From 3b1304f43293095a4f95e3285bcaec314680ef37 Mon Sep 17 00:00:00 2001 From: Putnam3145 Date: Wed, 2 Feb 2022 17:38:19 -0800 Subject: [PATCH 01/56] Weekly dynamic days --- code/controllers/configuration/entries/dynamic.dm | 4 ++++ code/modules/holiday/dynamic.dm | 10 ++++++++++ tgstation.dme | 1 + 3 files changed, 15 insertions(+) create mode 100644 code/modules/holiday/dynamic.dm diff --git a/code/controllers/configuration/entries/dynamic.dm b/code/controllers/configuration/entries/dynamic.dm index 935164352e..98203b7d8a 100644 --- a/code/controllers/configuration/entries/dynamic.dm +++ b/code/controllers/configuration/entries/dynamic.dm @@ -94,6 +94,10 @@ config_entry_value = 10 min_val = 0 +/datum/config_entry/keyed_list/dynamic_mode_days + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + /datum/config_entry/keyed_list/storyteller_weight key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_NUM diff --git a/code/modules/holiday/dynamic.dm b/code/modules/holiday/dynamic.dm new file mode 100644 index 0000000000..fb50ea72ca --- /dev/null +++ b/code/modules/holiday/dynamic.dm @@ -0,0 +1,10 @@ +/datum/holiday/dynamic + name = "Dynamic Day" + +/datum/holiday/dynamic/shouldCelebrate(dd, mm, yy, ww, ddd) + var/list/days = CONFIG_GET(keyed_list/dynamic_mode_days) + return ddd in days + +/datum/holiday/dynamic/celebrate() + GLOB.dynamic_forced_threat_level = rand(90, 100) + CONFIG_SET(string/force_gamemode, "dynamic") // prevents the round vote, which prevents extended diff --git a/tgstation.dme b/tgstation.dme index 1bfe4f7561..b419903683 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2252,6 +2252,7 @@ #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm" #include "code\modules\games\cas.dm" #include "code\modules\games\unum.dm" +#include "code\modules\holiday\dynamic.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\holidays.dm" #include "code\modules\holiday\halloween\bartholomew.dm" From 345c1616f29cdb1602dcc8e58c2c3fc65cc83a64 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Thu, 10 Feb 2022 18:49:24 +0200 Subject: [PATCH 02/56] Adds a way to build bodies using the limbgrower --- code/game/machinery/limbgrower.dm | 101 ++++++++++++++---- code/modules/mob/living/carbon/human/human.dm | 3 + .../research/designs/limbgrower_designs.dm | 9 ++ tgui/packages/tgui/interfaces/Limbgrower.js | 23 ++-- 4 files changed, 109 insertions(+), 27 deletions(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index dc87322b57..68270b11bf 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -52,23 +52,30 @@ /obj/machinery/limbgrower/ui_data(mob/user) var/list/data = list() - - for(var/datum/reagent/reagent_id in reagents.reagent_list) - var/list/reagent_data = list( - reagent_name = reagent_id.name, - reagent_amount = reagent_id.volume, - reagent_type = reagent_id.type - ) - data["reagents"] += list(reagent_data) - + if(reagents.reagent_list.len) + for(var/datum/reagent/reagent_id in reagents.reagent_list) + var/list/reagent_data = list( + reagent_name = reagent_id.name, + reagent_amount = reagent_id.volume, + reagent_type = reagent_id.type + ) + data["reagents"] += list(reagent_data) + else + data["reagents"] = list() data["total_reagents"] = reagents.total_volume data["max_reagents"] = reagents.maximum_volume data["busy"] = busy var/list/disk_data = list() disk_data["disk"] = dna_disk //Do i, the machine, have a disk? - disk_data["name"] = dna_disk?.fields["name"] //Name for the human saved if there is one + if(dna_disk) + if(dna_disk.fields["name"]) + disk_data["name"] = dna_disk.fields["name"] + else if(dna_disk.genetic_makeup_buffer["name"]) + disk_data["name"] = dna_disk.genetic_makeup_buffer["name"] + else + disk_data["name"] = "No name" + //Name for the human saved if there is one data["disk"] = disk_data - return data /obj/machinery/limbgrower/ui_static_data(mob/user) @@ -119,6 +126,15 @@ if (busy) to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.") return + if(ispath(user_item.type, /obj/item/reagent_containers/blood) && user.a_intent != INTENT_HARM) + var/obj/item/reagent_containers/blood/B = user_item + if(!B.reagents.get_reagents()) + to_chat(user, "You can't fill the [src] with a empty [B]!") + return + user.visible_message("[user] drains the [user_item] into the [src] using the blood bag port on [src].", + "You drain the [user_item] into the [src] using the blood bag port.") + B.reagents.trans_to(src, B.amount_per_transfer_from_this) + return if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", user_item)) ui_close(user) @@ -180,7 +196,7 @@ for(var/reagent_id in consumed_reagents_list) consumed_reagents_list[reagent_id] *= production_coefficient if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes.") + audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) return @@ -206,17 +222,13 @@ * modified_consumed_reagents_list - the list of reagents we will consume on build, modified by the production coefficient. */ /obj/machinery/limbgrower/proc/build_item(list/modified_consumed_reagents_list) - for(var/reagent_id in modified_consumed_reagents_list) - if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes.") - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - break - - reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) - + HandleReagentUsage(modified_consumed_reagents_list) var/built_typepath = being_built.build_path // If we have a bodypart, we need to initialize the limb on its own. Otherwise we can build it here. - if(ispath(built_typepath, /obj/item/bodypart)) + if(ispath(built_typepath, /mob/living/carbon/human/chestonly)) + if(!build_mob_chest(built_typepath, FALSE)) + HandleReagentUsage(modified_consumed_reagents_list, FALSE) + else if(ispath(built_typepath, /obj/item/bodypart)) build_limb(built_typepath) else if(ispath(built_typepath, /obj/item/organ/genital)) //genitals are uhh... customizable build_genital(built_typepath) @@ -227,6 +239,17 @@ flick("limbgrower_unfill", src) icon_state = "limbgrower_idleoff" +/obj/machinery/limbgrower/proc/HandleReagentUsage(modified_consumed_reagents_list, remove = TRUE) + for(var/reagent_id in modified_consumed_reagents_list) + if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])) + audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + break + if(remove) + reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + else + reagents.add_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + /* * The process of putting together a limb. * This is called from after we remove the reagents, so this proc is just initializing the limb type. @@ -306,6 +329,42 @@ else new built_typepath(loc) +/obj/machinery/limbgrower/proc/build_mob_chest(built_typepath) + // Create a mob with a chest, but nothing else + if(!ispath(built_typepath, /mob/living/carbon/human/chestonly)) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + visible_message(src, "Buzzes, a error screen appearing on it's display.") + return FALSE + var/dna = dna_disk?.genetic_makeup_buffer["name"] + var/mob/living/carbon/human/chestonly/C = new(loc) + if(dna) + C.real_name = dna + else + C.dna.nameless = TRUE + C.real_name = "Synthetic Humanoid #[rand(10000, 99999)]" + C.set_resting(TRUE, TRUE) + C.stat = DEAD + C.adjustOxyLoss(200) + C.adjustCloneLoss(50) + C.med_hud_set_status() + C.med_hud_set_health() + C.underwear = "Nude" + C.undershirt = "Nude" + C.saved_underwear = "" + C.saved_undershirt = "" + C.hair_style = "bald" + C.skin_tone = "albino" + // Just enough to start reviving them, I hope + C.blood_volume = BLOOD_VOLUME_SURVIVE + // At some point, make a way to deal with species regenerate_organs + // Remove all the organs + for(var/organ in C.internal_organs) + var/obj/item/organ/O = organ + O.Remove(organ) + + C.update_appearance() + return TRUE + /obj/machinery/limbgrower/RefreshParts() reagents.maximum_volume = 0 for(var/obj/item/reagent_containers/glass/our_beaker in component_parts) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4fc60cc6ac..3e7f2f59e3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -942,6 +942,9 @@ . += "[t_He] [t_is] a [spec_trait_examine_font()][dna.custom_species ? dna.custom_species : dna.species.name]" SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .) +/mob/living/carbon/human/chestonly + bodyparts = list(/obj/item/bodypart/chest) + /mob/living/carbon/human/species/abductor race = /datum/species/abductor diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 8da18c453c..39bba19176 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -2,6 +2,15 @@ //////////Limb Grower Designs /////// ///////////////////////////////////// + +/datum/design/chestmob + name = "Synthetic Humanoid Framework Chest" + id = "chestmob" + build_type = LIMBGROWER + reagents_list = list(/datum/reagent/medicine/synthflesh = 100, /datum/reagent/blood = BLOOD_VOLUME_SURVIVE) + build_path = /mob/living/carbon/human/chestonly + category = list("initial","human","lizard","fly","insect","plasmaman","mammal","xeno") + /datum/design/leftarm name = "Left Arm" id = "leftarm" diff --git a/tgui/packages/tgui/interfaces/Limbgrower.js b/tgui/packages/tgui/interfaces/Limbgrower.js index b91c7e4b45..004137782e 100644 --- a/tgui/packages/tgui/interfaces/Limbgrower.js +++ b/tgui/packages/tgui/interfaces/Limbgrower.js @@ -1,5 +1,5 @@ import { useBackend, useSharedState } from '../backend'; -import { Box, Button, Dimmer, Icon, LabeledList, Section, Tabs } from '../components'; +import { Box, Button, Dimmer, Icon, LabeledList, Section, Tabs, ProgressBar } from '../components'; import { Window } from '../layouts'; export const Limbgrower = (props, context) => { @@ -22,7 +22,7 @@ export const Limbgrower = (props, context) => { + height={760}> {!!busy && ( @@ -47,7 +47,16 @@ export const Limbgrower = (props, context) => {
- {total_reagents} / {max_reagents} reagent capacity used. + {!!total_reagents && max_reagents + ? ( +

+ {`Total Reagents/Maximum Reagents: + ${total_reagents}/${max_reagents}`} +

+ ) + : null} +
{reagents.map(reagent => ( @@ -56,13 +65,15 @@ export const Limbgrower = (props, context) => { label={reagent.reagent_name} buttons={( act('empty_reagent', { - reagent_type: reagent.reagent_type, - })} /> + onClick={() => { + act('empty_reagent', { reagent_type: reagent.reagent_type }); + + }} /> )}> {reagent.reagent_amount}u From fc6f3cdffc379d051547a28464e3a69e177b2074 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Fri, 11 Feb 2022 16:54:05 +0200 Subject: [PATCH 03/56] tested and done, seems to work --- code/game/machinery/limbgrower.dm | 32 +++++++++++++------ .../research/designs/limbgrower_designs.dm | 3 ++ tgui/packages/tgui/interfaces/Limbgrower.js | 12 +++---- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 68270b11bf..8014582eb0 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -129,10 +129,13 @@ if(ispath(user_item.type, /obj/item/reagent_containers/blood) && user.a_intent != INTENT_HARM) var/obj/item/reagent_containers/blood/B = user_item if(!B.reagents.get_reagents()) - to_chat(user, "You can't fill the [src] with a empty [B]!") + to_chat(user, "You can't fill [src] with a empty [B.name]!") return - user.visible_message("[user] drains the [user_item] into the [src] using the blood bag port on [src].", - "You drain the [user_item] into the [src] using the blood bag port.") + if(reagents.total_volume == reagents.maximum_volume) + to_chat(user, "\The [src] can't hold more blood!") + return + user.visible_message("[user] drains the [user_item] into [src] using the blood bag port on [src].", + "You drain the [user_item] into [src] using the blood bag port.") B.reagents.trans_to(src, B.amount_per_transfer_from_this) return @@ -335,13 +338,21 @@ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) visible_message(src, "Buzzes, a error screen appearing on it's display.") return FALSE - var/dna = dna_disk?.genetic_makeup_buffer["name"] + // Fields is from cloning, a much fuller scan, genetic_makeup_buffer is less so + var/dna_genetics = dna_disk?.genetic_makeup_buffer + var/dna_cloning = dna_disk?.fields + var/datum/species/selected = GLOB.species_datums[selected_category] var/mob/living/carbon/human/chestonly/C = new(loc) - if(dna) - C.real_name = dna + C.real_name = length(dna_genetics) ? dna_genetics["name"] : "Synthetic Humanoid #[rand(10000, 99999)]" + if(length(dna_cloning)) + C.hardset_dna(dna_cloning["UI"], dna_cloning["SE"], dna_cloning["name"], dna_cloning["blood_type"], dna_cloning["mrace"], dna_cloning["features"]) + else if(length(dna_genetics)) + C.hardset_dna(dna_genetics["UI"], null, dna_genetics["name"], dna_genetics["blood_type"]) else - C.dna.nameless = TRUE C.real_name = "Synthetic Humanoid #[rand(10000, 99999)]" + C.hair_style = "bald" + C.skin_tone = "albino" + C.set_species(selected) C.set_resting(TRUE, TRUE) C.stat = DEAD C.adjustOxyLoss(200) @@ -352,8 +363,7 @@ C.undershirt = "Nude" C.saved_underwear = "" C.saved_undershirt = "" - C.hair_style = "bald" - C.skin_tone = "albino" + // Just enough to start reviving them, I hope C.blood_volume = BLOOD_VOLUME_SURVIVE // At some point, make a way to deal with species regenerate_organs @@ -361,7 +371,9 @@ for(var/organ in C.internal_organs) var/obj/item/organ/O = organ O.Remove(organ) - + C.update_body(TRUE) + C.update_hair() + C.update_body_parts() C.update_appearance() return TRUE diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 39bba19176..e30cdfb5ef 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -6,6 +6,9 @@ /datum/design/chestmob name = "Synthetic Humanoid Framework Chest" id = "chestmob" + // Mobs don't make very good roundstart icons + research_icon = 'icons/mob/human_parts.dmi' + research_icon_state = "default_human_chest" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/synthflesh = 100, /datum/reagent/blood = BLOOD_VOLUME_SURVIVE) build_path = /mob/living/carbon/human/chestonly diff --git a/tgui/packages/tgui/interfaces/Limbgrower.js b/tgui/packages/tgui/interfaces/Limbgrower.js index 004137782e..75b98f0d81 100644 --- a/tgui/packages/tgui/interfaces/Limbgrower.js +++ b/tgui/packages/tgui/interfaces/Limbgrower.js @@ -47,14 +47,10 @@ export const Limbgrower = (props, context) => {
- {!!total_reagents && max_reagents - ? ( -

- {`Total Reagents/Maximum Reagents: - ${total_reagents}/${max_reagents}`} -

- ) - : null} + {/* Total_reagents could be null or undefined, so let's be safe */ + `Total Reagents/Maximum Reagents: + ${total_reagents ? total_reagents : 0}/${max_reagents}` + }
From f404390c913d01c99b1909f3bb01cbe25b311906 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Wed, 16 Feb 2022 00:46:25 +0200 Subject: [PATCH 04/56] Edge case and documentation --- code/game/machinery/limbgrower.dm | 3 ++- tgui/packages/tgui/interfaces/Limbgrower.js | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 8014582eb0..ab93012ae4 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -356,7 +356,8 @@ C.set_resting(TRUE, TRUE) C.stat = DEAD C.adjustOxyLoss(200) - C.adjustCloneLoss(50) + // Limb replacement causes toxloss, which can cause too much suffering for the doctor that I don't want + C.adjustCloneLoss(45) C.med_hud_set_status() C.med_hud_set_health() C.underwear = "Nude" diff --git a/tgui/packages/tgui/interfaces/Limbgrower.js b/tgui/packages/tgui/interfaces/Limbgrower.js index 75b98f0d81..e7e04d4f51 100644 --- a/tgui/packages/tgui/interfaces/Limbgrower.js +++ b/tgui/packages/tgui/interfaces/Limbgrower.js @@ -42,6 +42,8 @@ export const Limbgrower = (props, context) => {
Containing data for {disk['name']},
Attempting to create genitalia will use the disk's data. + Any Synthetic Frameworks created will + overwrite the race category selected.
) : disk['disk'] ? "No data." : "No disk."}
From 50455227f13614e7c7474aa33642e82e6eb35da7 Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Wed, 16 Feb 2022 00:49:46 +0200 Subject: [PATCH 05/56] More comments --- code/game/machinery/limbgrower.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index ab93012ae4..3570ce49a3 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -354,6 +354,7 @@ C.skin_tone = "albino" C.set_species(selected) C.set_resting(TRUE, TRUE) + // Don't want to cause it to deathgasp.. C.stat = DEAD C.adjustOxyLoss(200) // Limb replacement causes toxloss, which can cause too much suffering for the doctor that I don't want From c42aa2c30a4d06ce05bc7f7f3e7293b49345e07e Mon Sep 17 00:00:00 2001 From: SandPoot Date: Tue, 15 Feb 2022 22:16:07 -0300 Subject: [PATCH 06/56] Upload files --- code/__HELPERS/cmp.dm | 3 + code/modules/admin/playtimes.dm | 68 ++++++++++ code/modules/admin/verbs/randomverbs.dm | 8 +- tgstation.dme | 1 + .../tgui/interfaces/PlayerPlaytimes.js | 119 ++++++++++++++++++ 5 files changed, 193 insertions(+), 6 deletions(-) create mode 100644 code/modules/admin/playtimes.dm create mode 100644 tgui/packages/tgui/interfaces/PlayerPlaytimes.js diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 4ee622961a..2fbf087288 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -140,3 +140,6 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_typepaths_asc(A, B) return sorttext("[B]","[A]") + +/proc/cmp_playtime(list/A, list/B) + return A["playtime"] - B["playtime"] diff --git a/code/modules/admin/playtimes.dm b/code/modules/admin/playtimes.dm new file mode 100644 index 0000000000..7cf24d9746 --- /dev/null +++ b/code/modules/admin/playtimes.dm @@ -0,0 +1,68 @@ +/datum/player_playtime/New(mob/viewer) + ui_interact(viewer) + +/datum/player_playtime/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "PlayerPlaytimes", "Player Playtimes") + ui.open() + +/datum/player_playtime/ui_state(mob/user) + return GLOB.admin_state + +/datum/player_playtime/ui_data(mob/user) + var/list/data = list() + + var/list/clients = list() + for(var/client/C in GLOB.clients) + var/list/client = list() + + client["ckey"] = C.ckey + client["playtime"] = C.get_exp_living(TRUE) + client["playtime_hours"] = C.get_exp_living() + + var/mob/M = C.mob + client["observer"] = isobserver(M) + client["ingame"] = !isnewplayer(M) + client["name"] = M.real_name + var/nnpa = CONFIG_GET(number/notify_new_player_age) + if(nnpa >= 0) + if(C.account_age >= 0 && (C.account_age < CONFIG_GET(number/notify_new_player_age))) + client["new_account"] = "New BYOND account [C.account_age] day[(C.account_age==1?"":"s")] old, created on [C.account_join_date]" + + clients += list(client) + + clients = sortList(clients, /proc/cmp_playtime) + data["clients"] = clients + return data + +/datum/player_playtime/ui_act(action, params) + if(..()) + return + + switch(action) + if("view_playtime") + var/mob/target = get_mob_by_ckey(params["ckey"]) + usr.client.holder.cmd_show_exp_panel(target.client) + if("admin_pm") + usr.client.cmd_admin_pm(params["ckey"]) + if("player_panel") + var/mob/target = get_mob_by_ckey(params["ckey"]) + usr.client.holder.show_player_panel(target) + if("view_variables") + var/mob/target = get_mob_by_ckey(params["ckey"]) + usr.client.debug_variables(target) + if("observe") + if(!isobserver(usr) && !check_rights(R_ADMIN)) + return + + var/mob/target = get_mob_by_key(params["ckey"]) + if(!target) + to_chat(usr, "Player not found.") + return + + var/client/C = usr.client + if(!isobserver(usr) && !C.admin_ghost()) + return + var/mob/dead/observer/A = C.mob + A.ManualFollow(target) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index a0a1da9584..9e201ec360 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1557,6 +1557,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_check_player_exp() //Allows admins to determine who the newer players are. set category = "Admin" set name = "Player Playtime" + if(!check_rights(R_ADMIN)) return @@ -1564,12 +1565,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, "Tracking is disabled in the server configuration file.") return - var/list/msg = list() - msg += "Playtime ReportPlaytime:
" - src << browse(msg.Join(), "window=Player_playtime_check") + new /datum/player_playtime(usr) /obj/effect/temp_visual/fireball icon = 'icons/obj/wizard.dmi' diff --git a/tgstation.dme b/tgstation.dme index 4328158bfc..533962c9d9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1472,6 +1472,7 @@ #include "code\modules\admin\outfits.dm" #include "code\modules\admin\permissionedit.dm" #include "code\modules\admin\player_panel.dm" +#include "code\modules\admin\playtimes.dm" #include "code\modules\admin\sound_emitter.dm" #include "code\modules\admin\sql_message_system.dm" #include "code\modules\admin\stickyban.dm" diff --git a/tgui/packages/tgui/interfaces/PlayerPlaytimes.js b/tgui/packages/tgui/interfaces/PlayerPlaytimes.js new file mode 100644 index 0000000000..aaa3e0cc98 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PlayerPlaytimes.js @@ -0,0 +1,119 @@ +import { useBackend } from '../backend'; +import { Button, Icon, Section, Table, Tooltip } from '../components'; +import { Window } from '../layouts'; + +export const PlayerPlaytimes = (props, context) => { + const { act, data } = useBackend(context); + const { + clients, + } = data; + return ( + + +
+ + + +
+ +
+
+ +
+ Ckey +
+
+ +
+ Real Name +
+
+ +
+ Actions +
+
+
+ {clients.map(client => ( + + +
+
+
+ +
+ {!!client.new_account + && ( + + + + )} {client.ckey} +
+
+ +
+ {!!client.observer + && ( + + + + )} {client.name} +
+
+ +
+
+
+
+
+ ))} +
+
+
+
+ ); +}; From 7735a68d3e997f6251f963989da9c063a3a1df4c Mon Sep 17 00:00:00 2001 From: SandPoot Date: Tue, 15 Feb 2022 22:46:29 -0300 Subject: [PATCH 07/56] i forgot to push --- tgui/packages/tgui/interfaces/PlayerPlaytimes.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tgui/packages/tgui/interfaces/PlayerPlaytimes.js b/tgui/packages/tgui/interfaces/PlayerPlaytimes.js index aaa3e0cc98..0996b0ba04 100644 --- a/tgui/packages/tgui/interfaces/PlayerPlaytimes.js +++ b/tgui/packages/tgui/interfaces/PlayerPlaytimes.js @@ -64,12 +64,12 @@ export const PlayerPlaytimes = (props, context) => {
- {!!client.observer + {!client.ingame ? (At lobby) + : (!!client.observer && ( - - )} {client.name} + ))} {client.name}
From 86c711a0030e88b34907d7880a5cd00a99cfd710 Mon Sep 17 00:00:00 2001 From: Arturlang <24881678+Arturlang@users.noreply.github.com> Date: Fri, 18 Feb 2022 23:44:03 +0200 Subject: [PATCH 08/56] Apply suggestions from code review Co-authored-by: Putnam3145 --- code/game/machinery/limbgrower.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 3570ce49a3..da1d294729 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -129,7 +129,7 @@ if(ispath(user_item.type, /obj/item/reagent_containers/blood) && user.a_intent != INTENT_HARM) var/obj/item/reagent_containers/blood/B = user_item if(!B.reagents.get_reagents()) - to_chat(user, "You can't fill [src] with a empty [B.name]!") + to_chat(user, "You can't fill [src] with an empty [B.name]!") return if(reagents.total_volume == reagents.maximum_volume) to_chat(user, "\The [src] can't hold more blood!") @@ -199,7 +199,7 @@ for(var/reagent_id in consumed_reagents_list) consumed_reagents_list[reagent_id] *= production_coefficient if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") + audible_message("\The [src] buzzes and states "INSUFFICENT REAGENTS"") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) return @@ -336,7 +336,7 @@ // Create a mob with a chest, but nothing else if(!ispath(built_typepath, /mob/living/carbon/human/chestonly)) playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - visible_message(src, "Buzzes, a error screen appearing on it's display.") + visible_message(src, "Buzzes, an error screen appearing on its display.") return FALSE // Fields is from cloning, a much fuller scan, genetic_makeup_buffer is less so var/dna_genetics = dna_disk?.genetic_makeup_buffer From 2b11cfcc3335c4dc5f0223c4307dbc63d176b4b5 Mon Sep 17 00:00:00 2001 From: Arturlang <24881678+Arturlang@users.noreply.github.com> Date: Sat, 19 Feb 2022 12:55:35 +0200 Subject: [PATCH 09/56] Linz's suggestion Co-authored-by: Lin --- code/game/machinery/limbgrower.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index da1d294729..5b1bd91fc3 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -199,7 +199,7 @@ for(var/reagent_id in consumed_reagents_list) consumed_reagents_list[reagent_id] *= production_coefficient if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes and states "INSUFFICENT REAGENTS"") + audible_message("\The [src] buzzes and states \"INSUFFICENT REAGENTS\"") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) return From 29a4e1059205b71d600179de83208365973291ab Mon Sep 17 00:00:00 2001 From: Artur <24881678+Arturlang@users.noreply.github.com> Date: Mon, 21 Feb 2022 01:09:21 +0200 Subject: [PATCH 10/56] Looping performance tweaks --- code/game/machinery/limbgrower.dm | 32 +++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 3570ce49a3..d77e2e0aae 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -225,12 +225,12 @@ * modified_consumed_reagents_list - the list of reagents we will consume on build, modified by the production coefficient. */ /obj/machinery/limbgrower/proc/build_item(list/modified_consumed_reagents_list) - HandleReagentUsage(modified_consumed_reagents_list) + reagent_usage(modified_consumed_reagents_list) var/built_typepath = being_built.build_path // If we have a bodypart, we need to initialize the limb on its own. Otherwise we can build it here. if(ispath(built_typepath, /mob/living/carbon/human/chestonly)) if(!build_mob_chest(built_typepath, FALSE)) - HandleReagentUsage(modified_consumed_reagents_list, FALSE) + reagent_usage(modified_consumed_reagents_list, FALSE) else if(ispath(built_typepath, /obj/item/bodypart)) build_limb(built_typepath) else if(ispath(built_typepath, /obj/item/organ/genital)) //genitals are uhh... customizable @@ -242,16 +242,24 @@ flick("limbgrower_unfill", src) icon_state = "limbgrower_idleoff" -/obj/machinery/limbgrower/proc/HandleReagentUsage(modified_consumed_reagents_list, remove = TRUE) - for(var/reagent_id in modified_consumed_reagents_list) - if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - break - if(remove) - reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) - else - reagents.add_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) +/obj/machinery/limbgrower/proc/reagent_usage(modified_consumed_reagents_list, remove = TRUE) + // Apparently, having a boolean in a loop is worse than doing it twice + if(remove) + for(var/reagent_id in modified_consumed_reagents_list) + if(reagent_sanity_check(reagent_id, modified_consumed_reagents_list[reagent_id])) + reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + else + for(var/reagent_id in modified_consumed_reagents_list) + if(reagent_sanity_check(reagent_id, modified_consumed_reagents_list[reagent_id])) + reagents.add_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + + +/obj/machinery/limbgrower/proc/reagent_sanity_check(reagent_id, amount) + if(reagents.has_reagent(reagent_id, amount)) + return TRUE + audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + return FALSE /* * The process of putting together a limb. From b032c8b1b2fb8ab491d42af67351e552a82413c3 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 21 Feb 2022 00:53:36 +0000 Subject: [PATCH 11/56] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-15414.yml | 5 --- html/changelogs/AutoChangeLog-pr-15510.yml | 36 ------------------ html/changelogs/AutoChangeLog-pr-15513.yml | 4 -- html/changelogs/AutoChangeLog-pr-15515.yml | 4 -- html/changelogs/archive/2022-02.yml | 44 ++++++++++++++++++++++ 5 files changed, 44 insertions(+), 49 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-15414.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-15510.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-15513.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-15515.yml diff --git a/html/changelogs/AutoChangeLog-pr-15414.yml b/html/changelogs/AutoChangeLog-pr-15414.yml deleted file mode 100644 index b483e8437c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15414.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BlueWildrose and tralezab, Wjohnston, Mey Ha Zah, ArcaneDefense, Jack7D1, Papaporo, Sheits & Mqiib from TG and Yog" -delete-after: True -changes: - - rscadd: "TG wing port - All species can now use flight potions and grow wings. Your wing sprite will be based off of what wings you have on your character, or otherwise what species you are if you have no wings." - - bugfix: "Jellypeople did not call the species parent proc on spec_life. Fixed." diff --git a/html/changelogs/AutoChangeLog-pr-15510.yml b/html/changelogs/AutoChangeLog-pr-15510.yml deleted file mode 100644 index 206bf8c13e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15510.yml +++ /dev/null @@ -1,36 +0,0 @@ -author: "TripleShades" -delete-after: True -changes: - - rscadd: "[Omega] Gateway shutter button" - - rscadd: "[Omega] Signs to the airlocks that lead to space that say SPACE" - - rscadd: "[Omega] Air Alarm for the Turbine itself" - - rscadd: "[Omega] SMES Unit for the Turbine itself" - - rscadd: "[Omega] Firelock to Robotics airlock" - - rscadd: "[Omega] Captain's Office now has a hand teleporter and medal box" - - rscadd: "[Omega] Screwdriver to Chemistry" - - rscadd: "[Omega] Space Cleaner bottle to Medbay" - - rscadd: "[Omega] Limb Grower and Spare Limb Crate to Surgery" - - rscadd: "[Omega] Kinkmate in Dorms" - - rscadd: "[Omega] Lightbulb fixture to Secure Tech Storage" - - rscadd: "[Omega] Armsky is now in the Armoury" - - rscdel: "[Omega] Extra automated announcement machine" - - rscdel: "[Omega] Wall inside of southwest Solar Array window" - - rscdel: "[Omega] Wall inside library maint airlock" - - rscdel: "[Omega] Duplicate Robotics airlock -tweak: [Omega] HoS gun now spawns in HoS locker instead of Captain's locker -tweak: [Omega] Both Solar Arrays now have more windows -tweak: [Omega] PACMAN moved out from behind a Command airlock in Engineering -tweak: [Omega] A few cameras so that they're not sitting improperly on windows -tweak: [Omega] Medbay Surgery now has a surgical duffel instead of strewn about tools -tweak: [Omega] Security Cell 1 is now properly named and has a bed instead of a chair -tweak: [Omega] Toxins scrubber piping now goes through a wall -tweak: [Omega] Robotics trash can is now moved to the small hallway between Robotics and Toxins -tweak: [Omega] Maint Pool drain moved down a tile so it's easier to retrieve lost items" - - bugfix: "[Omega] Lawyer Office access" - - bugfix: "[Omega] Both Solar Arrays are now wired up to power the station properly" - - bugfix: "[Omega] Wire leading to the single Supermatter Emitter should now be properly connected and not diagonal" - - bugfix: "[Omega] Gateway Maint airlock access" - - bugfix: "[Omega] Toxins Launch not being connected to the main air supply" - - bugfix: "[Omega] Toxins Mix Chamber no longer starts bolted" - - bugfix: "[Omega] Missing pipe above Security leading into Perma" - - bugfix: "[Omega] Secure Tech Storage now properly has an area" diff --git a/html/changelogs/AutoChangeLog-pr-15513.yml b/html/changelogs/AutoChangeLog-pr-15513.yml deleted file mode 100644 index 077fb57101..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15513.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - bugfix: "Default features on linux auxmos compile now formatted correctly" diff --git a/html/changelogs/AutoChangeLog-pr-15515.yml b/html/changelogs/AutoChangeLog-pr-15515.yml deleted file mode 100644 index dcd230897e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15515.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - bugfix: "reinforced plasma glass windows are buildable" diff --git a/html/changelogs/archive/2022-02.yml b/html/changelogs/archive/2022-02.yml index 17000e958a..8ae10a7f5c 100644 --- a/html/changelogs/archive/2022-02.yml +++ b/html/changelogs/archive/2022-02.yml @@ -84,3 +84,47 @@ 2022-02-20: jupyterkat: - refactor: switched equalization method to katmos +2022-02-21: + BlueWildrose and tralezab, Wjohnston, Mey Ha Zah, ArcaneDefense, Jack7D1, Papaporo, Sheits & Mqiib from TG and Yog: + - rscadd: TG wing port - All species can now use flight potions and grow wings. + Your wing sprite will be based off of what wings you have on your character, + or otherwise what species you are if you have no wings. + - bugfix: Jellypeople did not call the species parent proc on spec_life. Fixed. + Putnam3145: + - bugfix: Default features on linux auxmos compile now formatted correctly + - bugfix: reinforced plasma glass windows are buildable + TripleShades: + - rscadd: '[Omega] Gateway shutter button' + - rscadd: '[Omega] Signs to the airlocks that lead to space that say SPACE' + - rscadd: '[Omega] Air Alarm for the Turbine itself' + - rscadd: '[Omega] SMES Unit for the Turbine itself' + - rscadd: '[Omega] Firelock to Robotics airlock' + - rscadd: '[Omega] Captain''s Office now has a hand teleporter and medal box' + - rscadd: '[Omega] Screwdriver to Chemistry' + - rscadd: '[Omega] Space Cleaner bottle to Medbay' + - rscadd: '[Omega] Limb Grower and Spare Limb Crate to Surgery' + - rscadd: '[Omega] Kinkmate in Dorms' + - rscadd: '[Omega] Lightbulb fixture to Secure Tech Storage' + - rscadd: '[Omega] Armsky is now in the Armoury' + - rscdel: '[Omega] Extra automated announcement machine' + - rscdel: '[Omega] Wall inside of southwest Solar Array window' + - rscdel: '[Omega] Wall inside library maint airlock' + - rscdel: '[Omega] Duplicate Robotics airlock tweak: [Omega] HoS gun now spawns + in HoS locker instead of Captain''s locker tweak: [Omega] Both Solar Arrays + now have more windows tweak: [Omega] PACMAN moved out from behind a Command + airlock in Engineering tweak: [Omega] A few cameras so that they''re not sitting + improperly on windows tweak: [Omega] Medbay Surgery now has a surgical duffel + instead of strewn about tools tweak: [Omega] Security Cell 1 is now properly + named and has a bed instead of a chair tweak: [Omega] Toxins scrubber piping + now goes through a wall tweak: [Omega] Robotics trash can is now moved to the + small hallway between Robotics and Toxins tweak: [Omega] Maint Pool drain moved + down a tile so it''s easier to retrieve lost items' + - bugfix: '[Omega] Lawyer Office access' + - bugfix: '[Omega] Both Solar Arrays are now wired up to power the station properly' + - bugfix: '[Omega] Wire leading to the single Supermatter Emitter should now be + properly connected and not diagonal' + - bugfix: '[Omega] Gateway Maint airlock access' + - bugfix: '[Omega] Toxins Launch not being connected to the main air supply' + - bugfix: '[Omega] Toxins Mix Chamber no longer starts bolted' + - bugfix: '[Omega] Missing pipe above Security leading into Perma' + - bugfix: '[Omega] Secure Tech Storage now properly has an area' From 6b3fb90ef61d9cdaf07fd307d7395dc5938decc5 Mon Sep 17 00:00:00 2001 From: evan Date: Mon, 21 Feb 2022 17:44:27 -0500 Subject: [PATCH 12/56] keep the cold in --- code/__DEFINES/atmospherics.dm | 1 + code/modules/clothing/suits/miscellaneous.dm | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 2ead5ea068..35de475d35 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -116,6 +116,7 @@ #define GLOVES_MAX_TEMP_PROTECT 1500 //For some gloves #define SHOES_MIN_TEMP_PROTECT 2.0 //For gloves #define SHOES_MAX_TEMP_PROTECT 1500 //For gloves +#define COAT_MAX_TEMP_PROTECT 330 //For winter coats (if they can stop you from getting cold why can't they do it the other way to a lesser extent) #define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE #define MAX_HIGH_PRESSURE_DAMAGE 16 // CITADEL CHANGES Max to 16, low to 8. diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 513ad94365..c35e5b0a07 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -279,7 +279,9 @@ item_state = "labcoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET cold_protection = CHEST|GROIN|ARMS + heat_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/automatic/speargun, /obj/item/staff/bostaff) hoodtype = /obj/item/clothing/head/hooded/carp_hood @@ -289,7 +291,9 @@ icon_state = "carp_casual" body_parts_covered = HEAD cold_protection = HEAD + heat_protection = HEAD min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS /obj/item/clothing/suit/hooded/ian_costume //It's Ian, rub his bell- oh god what happened to his inside parts? @@ -419,7 +423,9 @@ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/radio) body_parts_covered = CHEST|ARMS cold_protection = CHEST|GROIN|ARMS + heat_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/jacket/flannel @@ -520,6 +526,7 @@ icon_state = "leathercoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS cold_protection = CHEST|GROIN|ARMS|LEGS + heat_protection = CHEST|GROIN|ARMS|LEGS mutantrace_variation = STYLE_DIGITIGRADE /obj/item/clothing/suit/jacket/puffer @@ -537,6 +544,7 @@ item_state = "armor" body_parts_covered = CHEST|GROIN cold_protection = CHEST|GROIN + heat_protection = CHEST|GROIN armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/suit/jacket/miljacket @@ -655,7 +663,9 @@ item_state = "coatwinter" body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS + heat_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON @@ -666,7 +676,9 @@ icon_state = "winterhood" body_parts_covered = HEAD cold_protection = HEAD + heat_protection = HEAD min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS rad_flags = RAD_NO_CONTAMINATE From 4d403ebca5a338126bf5eec5fcd087de1c77eb67 Mon Sep 17 00:00:00 2001 From: evan Date: Mon, 21 Feb 2022 18:14:56 -0500 Subject: [PATCH 13/56] Update miscellaneous.dm --- code/modules/clothing/gloves/miscellaneous.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 8c8400a45d..d3e87dfdf3 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -9,6 +9,8 @@ equip_delay_other = 20 cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = COAT_MIN_TEMP_PROTECT strip_mod = 0.9 custom_price = PRICE_ALMOST_CHEAP @@ -349,6 +351,8 @@ transfer_prints = TRUE cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = COAT_MIN_TEMP_PROTECT strip_mod = 0.9 /obj/item/clothing/gloves/evening/black From 93c322f494685701be8d15436bc95af8ed6cc776 Mon Sep 17 00:00:00 2001 From: evan Date: Mon, 21 Feb 2022 18:23:41 -0500 Subject: [PATCH 14/56] a --- code/modules/clothing/head/misc.dm | 3 ++- code/modules/clothing/head/misc_special.dm | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 76e8ca53df..98ab79068a 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -264,7 +264,8 @@ item_state = "that" cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - + heat_protection = HEAD + max_heat_protection_temperature = COAT_MIN_TEMP_PROTECT dog_fashion = /datum/dog_fashion/head/santa beepsky_fashion = /datum/beepsky_fashion/santa diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 247062581d..01f4a59e9e 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -93,6 +93,8 @@ var/earflaps = TRUE cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + heat_protection = HEAD + max_heat_protection_temperature = COAT_MIN_TEMP_PROTECT ///Sprite visible when the ushanka flaps are folded up. var/upsprite = "ushankaup" ///Sprite visible when the ushanka flaps are folded down. From 2619387dc1913a7d580c16d1cdcdeaedf756647f Mon Sep 17 00:00:00 2001 From: evan Date: Mon, 21 Feb 2022 18:25:12 -0500 Subject: [PATCH 15/56] woops --- code/modules/clothing/gloves/miscellaneous.dm | 4 ++-- code/modules/clothing/head/misc.dm | 2 +- code/modules/clothing/head/misc_special.dm | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index d3e87dfdf3..2cfc22eef7 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -10,7 +10,7 @@ cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS - max_heat_protection_temperature = COAT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT strip_mod = 0.9 custom_price = PRICE_ALMOST_CHEAP @@ -352,7 +352,7 @@ cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS - max_heat_protection_temperature = COAT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT strip_mod = 0.9 /obj/item/clothing/gloves/evening/black diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 98ab79068a..3bc0d02350 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -265,7 +265,7 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD - max_heat_protection_temperature = COAT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT dog_fashion = /datum/dog_fashion/head/santa beepsky_fashion = /datum/beepsky_fashion/santa diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 01f4a59e9e..34df3bb932 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -94,7 +94,7 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD - max_heat_protection_temperature = COAT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT ///Sprite visible when the ushanka flaps are folded up. var/upsprite = "ushankaup" ///Sprite visible when the ushanka flaps are folded down. From 7f9d7936f084e70c2ce268bf875aaa9b06b7fb61 Mon Sep 17 00:00:00 2001 From: evan Date: Mon, 21 Feb 2022 18:31:48 -0500 Subject: [PATCH 16/56] a --- code/modules/clothing/gloves/mittens.dm | 2 ++ code/modules/clothing/gloves/tacklers.dm | 2 ++ 2 files changed, 4 insertions(+) diff --git a/code/modules/clothing/gloves/mittens.dm b/code/modules/clothing/gloves/mittens.dm index 42250aae2f..b1b17c9afe 100644 --- a/code/modules/clothing/gloves/mittens.dm +++ b/code/modules/clothing/gloves/mittens.dm @@ -6,6 +6,8 @@ //item_color = "white" cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT resistance_flags = NONE /obj/item/clothing/gloves/mittens/random diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index 39d39ba58f..23230b32c5 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -6,6 +6,8 @@ transfer_prints = TRUE cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT resistance_flags = NONE //custom_premium_price = PRICE_EXPENSIVE /// For storing our tackler datum so we can remove it after From 6db0142ec39505223cc2e656511899709c819f1b Mon Sep 17 00:00:00 2001 From: evan Date: Mon, 21 Feb 2022 18:58:54 -0500 Subject: [PATCH 17/56] fluffy tail costume. --- code/modules/clothing/suits/miscellaneous.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index c35e5b0a07..5c4193d532 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -366,7 +366,10 @@ item_state = "ran_suit" body_parts_covered = CHEST|GROIN|LEGS flags_inv = HIDEJUMPSUIT|HIDETAUR - heat_protection = CHEST|GROIN|LEGS //fluffy tails! + cold_protection = CHEST|GROIN|LEGS //fluffy tails! + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Bleh, same as winter coat + heat_protection = CHEST|GROIN|LEGS + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/head/ran From 87e4f9353f67713821455e67b37b921ed32671a6 Mon Sep 17 00:00:00 2001 From: Putnam3145 Date: Mon, 21 Feb 2022 20:57:56 -0800 Subject: [PATCH 18/56] Change BOMB_TARGET_SIZE to match new trit fire I am SO GLAD I WROTE THIS CODE THIS WAY. --- code/__DEFINES/research.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index 4b8b2c797e..129ec8fd5a 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -74,5 +74,5 @@ ) #define BOMB_TARGET_POINTS 50000 //Adjust as needed. Actual hard cap is double this, but will never be reached due to hyperbolic curve. -#define BOMB_TARGET_SIZE 200 // The shockwave radius required for a bomb to get TECHWEB_BOMB_MIDPOINT points. +#define BOMB_TARGET_SIZE 175 // The shockwave radius required for a bomb to get TECHWEB_BOMB_MIDPOINT points. #define BOMB_SUB_TARGET_EXPONENT 2 // The power of the points curve below the target size. Higher = less points for worse bombs, below target. From 6fb26a5afc7cce0e67e7cd1c01be46ce433718c8 Mon Sep 17 00:00:00 2001 From: Putnam3145 Date: Mon, 21 Feb 2022 21:05:11 -0800 Subject: [PATCH 19/56] Raised sub target exponent too Needs to be this way so plasma bombs aren't way stronger --- code/__DEFINES/research.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index 129ec8fd5a..55c3ac8772 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -75,4 +75,4 @@ #define BOMB_TARGET_POINTS 50000 //Adjust as needed. Actual hard cap is double this, but will never be reached due to hyperbolic curve. #define BOMB_TARGET_SIZE 175 // The shockwave radius required for a bomb to get TECHWEB_BOMB_MIDPOINT points. -#define BOMB_SUB_TARGET_EXPONENT 2 // The power of the points curve below the target size. Higher = less points for worse bombs, below target. +#define BOMB_SUB_TARGET_EXPONENT 3 // The power of the points curve below the target size. Higher = less points for worse bombs, below target. From c0420c2c6152270fe637f3f6aa4ef908fd52ff99 Mon Sep 17 00:00:00 2001 From: BongaTheProto <93835010+BongaTheProto@users.noreply.github.com> Date: Tue, 22 Feb 2022 15:07:51 -0500 Subject: [PATCH 20/56] safety check probably too late for this but better late than never, I guess --- code/datums/traits/neutral.dm | 2 ++ modular_splurt/code/datums/traits/neutral.dm | 2 ++ modular_splurt/code/modules/arousal/organs/breasts.dm | 5 ++++- modular_splurt/code/modules/arousal/organs/testicles.dm | 5 ++++- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 36712ea6bb..1a17afe033 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -119,6 +119,8 @@ /datum/quirk/libido/remove() var/mob/living/carbon/human/H = quirk_holder + if(!H) + return H.arousal_rate = initial(H.arousal_rate) /datum/quirk/alcohol_intolerance diff --git a/modular_splurt/code/datums/traits/neutral.dm b/modular_splurt/code/datums/traits/neutral.dm index 2fcfd931c3..527431021e 100644 --- a/modular_splurt/code/datums/traits/neutral.dm +++ b/modular_splurt/code/datums/traits/neutral.dm @@ -203,6 +203,8 @@ /datum/quirk/cum_plus/remove() var/mob/living/carbon/M = quirk_holder + if(!M) + return if(quirk_holder.getorganslot("testicles")) var/obj/item/organ/genital/testicles/T = M.getorganslot("testicles") T.fluid_mult = 1 //Base is 1 diff --git a/modular_splurt/code/modules/arousal/organs/breasts.dm b/modular_splurt/code/modules/arousal/organs/breasts.dm index 552a1d0493..c1e1c1d8de 100644 --- a/modular_splurt/code/modules/arousal/organs/breasts.dm +++ b/modular_splurt/code/modules/arousal/organs/breasts.dm @@ -1,5 +1,8 @@ /obj/item/organ/genital/breasts/get_features(mob/living/carbon/human/H) var/datum/dna/D = H.dna - fluid_id = D.features["breasts_fluid"] + if(D.features["breasts_fluid"]) + fluid_id = D.features["breasts_fluid"] + else + fluid_id = initial(fluid_id) . = ..() diff --git a/modular_splurt/code/modules/arousal/organs/testicles.dm b/modular_splurt/code/modules/arousal/organs/testicles.dm index 5388314edf..8f0391e9ac 100644 --- a/modular_splurt/code/modules/arousal/organs/testicles.dm +++ b/modular_splurt/code/modules/arousal/organs/testicles.dm @@ -1,5 +1,8 @@ /obj/item/organ/genital/testicles/get_features(mob/living/carbon/human/H) var/datum/dna/D = H.dna - fluid_id = D.features["balls_fluid"] + if(D.features["balls_fluid"]) + fluid_id = D.features["balls_fluid"] + else + fluid_id = initial(fluid_id) . = ..() From fd997e16153f29f28ba890673e796b0c3d82aef4 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 22 Feb 2022 21:59:28 +0000 Subject: [PATCH 21/56] initial test changes --- code/_globalvars/lists/objects.dm | 1 + code/game/objects/items/devices/PDA/PDA.dm | 26 +++++++++++++++++++++ code/game/objects/items/devices/PDA/cart.dm | 7 ++++++ code/modules/reagents/chemistry/holder.dm | 6 +++++ 4 files changed, 40 insertions(+) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 14969e6c92..d29bdfae23 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -16,6 +16,7 @@ GLOBAL_LIST_EMPTY(singularities) //list of all singularities on the stati GLOBAL_LIST_EMPTY(grounding_rods) //list of all grounding rods on the station GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction datums. Used during chemical reactions +GLOBAL_LIST(drink_reactions_list) //list of all /datum/chemical_reaction datums where the output is of type /datum/reagent/consumable GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id. GLOBAL_LIST_EMPTY(surgeries_list) //list of all surgeries by name, associated with their path. diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 2339e88a76..9a873fb561 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -369,6 +369,8 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "
  • [PDAIMG(rdoor)]Toggle Remote Door
  • " if (cartridge.access & CART_DRONEPHONE) dat += "
  • [PDAIMG(dronephone)]Drone Phone
  • " + if (cartridge.access & CART_BARTENDER) + dat += "
  • [PDAIMG(bucket)]Drink Recipe Browser
  • " dat += "
  • [PDAIMG(atmos)]Atmospheric Scan
  • " dat += "
  • [PDAIMG(flashlight)][fon ? "Disable" : "Enable"] Flashlight
  • " if (pai) @@ -705,6 +707,30 @@ GLOBAL_LIST_EMPTY(PDAs) if(T) pai.forceMove(T) +//DRINK RECIPE BROWSER============================= + if("Drink Recipe Browser") + if(cartridge && cartridge.access & CART_BARTENDER) + var/option = input(U, "Enter keyword to return a recipe.") + if(option) + option = lowertext(option) + var/list/reagents_required + var/found_reagent_name + for(var/reagent_name in GLOB.drink_reactions_list) + message_admins(reagent_name) + if(findtext(reagent_name, option)) + found_reagent_name = reagent_name + reagents_required = GLOB.drink_reactions_list[reagent_name].required_reagents + break + if(length(reagents_required)) + to_chat(U, "Reagent found: [found_reagent_name]
    Required Reagents:
    ") + var/reagents_required_string = "" + for(var/datum/reagent/r in reagents_required) + reagents_required_string += "[initial(r.name)]: [reagents_required[r]]
    " + to_chat(U, reagents_required_string) + return + else + to_chat(U, "Reagent with term: [option] could not be located!") + //LINK FUNCTIONS=================================== else//Cartridge menu linking diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 4ca0b86bc0..9d02207375 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -13,6 +13,7 @@ #define CART_QUARTERMASTER (1<<12) #define CART_HYDROPONICS (1<<13) #define CART_DRONEPHONE (1<<14) +#define CART_BARTENDER (1<<15) /obj/item/cartridge @@ -190,6 +191,12 @@ bot_access_flags = SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT | FIRE_BOT spam_enabled = 1 +/obj/item/cartridge/bartender + name = "\improper B.O.O.Z.E cartridge" + desc = "Now with 12% alcohol!" + icon_state = "cart-bar" + access = CART_BARTENDER + /obj/item/cartridge/captain/New() ..() radio = new(src) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2899f0ca11..6de8efd1db 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -32,6 +32,12 @@ var/datum/chemical_reaction/D = new path() var/list/reaction_ids = list() + // store drinks separately for bartender cartridge + if(D.id) + if(istype(D.id, /datum/reagent/consumable)) + var/datum/reagent/consumable/r = D.id + GLOB.drink_reactions_list[lowertext(initial(r.name))] = D + if(D.required_reagents && D.required_reagents.len) for(var/reaction in D.required_reagents) reaction_ids += reaction From 0f4a3efcb5ed66afdc882182c0b4c5589bf95064 Mon Sep 17 00:00:00 2001 From: keronshb Date: Tue, 22 Feb 2022 17:26:19 -0500 Subject: [PATCH 22/56] Fixes weird flipped line --- code/controllers/configuration/entries/general.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 1ffb5089b4..9966f90ce7 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -350,7 +350,8 @@ /datum/config_entry/flag/station_name_needs_approval -//ambition end - config_entry_value = 5 -/datum/config_entry/number/max_ambitions // Maximum number of ambitions a mind can store. //ambition start +/datum/config_entry/number/max_ambitions // Maximum number of ambitions a mind can store. + config_entry_value = 5 +//ambition end + From b578c65d7430d5d008e51832cfd842a489886492 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 23 Feb 2022 00:52:17 +0000 Subject: [PATCH 23/56] fixes --- code/game/objects/items/devices/PDA/PDA.dm | 12 +++++++----- .../objects/items/devices/PDA/PDA_types.dm | 1 + code/modules/reagents/chemistry/holder.dm | 7 ++++--- icons/obj/pda.dmi | Bin 16000 -> 16140 bytes 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 9a873fb561..8a97cc9f80 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -715,17 +715,19 @@ GLOBAL_LIST_EMPTY(PDAs) option = lowertext(option) var/list/reagents_required var/found_reagent_name + var/required_temp for(var/reagent_name in GLOB.drink_reactions_list) - message_admins(reagent_name) - if(findtext(reagent_name, option)) + if(findtext(lowertext(reagent_name), option)) found_reagent_name = reagent_name reagents_required = GLOB.drink_reactions_list[reagent_name].required_reagents + required_temp = GLOB.drink_reactions_list[reagent_name].required_temp break if(length(reagents_required)) - to_chat(U, "Reagent found: [found_reagent_name]
    Required Reagents:
    ") + to_chat(U, "Recipe found: [found_reagent_name][required_temp ? "
    Required Temperature: [required_temp]K" : ""]
    Required Reagents:") var/reagents_required_string = "" - for(var/datum/reagent/r in reagents_required) - reagents_required_string += "[initial(r.name)]: [reagents_required[r]]
    " + for(var/r in reagents_required) + var/datum/reagent/reagent = r + reagents_required_string += "
    [initial(reagent.name)]: [reagents_required[r]]" to_chat(U, reagents_required_string) return else diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 23ebaec3c2..8fcd97c261 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -222,6 +222,7 @@ /obj/item/pda/bar name = "bartender PDA" icon_state = "pda-bartender" + default_cartridge = /obj/item/cartridge/bartender inserted_item = /obj/item/pen/fountain /obj/item/pda/atmos diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 6de8efd1db..89ff24d2f3 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -14,6 +14,7 @@ GLOB.chemical_reagents_list[path] = D /proc/build_chemical_reactions_list() + message_admins("STARTY START START!") //Chemical Reactions - Initialises all /datum/chemical_reaction into a list // It is filtered into multiple lists within a list. // For example: @@ -26,17 +27,17 @@ //Randomized need to go last since they need to check against conflicts with normal recipes var/paths = subtypesof(/datum/chemical_reaction) - typesof(/datum/chemical_reaction/randomized) + subtypesof(/datum/chemical_reaction/randomized) GLOB.chemical_reactions_list = list() + GLOB.drink_reactions_list = list() for(var/path in paths) var/datum/chemical_reaction/D = new path() var/list/reaction_ids = list() - // store drinks separately for bartender cartridge if(D.id) - if(istype(D.id, /datum/reagent/consumable)) + if(ispath(D.id, /datum/reagent/consumable)) var/datum/reagent/consumable/r = D.id - GLOB.drink_reactions_list[lowertext(initial(r.name))] = D + GLOB.drink_reactions_list[initial(r.name)] = D if(D.required_reagents && D.required_reagents.len) for(var/reaction in D.required_reagents) diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index 8992f4a4a104de0e727b17623492a60598ea59f3..f968d158601eab3e41261e216f8f6877f43f00ad 100644 GIT binary patch literal 16140 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 literal 16000 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 Date: Wed, 23 Feb 2022 00:57:39 +0000 Subject: [PATCH 24/56] improves formatting of the couldn't find reagent text --- code/game/objects/items/devices/PDA/PDA.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 8a97cc9f80..c339b0024c 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -731,7 +731,7 @@ GLOBAL_LIST_EMPTY(PDAs) to_chat(U, reagents_required_string) return else - to_chat(U, "Reagent with term: [option] could not be located!") + to_chat(U, "Reagent with term: [option] could not be located!") //LINK FUNCTIONS=================================== From 405f53b8f9139e6dd3c66a01bb1c92a165502e72 Mon Sep 17 00:00:00 2001 From: BongaTheProto <93835010+BongaTheProto@users.noreply.github.com> Date: Tue, 22 Feb 2022 20:06:08 -0500 Subject: [PATCH 25/56] Idk why it wasn't like this from the beginning Now the roundstart size will actually affect how much fluids you produce --- modular_splurt/code/modules/arousal/organs/breasts.dm | 2 ++ modular_splurt/code/modules/arousal/penis.dm | 4 ++++ tgstation.dme | 1 + 3 files changed, 7 insertions(+) create mode 100644 modular_splurt/code/modules/arousal/penis.dm diff --git a/modular_splurt/code/modules/arousal/organs/breasts.dm b/modular_splurt/code/modules/arousal/organs/breasts.dm index c1e1c1d8de..3dd8e024b0 100644 --- a/modular_splurt/code/modules/arousal/organs/breasts.dm +++ b/modular_splurt/code/modules/arousal/organs/breasts.dm @@ -5,4 +5,6 @@ else fluid_id = initial(fluid_id) . = ..() + fluid_max_volume += (cached_size - breast_values[initial(size)])*2.5 + fluid_rate += (cached_size - breast_values[initial(size)])/10 diff --git a/modular_splurt/code/modules/arousal/penis.dm b/modular_splurt/code/modules/arousal/penis.dm new file mode 100644 index 0000000000..bc4eef27a2 --- /dev/null +++ b/modular_splurt/code/modules/arousal/penis.dm @@ -0,0 +1,4 @@ +/obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H) + . = ..() + fluid_max_volume += (length - initial(length))*2.5 + fluid_rate += (length - initial(length))/10 diff --git a/tgstation.dme b/tgstation.dme index d38c55683d..5c2cc1a80d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4262,6 +4262,7 @@ #include "modular_splurt\code\game\object\structures\barricades.dm" #include "modular_splurt\code\game\object\structures\bathroom.dm" #include "modular_splurt\code\game\object\structures\dresser.dm" +#include "modular_splurt\code\modules\arousal\penis.dm" #include "modular_splurt\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_splurt\code\game\object\structures\false_walls.dm" #include "modular_splurt\code\game\object\structures\flora.dm" From 56547a2556e6ac516c03a85b05efa25ce466e61f Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 23 Feb 2022 11:38:04 +0000 Subject: [PATCH 26/56] generalizes recipe searching, adds chemistry functionality --- code/_globalvars/lists/objects.dm | 3 +- code/game/objects/items/devices/PDA/PDA.dm | 30 ++++++------------- code/game/objects/items/devices/PDA/cart.dm | 3 +- code/modules/reagents/chemistry/holder.dm | 32 +++++++++++++++++++-- 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index d29bdfae23..921b512d32 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -16,7 +16,8 @@ GLOBAL_LIST_EMPTY(singularities) //list of all singularities on the stati GLOBAL_LIST_EMPTY(grounding_rods) //list of all grounding rods on the station GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction datums. Used during chemical reactions -GLOBAL_LIST(drink_reactions_list) //list of all /datum/chemical_reaction datums where the output is of type /datum/reagent/consumable +GLOBAL_LIST(drink_reactions_list) //list of all /datum/chemical_reaction datums where the output is of type /datum/reagent/consumable for bartender PDA +GLOBAL_LIST(normalized_chemical_reactions_list) //list of all /datum/chemical_reaction datums with actual sane indexing for chemistry PDA GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id. GLOBAL_LIST_EMPTY(surgeries_list) //list of all surgeries by name, associated with their path. diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index c339b0024c..1a130998b6 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -371,6 +371,8 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "
  • [PDAIMG(dronephone)]Drone Phone
  • " if (cartridge.access & CART_BARTENDER) dat += "
  • [PDAIMG(bucket)]Drink Recipe Browser
  • " + if (cartridge.access & CART_CHEMISTRY) + dat += "
  • [PDAIMG(bucket)]Chemistry Recipe Browser
  • " dat += "
  • [PDAIMG(atmos)]Atmospheric Scan
  • " dat += "
  • [PDAIMG(flashlight)][fon ? "Disable" : "Enable"] Flashlight
  • " if (pai) @@ -710,28 +712,12 @@ GLOBAL_LIST_EMPTY(PDAs) //DRINK RECIPE BROWSER============================= if("Drink Recipe Browser") if(cartridge && cartridge.access & CART_BARTENDER) - var/option = input(U, "Enter keyword to return a recipe.") - if(option) - option = lowertext(option) - var/list/reagents_required - var/found_reagent_name - var/required_temp - for(var/reagent_name in GLOB.drink_reactions_list) - if(findtext(lowertext(reagent_name), option)) - found_reagent_name = reagent_name - reagents_required = GLOB.drink_reactions_list[reagent_name].required_reagents - required_temp = GLOB.drink_reactions_list[reagent_name].required_temp - break - if(length(reagents_required)) - to_chat(U, "Recipe found: [found_reagent_name][required_temp ? "
    Required Temperature: [required_temp]K" : ""]
    Required Reagents:") - var/reagents_required_string = "" - for(var/r in reagents_required) - var/datum/reagent/reagent = r - reagents_required_string += "
    [initial(reagent.name)]: [reagents_required[r]]" - to_chat(U, reagents_required_string) - return - else - to_chat(U, "Reagent with term: [option] could not be located!") + recipe_search(U, GLOB.drink_reactions_list) + +//CHEMISTRY RECIPE BROWSER + if("Chemistry Recipe Browser") + if(cartridge && cartridge.access & CART_CHEMISTRY) + recipe_search(U, GLOB.normalized_chemical_reactions_list) //LINK FUNCTIONS=================================== diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 9d02207375..ca72e3371b 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -14,6 +14,7 @@ #define CART_HYDROPONICS (1<<13) #define CART_DRONEPHONE (1<<14) #define CART_BARTENDER (1<<15) +#define CART_CHEMISTRY (1<<16) /obj/item/cartridge @@ -78,7 +79,7 @@ /obj/item/cartridge/chemistry name = "\improper ChemWhiz cartridge" icon_state = "cart-chem" - access = CART_REAGENT_SCANNER + access = CART_REAGENT_SCANNER | CART_CHEMISTRY bot_access_flags = MED_BOT /obj/item/cartridge/security diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 89ff24d2f3..e1602fab4a 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -27,7 +27,8 @@ //Randomized need to go last since they need to check against conflicts with normal recipes var/paths = subtypesof(/datum/chemical_reaction) - typesof(/datum/chemical_reaction/randomized) + subtypesof(/datum/chemical_reaction/randomized) GLOB.chemical_reactions_list = list() - GLOB.drink_reactions_list = list() + GLOB.normalized_chemical_reactions_list = list() // chemistry pda + GLOB.drink_reactions_list = list() // bartender pda for(var/path in paths) @@ -35,9 +36,11 @@ var/list/reaction_ids = list() // store drinks separately for bartender cartridge if(D.id) + var/datum/reagent/r = D.id if(ispath(D.id, /datum/reagent/consumable)) - var/datum/reagent/consumable/r = D.id GLOB.drink_reactions_list[initial(r.name)] = D + if(ispath(D.id, /datum/reagent)) + GLOB.normalized_chemical_reactions_list[initial(r.name)] = D if(D.required_reagents && D.required_reagents.len) for(var/reaction in D.required_reagents) @@ -50,6 +53,31 @@ GLOB.chemical_reactions_list[id] += D break // Don't bother adding ourselves to other reagent ids, it is redundant +/proc/recipe_search(mob/M, list/reaction_list) + var/option = input(M, "Enter keyword to return a recipe.") + if(option) + option = lowertext(option) + var/list/reagents_required + var/found_reagent_name + var/required_temp + for(var/reagent_name in reaction_list) + if(findtext(lowertext(reagent_name), option)) + var/datum/chemical_reaction/reaction = reaction_list[reagent_name] + found_reagent_name = reagent_name + reagents_required = reaction.required_reagents + required_temp = reaction.required_temp + break + if(length(reagents_required)) + to_chat(M, "Recipe found: [found_reagent_name][required_temp ? "
    Required Temperature: [required_temp]K" : ""]
    Required Reagents:") + var/reagents_required_string = "" + for(var/r in reagents_required) + var/datum/reagent/reagent = r + reagents_required_string += "
    [initial(reagent.name)]: [reagents_required[r]]" + to_chat(M, reagents_required_string) + return + else + to_chat(M, "Reagent with term: [option] could not be located!") + /////////////////////////////////////////////////////////////////////////////////// /datum/reagents From 027002f92884d0819b8004bb542a3d677e67e091 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 23 Feb 2022 12:07:03 +0000 Subject: [PATCH 27/56] haha what if we didn't show secretcatchem --- code/modules/reagents/chemistry/holder.dm | 4 ++-- code/modules/reagents/chemistry/recipes.dm | 2 ++ code/modules/reagents/chemistry/recipes/special.dm | 2 ++ .../code/modules/reagents/chemistry/recipes/fermi.dm | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e1602fab4a..cdad332def 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -34,8 +34,8 @@ var/datum/chemical_reaction/D = new path() var/list/reaction_ids = list() - // store drinks separately for bartender cartridge - if(D.id) + // store recipes separately for bartender/chemistry cartridges + if(D.id && !D.is_secret) // don't show things like secretcatchem or secret sauce var/datum/reagent/r = D.id if(ispath(D.id, /datum/reagent/consumable)) GLOB.drink_reactions_list[initial(r.name)] = D diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 41c0ed717e..aab46bc3e4 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -38,6 +38,8 @@ var/clear_conversion //bitflags for clear conversions; REACTION_CLEAR_IMPURE or REACTION_CLEAR_INVERSE var/PurityMin = 0.15 //If purity is below 0.15, it explodes too. Set to 0 to disable this. + var/is_secret = FALSE // If it should show in recipe searchers such as the bartender/chemistry PDA functions + /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, multiplier, specialreact) set waitfor = FALSE diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index ad277ef4ff..4aab8e4046 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -54,6 +54,8 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related var/max_result_reagents = 1 var/list/possible_results = list() + is_secret = TRUE + /datum/chemical_reaction/randomized/proc/GenerateRecipe() created = world.time if(randomize_container) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index a78092988e..ce27433c07 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -548,6 +548,8 @@ FermiExplode = FALSE PurityMin = 0.2 + is_secret = TRUE + /datum/chemical_reaction/fermi/secretcatchem/New() //rand doesn't seem to work with n^-e OptimalTempMin += rand(-100, 100) From 00f19c0cf6a7ad243ce631de809f69805792f6e2 Mon Sep 17 00:00:00 2001 From: BongaTheProto <93835010+BongaTheProto@users.noreply.github.com> Date: Thu, 24 Feb 2022 18:30:38 -0500 Subject: [PATCH 28/56] inflation = secured mmmmm cumflation...,~ --- code/__DEFINES/splurtcode/arousal/genitals.dm | 1 + code/modules/arousal/arousal.dm | 4 +- modular_sand/code/modules/arousal/arousal.dm | 6 - .../code/modules/arousal/organs/belly.dm | 39 +++++ .../code/_globalvars/lists/global_lewd.dm | 4 + .../code/datums/interactions/lewd/_lewd.dm | 144 +++++++++++++++++- .../code/modules/arousal/arousal.dm | 11 ++ .../code/modules/arousal/genitals.dm | 23 +++ .../code/modules/arousal/organs/breasts.dm | 23 +++ .../code/modules/arousal/organs/butt.dm | 30 ++++ .../code/modules/arousal/organs/penis.dm | 37 +++++ .../code/modules/arousal/organs/testicles.dm | 2 +- modular_splurt/code/modules/arousal/penis.dm | 4 - .../chemistry/reagents/enlargement.dm | 25 +++ tgstation.dme | 7 +- 15 files changed, 341 insertions(+), 19 deletions(-) create mode 100644 code/__DEFINES/splurtcode/arousal/genitals.dm create mode 100644 modular_splurt/code/modules/arousal/arousal.dm create mode 100644 modular_splurt/code/modules/arousal/genitals.dm create mode 100644 modular_splurt/code/modules/arousal/organs/butt.dm create mode 100644 modular_splurt/code/modules/arousal/organs/penis.dm delete mode 100644 modular_splurt/code/modules/arousal/penis.dm create mode 100644 modular_splurt/code/modules/reagents/chemistry/reagents/enlargement.dm diff --git a/code/__DEFINES/splurtcode/arousal/genitals.dm b/code/__DEFINES/splurtcode/arousal/genitals.dm new file mode 100644 index 0000000000..85b93e94dc --- /dev/null +++ b/code/__DEFINES/splurtcode/arousal/genitals.dm @@ -0,0 +1 @@ +#define GENITAL_INFLATION_THRESHOLD 0.5 diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm index a9acc206a2..98181340b3 100644 --- a/code/modules/arousal/arousal.dm +++ b/code/modules/arousal/arousal.dm @@ -122,7 +122,7 @@ to_chat(L,"[src] climaxes [(Lgen) ? "in your [Lgen.name]" : "with you"], [p_their()] [G.name] spilling nothing!") //SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm) //Sandstorm edit do_climax(fluid_source, spillage ? loc : L, G, spillage) - L.receive_climax(src, Lgen, G, spillage) + //L.receive_climax(src, Lgen, G, spillage) /mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender var/datum/reagents/fluid_source = G.climaxable(src) @@ -260,7 +260,7 @@ // if(partner) //Did they pass the clothing checks? //skyrat edit - mob_climax_partner(G, partner, spillage = forced_spillage, mb_time = 0, Lgen = forced_receiving_genital) //Instant climax due to forced + mob_climax_partner(G, partner, spillage = forced_spillage, mb_time = 0, Lgen = forced_receiving_genital, forced = forced_climax) //Instant climax due to forced // continue //You've climaxed once with this organ, continue on //not exposed OR if no partner was found while exposed, climax alone diff --git a/modular_sand/code/modules/arousal/arousal.dm b/modular_sand/code/modules/arousal/arousal.dm index b1c12abe89..01de24275c 100644 --- a/modular_sand/code/modules/arousal/arousal.dm +++ b/modular_sand/code/modules/arousal/arousal.dm @@ -23,12 +23,6 @@ if(ishuman(partner)) h_partner = partner - if(istype(source_gen, /obj/item/organ/genital/penis)) - h_self.cumdrip_rate += rand(5,10) - if(h_self.has_belly(REQUIRE_ANY) && (h_self.client?.prefs.cit_toggles & BELLY_INFLATION)) - var/obj/item/organ/genital/belly/midsection = h_self.getorganslot(ORGAN_SLOT_BELLY) - to_chat(h_self, " You can feel your belly bloat outwards as [h_partner] fills you up with [h_partner.p_their()] seed, sagging more distended in front of you") - midsection.modify_size(1) if(receiver) switch(receiver.slot) //Feel free to add more options for other receiving genitals if you desire if(ORGAN_SLOT_VAGINA) diff --git a/modular_sand/code/modules/arousal/organs/belly.dm b/modular_sand/code/modules/arousal/organs/belly.dm index ca7ecb53ab..fdaa0c6bee 100644 --- a/modular_sand/code/modules/arousal/organs/belly.dm +++ b/modular_sand/code/modules/arousal/organs/belly.dm @@ -97,4 +97,43 @@ size = D.features["belly_size"] prev_size = size size_cached = size + original_fluid_id = fluid_id + fluid_max_volume += (size - initial(size))*2.5 + fluid_rate += (size - initial(size))/10 toggle_visibility(D.features["belly_visibility"], FALSE) + +/obj/item/organ/genital/belly/climax_modify_size(mob/living/partner, obj/item/organ/genital/source_gen, cum_hole) + if(!(owner.client?.prefs.cit_toggles & BELLY_INFLATION)) + if(owner.has_anus(REQUIRE_EXPOSED) && (cum_hole == CUM_TARGET_ANUS)) + var/obj/item/organ/genital/butt/ass = owner.getorganslot(ORGAN_SLOT_BUTT) + if(!ass) + ass = new + ass.Insert(owner) + ass.climax_modify_size(partner, source_gen) + return + + var/datum/reagents/fluid_source = source_gen.climaxable() + if(!fluid_source) + return + + if(!climax_fluids) + climax_fluids = new + climax_fluids.maximum_volume = INFINITY + + source_gen.generate_fluid(fluid_source) + fluid_source.trans_to(climax_fluids, fluid_source.total_volume) + + if(climax_fluids.total_volume >= fluid_max_volume * GENITAL_INFLATION_THRESHOLD) + var/previous = size + var/growth_amount = climax_fluids.total_volume / (fluid_max_volume * GENITAL_INFLATION_THRESHOLD) + modify_size(growth_amount) + if(size > round(previous)) + owner.visible_message("\The [owner]'s belly bloats outwards as it gets pumped full of[pick(" sweet", "")] [lowertext(source_gen.get_fluid_name())]!", ignored_mobs = owner.get_unconsenting()) + fluid_id = source_gen.get_fluid_id() + if(growth_amount >= 3 || size >= 3) + var/obj/item/organ/genital/butt/ass = owner.getorganslot(ORGAN_SLOT_BUTT) + if(!ass) + ass = new + ass.Insert(owner) + ass.climax_modify_size(partner, source_gen, TRUE) + climax_fluids.clear_reagents() diff --git a/modular_splurt/code/_globalvars/lists/global_lewd.dm b/modular_splurt/code/_globalvars/lists/global_lewd.dm index e2c0693332..77b051c103 100644 --- a/modular_splurt/code/_globalvars/lists/global_lewd.dm +++ b/modular_splurt/code/_globalvars/lists/global_lewd.dm @@ -11,3 +11,7 @@ GLOBAL_LIST_INIT(brap_noises, list( )) GLOBAL_LIST_INIT(breast_nouns, list("breasts", "boobs", "honkers", "tatas", "tiddies", "milktanks", "mammaries", "milk bags", "boobers", "boobies")) //Yeah I need help coming up with better names + +GLOBAL_LIST_INIT(balls_nouns, list("balls", "nuts", "ballsack", "testicles", "sack", "cum orbs", "cum spheres", "cum tanks", "cum holders", "cum churners", "spunk orbs", "spunk spheres", "spunk tanks", "spunk holders", "spunk churners", "nut orbs", "nut spheres", "nut tanks", "nut holders", "nut churners", "jizz orbs", "jizz spheres", "jizz tanks", "jizz holders", "jizz churners", "seed orbs", "seed spheres", "seed tanks", "seed holders", "seed churners")) + +GLOBAL_LIST_INIT(butt_nouns, list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump", "behind")) diff --git a/modular_splurt/code/datums/interactions/lewd/_lewd.dm b/modular_splurt/code/datums/interactions/lewd/_lewd.dm index 129fa36c72..259d6e6265 100644 --- a/modular_splurt/code/datums/interactions/lewd/_lewd.dm +++ b/modular_splurt/code/datums/interactions/lewd/_lewd.dm @@ -1,3 +1,137 @@ +#define CUM_TARGET_NIPPLE "nipple" +#define CUM_TARGET_URETHRA "urethra" + +/mob/living/cum(mob/living/partner, target_orifice) + var/message + var/u_His = p_their() + var/u_He = p_they() + var/u_S = p_s() + var/t_His = partner?.p_their() + var/cumin = FALSE + var/partner_carbon_check = FALSE + var/obj/item/organ/genital/target_gen + var/mob/living/carbon/c_partner + var/cum_the_II = FALSE //If the cumming interaction is fully handled here or goes back to ..() + //Carbon checks + if(iscarbon(partner)) + c_partner = partner + partner_carbon_check = TRUE + + if(src != partner) + if(!last_genital) + if(has_penis()) + if(!istype(partner)) + target_orifice = null + switch(target_orifice) + if(CUM_TARGET_NIPPLE) + cum_the_II = TRUE + cumin = TRUE + if(partner.has_breasts()) + message = "cums iside \the [partner]'s nipple!." + target_gen = partner.getorganslot(ORGAN_SLOT_BREASTS) + else + message = "cums on \the [partner]'s chest and neck." + if(partner.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) + target_gen = new /obj/item/organ/genital/breasts + target_gen.Insert(partner) + + if(target_gen) + target_gen.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS)) + if(CUM_TARGET_URETHRA) + cum_the_II = TRUE + cumin = TRUE + message = "cums down \the [partner]'s [pick(GLOB.dick_nouns + list("[pick("cock", "dick")]hole", "urethra"))]!" + target_gen = partner.getorganslot(ORGAN_SLOT_PENIS) + target_gen.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS)) + if(CUM_TARGET_MOUTH, CUM_TARGET_THROAT, CUM_TARGET_VAGINA, CUM_TARGET_BELLY, CUM_TARGET_ANUS) + if(partner.client?.prefs.cit_toggles & BELLY_INFLATION) + var/obj/item/organ/genital/belly/gut = partner.getorganslot(ORGAN_SLOT_BELLY) + if(!gut) + gut = new + gut.Insert(partner) + gut.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS), target_orifice) + else if((partner.client?.prefs.cit_toggles & BUTT_ENLARGEMENT) && target_orifice == CUM_TARGET_ANUS) + var/obj/item/organ/genital/butt/ass = partner.getorganslot(ORGAN_SLOT_BUTT) + if(!ass) + ass = new + ass.Insert(partner) + ass.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS)) + else + switch(last_genital.type) + if(/obj/item/organ/genital/penis) + if(!istype(partner)) + target_orifice = null + switch(target_orifice) + if(CUM_TARGET_NIPPLE) + cumin = TRUE + cum_the_II = TRUE + if(partner.has_breasts()) + message = "cums iside \the [partner]'s nipple!." + target_gen = partner.getorganslot(ORGAN_SLOT_BREASTS) + else + message = "cums on \the [partner]'s chest and neck." + if(partner.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) + target_gen = new /obj/item/organ/genital/breasts + target_gen.Insert(partner) + + if(target_gen) + target_gen.climax_modify_size(src, last_genital) + if(CUM_TARGET_URETHRA) + cum_the_II = TRUE + cumin = TRUE + message = "cums down \the [partner]'s [pick(GLOB.dick_nouns + list("[pick("cock", "dick")]hole", "urethra"))]!" + target_gen = partner.getorganslot(ORGAN_SLOT_PENIS) + target_gen.climax_modify_size(src, last_genital) + if(CUM_TARGET_MOUTH, CUM_TARGET_THROAT, CUM_TARGET_VAGINA, CUM_TARGET_BELLY, CUM_TARGET_ANUS) + if(partner.client?.prefs.cit_toggles & BELLY_INFLATION) + var/obj/item/organ/genital/belly/gut = partner.getorganslot(ORGAN_SLOT_BELLY) + if(!gut) + gut = new + gut.Insert(partner) + gut.climax_modify_size(src, last_genital, target_orifice) + else if((partner.client?.prefs.cit_toggles & BUTT_ENLARGEMENT) && target_orifice == CUM_TARGET_ANUS) + var/obj/item/organ/genital/butt/ass = partner.getorganslot(ORGAN_SLOT_BUTT) + if(!ass) + ass = new + ass.Insert(partner) + ass.climax_modify_size(src, last_genital) + if(!cum_the_II) + return ..() + if(gender == MALE) + playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/final_m1.ogg', + 'modular_sand/sound/interactions/final_m2.ogg', + 'modular_sand/sound/interactions/final_m3.ogg', + 'modular_sand/sound/interactions/final_m4.ogg', + 'modular_sand/sound/interactions/final_m5.ogg'), 90, 1, 0) + else if(gender == FEMALE) + playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/final_f1.ogg', + 'modular_sand/sound/interactions/final_f2.ogg', + 'modular_sand/sound/interactions/final_f3.ogg'), 70, 1, 0) + else + playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/final_f1.ogg', + 'modular_sand/sound/interactions/final_f2.ogg', + 'modular_sand/sound/interactions/final_f3.ogg'), 70, 1, 0) + visible_message(message = "\The [src] [message]", ignored_mobs = get_unconsenting()) + multiorgasms += 1 + + if(multiorgasms > (get_sexual_potency() * 0.34)) //AAAAA, WE DONT WANT NEGATIVES HERE, RE + refractory_period = world.time + rand(300, 900) - get_sexual_potency()//sex cooldown + // set_drugginess(rand(20, 30)) + else + refractory_period = world.time + rand(300, 900) - get_sexual_potency() + // set_drugginess(rand(5, 10)) + if(multiorgasms < get_sexual_potency()) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(!partner) + H.mob_climax(TRUE, "masturbation", "none") + else + H.mob_climax(TRUE, "sex", partner, !cumin, target_gen) + set_lust(0) + SEND_SIGNAL(src, COMSIG_MOB_CAME, target_orifice, partner) + +// Interaction Procs + /mob/living/proc/do_breastsmother(mob/living/target) var/message var/u_His = p_their() @@ -90,7 +224,7 @@ var/u_His = p_their() var/t_His = target.p_their() var/lust_increase = 1 - var/list/balls = list("balls", "nuts", "[pick(list("cum", "spunk", "nut", "jizz", "seed"))] [pick(list("orbs", "spheres", "tanks", "holders"))]") + var/list/balls = list("balls", "nuts", "[pick(list("cum", "spunk", "nut", "jizz", "seed"))] [pick(list("orbs", "spheres", "tanks", "holders", "churners"))]") var/list/lines if(target.is_fucking(src, NUTS_TO_FACE)) @@ -126,7 +260,7 @@ 'modular_sand/sound/interactions/bang6.ogg', ) - if(is_fucking(target, CUM_TARGET_PENIS)) + if(is_fucking(target, CUM_TARGET_URETHRA)) lines = list( "humps right into \the [target]'s [pick(cock)], stretiching it as their balls slam together", "slides [u_His] [pick(cock)] all the way down \the [target]'s own throbbing [pick(cock)], [t_His] urethra is so tight!", @@ -138,13 +272,13 @@ "grinds [u_His] tip against \the [target]'s [pick(cock)], only to slide [u_His] whole [pick(cock)] all the way down to [t_His] base", "makes \the [target]'s fat [pick(cock)] stretch and throb as the size of [u_His] [pick(cock)] makes its way right in" ) - set_is_fucking(target, CUM_TARGET_PENIS, getorganslot(ORGAN_SLOT_PENIS)) + set_is_fucking(target, CUM_TARGET_URETHRA, getorganslot(ORGAN_SLOT_PENIS)) message = "\The [src] [pick(lines)]" visible_message(message, ignored_mobs = get_unconsenting()) playlewdinteractionsound(src, pick(noises), 70, 1, -1) - handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, target) - target.handle_post_sex(NORMAL_LUST, CUM_TARGET_PENIS, src) + handle_post_sex(NORMAL_LUST, CUM_TARGET_URETHRA, target) + target.handle_post_sex(NORMAL_LUST, CUM_TARGET_URETHRA, src) //////////////////////////////////////////////////////////////////////////////////////////////////////// ///////// U N H O L Y ///////// diff --git a/modular_splurt/code/modules/arousal/arousal.dm b/modular_splurt/code/modules/arousal/arousal.dm new file mode 100644 index 0000000000..9b57eb9286 --- /dev/null +++ b/modular_splurt/code/modules/arousal/arousal.dm @@ -0,0 +1,11 @@ +/mob/living/carbon/human/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage, mb_time, obj/item/organ/genital/Lgen, forced = FALSE) + . = ..() + L.receive_climax(src, Lgen, G, spillage, forced = forced) + +/mob/living/receive_climax(mob/living/partner, obj/item/organ/genital/receiver, obj/item/organ/genital/source_gen, spill, forced) + . = ..() + + if(!receiver || spill || forced) + return + + receiver.climax_modify_size(partner, source_gen) diff --git a/modular_splurt/code/modules/arousal/genitals.dm b/modular_splurt/code/modules/arousal/genitals.dm new file mode 100644 index 0000000000..b5508b6215 --- /dev/null +++ b/modular_splurt/code/modules/arousal/genitals.dm @@ -0,0 +1,23 @@ +/obj/item/organ/genital + var/datum/reagents/climax_fluids + var/datum/reagent/original_fluid_id + + +/obj/item/organ/genital/proc/climax_modify_size(mob/living/partner, obj/item/organ/genital/source_gen) + return + +/obj/item/organ/genital/proc/get_fluid_id() + if(fluid_id) + return fluid_id + else if(linked_organ.fluid_id) + return linked_organ.fluid_id + return + +/obj/item/organ/genital/proc/get_fluid_name() + var/milkies = get_fluid_id() + var/message + if(!milkies) //No milkies?? + return + var/datum/reagent/R = GLOB.chemical_reactions_list[milkies] + message = R.name + return message diff --git a/modular_splurt/code/modules/arousal/organs/breasts.dm b/modular_splurt/code/modules/arousal/organs/breasts.dm index 3dd8e024b0..b997c09026 100644 --- a/modular_splurt/code/modules/arousal/organs/breasts.dm +++ b/modular_splurt/code/modules/arousal/organs/breasts.dm @@ -4,7 +4,30 @@ fluid_id = D.features["breasts_fluid"] else fluid_id = initial(fluid_id) + original_fluid_id = fluid_id . = ..() fluid_max_volume += (cached_size - breast_values[initial(size)])*2.5 fluid_rate += (cached_size - breast_values[initial(size)])/10 +/obj/item/organ/genital/breasts/climax_modify_size(mob/living/partner, obj/item/organ/genital/source_gen) + if(!(owner.client?.prefs.cit_toggles & BREAST_ENLARGEMENT)) + return + + var/datum/reagents/fluid_source = source_gen.climaxable(partner) + if(!fluid_source) + return + + if(!climax_fluids) + climax_fluids = new + climax_fluids.maximum_volume = INFINITY //Just in case + + source_gen.generate_fluid(fluid_source) + fluid_source.trans_to(climax_fluids, fluid_source.total_volume) + + if(climax_fluids.total_volume >= fluid_max_volume * GENITAL_INFLATION_THRESHOLD) + var/previous = size + modify_size(climax_fluids.total_volume / (fluid_max_volume * GENITAL_INFLATION_THRESHOLD)) + if(size != previous) + owner.visible_message("\The [owner]'s [pick(GLOB.breast_nouns)] swell up with the surge of [lowertext(source_gen.get_fluid_name())] from \the [partner]'s [source_gen.name]", ignored_mobs = owner.get_unconsenting()) + fluid_id = source_gen.get_fluid_id() + climax_fluids.clear_reagents() diff --git a/modular_splurt/code/modules/arousal/organs/butt.dm b/modular_splurt/code/modules/arousal/organs/butt.dm new file mode 100644 index 0000000000..5163b3efb3 --- /dev/null +++ b/modular_splurt/code/modules/arousal/organs/butt.dm @@ -0,0 +1,30 @@ +/obj/item/organ/genital/butt/get_features(mob/living/carbon/human/H) + . = ..() + original_fluid_id = fluid_id + fluid_max_volume += (size - initial(size))*2.5 + fluid_rate += (size - initial(size))/10 + +/obj/item/organ/genital/butt/climax_modify_size(mob/living/partner, obj/item/organ/genital/source_gen, from_belly = FALSE) + if(!(owner.client?.prefs.cit_toggles & BUTT_ENLARGEMENT)) + return + + var/datum/reagents/fluid_source = source_gen.climaxable() + if(!fluid_source) + return + + if(!climax_fluids) + climax_fluids = new + climax_fluids.maximum_volume = INFINITY + + source_gen.generate_fluid(fluid_source) + fluid_source.trans_to(climax_fluids, fluid_source.total_volume) + + if(climax_fluids.total_volume >= fluid_max_volume * GENITAL_INFLATION_THRESHOLD) + var/previous = size + var/growth_amount = (from_belly ? min(climax_fluids.total_volume, 1) : climax_fluids.total_volume) + var/list/asscheeks = list("asscheeks", "buttcheeks", "ass buns", "booty pillows", "dumptruck spheres", "[pick(list("jiggly", "bouncy", "wobbly"))] buttocks") + modify_size(growth_amount) + if(size != previous) + owner.visible_message("\The [owner]'s [pick(GLOB.butt_nouns + asscheeks)] bounce\s outwards lewdly as [owner.p_they()] get[owner.p_s()] pumped full of [lowertext(source_gen.get_fluid_name())] from behind!", ignored_mobs = owner.get_unconsenting()) + fluid_id = source_gen.get_fluid_id() + climax_fluids.clear_reagents() diff --git a/modular_splurt/code/modules/arousal/organs/penis.dm b/modular_splurt/code/modules/arousal/organs/penis.dm new file mode 100644 index 0000000000..a54758674a --- /dev/null +++ b/modular_splurt/code/modules/arousal/organs/penis.dm @@ -0,0 +1,37 @@ +/obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H) + . = ..() + original_fluid_id = fluid_id + fluid_max_volume += (length - initial(length))*2.5 + fluid_rate += (length - initial(length))/10 + +/obj/item/organ/genital/penis/climax_modify_size(mob/living/partner, obj/item/organ/genital/source_gen) + if(!(owner.client?.prefs.cit_toggles & PENIS_ENLARGEMENT)) + return + + var/datum/reagents/fluid_source = source_gen.climaxable(partner) + if(!fluid_source) + return + + var/datum/reagents/target + if(linked_organ) + if(!linked_organ.climax_fluids) + linked_organ.climax_fluids = new + linked_organ.climax_fluids.maximum_volume = INFINITY + target = linked_organ.climax_fluids + else + if(!climax_fluids) + climax_fluids = new + climax_fluids.maximum_volume = INFINITY + target = climax_fluids + + source_gen.generate_fluid(fluid_source) + fluid_source.trans_to(target, fluid_source.total_volume) + + if(target.total_volume >= fluid_max_volume * GENITAL_INFLATION_THRESHOLD) + var/previous = size + modify_size(target.total_volume / (fluid_max_volume * GENITAL_INFLATION_THRESHOLD)) + if(size != previous) + owner.visible_message("\The [owner]'s [pick(GLOB.dick_nouns)][linked_organ ? " and [pick(list("nuts", "balls", "testicles", "ballsack", "sack"))]" : ""] swell and grow bigger as they get pumped full of \the [partner]'s [lowertext(source_gen.get_fluid_name())]!", ignored_mobs = owner.get_unconsenting()) + if(linked_organ) + linked_organ.fluid_id = source_gen.get_fluid_id() + target.clear_reagents() diff --git a/modular_splurt/code/modules/arousal/organs/testicles.dm b/modular_splurt/code/modules/arousal/organs/testicles.dm index 8f0391e9ac..a29fda337b 100644 --- a/modular_splurt/code/modules/arousal/organs/testicles.dm +++ b/modular_splurt/code/modules/arousal/organs/testicles.dm @@ -4,5 +4,5 @@ fluid_id = D.features["balls_fluid"] else fluid_id = initial(fluid_id) + original_fluid_id = fluid_id . = ..() - diff --git a/modular_splurt/code/modules/arousal/penis.dm b/modular_splurt/code/modules/arousal/penis.dm deleted file mode 100644 index bc4eef27a2..0000000000 --- a/modular_splurt/code/modules/arousal/penis.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H) - . = ..() - fluid_max_volume += (length - initial(length))*2.5 - fluid_rate += (length - initial(length))/10 diff --git a/modular_splurt/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_splurt/code/modules/reagents/chemistry/reagents/enlargement.dm new file mode 100644 index 0000000000..acba6fce9c --- /dev/null +++ b/modular_splurt/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -0,0 +1,25 @@ +/datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) + if(M.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) + var/obj/item/organ/genital/breasts/tity = M.getorganslot(ORGAN_SLOT_BREASTS) + tity?.fluid_id = tity?.original_fluid_id + . = ..() + +/datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/human/M) + if(M.client?.prefs.cit_toggles & PENIS_ENLARGEMENT) + var/obj/item/organ/genital/penis/pp = M.getorganslot(ORGAN_SLOT_PENIS) + var/obj/item/organ/genital/testicles/balls = M.getorganslot(ORGAN_SLOT_TESTICLES) + pp?.fluid_id = pp?.original_fluid_id + balls?.fluid_id = balls?.original_fluid_id + . = ..() + +/datum/reagent/fermi/butt_enlarger/overdose_process(mob/living/M) + if(M.client?.prefs.cit_toggles & BUTT_ENLARGEMENT) + var/obj/item/organ/genital/butt/ass = M.getorganslot(ORGAN_SLOT_BUTT) + ass?.fluid_id = ass?.original_fluid_id + . = ..() + +/datum/reagent/fermi/butt_enlarger/overdose_process(mob/living/M) + if(M.client?.prefs.cit_toggles & BELLY_INFLATION) + var/obj/item/organ/genital/belly/gut = M.getorganslot(ORGAN_SLOT_BELLY) + gut?.fluid_id = gut?.original_fluid_id + . = ..() diff --git a/tgstation.dme b/tgstation.dme index 5c2cc1a80d..3a900ee7eb 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -186,6 +186,7 @@ #include "code\__DEFINES\splurtcode\sound.dm" #include "code\__DEFINES\splurtcode\subsystems.dm" #include "code\__DEFINES\splurtcode\traits.dm" +#include "code\__DEFINES\splurtcode\arousal\genitals.dm" #include "code\__DEFINES\storage\_storage.dm" #include "code\__DEFINES\storage\volumetrics.dm" #include "code\__DEFINES\zeros\species.dm" @@ -4262,7 +4263,10 @@ #include "modular_splurt\code\game\object\structures\barricades.dm" #include "modular_splurt\code\game\object\structures\bathroom.dm" #include "modular_splurt\code\game\object\structures\dresser.dm" -#include "modular_splurt\code\modules\arousal\penis.dm" +#include "modular_splurt\code\modules\arousal\arousal.dm" +#include "modular_splurt\code\modules\arousal\genitals.dm" +#include "modular_splurt\code\modules\arousal\organs\butt.dm" +#include "modular_splurt\code\modules\arousal\organs\penis.dm" #include "modular_splurt\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_splurt\code\game\object\structures\false_walls.dm" #include "modular_splurt\code\game\object\structures\flora.dm" @@ -4402,6 +4406,7 @@ #include "modular_splurt\code\modules\reagents\chemistry\reagents\alcohol_reagents.dm" #include "modular_splurt\code\modules\reagents\chemistry\reagents\cit_reagents.dm" #include "modular_splurt\code\modules\reagents\chemistry\reagents\drug_reagents.dm" +#include "modular_splurt\code\modules\reagents\chemistry\reagents\enlargement.dm" #include "modular_splurt\code\modules\reagents\chemistry\reagents\food_reagents.dm" #include "modular_splurt\code\modules\reagents\chemistry\recipes\drugs.dm" #include "modular_splurt\code\modules\reagents\chemistry\recipes\lewd.dm" From 50d233db45be1780f2d414223da4353d1c5cca40 Mon Sep 17 00:00:00 2001 From: BongaTheProto <93835010+BongaTheProto@users.noreply.github.com> Date: Tue, 22 Feb 2022 12:34:20 -0500 Subject: [PATCH 29/56] teehee uwu --- code/game/objects/items/crayons.dm | 2 +- icons/effects/crayondecal.dmi | Bin 46544 -> 52832 bytes tgstation.dme | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index bf1fdb1716..fa6567864e 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -36,7 +36,7 @@ var/text_buffer = "" var/static/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","star","poseur tag","prolizard","antilizard", "tile") - var/static/list/symbols = list("danger","firedanger","electricdanger","biohazard","radiation","safe","evac","space","med","trade","shop","food","peace","like","skull","nay","heart","credit") + var/static/list/symbols = list("danger","firedanger","electricdanger","biohazard","radiation","safe","evac","space","med","trade","shop","food","peace","like","skull","nay","heart","credit", "sonne", "ironguard", "scp", "falange", "swas") var/static/list/drawings = list("smallbrush","brush","largebrush","splatter","snake","stickman","carp","ghost","clown","taser","disk","fireaxe","toolbox","corgi","cat","toilet","blueprint","beepsky","scroll","bottle","shotgun") var/static/list/oriented = list("arrow","line","thinline","shortline","body","chevron","footprint","clawprint","pawprint") // These turn to face the same way as the drawer var/static/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6") diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi index 8c42e6610cb5a90c435a022084aedc9c1492cd86..481d4e232669444076b6a70894d5e5ae5f575d64 100644 GIT binary patch delta 9390 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 diff --git a/tgstation.dme b/tgstation.dme index 3a900ee7eb..335db5f5ff 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4267,7 +4267,6 @@ #include "modular_splurt\code\modules\arousal\genitals.dm" #include "modular_splurt\code\modules\arousal\organs\butt.dm" #include "modular_splurt\code\modules\arousal\organs\penis.dm" -#include "modular_splurt\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_splurt\code\game\object\structures\false_walls.dm" #include "modular_splurt\code\game\object\structures\flora.dm" #include "modular_splurt\code\game\object\structures\ghost_role_spawners.dm" @@ -4383,6 +4382,7 @@ #include "modular_splurt\code\modules\mob\living\carbon\human\simple_animal\hostile\deathclaw\deathclaw.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\simple_animal\hostile\deathclaw\funclaw.dm" #include "modular_splurt\code\modules\mob\living\carbon\human\species_types\ashwalker.dm" +#include "modular_splurt\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_splurt\code\modules\mob\living\silicon\robot\robot_modules.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\carrion.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\hostile\dancer.dm" From 83c6e7434956decbf8915001bce5def36abadf9a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 25 Feb 2022 00:35:49 +0000 Subject: [PATCH 30/56] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-15514.yml | 4 ---- html/changelogs/AutoChangeLog-pr-15527.yml | 7 ------- html/changelogs/archive/2022-02.yml | 9 +++++++++ 3 files changed, 9 insertions(+), 11 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-15514.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-15527.yml diff --git a/html/changelogs/AutoChangeLog-pr-15514.yml b/html/changelogs/AutoChangeLog-pr-15514.yml deleted file mode 100644 index 4ba99f6c52..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15514.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - rscadd: "adds snake coiling" diff --git a/html/changelogs/AutoChangeLog-pr-15527.yml b/html/changelogs/AutoChangeLog-pr-15527.yml deleted file mode 100644 index 992cfac2b2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15527.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "TripleShades" -delete-after: True -changes: - - rscadd: "[Omega] Additional Solar Panels to both existing arrays" - - rscadd: "[Omega] Floor tile underneath library maint airlock" - - rscadd: "[Omega] Contraband locker to Armoury" - - bugfix: "[Omega] Solar Array SMES Units actually connect to the grid properly now" diff --git a/html/changelogs/archive/2022-02.yml b/html/changelogs/archive/2022-02.yml index 4d58b2e226..0715711ef7 100644 --- a/html/changelogs/archive/2022-02.yml +++ b/html/changelogs/archive/2022-02.yml @@ -145,3 +145,12 @@ accessible by engineers tweak: [Omega] Chapel mass driver and mass driver bulkhead are now controlled by one button instead of two' - bugfix: '[Omega] Lawyer''s carpet is no longer airless' +2022-02-25: + TripleShades: + - rscadd: '[Omega] Additional Solar Panels to both existing arrays' + - rscadd: '[Omega] Floor tile underneath library maint airlock' + - rscadd: '[Omega] Contraband locker to Armoury' + - bugfix: '[Omega] Solar Array SMES Units actually connect to the grid properly + now' + timothyteakettle: + - rscadd: adds snake coiling From 7c9bef2a049b7f4dff53c76b47da06363008a017 Mon Sep 17 00:00:00 2001 From: BongaTheProto <93835010+BongaTheProto@users.noreply.github.com> Date: Thu, 24 Feb 2022 23:01:03 -0500 Subject: [PATCH 31/56] teehe (the sequel) reloaded --- code/game/objects/items/crayons.dm | 2 +- icons/effects/crayondecal.dmi | Bin 52832 -> 55400 bytes tgstation.dme | 8 ++++---- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index fa6567864e..a231da32c8 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -37,7 +37,7 @@ var/static/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka","star","poseur tag","prolizard","antilizard", "tile") var/static/list/symbols = list("danger","firedanger","electricdanger","biohazard","radiation","safe","evac","space","med","trade","shop","food","peace","like","skull","nay","heart","credit", "sonne", "ironguard", "scp", "falange", "swas") - var/static/list/drawings = list("smallbrush","brush","largebrush","splatter","snake","stickman","carp","ghost","clown","taser","disk","fireaxe","toolbox","corgi","cat","toilet","blueprint","beepsky","scroll","bottle","shotgun") + var/static/list/drawings = list("smallbrush","brush","largebrush","splatter","snake","stickman","carp","ghost","clown","taser","disk","fireaxe","toolbox","corgi","cat","toilet","blueprint","beepsky","scroll","bottle","shotgun", "boobs", "booty", "bdragon") var/static/list/oriented = list("arrow","line","thinline","shortline","body","chevron","footprint","clawprint","pawprint") // These turn to face the same way as the drawer var/static/list/runes = list("rune1","rune2","rune3","rune4","rune5","rune6") var/static/list/randoms = list(RANDOM_ANY, RANDOM_RUNE, RANDOM_ORIENTED, diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi index 481d4e232669444076b6a70894d5e5ae5f575d64..c923eff233a6c22c66451f59504dbc1df73f649f 100644 GIT binary patch literal 55400 zcmb@uWmFVw*grUglr#uPceiwRr*wxPDcvBTba!`mcStwVjR?{rNDM8Ad-J^i_w4Ss z{jletXBdXzjw^m~L4=x$EE)q-c3b!~#Os0|UYxv9^kcRchT%j17iP{ex$4%p8l1Z6J3-egThMU2at!O7c4QpyDm_v`=sUtTo|&##b|| zig0{x4Zi}>u;5oM2S(26n_9(-POORbdK($2cjiy^M{_8=3B$yPU6T)JB5QBUBXu*< z5?uOM^=nKu3~UE--N-Uz<&D}Y2Yc$xN0|(NGmYGw`zk~G&(3}+pbE5pSeI~n?qNBw5%9Xj1I`dWrI7BeN%&h}f~8I;D{-qD(oyN$o(y5^|2 z9|e5+wOj7Svd89}DZ5>KXa~2L7!x?OeRm{R>^zbqI|m6_l7(H3iZ@Y%C%F@yb!~^! zbBPtSV^Vg?)vMh3=vRWzsv~h84$90)FA-E_Yn4d~E1Gdf9lm}^br_hz6z1r?N;EV* zU5bpV_TBWE_y4dFE?EpWth<)%tZ=KIQ2mZ9lbfFqZ(&h6wIdG3Z-)T)Xw3&=%k2ze30oMLV=gR$@qkS z9W4mIIYfJVS@kP3Blq;F)7R$@ugUF-Fd3JM4$8p6{&H&OIL=Jf?V@5uNtC zpivB4AusXoKfRY0I~hJS@p*cYCXUCm5Zjk>Ho;cvha6rqxp#gDF&uDB;5{cZ?~~|C zy?@1{qxU(y_!PhQ?ga<+jK=Akw5vBEO;L`ALwA+UAy+Y%hLeY!w@nkF1AP$-e+i@XfdlcL@0aR{?mSRSDXLV1rJt8~kM};Ue=#SZmbkl-(3*kH zX?L40x3Q6kEpzvY&j#*2lrZ$Cg7OOuep+Sao$vh(%hF@~Chrns)9Ui7C+dC%mssv6 z*wEQaJ4D)HTSmDjGTl>-uVQJ@?(6Vzkn(qXQt^|j5j!q6;%|JUMIPJPM>HXil4xq? z`~`o$JXH`wuX(1;n2s^iyn131GYcJ5@AVL8gg4gZb}_SF z^41k9?!J;umtJB#&g=PlZx>1^i>fxyTVkU$xZ4aW@+f@GKZ%psjJZiFa?AJQjEgEg z%*=|D6@FEn@gZ2yc^oF$?M;I$MkxMBu}Hr?6_|OL3TxbqDoSo;kPvP zx276|mDAq~FIABb)%+t3Gnf(m8Dcb+#r5|%O2qjS>VEmXDGzAi5M&8xy=L?MM6%MG za>6w+Q)aeSOWf`kqCCnk&uh|Xd6cx1j!!4TR#1};O_nZW8fjxJqNgg`_f!yD>B4zw z*O}^$T{*yXS~XBLpE{mqi_b|n){SSL@C12sQ>IyXM361MnVZET@u$>$%R$cBr(fFsDsfrck5L!XF_f_HS`|JEEw zP+eXx`I;(KPfJDc-kdn<&s!e-tgB?p)TJuPdj$L3vLnleL`T_JyrDwd01v{vuO`%Q zM?Y-Q)+l8giO4zo7x6Vb`jKQ!WQ&{7hy<*)D8zC)w5rHZGKw-8^1>H0M&F7377#lX z2!Xd)DfH8NF^MEgW8il`+{hp&ORLD->y?V^E*px}~k zdF6`VK2?s-&Se&_4mE6}guYEl_bfIx`}cPt*d`KMW$)$~#x2qrS+mk)myx4#5~N=b zKVIG^xqq&l)?PAG*e_d1V9HI>Mc3mi@uTRS_>(q{_xEHy2)vtIU& z|DxLHsdv4}vDeN@Q2mRZ#oPSdTUvTwWXl(L^BVqBiUOU<2$s_5C~FMfY3@Dfdj?BU z)i~-s@r^D>{t5#LTn?`j#wLpWII8!eY>;i}iQ1(H+y0WP-^u3%Y5B@gk)(J?^Nc3n z9R27?YQ}pBv)+-+<3Pn^rQ%hqz=;V>w=1jGXxQi&3);ybs!!a`cbqIfVK^%PGwL?a zBg~bcHw?R~70KAGZ1s-8A8b)o)uQq_dMOkoW{SDJ%*tJV5?WdGUR%1;6q~K6C+!F&H4nLIj=JrYC8cVV zCE6$m#=)!E)1|8VeAT+I`J;dFG2zmKfdVfedxOBscasU*w+H4{*C~dE9RS7ew75tNzRaqx0w^UJVjxixd@97w4X?YUF)(BAzn;K;u`wnl3)?S8_tQ+CxvUKu#Cc}S&GF&p_t2RNOYj2q zHRU8uZ&q_ftZpXfy`h)Qx9!WZeHt3HT2j2@*#68U9^K$(i0hZE^&a{akI>M0| zP=tK+Mh-b%mFftQ+07?(moSqmV4IXFYH83#NyKo?e(-!RKi-iNADQb(&2*EoXcB_5_45WT~Ud6;u*#wr3jZ_G*R z;D(cPt=kTviXC}w;g|I)OLO>N^7Z7n#q^AaIL|G&=PkuoFMqT!i1ZdB47H(kQSPC7 z&my6q^_-&QV$hwv&E3Bw6L_)GP0hY9KD+#;lFC^#x{06piXRon| zwex_+t@%Y*@zkpq88^|GY-4NTM3}B4`g&`HVPuh4uKeTi+UtG#=Iwq;H}m_Hvjz8)lL;~O0lAzK?)XZ{ zByIs|St=U*VPTFO+DFA_vmk75A6C?nmRFv9?(-_DOAHDR(^vORu_iOG#JTrnNP4VN03-uK04cQYn z@0Xq|_MN^Lx>ED=#`64~cR#~JhPk-TYr2ZzCtu^EarCPP*luU!2*v?6GV6hTB;=k$ z;(#vtQj#{x$Q5Uk^Zx5>A8ss}9_}HU)Gi8^p`J3d|Fu=|OCGYpmAD0{WP1K#3{kLr zfC$=dPrS(>q)(;CRA}JgHD2fdbv;Fp>bJ@sEoeu#LF+5QaOj%rDrqnudu(<<%B+;jeBaH*==zJs;MD2FYwGv!K}-}^L532vg|&8ykk-FSBd zb3Va=M6@tncQ<*0?d%DBs3{jj@IJ9UG>?9?5+}8UiUO4ms*J{w1D%}M*6jHzn)GL; z{&C){g=?>By|A&`!hfW(Xi1o3%iOEzH@yYx`?R-Vk)0gEZJ@Jh9Y#7y*Su*UF;p#9 zle5a!b?0e}m7lvW6@sTD$(a(yj`e_QNoBVBWeHV~9|)FQx>0WZlJ-#h_m*-@qK8v> z=@LIe)}^^BV692+@V+d06y`pBMn@>jiPhL(xXU=F`a~vY;?Y&lA*$6prFZzpP z{q^a@F9Qz~LTxD4!5&<7zRHd1!n|&%L$P!k_a4sG^V`Q%IQNMH zT0Dm8rIDDN31`8E)Z2R5(UUXNTE8XiaS}TlSQKH58uku2xBQGI)(gBInFSlrHQgzf zZ4^EV@~z*m4YOn_UdW{d6IkTDr)BHa(v6y)h8~kE-m5e-QJI(%s*J1BgWHWY{myL}Y!0+vL&ZO>Abm0wV#^MFn3jEJ|Ci&=pbY?WR)}qUp zOS1|!nPec*K;O@*CBanEHrYhqN#9eL$aTCoC(t9!FVCvpkGf_{<^SH;KJ6~;hWf}I z{`QaBQ?6I@WmA*^S6TP=)v$I*10W&QI|k#a*6{pkY#XW_9`hXUnM|13*m$>~G`Gdx z^lEJ2ccUS=KTO4a)5 z_;c)cIc-z+)>D%sm^G<()sJ}B8vE(=F!iQGjoO_O$oMG9@mUSq!E09N8!&bT0Hb0x z+#_X$>2TT}2#G4}qxqk&tK+uA@BR1HNZ7Q%=WiI0R{wz=|NQcHdK5!g7x40z_|l&g z#r}J{LV71;dPyZ!)uh^E_&^yM8G6DPe?0B0`4+nsk(c{!+ms}jXFC^sf;0RM&He|W z6!{ky7oUaGPfr~xYidHa&JZEhh8@@o3kzbogx@JYxBCC}A-^x2nx4k%?tb&;4HqAu z+$XWXKY#upL59sa6hs0tv$B}vaPqAhTCjTt*!(!_;kMWr(D4h!AKa+G1ZH#MEe6Vo6eE{To`ttC^D%W-To( z7;m4Sl%1WO*1IDy-9njpd9pS(HXOI4MY*}8&8@AJdEOWIetQ>Qv-9(mn~a)k8ie+I z#3SeD?Ao=45j2Xad%|RM*2#r)^tQIPYWn&pknqvnb1$I~zb6^tJ3kTo)%pU{Ytc7v zlHSf-US4Vr-OT)=JcCArBOoBCX=@|Ytwfo!hyVHGgQ;Gy8DOI)S%8_6oSfg<%Cm3W z1I3CORx>uvO{qT4eLiI*-B}5>I~BE;VS}0)8X9tIv{$#c3z^(@5N5Zb7h^Axb6AYN z_`Fg~W&X5sJk@4DwCju#B4KT7+qo?$i0Exfk8okb#R(oS@@NVtSkd*+`FYp zt&lM|Wo6}p+S+Naf8dN26cpHbdBYkT8@pHf!BI}l%oG(AP}u2Zp!O&Hy!#&cG9n=X zOTW{NA#q)`pPiq7T*b!Ai-6wPN(%gJvqODl<(Sm7?w_60p#-QMyjy-v+Io7(lmoM~ zYR2Cr^z>e5W@bVe2JptWm(4#xeoUk=^$j$!dVPzMDJng#t*w=?>hIgwFjOB$glJdm z7S!mspfu=KlS6;~`W0xgCCJ4UY|Ry!kdW{>9s{DOtz8J#MrTt}1%tJS(V1@|UQ|@n zY(9)a8~5JIN*!D=I~qN9gsH793X^sQ6Lr(nn6uVT#3&c;_O<5IH?4h~v7 zII!N-@eU8>B#3#T zdvZ*q{OW4vEps$fbo9c;M(lARTw5r9-+->8tLvLu!;ZI3P?*5fR6MY|2?v|%chhtu zqoZpK(v(=nIBZDI_rt{n4=Jy!LlpUN>m7hM&h`=K9s~mp-hm~GHeyp#6N7((T(R1Y z^7+GGq_9EhgefY#C^LI|<}(*A<-xl11dma6y_XMS?DI&RhS zlT%PBLCc-}sYAyRX=!Q8TU+rye*6fstSlk|8HD-gtuwZC8se2XLK0PWg0EdC9Uc4% z9zN~+sRofZ!#d>!2*~9P4Ok$LA${TX`GacUpq@_`BDTO)lRqQ2JXfpNB$JhyDdFwy z-4CT8f*SYwe^g)JO{7s|7Zo)@ouh>h65oZR*s`{_*Zc^7KmvlZ{r(`!HIcRVc+tpx5ep?$pXbv*sEG&XSY@zTkX2SBof2Kr*xw*QEUpY<@ zxwYs)SvrMbjuz6?)Fe0~MKPg+hk(Pdwy|MIev#>dLWzq~(9$H!Ga{9bR-cj?xH%fDa~E1=y;G?hULAtxi( zn*mFGXY%m{_fvXS*1KPAHjllXorH>MtkRSTm}mRAAhG(##^ibuJ%eGHglR!(vhA#W zXKTy2-+>s^-#vkj5X8m9gFtDHfC&{ z5)vAjfg=ej%4|O8&mf9V>HTOWq^S4z8yga9kIQRojZxvX)UK|s)WFSER#nZdu8wtI zYGJ@L`ytCvVlAIvGGO$TvH5}G)Vqv~gM%~6g;r8h^4J;PZSLlloXGaEp=Ne=X(=Rz zh<5;7HTas^OEazGKony#k-WI&I+Hkw>0ywcmDSZ!e8iz!XR^x5XhNi_6e}eqi|$;6 zC2MPXo0M>r1#`tlq7Iwqu(SUA>^Uc}x{rghg_ifU{pp%yC z;+$gRz7wxZ4x~&#Vq{`^sn6D+8$Gbip2}*ZpWH!*9zspVOFq16P11~d}XLo zKu)Nm;k-?G>$FuxM8>=EX1WXuHbMrmQ2jH&04@l(Upgk|QZAb(BKFc zynW_8QZ6Zo7E_b4ZsG8X3I>2~%9g5h-~yKy7mJ^BkBNc7IkB!f{^ah*D zWCO^?o!T>fA<~&NU7T9uFB8pd^_&>!=;q*i!-vg(o}ThRlgpUZ=y4M_({pmBZks$a z{Y5rEmf8r8jEy0I)7$4FI}w(&y~p!EX|3;Y6Zxkg)^Cd0*i#EITu@Mu&A4YX(G7Sh zHy2laVc~%MK*$|id`a}tk&S+%1u~cNq%0}@f7RHSvA3%$Yq`dt?5ja7lwC+D8nk;f z$jHcu^*wYStYl=p#ZLY0+eF^AZKrgAf;dD)<3L_d?BVX+tE#8~JRyEVbk{u|J8Z5A z;8)w#Z+1>j34kNPH9Wqd&6^2BBjUkjRK<-O-M;Wrg8GS&eORrBq2KY%lSyyh|MS=X z>-4nw-#^z3N3__;gruY+%Dmq#ZkwjF_hsd>&W2vjqyKq$u$ju_ZWJn}*-AiYcG*_| z4ThaUVI(s>og5PV;xcj%zaF=xr6pX7@*YzWfZ-fPCINYo`_Sc$4SPdoaCva~-a@1R zKkR_rc;92^WM>zHkOGLIatyJuZr2dBrUnW&QV=rnIvxA_`#+D4V5t8MO;r7$24%H^ z#h_JbSCl<8EUdw0e?lT05fU96O9^U)lCc0dqf%3Lq`e-T_VN_O8Qt|?{)TwWmbrlsHMsa{We4LAX#f17# zj9d&34vwCQY0|*Bva&Mza&yx-UrwK&C{htBvF`2kM^eD}OQ9*dwa+Yom&tw*LZ}d` zgjBH&VQ6Tm(}FTD1u=S2X=y2DW!-|Cjj3rMS=H1_Kr6ymB)|zrEJV7n`ntFzCc;}} zcu->(SaaFR&+82=nnuu@NY>bxIXJ{Z*S2*7|Hib(L&+yj06s}gO~w5uF_xE=Rg{>R z*o`g>_wp>g_Sl|adXX+RI@)x9B4xx$)6aqvd3}4#&3u?Y}it zXk%x$muZ=$Ht87|90H&B(mo}8@~iw=U1zpiGoT}HJU&yQkRwM8rPvGvi~uA6to*A- z5KN038>o3RX}lRA+~?Ugs&wiykqQ7v1<~j|iCCYX(1cMoEG7a0{AGk0_hp3iyBNF} znFM0I30|ccUoWq8&|AEAqq++^I`npB@!J#7V~7xFAl_7YYV=YxG&IqE&3pB(>fgk9 z2-~S(p*~+qj{z8C)@y`^$gQ~ZoT5Mo$jC;|&z(kIH%fvHf?QcEu_11(tHV&DnMQ=C zRO#Q_qXtElAl3FB)|V6jn-}Lt-5M^G0*;NAl2xx>y|Vv+T3;_h>u6GFKi1OPs!c>p zY%%k0&TT**E#GwP&^MLVdOVTFo9NH0IndL$x6NQpt^dB@8h|u~8noJH$R8{&;trcP zbfZNWfAL9iGqOq}tY<&Tp21LM0;DQ4BSRb%*%9|M3nZ0FEhkA%hFehPwY0TM?+zi2 z-2^WH>elUWu{0JC1F#Q}3&02qTV4i+jOgg-&>gUt&4i{Gy}`Q{Ha9ot&lLCJIYGpPg@vs@eBibi*>(Q)`?nTh z=^o*`ckhOpf4pMS2DGu&bU#j}XmMpF47@RA2YleCz!z{CeyF0VN=maE8^i~PhnBAO z!#^=xC|9sxXy~>yf}d&p&UVt)SzC7XG(6Z>u}x-mzdALxc&^+`p!I3B4Ph`={^yJV zJl$N1v^V02rrl0*nIVVVs{N+%ppj)#zB4!foXTPl3K9{iv>*f$6CF)X8izlCL@Dh7 z)#b{#@X7}4RfNg1Etx28w4%4y#I`a=wS(st3VS2o15ik{#X5RF0Qut5Z!6j2GBPr7 zqY@1J%>BhDdG8^i9d7{p2le_bGn9drtKsSR_;_w>%duL1g3e+OjzE%P9Z+DGnPvbYmBx>Vos1V_3&6eXLAyXyq=cdkBy0W732pI zQ$(M7WzXj`7>dTv@y4?lCMGVfsG(ubc^F08xkIXe#lQHO{LIhKo9mmt>LRr^Hy=nx zvdn#qLxA#hiiVCpU#V4PZ;4kgT#r>&ZONYl zr(h5dGR+X9zk~hPD_wZ0YO#j#xsa$C>clP_+~B|=?>?n%xBr8%ocdddCXwel{*N#- zFFq~9zX7n)f9S|9zR67F|Ep5-|3XZ{a;d!kI}7l?5)d!t#_$JLLqkL- zEk(V;I=8VX`os{hp7K8PMOf`|@v#8d(wLM8Y1}BE)gBH?$ocm(fBdb#r=D0SAx`H% z#Jz+_!IB{_rLIcYJ|aIK*7J_`#;~Y9rabOp+@gM+nkuNQR3HMF)tZYjM#tDVc7Fct z*O?g&9i6n_U9)p@1^g6bbt_dL)|=(uU7M%XMh%!<9!xQiVP^3d5W zT3hQb{$|AqpD8OUlFR}K=;vP#ZgL{PWOqh6p=P%(^pUu+y?OFJYkP2N7w{)@+6xyggS2ySi?n=5)hl2wZ{O4uXec71*#spwK{x{1edbKE_8Rm+Z(ZB5qRv# zpr8c0?Gg}!et!4d;+}dbMTv!n0PsL)NN%(rgdD(bpdAu~?m7#5>;b6BJ9NGcGUVq* zhpXGgjx@lu`QX;F1wE(fS2|n|t%2?akY0WiKHEI_G+b|Nje>{@{@2;rCs=jY+j{j6Y>+mG4A&lE^_57XD3?8(R$VfH14q>&$I8v%)8>#abOnm!Y z2kk-6#?p_V$_J)TBab*9^~+ zbCQ!s69FRVc{&tE<{v(l#aq1T{EvzJMno|69)he1L1#0aw&}&9bW3yT2~LN*Z^VL!GVv6d||#3P|A!ii*RX zX*%&p_Hj}9=`c_tSEP9PY%L1%56z$er3eTYa_*fEX7R%LoK|lt1PB$rd9^|5q4dzTZve?92k9OUg7A5rlfQt4f%J_h(Orzw<>fauEs&?Hirm8=PUj4Q zC!L{t@;^Hr44b?VF-V)I48ZD~Riy4fMpc8Od6t!c#0(>5Wn~q~??IW656U9Z3V`c{ z<8Jcu5zc=v^ZpS-fROVR3S?zAbRGHe(c|mVu`w(zW^0%EOXBaI(NdJ+-3SwEdU_QR zu1=`(iqeABZ_Y%Ye|HV3(4bvtHzq z5&)@YWMrgJIHrkXF6q=gV#y6ZIVo+|oXN|J8$wSbQwZ_&@2(^Y#@DL>EdFPbHHjc9gQWS{daNUEOar1b9J?#YL(mzZs2hv z*2|eII}-~kU!fqfY|D8kjQ9{HI!tbsPx44yh_a9meuFy%-B4w5%Bx-JT_2IS;*S_BrxvnK%g0U+9_UEP=Wcf342 zJENl7yz+QwEi1-~5tEbhY2mACga!+PGphB|*PxCyJMYS{AGdi4ov!+@;G$6AqF~k6 z!wmo|j*6{--jM*1uHWxSOn~&f@jO^BlR~Uk#*2>lBQJzW<4TVOhIgGSD1f*fKb^qw z_;mJ91hB^D`+M)CY+dH}nN5>4tHjgKg%9+Kb+GLViwR z3=an|@;Sh9P5a5o`L9MCtTfx?r-FMC&Kd57{$4GFZh@o7_5Wi7`W1SC8j_&L$t*+- zBrg_1AXXS1g}98&I_4W5sFx7J>j=9fV2I4CtQ=nx;`tcY;RBol)a96)iPN&IT8$xd z4)6gh!hN55f3bbP-J;737zx6{dLHQe=4N;2po0(w#PvI*+xz?HKKTwkib&S_M*vrrZA9+(lDw|wWMP=&F;sCoU{%dK zYj;8Q`btkyiky;~YKtn@`aR3B=QYsuOhaEDecrktuQ*DVlWn1r;8fBMeFFq~YisLS z;H_yq0(Fwh*(#``qa*pQu-A(e2|k>kLj;nXQgIE_yQRAAv`VnNBP*DdmDK=(<*5GW z>ZUbY3VWJ%LPEZ84@?aBzR=XAfq=%KObi(48}T+UQ9d<8MWr7Y>9LT?9JJ~-ap z)#c?<08tX;6gFBAm~|UCL~|{kua#KTed24BGydp?k%1P5(B~c(~%|OK;nv(OjQz(;@g_|fV`BoS@ zu-A!+8Ft`BC)xQ#n=Kk3GHeN__c%%xV5osQ1#`3P+sI~AH7zUM`Z|E&5(y!Q;ot5! zLSr+5GrReA*qVjeYjqMnCrD>)6GdloGX^nVe3RcB>&(*Uiv-T6KJ6YHGpc(72^Ns? z@K6!f(9uf^*o{_>K>AX1Y)vCk7KHmhdYhP-Oc*9>z}f*QKIDtqZ>pBbn_>2ukvVRU zI7dc`o`GSGOL<|4zf!5*^UU}IP)I4t79JSl{1pmyvCIcTy8ag*?yj#d z)j7~)7lU1d5sP8#koPmH$ZtqydN({y?gB!4i@S;U*bkC|HK_T~;8$W;2Kg%Zoo1QPY=OiAp!9aTNhS{9H zeQ28lu5-x;Zwm|f&f0~M7$T6G@4NEyaq0tLVAjwizhSGXs$u}?$Q&eQ0tN>+9|5ZQ z(R|6Xdfe%LT<>#j8$7rjO-oTn7e16kr*UGqR8Ztr9Sy4~>Be>}%Kd0wc~sq@uG^|MKB4 zE-Hfa(L9a)x7I200yTPzcx9090OLt^ll`#&M*8~oxhvP>M-TsdsHORFqQ!-`sB@2O zi?Pzp32;@FqP#7C{`@(c-VluX9D-l#*Bo#=BzOWOUl3!e+1XVgFe_PeM3LRh1FwVG zs1p~kaJWPg*l)QME0`fZF-2~x!U*V6 z=1z@a2j?(b&O>Fr_WPrq^;`gbfyT!`rq3y%mEoYOtb8HpQ9L$=u$G7sABqJA3^GPC zvS1=j7p$A@e)`n3t$UR?{LbIn(NQ(S)%_o$1x(d%ue)REZVH>t^RI7aW`S04RMWOu znD@9xcLkoeO=aA&8$Q78F(61r42{_Mjs^H@4Ox~CoCr|b-qZ{vIU z;1WQ^2e1v`yZ2-QvGahdECP1cqSU%6pBTrbiaww_qOt8mnXe>}UET2U;YJiE;LEw* zieIkx!E0Nfz4q81|N1oxj0fU)wVvFwLMoEiF2c7|idzx)wJ0mKMpW-bHkOxDInVmm zC51@ooH=YuUDl*}!5SqBFx`ykdbb=;(9)XGxmdJ~n%*lbl!5vir<}!OQ~AeTfmLPT z4GuvMhqD$apPk7lJEtIsz#9u@xp&3Wt3>iKh)LPLl(x>SMbHM+U}3J%PxS3+1H zQ!kzm6nFs_bOBI0!hf%fb#%f2#y$8PoZVMZT0EbQN0a;UMh|juEv+QzqCom^dp4S+ zDq@2YaP?DNdE-8Ce8 zGbi9+5n(;^6#feH3Y&rP3sM+$^3tEgVU*H)NFTsv(jG}&FZ$5bM;qM*&%WH|A~076 zdEcyA9evw+;_3PO+YwHe93wZH=firjFhDUwrvVS&wnmy}MC_^yoEaC;FT6HfNPYkz zCaUYSGYW_{YU=7{C+uI`kC(F_>7wZ{p32+@oU)Gs#6dG|c|^{8X~);#=4y+UhHCZ8 z#0Zv?D$V4Kmm0aDPBFm`+HKT>$(#74d*PD>5|3CHGl?g@dAaG4kL z?D1EQ8?#wUVcn@*GP>X&>2x)hKxlCd!#4%KP*L2Z$e za_WR|8`Ya|{p?ivdTtJ^y3pmM856#Z!1#|`ilW7%qoWaR=}jnhFMuehi(A?g1%z;i z1k71?jNHJ+kjTKuPjb`}{igM%u56s<9t~dG*zr-(6okaM8Gg0CEMq{sCj7sr1MNb8 z|IZNN=R&ObcJlGz9WfC92VSBVhIrGg%3bXCgEDKhagQIDxRd%HhwVI0-EhWdP(Vrm zNU}2=vpn(W^HnX1+EYSrG~jS~&6Jsz6R%Fd>~iL&ex zXjh3(stEy(4S?z`AUa-K!1pz`Yq;k!&HDgoYy*rsulq99JX)ib2o@)c6#(i zRM#)zVUssPc$i%KiC|R54lBxXVH0znuMQFjl)}(AR@0b}@WaQt!r$|7`KV`?_hZM` zg#ZXdjqWm3L4W)I+P}On@97~0X90XAQ^7W0AyPkppseleg5;z;+#ANk$9=HBd93RK z>#Du)4a>Qm<8z}0PS)JeZ)eTz*SWr@{KNn!&WQf&zWG@cH-9-J8V72M|2svh8aPCB z%!jiCg3_8Aw7PC6%4!GW2mIw9f0RdW(?xxIv~38;DF;bJ{L(l5A3p4W*={gB0{ba2 zL53WY9JpHrYGa(=!SIAREAkwMlm-6Cxi47T(ZwiP8BnAwfm!Y7$mZ_uZkeMZaC*Ky z7`rzmkd`h74 z!eC*2?l)D)sMV0|^7zf!LEWgJqZJ1RRLP&#>W{&oNU;#xTwL7bD88jAbd1XF*CK;} z`!8H!@VNB+M1UB5p+cifE>%?oHNYXIbpbkg`u%6@br$$Rz+~HsGq<;oPVdzc7C0h{ zNlG*J8AtLvS>>=9(kN4z1B*26p5+`x`dN}@%(?MQ!u>=hzg}HmV+l68Zklw{2}b%$ z1%sK$$p>u*Yil_|@ZT7D9>4^$HkQZP*x}3@pw&h2Kk-jySH1&d1w#UEUG#4FnOv1)T?f@9jMH7QiGIb*SgBYJobp0gEGR&`{t5ffgeTc&I5nyuO&s(L}iT zjd(sKB}Y$nkh$4rz`wuAevLl9dkL~~)aW8lRB=KQ9%dFt;r^8ZhumgGtI+&26u{zfZ}|ic1I4z|B~-R^!oh0|OS_F>lV+ znnvf;GBIV}O|w?ps)SAL@*!8D3_7ZfKhKd`rtJVs`)3PX6p?xpzYPZa@4XO!jF#7A zd10hJ;njwvM*_hdi>-Dmti-}Tn(ur^U}XNj&qnMb8#(G!0pcGd5KQz@brZyeRMpnv zwN3N`^O0*!V(u{47rnCF*Pf?oW(Wb~Ach&ZlFl&_ho{Qx%3E0utc!sl#(g8<20AONJQV98q(uZ&T)K*5N&&~WlWxwdG~j@t;cd`zZu;!owy5^ zWsZ`~=FrT~PlzV=yBbk|>Y~2|=SffWFb|~)V)=T!kx*58rBI~4s*Vo+MJColpr+-d z%o_lL64B4_ea5yTzS>_Fb4h>+xuJ{QQ5&FKP1F?v?E#XPsoB=rS_q6dpl#fK_sny} z3%(E2`kzg}`Be^sk>&oY;nMZ{w(f3XAm;*0fzWY&a^B1&IE~GO_C_@67|nC*V_Okh z2k;cWyBTR|Sw7ah!Hc56i(&|%U-3>$QX2d0g8CVb;~8S>TxV*3{A} z00x^%u24i-p1%P8jIq5*B?;M3cX7)bc*pQQc46TdV9tC1q5uTdjvw;!gW-z%TN~xV z0+@wJU40d&t&g`E^V-VRQBUUGZUF9q0#iV7DcWVOzK z0}TB1{#mMnJo^Y>JZB=g*}NgW$aU@{>GmBP9N8$VGUS=@fI)_vgi86^?`#pPec$SM1p|?Tsxp@Kq{2^ zJ~m*1Qn!-z0Xqt%^*GSuWVIk-Z}1-tSnH{zs%o4~Z5Y;9pr66?)%jmDJ#L=;B?Z%% z=rU52&w6x@<65Kiw?@mTk;lV>1Jr+8j|aTeBMpi;y6JD|+1O-(Ltr0+?sQjizoZW4u|nghBQ=#L&|b}P^PA)fDeEJ`H`Yy+@C-tt7Osa zd+Q*1>3!ah2;AHdfZbp3HCfG&LY}>cw@pB*lK`hT0zAEHs4;ldPzqYDEzp|fZo$wK z;LJeS#{?5e07wCNT=w_jRs+mq-?_?&fLbuWMN*8sdsYO%?E4R@*=HP62@Um*U#?TJ z5YeBUX@Zj6-w07eSPVDQ-T2qH$bdRE<{^x}Ahn99R&Z!^B3B1m_%k2333!|vE|aq( z!KBL3s?zS?y&xDG7z4s05AMq9YPhiPjrFtZvdKX&IWT)p-( z$Kraed5VbNA<5Q7kuwLp$?u zc;NT8hfEzC)o17e+(tQ`y+hoS+n3C2!%yEoD~UV^!*}VN2$jCP=$OpCmBbL1V(UKt zY)Jrq83_54jZjTZ4d9w#qq`h7!b%I<6t?0XPL(hbhaUbON9;~a*D?4@{k8!MPDpkZ zmX;OW;16)%DIer9K))mn0hbs24oBdN$p$t0U@svDKX+)V)y^z&keq@x$W~ypDIS&U z+wUg)cP^0nIMjgvgLG(5-7+90$VnzK(twr|8a7mws{z{qwy8>MBcQ=zC}+cy$0 z6@T&YH}qyGmj-;Yz~vgVCzLpXv1VyYLH7UwL#N(sOunbxc#}bB{Jodcf->n!TteSS z6RR+)*7B2XD}TW zqBFevH$A}Dx64dl#X?Utqnr3-e;LwpF%XJI)NDvd8!qYGG5;9|=gNon^iv>YUBw^C z)Q7z(JXlC;W`WWQ^O6m}4*3Fjf7Db2n~p$*D~-_S5K1cgtYy6Bhe1WWoV!|26qLfx zqbLcJ_#2jjDq~M5?nu9zt;?ejx#6CeE;E)S(N!Gc!h=}Y&;drpEcP6|y!hC18gZ1x zg8BXw91A?x`Ta;fCu)yx5LOX{f{QW(4Hg!Py`ov%!OpC#L@QQ^uxcT4@Muz1U;12F*Qv}RD~|26ucrr zl0q#IDSZh*9|5i{;F`%A*y~MJajDc~#QZM71KZ$Fo=Ag95i`F&0V(6-?G_5ia}Dab z%sC@~AI3>gkW3VRuQg~_2z0xBy>OdLn_|0?qIr5_zYA$e!FR`d>C1x$e(8AEJ5g-r zTRk6BZRFPfFVfyRs;c&j8r_75NGj4LASD*k(xHe*2?iqFQqpnY5Yo~h0@4j4ASfMz zfPkbRB@NQudA@bt-~Gn8f877BgLe#GJqPyLdp+w}YpyxxLnqn#)4xZ_*aNy=q(M%M z*K&&qnOv)07ku^Tg!f?}NlHnP)}LhH#w6Wyo=!PiOi`MWUkxxk`BT&b@ZZ@-zlw-;%=2l)lqX z)a;GCu7L1KTdp!b-FUgZ;h4wZ1H08R5XavwLz%TQR{iV=$tgf{Y8(s!?%LDA0R3%tK}1Q@fmjR9Nw zdt~^y4w%z@`h6YGL*rH8b+r5yV(x15&*a9B(N?p3UU9ltUhil5>zSOPVMdEWV5O}v z@t$$t$cV-9w22J);k%}v(DYD1z64N74g>&n^z^apKbZ8O4SqG42fSj#&^XMc_Ic|I zmAFMyxBE)8em6}R&O;AXvKM{xU|_ydJE#t_GxvoOyNy5AHI59-x&r&VkiV}x&-`l( zO=)_g=*FuZ6_L3(;$5yW^Obtfm?20`z3+T~HCORrvi1wFJ6nf|^@sFGLlc?gNBc{C zj!9j~;vw@XXq`%TLbi_(9McWncrg4x;O`S7{Zf=<-$Xrd>iT*9Ig8@GRSw3-Yw*Ec z4(H+olHcmMuL@*+y+sxoV|3din6rFTe;zXIAhgbq**&;lZvX5V8p!RzRWf1Qbi>AY)EHo@H?MTp-s0UP{-@IT4P=9nCxi~V21#`8ijRKzOdR&1FQA}(<*?=Rq(SXP8X_>QTsi&#pbouOy z+c%=__jcITl6@OUHImRMac6gIMMT|PZ|$NTZkxu%#raxZPQNW?>2CiAC;J{Mo0U0v zHX=utmEoS#JL}3hsu{7wv~ob6ruIf{T49-B$@W0{X1NpuUo=_~1`>ooxCIUmWk@qt zeg~W?_yQ5wV@=7ws4&AV{mFUXFVb9;*jiD?b?ypO)B3QhLnUeYuLf$!Mqsv>5vBZc zZ@;bg`71M2Y!WGCz!yclpfi0J9zFwzQTri1Cs6K2LT=TW)hNM$ZfFrtipYD5QKbHV znI#>&BLGmcS$`iz=VOj;aqZ%$BYeX;vLr-uA~5k@e*5+CIxQcLiiD--)&t2S3aDB) zLv2t^3kUWOWq59P21Jsn$dHL`V8biq-dY9QjW5QTkzvEtPh`p!=@GbbLD&)>I1<_O z-8mQt?blE!r(rW2OrM3sF@rkpojc?9bbPgNw*idjbybEtUQeMj!?|a#zl&?_6U|2d zTj1`KU+Q6(-hnhGaFrm0Z)4UT$Xnil#SV+=FgK+rc}_gvo$`Q%{B{}Z!29bc&Zc^r zr=#Xry5f+*lQ(st=J%aAhLoGyZ0D1lqo8D{Q`aEC|Am24QX1q9(w~3nN%toMV0*R@ zenz*?!^>lPcXsg)wW@ZM)CmS10WHWPdx_^GyuGegn?yU@Glzf$b`p4nKHJ#tk`7DHCu$>Isoy78up62ySP4)s12(C0oXZLS4W!02l0 z`*VQ6_zi${X?0nH7YKDHI0d|af#H(cWGFk_A z^vjQdruX+vD`WP2g3ax_R>J|@cW0;hh}V1e_!9~9Lx}Q_~k@yI@|QK zt?tJ~TZ6FXp9GV{`EXw1xg@3f|acTeXapZR~xmiCP8|jfyI6U-Rlr=`mn7YAbn!^TW`wbYl7LK z-M)Yv9Co9_0GWJp^mnKw6K2B|FxJ8{loq4#&dag0(fcYKgeP=$DGTyjM_igWmAZ7( zD)*n0(NCk*cf{{dOr8h&z#^cZZTjb_@zY5;@N{6iaz6Qq^-o^X>b9<=X$YE+1V-OV za(I+Q&uTcL+Y*?cwu*_o=#$mj|i%}qq*fOqXa%!i#@L=b>I=bm%reNL9Js&c&{k5Ep({=R3#svaj zkV1TiiIW9NZbJ?qHS+MOre^$4&cw>A{s1iZ!1cWW3NA^6jT{kz?Ev@o_R8khg`a<= z-#j%`7`%0EdV{|HO8CmhaJFM+RrX5{X{~1hW>)-LTwe?6{HA4Mx^Hh^I@S7mNa?bH z=P+sO=4(BpB<{O1WREr{`Jbf!Y1HkY)8E^6PZ7dRzu0_XK{XWL~*xasjsM>IP?)ah6vOL{cO% z+mhu(7D3w2TVH%N9{$T!>eVsN;4BfLd@B4Z<~rPr$xw0)#u&p;|62C8ID}mEH^d_{ z8NiY07jfk_1L@`ZSP67z*KqIrb}z^q-YLhYWa!VsPQo^T+k$P@<>meKEyh4k1gu0K zbNL2bkvrQfv;IlbkBYQ5Ndc@T!n+{qwDKWHDauhUfRu4M;Lm|863u)UB@Dd*+^3G| z!1>9OR6;|dTh=4o)>Un*1)L;J0hgCea4ypIFk?2E6H)QaqlV$){!n`i&bDG1=17Bc z-8LigGmq-WKm3DAj;X=(l?g(s=6utw7rZE0r>7R0WV45Vmc7{2mghhDs(AhB_x4FC zEZfv<G{SzvB9Dw)T zvQCZ+X?=$VE%_JmORD#g_tow1e7kz-ahogpALn~bs(|`iZ_5*A-+PL5C}Z@^J=HUOEuDCzrMPd!g0yq^B}TxDwfyn!sSjVe38?~-$k6JKit>0xFFOkL(;-u_Ud<7`sD zsjf!AYsUU?^{uF=C`$xcQE&06cIt3D?N8bKrBZ&K>G z{4_(HZ_9N$i1WX8l6Pvz=EC!YO7?fCsBogEuRRYAvz4gQv^&}MxmP)z^=ct=d^qk(bTYq1ltUZJ{8lA5EX0vgZ=Uc6NkQR*ne zm;R=W6OSF!`8a@#`Tg1G@lc6j3_hm*Fs2y(f}rIkS+w_->{IcfaHdK`ShnSizeAav6Fe>>- zbKj}Zjt>`08d`+;qQg|y)_NtilL8*b6xFj0yiw+RSv04Lb&y-S<3Q)-6Ae>x}_ca(9iS zGFuQIveQCu6XW3QjA37VfSff-|GkEQ-^iC0sFuRe4@SnuK&E%;hWTvof7)kZIZ=D5 zSVT}?I)ocf6=cR=#ppr>p$t6Zs9eYIj$)D1I>aq`z4WD&(otK;a?g5y9b0>1Ump# z2txmWA@RC}xLjzU@d`&AaD|B`O<_=r=^q3OZ&*Ujz$P@IDt_bh`q(pLCna78Rq z0Xw|H>b_~{-1 zC)Ho4Bkr4%0t^ z?#S0+ZG@&vN#5x9KoZBu$iZM`0UE~M1~T+P)2*$2*)&zjHwOc7AupR*Gp=pAh&498 zszZrv`ZAyB2{8YIPOLIEss8L}IT~~;N9@k^ytH5Mxr)onIUHZ{pm@wV zv%6fS3@pBr6BH|LiqWQy%aq@Ggcs%@9Fv-Ix?;*NAaJD)b-0CzCf+}L!0gelEVl!c zl07xn#+8+o15j<$ZZuw;05Vq}#6Rs+-R=ooAYx)>f_XGR3fTTyMvf|7^aC^UcvZL>m0Ph_)@C=Y`5q? zb`*5KDV}?!DZOy*a?I$HO|qCg!{9?biNQwt7e~Ti5P_EV~33F7P|_ukV1uP4jOC zdcLg(tQ0`8KRLyAwIIb7cHLqJxLj*(StC2=MA&-gf6 zbo@yshCevk8n!GC9U89EUVgp4;^ri1saxng6w$~;W!REBT2nB|q2yZ&qC1kH8 z++#&|^CFYmLYl6{#;DB(+WK$BW<0%+HOkJ&NN&6<@lMP38L!tZyyrSP0CFzoq_hkT z(SU3p)Q1f;mwmoZ0@od-w6IH?&KY-fK1yiZ8qD_(=2n-nK2eho0X zKkXUe5=$p5rjjqQ|Hm0Kalt2oEvOrPww)$NrSd%R*>tPz=Sfc?kEH`E1-&hVW<&2oI9Z87W=1Q> z9rVT3IV?dL()RuP_mq7;4-x`jEl2)hHn^s?whN3*Or-h50x=!NJaHYed3ex~=oCGB zmFYdpNaPn7xUjQRmVGlYfBmo5vJ3}P`2IZ`R@QtC9+dm#!_qGjaBGh=NyGl_r*n~J zuGv>w2z^vwpT#9PsJtH8O&ubynDd)4R(5+9K0I%^^;m*h5?U(0U}8NyB;7?$lhYfa zP|MRuzlEB*xFrw}5Kt*d^hQx`2l|X2xY!)<>X0Zr2qPsWm1{PAagd82K~Cfse1eYa zxT2Ze`^Z=lG%pTdmg)Bv@PO%E>a5EXd18aV;L$uEKSX&>x>_&-r6{V6ots9k zuBMCLbKO?>=gj6#ff&iUqu08@D|VN0(qk@{*IRMv34^o1u5eT*vod7}y^ndGgvXiK z`4rxJE&8Exjsi5Uf9#WlX47Tgc;~4KiQJx2*X)aN1nXld4+^7-HlNsij;|Yue zUp#T<#CaS-m|XpXRcE<1ft4{IJ!8fkv|=hWM`9J_De=AIJ57dGot*a9Ub(^0d$c56 z%pQuoDWLamzMhlMZZ@Dm?><9o-icTG2izJ3$YjO&} zccugsB5ABA>K?zlQv+nn^M=Il?l3SjXK3(D&3mrR+d4SB?d?^of&CbY(F$$%1rp@;mvdjgTwZ=1 zubxK?ebcR?e|Oglk>5vl)CiViixxkTV;sju{5L=wan)lhR?M@=^Kd zwjY6kR8&+w{^V}|U~gzD0w7vf7bdCH8WSa^$*vqmeDNF54Bx{BaLRq+mz^N zVY4@HN{Z%gCw28QB z;lWe@aJC2nMy-s&G{S2+zk|TvV^4g2JZbs*|K$Pz6`zAd5YZ5~&%&{q08r@XoE@-Z zp4q3sg_i*uu)dO~ebdm|`m@Px8^Oeqy1LH{foU1eX-Velf{CXB68qO<6?YD1!gU9$ zZe9u!>nL&u+}dzexhdIgiQ8={FDF;~W{3|L1;&PdTVUhm*gX{aeFiF zQQaEcMxD{$%C)2qsl_%>L4;8}3u1W&v-1LhsF->GIl|sd%TwM*B#IB-Sqk3M;0%M%@=`JXLX5&QJb(WDpa`d7W-}1z z%#8IAMyYk5Rk>y@1xIry)?0yyOn>x)Q=&vYMayt)y!O$>ix(lX&V*_gAHN2PD^RIy zg&EAUqCns=0c1P(`klzu05;_Lt5@d`Y%ut2xnG$O6Ba&bfGyc`irNzgKGE4U>^d&X zFDHVbI-A{g{afu!)<9pH*V*|P%B9;#eNy*48tve)g9mu&#MU7SL)^gNwLVefx?QQf zl>WH?_k{GFPpHJG?s@LGjyzLNH(4P44h;`WizeL%qp|^u=0AU^U~4I^tjw!%qS^gD zXd2xyckt=ib&ufI8G(#hiMzK468TijTV6z`7~!?Hw-c>jB)IU9M?Y0%SM_FGP=QNE zFV_uT-u}7ff!|3nX<0;T!=@>W;9`OqfO=mI@fuw{OMAb8v*FcgLVqrwv98(RP^sE) z(kI|zeEo5CJsSdsP*y@0U=?@(?C3EA93RxJO#ilX-SEqNzO&Sqsm-Ct2bztM{JTvB z&x}dv!OICdA}d18U3Z!EK5x4|E)MU$N<%z-UH6davu?dI^xEv~-e-l-#mqp}ZjT&U zU8V!i#5@h6MTdj~x;#rktn=o;fF_~O?Vrko2&@sVBxT<_ExJEEzdJcO5$1lrI669t zhkQ&3Qr%lOco}x#tslm8d}(=AxRe3qCFtMk;=C`1-cK8#*t=Xl`ic{5 zk=)!8vVNPxN~G0LLu%4Imvc67^4E{SgC)3`^-73*Va>wqEPm36^h=^tEd0j|*&L?< zGMWzhbQg1qZGy%ed(C#D)eWWKQL&I$WE>pTB6Xu&;aJk_Sgm^;me%Xm?LOY*B}C;q zXD4EZ3IkF&smq#S86K@B9|$!f`*&6 zlTOu}l3-$}r69eWnw)470Yx53zXux)aUVQtBELo{tF-IauX|Z!a}weXuQ~;$3m4nj zx=02{lplj2@+nU&2oZ=u$Y@(V27>u(`<<2ApADz*`iW9g&J}wt=}7W58*HMJlamP$ z?65XcJ#XjjQyG)e!}=-A1J=kDkoV7Vw~~2o_zJz`eNR@mYGreLYT_4kKf?uJFAE1B zXy$*;Z{M(yE3|&%K@i-~|!Y1<7dv9H}PU0KJj~P><|C+8IpQd36oTN1?O= zp9?=1F@TvlFQ!7+p)U@+(5$CzSqa9;rC(KK!_*n@#nT{{;u0W0tfWw?p63I`NF7W?M*XT%{=wjwEb8w)P8n|lgb=ZzK12+JufC))S@;tFV zW7YwE)lO2X5-D-VRi1`lwTAopF5zhAT%Y@)XKDGV;Mhd&E${&kqjie*B_FP}qwyz& zJR~Oiwzjr3Lz=fSFz$uwIRp9)BZlk+c)s=b}uXn={V*Z4P>{y%-@jR_wziyLs!DWV5CjQnw2O z=o#kq_4O1h8=G!eTz{dhtu*653b!7wc_Gxz8>=X3^;Jt3*Q*G9x;!*GdfWv?3Fd;7 zl;e3#tmd~(_b5v@p$hW44OVD^$uRM&a^L?fc2QlF8Kl-A|z%SdithY zXVbTww#X%LCMBJ1Yrl&;;QKYvPa+V?Z|CSB;6+)Bz>M6zmZ78NxZV%%6v^HpjE3 z=P#SyrpYwodl=lq&PP=K0AWzYP^?wnFX(hyrBtzuRm|x+!SLK{qUtz_2cBjeZ}F< z)eC~RF_tYNd30HF^D;BF{F}dXp!`Ih7C2_9a@Fhu3xvdZ7lsLIDR_{`&IZ);@KY_& zP>~jou9l==4pYis@V;-uVk#*>JUE%fBNIacnl?v|kB>2*8FAW7#kH@+DQ2bW1bxC{ zLf>J#Vjw*~4&(K50ht3(y16u&l#1Wi&@2ZkKsmw?&wqYClkO%Ni#6 zk24LEm$7w#D<)bDN@Q7Op!5TFN-QLxzwNJ~$OSz}-1gx~{meX6#p1jDPwX<+v1>h2 zKV0HnlQ4YwyB5O@KR3Sjt^5^U1c8?n%jAn!ug2W|#hXG`XPI);pA&4={zX$`e~TOW zfWNUcHI?Q8?!d7fb7uxdMn;An9;YdY*YCxX4VAN570<$lT0f}McrN(KAo>ks(sNRLB1S8$6G-q^aAKYAy!SCt2!;WO6&?6rp+S&pLVMmvu32 zN|n#Z!8ha2Tg!R1k5BUYF^>jT8R;J0XU$)`)o3bh0lSqr=45;8(*sKRBkV2-UW?H4 zLtEpv`gJfS%{li~-bdve%!^8G&*VT`C#Stz2jSOa+v|4^QC+seA1CKf@VZOg62~hS zeOOSwfwpdLJgx1}!uVm$l2Wd*o&a1R%0o%y4dSdGfS&f;PZ>1-TTpMb-!`!l%A{-G ztiRHLhv-zgZvU%yh5DESh)ZX4)6>&7K#*N8r!nNTaUUI(K`fE`YDo`&;e5bp7~gtd z-hc2Gz4}_WsilPg+c&y1xz0weuA}Df4gLN51A3FBA+WgxW5^RuBp%3l7DUb9rZWSS z$QIzcLaPMsi(ts9Czv?*q6_9b=Y6~umO9rRCLCp@@;iE z{P*Htcc{6>&mquAltbmHS3X)&T)a^Y8}|yhg`bSPE;?O-Mr0h=-Q9@GgWEL3P^alu z9wqPBaGqi##m$Wl?1O>U40=Rz{Hb$s9lL2@L`Y@>22ka)pTLs!`zZli`gveE#TG%z z_jHE1K;vy-F`#w?bs)=p)N|LVnh~7f5<-X%+b6Kfk98>hH?W>r2!#0Ah5W`P%uA@) zouP)3OwUiRzNohjxhU-ZxhmL-us-P!tN?6*8&K-W*nU06!=+XSJFNR@#P`#r6j~m5 zgcU%a1vvQ}Y|f~o-zo3W_O`ZOV2}ewmfr^dq1IsCZa~9V50KcHoWtDOSammak!{dw zFEC?0DdB_7z|!5VVj-OP3+4wms6s$ap@Lp|lHx{=VDnTTOaX4C)18|t5P}(-JK_RU zF6PQNGyeZ%bN~kRJtlF20Ov-S{qFbtl01x-Jlxhjo6|iD99&LvZM`?{{Y=O890D~Q z#sX~V;*~h=0zFfS{4K_3Y5LP3&U4rRX{XJ_jutYug>1&(eSMh%+xlrEh6M`YGYGF1TY|Yg!M?bae3K`P1em1+)En@3_xCPXpmA-D!g^)Hug^svn)c3%?`xp{@>s1{Fs`$3M+v4Z^Xj> zF*k4s@|C$y;Pn+!W#t38-rj;R9T4bYg$G38E*V>bvP^Kw#huF>3#DoCp3fYimA(tw7{sVA;;*dTvLIi{;U=-OU??F$T z433;&=m8)?(@i3z!Q!ja4U`v?rBu68l5$R3Yc*M(b&!K6bf~rcjpq?~mxTlwEw0qC zfcjihmL&DrfJsE3Ewu zaP1Wi-6EYWS? znHU$xJhZx3MIv@yTA1N}$&d$EPd09@2G4({$g{S>7JpvO+KFtmctaYAV?VAt4 zTG=ZT=S`(H^v8>)@At1k4PvRU?~S7eZR33Jo)w96M)YKI}Jyj05_kIlaDB?>;?9){-(|$X;5vvH1 zN&Rm2M56ZQQ|H% z!~(eY`QjN|D9IlV4c-A+S83_p@p(Qdz*Gp1G~XMP5Ju;fXJuNse&@!&(D~~Z3teaw zyMC-tD*%Y__!>+~Us-%_f(JxE;eE$n@3sPz16;9+;*THRYo6I8HzbDaFUPN%Ru3m- z^v{by=VeXZ;25G_+njWp-Lb!co014Xvk2v!JClxAAwY_udj+ghkFbi|YX=g> zDjH8VJ|M?mSzj;30y%b-3F`!N6sCOfL(usC85}GrE8`F3eGNa*wo+SIT- zKPB;L*|^WZ@B5wg79m*YDCGQxHTV73FJcH~f=#hp^*r0^CrRQ8l=6T=dARTM->-o# z?mOhY+i$)52Z@)(_0&^_icZ?*?9^_?Wx#^Ystv*VsYSe6yJqU;J>Z+^w;2EJT!g5R z3j3ugoCO+$Lxj`zJbw00ROKhi5cyA^KK+f8k>aZ(wTie}xlhK1Cdiw4p{+gJMP@0r zwt%nU*8px_NgG#LKPYhs0@&nvAb)vNRNQ3sGc^*rt`9p57302Y?cY z7jU+*1%kmHIADZ@DnyMZ7FXl$wkMS(1P7dAGVd^QMT%XX8CFN8gXm*Od|oosicjtg zzwmZ%+kxXumBg5sohbbMXZOVT19MGJx8>8-^He#aaS#|*_d8Za39(>)YR*)Ze*4zK ze(x5*K0H(*{Cs?kvQ5NC9`(N(bNm6+f+{2eVi^qUklSs`QD6}U=YL#S zudgqdn3$i4J)&e=B(Za^kQWAn#JS(RfB$~67Tkf7nDAhx%}gPW{Fgeo>I97$2tD3| zHl8n}Ilb)SzP!SI)mgyr_ej(V1N#`NgMQj6SU)`KIP{Ogj;Fr6dm{J!zfF^#pN>uT zd0#UFY);ZZ>-D1WDTkHEcSO&_BPl7ap)4-4xmmu`QL4JSnr5eZX!(d)`6cOJfLDo; z{X-ji#zDNps>4Ww93|hg+bdlrLx*HhPHV9^cBy*4kNhcDWl934|R-q1)5blc~+fF4dSE-`mDb=$AM3OI=-N z6I%bElQlzOUkO||ETA~2?i)RhoJnc?rj;v>o}r=dGoLjQkR?YBF8ei2NhK~u8_3=q z>tNFqPIXy$S`dr#<*}YBzlLL$dS3G7iII^$G2J{3x>!H^VN)r`ZnTX}IF47-)WY$$ zq=-lwc((xpXDnU{Ck_}79|gk=^=pqmhwGh2gh-S7$Df}1^V&io_Vnq~*=^;V(ix|o zJj5bvV(=wlFK|qtc!DHc#OurP;K2j@pZCt=B1C>ZpKk@EH@=1m&Xc8?hYhlk6r$mYLSdV`pb z#*jESKRxXO#jvHIOYL}Fe)`O&FbvvacBPQwFJBrdlhk$LxC7WwS?4{RoSxp@cB~#d zT_avxS$P*22$a*g=%^N7zW86aSFYlpX! z*3vmY3zZ;LkzgVTyrF6~OO9{v&w~3o>4ScB6~)U(yOMKGRSK7Xx+KnXqD4Lke4 zI{Gq|+SKOeX1c2xUp)HYsGjAxm%`}tK#2IjkEj+j4FC8cH=%?b16_X%e1!;n-7#mk zf46r1G&u_#QDkIfK{?EDunf-DF7QoHJnKL2e^$ecp>kfHsgD+zlL42(qZ{0t zkJXrn2z-|uzAhz#^lM_tw|-g7aA3Y}04eVsc)iyD))5I|9J9uOgjgsT#E3?Ap4qAtt9b$HbJui31U}0Q&iMFC? z%4^utzjY>0MCjhV(YTYixVSkCluZx2I2^lQl5xh|=OR8^Sy&+KtDbOPak>}XpXj*m zGrIb;>+SB-0SmW8f!-E!#6&Q0cy>0^dQMnWv=L4-fhmY!q96b0%;D|;V|Aoeb$q8< zo}YyxH5G9`{(+e(D`++Et~P@Gia&;z^lLxhh3mm0FVs~%#0*b zDJa-dU_%b~gWbVMI-|z=4CWnp(hba2FLWZe4lk*;uF>I>gt-sf6 z4wZ7&YWR5yMb;fexg!-8o^mu3Yn;~5&-JcUColV8iV|XXj%oRMAEa#mQL1j^EwwRz znDaZPV@@IRJOzcH%+<47u!)Fo=a}480StskvfYU9amVj2VmLCD(#taNoEOxL*;{h@ zQEyiiS#4}=?jq0;rQqmA#gQbYq{KbA0#Km!9*!5fTZ!W`UPFcFbH#$|{cMQ&6!Y|E z#mYu%%`?_~+QKEj%xzP;i!u+5KdjL<&lHLj{(2(P7;Tb`Co6(GcV8_P&Ex`=h~qrK zqtJvcbrlsBE{a}MqxeTMN2JnJ>{hy^l;SkXt4Ws>kJ zV4EIr6L`U~Qf+r(!hJ{Fs_60R8b|cQKdR=^a+6Md{^n&|zFG&jQ@V3p^(9gQjz(a5 zXpL$by_(qB9-7+iFT8bp>eaYfsh$TjOt2UI$m_*EfRCf;D~6Pnn3b|Y;S82{K?P!m zu6Zb5nb%TwOk({A($^q6n1%FBR2|<<>_kbMk-(#~1PiFHhpD3{*UH^Q&>_t}F!B#* z@&@+Bu)f?T)9uu*M~|s@>=r7y;Oqwb)(|?JA_oFBR+8jA<~O+1)YLdq!+9NZQ6JeI zI_*KInwARotYx*eq0lhsgo)A^+QrlN@=$3%ZdK=^1gJ}3)eKTXIhlEO8Yj?pGU?Io zMHK&+3$XHXzBQ*>y%kz?!x5Mo^V7|(72BNy?>eB(-bJ7zVXx%d&$3)}&`S1(rUM)l z`UIF+S+m7S)Fr$1FE9h}Sv+h>j*kN!8|-{A>TQN9zdn23&T+KG0d>Ycrd#U3MMEsJ z$m-$ZqVVp{4&Sy-%(FCAsY>k@03~7m3z4Ci6(zPo2WN6bX3{ROYzey z&2RU2B~&VRumrOLe*~WWk!Lq_HLwe(uAK+-0tipn?39i<;GJMkmPlC6lpr$OLy7i! zd|TAdatuv&Ym;XB=s!=%#OgTs&#p4rQl*o0&4Yco?NmJZAibH zaVTD{@018$ZgYFxRqNn=OhEwvGI;Vv)u=DG=ah23f0IjEYgN=42K+Fr-Fmr=ufjL! zZ6`&K;s84-xd<^&-~<7u>x)NnTt@FY9V3aRtrin0)Urwx!S_WR)sqXNokIJa#938D zfFY~fkLpYRO{bWp9vYVdpME{=)`z)|NlDyn!VB$CHrZEdXEM1izUw;WQAw zy^(iNRD;csfb|4H{zY};V__t_EMUpIy@jpZzJ=zpJOxMegPO>)>>(tLHjWz{LV&8QK6vltWE&WeNAQln7Y z!OOTc=r!_k63tX~gXDYw!&<-SyK2mu(hX;j46Y2}ykH#bav~dpZ@#)__ zoTGKGnqO%YejsoND%^fes;5z1f^x#O=v6fb`l(LN(+fiB@t0*vse^$LgyeocizAL! zqP_YuXdK&i!--YRP%1!wh|T#EgoQ7}zG8zRx2JE(sMEddIj=yPcNG>!o4ACNn`DKH z09iNb83WzB_IsT#<5L_`_~?4?%yKP?@hXPnh(5exUb|MOv9H{&xdJ?qLu8EtQ78#kmx>c>}c75OEXXD~Q?}W0797AD- zY$+BN$!+yKxp<}fchw)1=QbX5t=0;xDjg(ar&J$a|^0xbqd9NoDxd>!KbkDTR#P1DTKp`Ql}Zd_7xT#Yv%dHz@@e}2qf zgnz}taq;@f9bplXUY=(vb3JB4Tc%8JWGnypOOiDo588`w)PQwZOwj;wyRHZ`l&0h?G(1IkYAYFnaW1;aUey)TK>w z>2^K<(V+gat4MGVeMMb$pBx|X*7hfiu@86YS@U1uE6NElY8N@G{$7YVFGefZU65Ylep!`lbrB*7>Sj zT%pritD51yWoP+Ks@xcx$(Y_J$I*=w5v*dGo%=O20IdNiwUZx^;Gl7FV!1t4V({Vd zdZt+WnbNR|Q-aP*T00wtxDI&$=P9FfBtSR>Y0S7;XlHWqD{jm!qdbi$!-hrvB@R}R z7EO};UZcnJ>EsOpA3uKF(A*p>gNZ%r!CTStz>sAS3?Mv`(Ocr^wv8<4zY_C?+Tn z2$=%wuSDqA`RnZ}mHcG9VRT)TD(=}i)ROV!qnl@oNE!| zq1lJq%3&9srO9IoCV~{gcC#;pKaT63e?1;;SNZq#J5k4^e2h(uiW_~>I)J>S>Qhw4(iyA(W+JASyd z!S^Rty3lEs(RXB3gf7%+hG62gD?O7{KF85}v{0!JOuda8)Lc`0<$hj{T=VTtC_Bha zCcET1#5Q1AI*$V0wp;NHOwq?6AXqrw8(ba#D&xUzQYPS-Nr%7X{YZBtO6Ng=U+(-B zT%?Zt4qd1L3RP3s*#~TSV&bmz)SCYrJ!soHO#DBSiBv{n93xNw>)odO|Nh2S8VDHd zerZ>c7$pwiUJO{aeR4jCwFd^Y6pO0;x7n$q-SL>7R23{3G5OIBhR;ag zdB(X>bfOXm;LOlvxA~a5y3ztg6b^hjL@@z?LWqxx%K7!kmy)3@Y1h-Ayb7UN#{PQF zt&qH-EgZA4!~6{PCL_Lqm6wj*iy##R%p3?aaZ}^3p@VWjq257TiQ6s(O)@hD*(w8~C3Q3hZ7&f&`X;-~f72{G7KU+)`FRfj;{c4{WC|c&Rw7 z?CsM`-Qw04cf0^bmon5(m(b;jg_@u5?Ahr{Pi0pRw4$}`3n-w|p|}i82Y?_Hzy#>P z{&W&PqmqM<1GPr}sliQ#F|*fhe?tnc28+AF1*(ZAy_b9>SnVlImw1uSTqXNrK$_1o z`AxZsNwu>g387zhblM7pNM@3%Ho=!%Zn z*Cwl0i$>CI6RF3qe$K-b)Xd&~TSj~|L>Nzfja=b$bQVMzv~$1|s!< z?@AjLUZ++@7@3(3Q7G**v3vJI0HRB{VdpM?<2ha4P(McK%X!+;tG-V+x(1B+07k3M z*@MOWFhLqes?$=DQXZr?I#JAYV?*{8=k>!kaBP0h+c`O9KhWvadu-{7ciGdeuK=N2 zP*{SD2-G*2pTe;d2m;_FxjY3ZdaB|ch(w#4Qe{|r`S;veKyU%@D6Xp;x7UJ+2+R;+ zk_yufRR^VXE&~XuO_vjyE+0`iKy7E|7}${xe=;%?X|-~IseB{H_aZmSYaE}ve$iWC z79~N3z|21!=9WN12DUK-*B#{7qQlbrXKbcEFf{1I%Vo66({%Qy>q^DODhx)PZ;#2O zbKzpAbI?i`mzU=#g+ts3Cn>u=RugiCA{0)X)k_V0IHEy9?%g^QSwD}C&963Law3>dL`mFo{!AJmyFULQR`DFnieQ}ZiW6I1 zPuc#o$p89PAoY8$3ykBy6@KBQHVYm-mSdZ@d$1ns@A@=PqvsRb8pR7nj=YSYaG()X z1yDT#OCE}qc#S{GrUbLQZgaHZ!1;g$P$ZgF+ENx+-l^&kR;!%s`W!H@SuM83no2Po@+v>#Y1P?x>+ zd!H;6uLM(hEh;4o>4681e^qnF`?hKR^``*ppiBKCpHT?`EE`~~nwzdw+BZRwc+QY` z;p~MvM>O_K3M5rCiO@%iXn*$G*1OgjI85se_9nXJ88%N(v-XFGUn8sW6pITRL5U`1 zx3#rB{RX*NMx|TOXO^kZlS+MJn75v;%FL!}_afaz*RM4QRQ1wxRzpu|tCDaADrA)( zKX!~)GX2nL^3Oq(f;6C#B+$y*nw6Xo=v4)`8XpvT;<0qQ0c-+0+uX#)3v!I|p}V-L zL?6F)Hd)5jQ*u=gCMf}he_q?**`H-8*x`8M(I!b1GH`(zJIFExIZB+^{@z{#jcoan z;rM6RZvp7)TXcBj{ZTP%a{u`Ifa59u@hj$p!DZJ@#JC?S_rCo!Zt?{dVkp@ z*N3G{$sUgH?P|#&((mv5-J7-b)tL+BhViqsSzX z5EX5QF)lboK162 z&iI8;BdIwzvuuI($V{6DeVXFSY8Oeen!N4)!3y*R5EZ=QT*Q*A9F9|c41HK4j4*V; z8*L_~{CDoWxmlA3z~E7oHB3(sE|Ol4V*WL$WiXvu;?yd0NEYpbf-*+FxoJ&)>L*L+c$HQXTfbJ`Aypd1YZy=rH}F<`Di8^xS0;^hsZ`ZkOY6L0=)=N=H}L zpHiykWz~#x7$qPMgQgSblP73pRGkagUsx(dhm#*6m+b&y2gE@czJ@bW#0MGT*Fj+H zp<&7T8bochY=i@4A2&$l@r{Am-LiO+y&Oq)w z1i~YL;DJ=!-}Hn$$uJXO#;MzyVt=eTMBt2nfF=txcqaBq%+eIn)k+Z-U(5jy71)J> zChYJ8xP9mq(|3Rb&}ZZhjH%kPPrtEGF=8goPL*yoVu2Ihil{0Ezmf(=Ay~VBNb}nU zD+#a>!RZaq|Acw+AjC<3GQ^NJXg9Al1&(b%lD=d0fy~}t!c6gN#3o{y*y9bs|Kucs zLCjH1AoiUZ{bS#0dv#r*^SUZmdtsCpIQoJaS$)@L421b9DWpJM)O?#XgjF@c1gZX1 z8n3Tx>x@(QRR8&N7r>sCb6tHWep7m!NYvM&*il{^T0i)Y$gPQ_R%cBH;olAR*q*klCo#vbe*IV=g?JFSl9@|(edS8O7v^dM+{r%lYaJ>el zbHPv4S>kO%aeL_^627Y-uI^8yl{z(iRJdgDp75{F;F?A*XS57<4RK^hV$e44&EYmQ zStfj)FrhXHlFd6@{Z@?-{eHO2vj_rv%&M-!33tt0*m>?K#{6*4&dCITBLO!ZNN^}D z0XLH;L)F+8SYd*J6{x9cX>))I06KAVuNadN8U-4`YR(sep`bs*dE=Ek(^Ox5e(1078}FYY8fGO$n5b90@IOpu(Nz-!HpY|2$Ms)b?=mt@@b zBRD9>-mzuou2<|#8ru5){f*`@0SvOItlsfHn(FaQEvOOjlmQI|!Muf&y#uQN>C!i! zmH-L>mIGM%&RI_7_rm$I)tFHxRGn-bhu`>U^w|zt*A1+s<3h>SD1hl63wSswaLQtn z(_bHdQO>M*h;D(gAwd899Y8Ny*xT8kGRH9G@W+ZQm~=daHjzh zE(@jCXPAxJ`phVQjbM1HBL7LV>iGMH-=!sWKV*Ew{kJ}wDsUFEt~1d8IpbuI{}V3;=dWYdeFk~LHY)Ef zloTiS`o~iBUUE(wC)OfN#`r~)cw=8JhqpW$cET8XWV^t53=}4=rD1wLa5NO%g-WZ& zma)ChwD6L_b*5=OlC-4%0i-C9l9O7RU_xjiGpR8q&KGVxL+-h%AF$Tzk(FNzcq8^B zTjSl&>sX<&3g$$!LvtPxoxQN!dP14Bz8@Y!P|lQ00;+oE9i&j zd=>*tlh1&-3EZ;1!_x^f*?X?aP3*2!xVZbo zSZ{lX6xLZL$NhXY(KRMx%Sg1ltvh*}(tikRis0gMV|@!fupb*2^Ci-GV@Mm%_wrNf zA#anv?fU{@9$P6h-6PQG7r(xQy#S+>IZ{*vzXByG03p5Mc%#kaQdEA1{TxDepSVjz z3G%7fr&qqZgY!Cf;HOvXL2H}}8(7btIxhdyt)fh?^#9gwfBpygvOwdv;?ZU*XcVu{ ztb^hSv=KoV)H3nVS>7~-l#NIqC)$X?p7lFeOHZVJCkLu)83mh@-XZ<#7)(83&_Elh zn2ggvQFd^Rp)|%+lA#7c6Zne&?KI$J(Z&HBYT`T+8UqRZvS=3Q`tnLGWvl5ot$dkt z^koZRWGA@~=|*xIgWvQ`-myVvtlQ$J3){tNLI~b-tl78&EbN#CdqmAoD;GS+)_Nz)e<#q zs=O!n&t8ARfL$(v_IBZLEH0*&&(D&DjjwQjf-`Z3wX({pX@=^c^ z%z$}>Pppki3L_+y81yXokapGrqazyZdKoZRY`Wz3SU!H+pUaUK7pm*rgZVG<* z$V`b=_RGs6{J#e|9{T|STPdLw(uDR$24-dlBF_Le6wBZ5)96m6`I-Pi&y%Z zU4RCFqJs;6AoJGgJ;{%V+CV)(6 z-RU<95X=IGB|!4Q7akvHn)SN{W#`doZTZ~Cp5KBG3@kM!Pg5^{)YK=X zkSXZ16 zKGZ*J&B)HSs+#Wtr7Yl~2-=qeyb!?20MJqeut5`B%7};H{EK2Olh?gz#FaHQ{L+N% zS;I$shc7nXe+3DCXPvn(Rvbq3!`8xSIhE~r?q^`%gOo=~mo`nUR9X%k1R)F_sT4$l zVoE!=0IWN|eaTtkGyLZdZ~0{M-!Gn<3;nI*-baFgot+!L)tA$M5+y|3Zu{>j@lqQV4^G_skDp>F<0C*kPFlw8CJDO2~OTSA*)V#QFy?$^WsqiV_xseZ0 zSOE{NZH_0?e)GrOdBX9E<*-fX9U~yqhy;8ohxwGL!0kKWO_fy^SO@@Isb#pe;#5h; z$pP;-d%GGv9g(gX786tHB!W6Z6)=``65?>!p8d#lhm90%_<^!RuEo<>un(-)9{=f0 zfa~|2`-$hiKN)@s7&Z!{#m3ypQ;!IVrp3v_S2pW8{c)1u!#gJHNAIl9BTWz|n+ZKVL|<8Poui)3pczRU?nsfD?wcl{syvQD;g`mN2n z@ojZ>K!6a<*%vW0p?_N^YyX+Hbiuq~yfXV5=AX;0{3#&GRLy|l*rA1T&*52{!V^h) zQlKmbRSxau^v15rf$uK+Gdq^$8XJ+aWw?K874T+N19#xtt&3*0f{#bQa$8kJ=S~kK zeRko(Q?_$qTSU5|D12a1$H%e#^0+27c)c?bo%)gWk)g*Wr`5!k05B|&kUbC?7Nt(8 z|JAC$=#UfV@9j;#SXA-Gz4Ea>T3TlZHA-`pqTxa}XpvFE8p^6Cb>26w2)NmOj2XWJ z&A7O^z5F}(X0!g{zh3+ERHFYc`6n%?sQN>(*C zl>C>R7>E~?fO!!N``Na@Cws(=*2Qw5K=}w20ukVs>v#(uV)@D6H$nOn19t)?QME}& zp-+H<2zm}q8U8|vs;pTzLR7H>brv^9bQ#in56e6~EGssI=<$iVog0x&uf4;xsFaz{ zQy(PkNT$?3wb--&wj@KfBlOjdzb3Pj!;_kbsCLe=Z+#+D&@~|NzotXc6dv+g0#tN6 zHJxg5x<+9#q$(;W`mOxYUb)11C=JIn^NvP>5%b(7lLdoyTWcD#j-nDpq6s_c6(RBQ z@gFL>o33B@xBx1f1oG9*lpO7kT71&;ZLh;($mB{7SzBK)kGx(g7T7vGOeh>Lb6j;O zGW8Il0X>+qaA3Q)I7}$7`O!vf!jI7*xJ7ee@V5R_r?yAsfW!JNpe!pRL0^L9DMs1& z<uDlr0~RS-0Gn@IMR68kIh#Ji?dzNhp;BF@(Dlx-QsO$e!N_m7{?Q zsL1Ui5mPc}{$l=F%NFOks37g&I7d~-55Fgh07X-P^>Aap1(B*8JQ|6-&4BpKhRM~P zU@F)m$Pq!I_Vl9S$dHLChup{W8^8*k9362vf=+znT0~cO(82nH8}?1GTvLHV74K2t z%jdd|;6X?+1OtvheM>{m-}*8ByRLa*hE_?_|8W6;+mq=;(t$Kl4KCnD0h+T+xsF!L z4)VH$nq((vdjPPfm9=h#1}gRdZX&iyPtCPa{q*3(*AAd`8y8yT-&O^-=dJJPYL%6L zTRN)s4U0XwXAbNNi1c7PO;O@>KR~q!?598lY0j7N@twhm0j8W>eP`!rQCEVv<{T@( z>Q6L?by5TE>D1yS;JZWSz$$F@TRjt^WziYnFqQ#^qZ9m~BcZxIb~%HenwpwU;#0sV zE))7|Om1GL$>AeoK1ny<9Oy{b%{e++ScCx1Taz(&GcIjSv_>M3y?6Szr(}EaP@qGg zN8%hYUif+;ah}p8)N@p;mUJoya0Fp~r&=23tl>mk9^od()bkDCbr(53U6bV-n30luR`bKfrVS22 zts+Xs;O*TqazL7ImVLLo%S8K)R?tx>%Ppad^OIZw3EuV0GN!T@b)$eJHe+aG)g+YKAra@T+V%T6Fb zvgR+!! z-g5L)NF8<(aJ9hPm0J-4+;9LQ`5)8{j*$z>+na$TSCBssEGNlE6HLJ`DSg8EZTw7LjIR|P{Vy7YG*52fl#QmSK#!-CQ`b~@coRV01bgr10ry+3U zrcy&O^w~~%0?nC&2Oa@hApbQ};y}&;8YDv_BTS&b2x=!F9{`NT?M2a(%z&AkdF`UpO6S% z0NL}%PCVa>P$`y)8o`sA229k?!Jr2L$iN`A15IOdcXwidVijnVnH&r`59orP$@|_L z%`~F(o5A&3P7ex8Li7U5y}58wsU&L09-?$WfDW{6-c^C|N=^U#{pxmnD@O>UL^OGH z6X2+fX@h?rVjAz2w5iey@4DkY!YeT39s>007HKWp5-JyA1h@9;ZWp=ybGky4IspB^ z7n-{dDQRiL5mrgz1a~{{HG6Ix`i*=Jir};|H3h|QmEqR!FIs$gsel5i*v&g`_6dHs`IvFJPOo8rK6lzNfa&LrF1@gbu34dXyrU%`o}(UU9+i)MKqoQ81KtKOmS;ebKU86YEihTip^;t~yfuaG^;Wvj##OmCHF>FCHcG&55N(YDR( zd=bo7k04zRczLpTdF~BLWBNT-7s2lqm;g#D&CqWuueCVSf@-teri(r? zf{qLC=^w4~skDII)?yuwYex~9n+RYk&@?V+g2Mo~3KPwlkfXTI?O{HD7WqDL}4%ao)f3S*S=Yo0XU0xV7C?zz4p zyyr@yk=l(%`2C(0&VyR%2DQ?(g|nHX?Bz>E-NmW)=El~^oFeI+%k!zy%b7a8lRZ(- z5%*kos7*<3pUr1NsP)|fh3>P#<2FnsZtdxag=u$_MwKHfr00SD^jVRN!&i^f;RdD+ z<0NF+e8!wl(j0Y9gz~i?6x`p8AehsyGAWulm062m;-fb2p~fh$A+w|lF*kp{F{vu{ zQ`QX|q3;8P)jkwRd$@3=QDe2kG)(sl5TLJ%P1+y%bmQUUGYu+hX&lOgTbXEUPGb}# zOCGIfd`8q44w0ngoQV^xyEQx44%QdCHOGLrUWtoCl}${uft=bypHTRzh~>~EOf+S+be)|s;6G?-!f(6+`_v1tRI@5GXY`(dQMCYQ29!Lao_9?(FV2`q{*p7!d<5vHH z{~TVuvq4Pr)Yh<1sMnZMew+x}@XhtMq3LUNLZlZ3-s@^++91+0%X$%RB^fL&wN!4u zjAi~5(W-So?C{2~vJM)Ci0UUYD&YdO@Xd&1P`8b~NV z{`EtgL(H)lL=f3O68uB;XaQ=G%Een@gmswp93q*H)QHM?8iXB40%Pr$@0ru;s$=|N zC@+oV4I)cyjE*b{anf=uKP;cNuZEuvA>xGZi7F~6aK8oiH7<(|HSKgL(C9G@%W`|F zDgwtD3~YKsgUN3_l&&It@19e+Ud7Oi4J0L(p3$xJ^(>&*)!3{Dp=!&-SD=FntdO=a zT3SBa!Sfg&kA^7=sj(Ivt++lWD6;TT%lRNT&4piyi=Apb{3(iXtf48;{ zsbPGUldFE-zO~&TvwUU=5x}-hp%J!bnl3vgx5CK3Nmpcu$MS0uM9tlXesAh5zXI$3 z9~&oBL{B*{7Y#2}baPSygnBs#+Ab>LiZFYdYR6aHDo3w|H+sQv-qX}CG{nC|a@T#9 zUd+sUw^mhi5ExuGxH12Mk_X@ylFNYHA!-Qw(Ot%5|J48 zTztLP>ll3XfOu~}v51`NOv({*;c*YmU*^ujop)=Ny3X2@; z(bYfI@KQ@RK%*)L@cYDd1DN8zR(nWD#@J7XZynqg%;aWe?I`M;;J8wp!r(3${Y_l^ zJ;hb~c`ymPs>SB!K)9i26?}OR37;{Q$oSIuCijUEuw-c--b7Xzop~kk=`AQ{t-z)^ z05#kiOg|1>cLJC=V?t3xPAaxI0ai$G@?5}`3}ekht4#R@jLEhpfO$D#=WZ%538V_Q zt}oVPAw%rph9;|s`hqKQJ}xd?;YU;%tRD~1Ai1?XIV(1ZoXS!`$CEMmxzbJQnh_Md z<}LRvvcD8+d(ahX*Qkyb2^q69u`!K@<&q>GB#VRK@7+}GrzCnKtRw-gm{r0@2frIR z>}@HvT{(}AOxp`SX}@tn!BXmAi(Ab>G3H>>?{gK`*ImX~F(5k6-t=h5vnq1?uvh&45o+X>RMnoVxFqUffMvEY8r08Xrb&_tWy9=m#hzAe zqKarZ`M+EBk+o2L-uTCLzsJByAg{~N@7K#r^_w={4Q80{d1{=b=2sqZSKtpUHk!e| znKk^{?pF&h;AfLboxk}pDGe;#gFE;BI|qO_Mb^k8$GSJ?EE(AEhU8KufyL*~O9}tw z8l0lGgn?Eu{$vZw1ahf!c)nv>CFfsmUxNRYpx6^t% z9a?cC+T!ocPVNlsb5%g0$&##ur>(<`XLW9V8qY;!4R8cO`w?F6O#CcGefc-_)c0JrERga-!Q)EQb?q!Zc?TvCEde^4> z8k6PF4m502W=kI)eJ?3I|E;j@XlOqp;W>Lb8&zqykxMin&%UbC6I(pH&YC!o zqO}}))Nv40qgRoGBGvamqFIQ3E{ceF0Gvt>aeD;8ux)W)FzF!cDatMw;KWu$^r-gQ zQXOS>NZVzC3SgXH!HAPmCwh(4cQsn&G1~4~we7<}KzpWOW=4PKw>Oj{Mh=S-FrYa7 z;jSL`s%dzm2sYHYZbL27!}ASTA%G-dyTGPICH1Tr%yj}>neMBU>s)!deh0=3y^rJ% zRuij<1+Y?LDsQhgCfb-~O7Pah)vUdCz=(@cK@dB$hMx##Ny~9RJSR`mM@c8``|~(` zcQxY)lRFA0X(AG3)*usY!s)`FE_k|})r0*3p1mYX$Ocx@nMhon#GKRz*~-Ow8HmQRj8hD#TESgm&pFWh>=65LyXU= z)dnk*8OG}h7B$QIG)*sDMr}5yn9syv`jpF^!ttx>6 zRV+BM1dA|nu#qxxChhy5S*s!)4Zt+~{p-P0lUrbfC2^OTvFTU7{Idq4c`lgrcWy~7 zf{eqw=;!o@0&l_?- z3J+3RZaW=OYiW}u`{Q>BLUH7Y-e_+VH+>}QXO^sD&L1F3Q8-n?RW7MnYYBoMD@&-k z(L)5(mN$hkVMJ1oiS3h?6jD%sOvERArCE50r@JlGiYekyRTz zuqprNK?<}5~H_5U%63lnqjj|lUSmS~=QGON0 zr(XhLl}hj4x#>|Q=c8OtxX%H!`IcVyL`{x(?>J~lAMvSJ%*o#c{7 zPG*UXY|9@S_{5Q4ZwU0BC~_#dMJ~p zp5NWQ14dWv4xXq&$+x+U>~X7-|2oulpRtolJyGBY)~hky6Ns4N1sP+2IC`vgqkjE4 zErjp5{pr=P4Tx^uYnFW|U0}A+t2nWJ5$~loAJ06H&A0x|y;iRqdqYzya|8yJ@$`x> z`qTds=@>p1&pLILtsaE~;v1Nwn7c>-NxyzuLQ#qf#cdAr#$9qjl9-1Ak<=*M;r$;V zr0g0ebj(V}31nRKPBQxPbU6&?E(kG7q^ zr>z3MD&p<(fzY0nRKn#jpp#5~96Yu03ApzFTFfGb|o!) zV5*_UaQko>)X90iD&eR7D!PEuzLiYLU9Vy_-WM%ye9FwTQ<&;riF7bjY^!N1C z;^yjnvY~@dR8(d8?57C+UE|N?U+(7gJ&m|W4(8=Jc0IY7U;0(e&M^bj-o`vl8}h4q zYOJPLVn@>i3Poe#@9WIAHp@8qnvWf3qH4`ct9R}rG@&z8soHZQsRzfqljZM2rv7?e zH3>78KkiK*Wt^k0YlN9@`IvffMWFu6gjFkVK4tU16-5!?WEFn)SMq7^=d^~$Z)i4? zHr!$JIQfiD-$L%;_{Q>vzR>l4SPtX@L3VJYhVHGl+=XHL-+vvFGH!yw@0GBaYDdnl zpF$TXU5~x5DkwJniImB-5u{4uxXU<+6#1CubPRqdO{87=+L(zke8J&_21-YC!6*!3 zGHX}~p^z^_t#GiI{F-c_;%3Bz>qYEpb|s8$y?s&6suOX)pzZLkQkrqZVOZM8`xCVdvTgn?{Jp08LdB`tE8R^gIW@kX=SX^4u#J zM4oSlhi@d*V>~=PiIirP+%_9Iz@y358|~354-<*wM-E`TOSV&(F$7i{sxNJ06vZ~- z)=%KO#y9?_pUD$>Ho{N%=JE1JY6lRfAjB7>=@kEw^DIKl;DX?44UgODX zllfC!mQyy*MBWjVNCy0nQPGYdILnrRA$(3X$CfQDK~9c-u$ghJM7aA)7$L%yK9|Le zN`Bm2QL*pS`7v+}i<}F(y$Oze^}Z z@Bu?-k;{+zuIK^Ip!vXv`n*#Q;yF{V*S)RKuQC*LMql5P7F%eBlg-S(7fdTpsuC7F zOM5nZj3UENP;cEWkm!Rh4H3-^`KQIEG#hQ6?h42~?-!$8L&otraS}@ya{oW`&(N+rMw$Bt~B)PA|nq$_50Ep=9?V}?qniU?PDmx_`bR2g`c`F z*NMM$Z@MPSINA0~hxj2o9(sjed#Qi!J5Km>e=iA8ma+)Bw3_ehET!}DocKcZ@{7gy zLp8CzsfE9^MvP1)t*w4fpyx`?JiS+0kwZGum!RU46!6|Re%Ra^nXNF9)OHX0%Cmba z?xF|{9@8dee}bK0GU(P|uI(!z`tW*P4_unaHUH`MJuzWoI_70<8=$axeTv{pDVxcC z66an4o4%sYg{gn&?@S1bH2!!{Y=9NJX^$u1+XoyUFJzlj2y15oXI!&+-5;a;jx78g z41n{44Rw4xJX%TM*Jg%V)?kNB5_FjH7|j$MWFXJ9Q9-o@IVzYgnzb%EM>l0JXuX}k z>9cSp=xl4tj`MWNnUfI#=7dzyBcp zq^5=vsu2P#Zral$*-~#IC*!I_tUUjPmUb;&dN-QVf@Kg2z7+fcQzL$Sk0v)mTM>SN zJc|CC+c{%+`SIW~Px{w7lCtlQ7??O$Vb^|!DuU59nIv~})3npFBmYfv+DysvSBDMA z;-BF695OARP5-%)g#O89?Z8%32dE-`j$0HhP;6dX3@s?lB!ul!YEtK6ThLB(yFZV$ z=16A2Xq%=e-D=Akwo_#!kstp6(%3+8eFt+386{npyx>D=nm(IK)Aox_uLZ6z7TiV+ zs(1V5L!@~Gt=GS~w|o4lPt5j*vV;%9p1N<8t%?W>8?U0D{*Jw;Y_ZxK3&Qt8HGzTy z7j2(3+;Gv5pzTlk%uo#&Nc(!@e8!$GLyC@u<{QAv8W7^44EekmxtoGT#QlLa)Aok} z^hOR`m0IOIlOjhOl~?mo2bZ4uTRgZs)&oPbT#AEFbt`nOLmm>#%}KC9p5zCPZ5!zB z!_F(`W%qsX*bfGBu=7D$#|VP23u->oFEj{IDsNRI5+_E}XTZo*r_Ax7yMEQ0JTb|4 zO+2gWVd9lO(RnA#H!Si;W{X*#aTb zsP2vND&LBq0>=Y2v}+%049lQ4mvu7=nJaw<6Kv%y6yGPxF1=ry|4#xFP$eNvF&i&{ftxcKHd<9 zvQf6qYIK47j~$%I6t>BkexWv{t<9-UaPKM~x%Ii;a580hkH#z01^sDKgCJ5mWjSdb zxuZE=?oDkL^Y_N-?sKh-yh>V&*D6Itx@J@V5~&u$0~s8VLG-str|A4`*Whe| zBSom1G%?b?6Q!RsVVTJC#%T5JgkG@@@r6h9F;}=cO`i*eOP+>=1uCQ}_wSplzZ*?o z3W(Xk_i)JMjF^C82b9r4ApJQw4!8v@1P^yY^v9EFtN_WXj4!|Inutwts(R!ylhfHwSM8?n)C>VIo3>-JldNfj7{N zi$)vg$iqi^*$@Ch1xbOm`>^8v2$Q{y6DFv@UmIBMdEiTGO=~*r#cgfk=$ssh#I-6h zMKS5?)(rRROpgLAv-E7m&|%L(_vAypV>^sa{=v*Voo;}kF4D+hvj}KRb*Byelx`$c zy#*W{_LgA2md8Fxpis(%1+ukwJcRk0lE@#|9r569zI0fI!Ge@_eh{HcdslSmoIHm4 zzOAVBiZE=AfZZ5WndHyVRlp?G2A!ir<_D+eEodM&;!z8!o(VKOs`^ow^@(W>>1aKYZ4j@JlY!{}f)qJ+5YIqx zQVa7B!rkB_OwvV{-D3b0t4V(PT0l&C?Q&$k*!_wmxHi%l1N1hYI_z~)T2{08MD4Wj z1}{vsP|K~MS`MMvNxBI3USW07saka4m2F?o%-2Tx(|1KfZ3`5264O{WlwG&hdwEYN zEK{Mk3cA7z2Y{)>Oyq-uXhdWG(2q1mn#jAQujTKwIK=WIQPb6rLV!K@Q9w{pGyRLg zn6t?K8aB}Q9hS~yE^}G5h6cpI18{Esf>K$jYa!~>Vv#{grXP{SfDUpX4c6J6Waf==JH*AV7WYY&kOSqvEze{tQ(c7h%w3%~KL>AN* zx)wV#-%8WhEGj709=i4&T2epCn2L6iBzkHrC!v0%4|Np5yeTbB*_f7jdb8uLCfB5u z3JEJCS6|Zfor?xPKoAHW+=3PrNT4at-I?6Vc3S9F4~{{%D6w+LHCw(n{W%1%deA1( z*!MjJIlZM_XCC9+$^=cH>+>@c-S!_8?(QV=XP{1=%S?zgrhfm^+YNimOR+ZQvzG1- z_SU@5I>@7xJ8at8)nC1q`{Cw8PE^+z*-W$2_dVULJl6ZcDrc>$N6Ai_)PuO4rxv)% z*DVys+{_~n?e~_Wc_o?W@Qx&OFVk0jjjkHf&*G>R|NVHx^u)ngQd-|3?3IWM79`}^Sio7Z2`WbV!{`+w3hebxJinrzsVD4zS`GvSlCPS&sLXY{Q9@>jL&@*1Vrnb zs?lWd#?k;b)RKZ55E0&4` z^Y{0i0T9d>RcQAdp>f!#XzlBCk}8(LPU2H%sL(JjaG;eVN#J;YeDVh?KXP66WDTCz zrVyU(WgTN6dxQ%~k|y#iFHy*k8`1W;#_-akzA20Jk6$~3D$x#Kp0d`!{G$5FV|e?b zlrRyO(BG*3JS94u6$zrJ5o_^PaQeLJ{)fbjajPz(aqcxcEs7P}LDZHbY(BLx(`^yr zXg=EauOfC@$eXMEXb@RoQ*i{J!&>?&nF$|36v*q^$m|R;!G)dQzQTw}=qX0mI+Q;% z^1#xItyx2EKSGH-SYoy1xpE-dEQyGooHb!nEKKnOuVrbOvml#g$M{viGF2u4l<GOpR>?Q*UE%oM#nZISbP32IRo>v|nt@`Ww*n)#(aa z<2&q;7qV~bPHX7q4K;#&C#ze-s;t{SXt>b)@XT6NAYV@r&=S1x=4bU`;;H zH|$RF{t^r^cdojYrRh5`=?rX7PH~$3+)e31quZYSqHMmVe7pBWo?yM}Uk+W9%s@T( zsbx9Z_Y$v}KzUuH;A!#T)VxWluVh2&MzZNK_VZNExuHizeBxL8wjTBM#qQeEi-L2> zf&~}aZas7~j&ZavH4Z~$gXQ=U#zk4O&tE${11Jezc~cfzjJ4!(rl!QXv4n;lnUQlH zBJv7LnMMTl-y_7W&a{smeP2=Q<#Hhm)6l_8`6#-22cPi+lLlF0D`;VXLpg{f(L1S4 zP1kIa1APPsrO&lGzVJ68>v_!0XvgLLCAIGLJw%rBjg;(N}3<5_dZ~DZPU=VnV(=l3?2}`m$M!^H2w*y5Vi^9;;wDPfLxRG@ z79t*N6}xsYHJ_$=GF{}W-Aw+9!pjM7n60njQ~U4oVq;=HcZG{)&Cp@E#YJ9u6o#rle1Ph%`S}(`-h*?~@@0mPm@h;7#p8Hk zUHN8XXRLc5*`>_q6|w-zB(aB9*H+RVee=S_uwxeG5HG5vbfepF7N)L0Fws8O?Dvh5 zNoi62eM+YHS4fBqa2b}5+W|0Y6! zGHWE4Bo)7w!f-%txjjy+Bq0s&`{0^OL=;gJ6BPkSz3pZyhi^>B`;`!Xu4TWuinAs|atytMQds6n!6}4uOg7Pvuo;S^ zMKrPULpo7m)ArA%6_&I)=-U}KMNLM7K7Rjzmh@T9AoGC(7foL|P6MZvCLua8zKQ(N z0c4E3^6l?WGPHkO!8Q;s;~%RW%oQo3xra`5R9#4=zykTG&=73Gh<8MmUIKCMVZDF$ zdR+;E`)_%$9XuH1s^uT-`FKOlRPDcnpmaE1k_y&Z&jo2vx;W?G zZTbMT_9iHy`h3cAy!h#-k{H-N6H^W58L@=o zj~26frR?P26j>g{+o?}|8QeAqmhbd@TGB-mh+dsXPSHS zcFV(sa}DO|kh;2CcF5h!&Px1=2xeCS3oVfkh8@*34JO(@lgX#_UBBvwlcC&&kn=X0 zuIElXd@VPLVz)L+-JnErp99=5g=eGDpV)Ve+KM91ea-Ncd`rh^+CZnn`Ym>cg z<-d!K@Ivjs_eLP8ov;&iOpUOO22s-FwM$^G55+Uii3pQDK^wzdp@TH2bF_BMZp=4- zw9jLIUQApQeZ-6{%a=eJ1}~^J+keJz{SP-7zK6kut|2Wg-7WCNAh;>16CFfWVpm%RBRh4RJ3V z;$UZIe@mC>M{)4tD1poWv&)Cis0e&kB8#li!I!A)-fbMDdPaP#I@7w-sn_KHJtTq* z@@%vfDM&b0vys$@D!n?&YWTMXbRy6W`iMVVv#;er=O0-B$IQVrCsf|8XqbXAcf@`| zYtz~kC-h6Il=?h$_M9N;2eA|<)9?t%e`{eOgY(OzgWMV&3#!HQSD;46lm- z;)(gyjJp5ZXX%sD(QFMG;LETjVl};1qQTu@CQ8Tq`bn?qU(xP{$jCbu0xfu*$*7U+ zQ4q?~!R0yz=6wez;b0S*J|7zPY{LKU5e_*77z_FUTT8u9&+sQ{2bHHlrYN;KVs-R~Jn@1;Yn=ttyUVws}^pFn}w=I9XmFM(-l^f!a}$6m9v z%3rx4DT*+6@ln4YCqD?GLUv>5jjWCS<^*=!@{rJ=tEL8c@kn4GE`}9RXs}n*q4y~M zqSxZAENCnvD3;^cU_2ZdBO;3qwdui!!-Y8tX3&(xlTnhBA@Ye@i&plUu@?kvj9Rm! zh+iU0ReV}caaV{t%na*Zr!DZDA>QA=TVd?8R0(ZDp54wu+5x$1iL2>fOl91Vyxad+ zYHVr=N}G3|vye}R3c4&4+<-G&h!t46`6uxz^mWRvq5BjqiunZM8yo|lMbc2X7 zy0wbwq~XX|-lfzrc*@12yQ@k^SCA8hvZcYcX?dS6;1`gg*zckZ$k%oR)!L;&LjKOIi z`U6frP#n|f9*{G;#H^OR?#$hktQ3+63_%K!xyxBy>;3-UFHNF=groXDD20vT68Xqi z`>Q9NHP{*P^|oPk@mAfRR6<*9)~1bHrFl_{*@erJh)-qQj@=yp%?+hZDFSY{mxDU@s7CT?#1s{T#2bS&C`Gon6a&XsSnry?kLTfB z|2=&PtMgzoW>?WBv@Sd)nIjJXL}kEFR{;aysn`|`WP{p-(WR+m+Si0Ciaf}IlVwUAM?%RuXYU`+LZM+Y;lF&)_8^dP4 zs@(RPHwD36pRIb2%*y|mz^~SyAAXJ3=O9z3_@yZlt&<=kEo(uj&0o`mrD+YzGoVM-tV5~5ZU(>cM?t=c3KJsfJ?#@@R- zAn%t%cu|cVzZYq!-Vx1Ohd>fka#!}F<2nBLeKwrkZ19#=D>l-u)w^u$zu;XGvDpsI z&yaw;1DsF3wv;y|cWXG`+(;W_QU8VGg8z&6UvDu1kkoQtxl|hhFJ*Z(xoR2nkpBmr Co>PSY literal 52832 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 z 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 Date: Thu, 24 Feb 2022 22:41:57 -0600 Subject: [PATCH 32/56] Automatic changelog generation for PR #15523 [ci skip] --- html/changelogs/AutoChangeLog-pr-15523.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15523.yml diff --git a/html/changelogs/AutoChangeLog-pr-15523.yml b/html/changelogs/AutoChangeLog-pr-15523.yml new file mode 100644 index 0000000000..48767debcb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15523.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - balance: "Now slightly easier to get 50,000 points with toxins (50,000 point baseline changed from 200 light range to 175)" From 2b7ba387f8f44393af8cd101332e9e906684c74a Mon Sep 17 00:00:00 2001 From: radar651 Date: Fri, 25 Feb 2022 13:55:13 -0600 Subject: [PATCH 33/56] Guns guns guns Lots of guns and some knives --- .../code/modules/cargo/packs/armory.dm | 9 ++ .../code/modules/cargo/packs/goodies.dm | 99 +++++++++++++ .../ammunition/ballistic/pistol.dm | 9 ++ .../projectiles/boxes_magazines/ammo_boxes.dm | 7 + .../boxes_magazines/external/automatic.dm | 12 ++ .../boxes_magazines/external/pistol.dm | 32 ++++- .../boxes_magazines/internal/revolver.dm | 5 + .../boxes_magazines/internal/shotgun.dm | 7 + .../projectiles/guns/ballistic/automatic.dm | 72 ++++++++++ .../projectiles/guns/ballistic/pistol.dm | 95 +++++++++++++ .../projectiles/guns/ballistic/revolver.dm | 31 +++- .../projectiles/guns/ballistic/shotgun.dm | 134 ++++++++++++++++++ .../mob/inhands/weapons/guns_lefthand.dmi | Bin 0 -> 1540 bytes .../mob/inhands/weapons/guns_righthand.dmi | Bin 0 -> 1500 bytes modular_splurt/icons/obj/ammo.dmi | Bin 1220 -> 2453 bytes modular_splurt/icons/obj/guns/energy.dmi | Bin 0 -> 1583 bytes modular_splurt/icons/obj/guns/projectile.dmi | Bin 58264 -> 65264 bytes .../icons/obj/items_and_weapons.dmi | Bin 2261 -> 5399 bytes tgstation.dme | 4 + 19 files changed, 512 insertions(+), 4 deletions(-) create mode 100644 modular_splurt/code/modules/cargo/packs/goodies.dm create mode 100644 modular_splurt/code/modules/projectiles/ammunition/ballistic/pistol.dm create mode 100644 modular_splurt/code/modules/projectiles/boxes_magazines/external/automatic.dm create mode 100644 modular_splurt/code/modules/projectiles/boxes_magazines/internal/revolver.dm create mode 100644 modular_splurt/icons/mob/inhands/weapons/guns_lefthand.dmi create mode 100644 modular_splurt/icons/mob/inhands/weapons/guns_righthand.dmi create mode 100644 modular_splurt/icons/obj/guns/energy.dmi diff --git a/modular_splurt/code/modules/cargo/packs/armory.dm b/modular_splurt/code/modules/cargo/packs/armory.dm index c81d3a8cbb..fc9dd634c4 100644 --- a/modular_splurt/code/modules/cargo/packs/armory.dm +++ b/modular_splurt/code/modules/cargo/packs/armory.dm @@ -86,3 +86,12 @@ /obj/item/ammo_box/magazine/e45/taser) crate_name = "captain's .45" crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/security/armory/enfrocer + name = "Enforcer pistol crate" + desc = "Contains 3 Enforcer handguns. Requires Armory access to open." + cost = 3500 + contains = list(/obj/item/gun/ballistic/automatic/pistol/enforcer, + /obj/item/gun/ballistic/automatic/pistol/enforcer, + /obj/item/gun/ballistic/automatic/pistol/enforcer) + crate_name = "enfocer pistol crate" diff --git a/modular_splurt/code/modules/cargo/packs/goodies.dm b/modular_splurt/code/modules/cargo/packs/goodies.dm new file mode 100644 index 0000000000..c514dba164 --- /dev/null +++ b/modular_splurt/code/modules/cargo/packs/goodies.dm @@ -0,0 +1,99 @@ +/obj/item/switchblade/butterfly + name = "butterfly knife" + icon_state = "butterflyknife" + icon = 'modular_splurt/icons/obj/items_and_weapons.dmi' + item_state = "knife" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + desc = "A sharp, concealable, fodling knife. Also known as a Balisong fan knife." + flags_1 = CONDUCT_1 + force = 3 + w_class = WEIGHT_CLASS_SMALL + throwforce = 5 + throw_speed = 3 + throw_range = 6 + custom_materials = list(/datum/material/iron=1200) + hitsound = 'sound/weapons/genhit.ogg' + attack_verb = list("stubbed", "poked") + resistance_flags = FIRE_PROOF + extended = 0 + +/obj/item/switchblade/butterfly/attack_self(mob/user) + extended = !extended + playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, TRUE) + if(extended) + force = 20 + w_class = WEIGHT_CLASS_NORMAL + throwforce = 23 + icon_state = "butterflyknife_open" + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + sharpness = SHARP_EDGED + else + force = 3 + w_class = WEIGHT_CLASS_SMALL + throwforce = 5 + icon_state = "butterflyknife" + attack_verb = list("stubbed", "poked") + hitsound = 'sound/weapons/genhit.ogg' + sharpness = SHARP_NONE + +/datum/supply_pack/goody/switchblade_single + name = "Switch balde Single-Pack" + desc = "Contains one sharpened switchblade. Guaranteed to fit snugly inside any Nanotrasen-standard boot." + cost = 600 + contains = list(/obj/item/switchblade) + +/datum/supply_pack/goody/butterfly_single + name = "Butterfly Single-Pack" + desc = "Contains one sharpened butterfly knife. Guaranteed to fit snugly inside any Nanotrasen-standard boot." + cost = 600 + contains = list(/obj/item/switchblade/butterfly) + +/datum/supply_pack/goody/varmint_single + name = "Varmint Rifle Single-Pack" + desc = "Contains a parts kit to assemble a varmint rifle." + cost = 600 + contains = list(/obj/item/gunpart/riflevarmintsotck, /obj/item/gunpart/riflevarmintbarrel, /obj/item/ammo_casing/c22lr) + +/datum/supply_pack/goody/huntingrifle_single + name = "Hunting Rifle Single-Pack" + desc = "Contains a parts kit to assemble a hunting rifle." + cost = 800 + contains = list(/obj/item/gunpart/rifle308sotck, /obj/item/gunpart/rifle308barrel, /obj/item/ammo_box/a762 = 3) + +/datum/supply_pack/goody/sawndbshotgun_single + name = "Sawn-off Double Barrel Shotgun Single-Pack" + desc = "Contains a parts kit to assemble a sawn off shotgun." + cost = 700 + contains = list(/obj/item/gunpart/shotgunstock, /obj/item/gunpart/shotgunbarrelsawn, /obj/item/storage/box/rubbershot) + +/datum/supply_pack/goody/dbshotgun_single + name = "Sawn-off Double Barrel Shotgun Single-Pack" + desc = "Contains a parts kit to assemble a double barrel shotgun." + cost = 700 + contains = list(/obj/item/gunpart/shotgunstock, /obj/item/gunpart/shotgunbarrel, /obj/item/storage/box/rubbershot) + +/datum/supply_pack/goody/pistol22_single + name = ".22 Pistol Single-Pack" + desc = "Contains a parts kit to assemble a .22 Pistol." + cost = 500 + contains = list(/obj/item/gunpart/pistol22frame, /obj/item/gunpart/pistol22barrel, /obj/item/gunpart/pistol22bolt, /obj/item/ammo_box/magazine/m22 = 2) + +/datum/supply_pack/goody/revolver22_single + name = ".22 Revolver Single-Pack" + desc = "Contains a parts kit to assemble a hunting rifle." + cost = 500 + contains = list(/obj/item/gunpart/revolver22frame, /obj/item/gunpart/revolver22cylinder, /obj/item/ammo_box/c22lr) + +/datum/supply_pack/goody/pistol9_single + name = "9mm Pistol Single-Pack" + desc = "Contains a parts kit to assemble a 9mm Pistol." + cost = 900 + contains = list(/obj/item/gunpart/pistol9frame, /obj/item/gunpart/pistol9slide, /obj/item/ammo_box/magazine/m9 = 2) + +/datum/supply_pack/goody/pistol45_single + name = ".45 Pistol Single-Pack" + desc = "Contains a pre-assembled .45 caliber M1911. Comes with .45 Rubber" + cost = 900 + contains = list(/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag, /obj/item/ammo_box/magazine/m45/rubber= 3) diff --git a/modular_splurt/code/modules/projectiles/ammunition/ballistic/pistol.dm b/modular_splurt/code/modules/projectiles/ammunition/ballistic/pistol.dm new file mode 100644 index 0000000000..2dcbebfcf4 --- /dev/null +++ b/modular_splurt/code/modules/projectiles/ammunition/ballistic/pistol.dm @@ -0,0 +1,9 @@ +/obj/item/projectile/bullet/c22lr + name = ".22 Long Rifle bullet" + damage = 5 + +/obj/item/ammo_casing/c22lr + name = ".22 Long rifle bullet casing" + desc = "A .22LR bullet casing." + caliber = ".22" + projectile_type = /obj/item/projectile/bullet/c22lr diff --git a/modular_splurt/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/modular_splurt/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index f732968487..333f478f11 100644 --- a/modular_splurt/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/modular_splurt/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -44,6 +44,13 @@ obj/item/ammo_box/c45/trac name = "ammo box (.45 Trac)" ammo_type = /obj/item/ammo_casing/c45/trac +/obj/item/ammo_box/c22lr + name = "ammo box (.22)" + icon_state = "22box" + icon = 'modular_splurt/icons/obj/ammo.dmi' + ammo_type = /obj/item/ammo_casing/c22lr + max_ammo = 24 + /datum/design/c45/c45r name = "Box of ammo (.45 Rubber)" desc = "A box of .45 Rubber" diff --git a/modular_splurt/code/modules/projectiles/boxes_magazines/external/automatic.dm b/modular_splurt/code/modules/projectiles/boxes_magazines/external/automatic.dm new file mode 100644 index 0000000000..20c2b8446e --- /dev/null +++ b/modular_splurt/code/modules/projectiles/boxes_magazines/external/automatic.dm @@ -0,0 +1,12 @@ +/obj/item/ammo_box/magazine/m127x99mmbelt + name = "ammo belt (.50)" + icon_state = "762belt" + icon = 'modular_splurt/icons/obj/ammo.dmi' + ammo_type = /obj/item/ammo_casing/p50 + caliber = ".50" + max_ammo = 100 + + +/obj/item/ammo_box/magazine/m127x99mmbelt/update_icon() + ..() + icon_state = "762belt-[round(ammo_count(),25)]" diff --git a/modular_splurt/code/modules/projectiles/boxes_magazines/external/pistol.dm b/modular_splurt/code/modules/projectiles/boxes_magazines/external/pistol.dm index 0f6d5c5d78..d67732ba46 100644 --- a/modular_splurt/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/modular_splurt/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -5,10 +5,13 @@ desc = "A M1911 magazine." ammo_type = /obj/item/ammo_casing/c45/lethal +/obj/item/ammo_box/magazine/m45/rubber + ammo_type = /obj/item/ammo_casing/c45 + /obj/item/ammo_box/magazine/e45 name = "Enforcer magazine (.45 Rubber)" icon = 'modular_splurt/icons/obj/ammo.dmi' - icon_state = "enforcer-8" + icon_state = "enforcer" ammo_type = /obj/item/ammo_casing/c45 caliber = ".45" desc = "A Mk. 58 magazine. Loaded with rubber rounds." @@ -58,6 +61,33 @@ desc = "A Mk. 58 magazine. Loaded with Stun rounds." ammo_type = /obj/item/ammo_casing/c45/stun +/obj/item/ammo_box/magazine/m9 + name = "Cheap handgun magazine (9mm)" + icon = 'modular_splurt/icons/obj/ammo.dmi' + icon_state = "m9mmds" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + desc = "A cheap handgun magazine." + max_ammo = 10 + +/obj/item/ammo_box/magazine/m9/update_icon() + ..() + icon_state = "m9mmds-[ammo_count() ? "10" : "0"]" + +/obj/item/ammo_box/magazine/m22 + name = "Cheap handgun magazine (.22LR)" + icon = 'modular_splurt/icons/obj/ammo.dmi' + icon_state = "pistol22" + ammo_type = /obj/item/ammo_casing/c22lr + caliber = ".22" + desc = "A cheap handgun magazine." + max_ammo = 12 + +/obj/item/ammo_box/magazine/m22/update_icon() + ..() + icon_state = "pistol22-[ammo_count() ? "12" : "0"]" + + // Pistol Magazines for the Sec Tecfab, yes its just easier to put it here for my own Sanity - Radar diff --git a/modular_splurt/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/modular_splurt/code/modules/projectiles/boxes_magazines/internal/revolver.dm new file mode 100644 index 0000000000..b79c8d1a60 --- /dev/null +++ b/modular_splurt/code/modules/projectiles/boxes_magazines/internal/revolver.dm @@ -0,0 +1,5 @@ +/obj/item/ammo_box/magazine/internal/cylinder/rev22lr + name = ".22 revolver cylinder" + ammo_type = /obj/item/ammo_casing/c22lr + caliber = list(".22") + max_ammo = 6 diff --git a/modular_splurt/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/modular_splurt/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index 36ad30d86d..7d9767733d 100644 --- a/modular_splurt/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/modular_splurt/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -2,3 +2,10 @@ name = "super shorty shotgun internal magazine" ammo_type = /obj/item/ammo_casing/shotgun/rubbershot max_ammo = 2 + +/obj/item/ammo_box/magazine/internal/shot/varmitrifle + name = "hunting rifle internal magazine" + ammo_type = /obj/item/ammo_casing/c22lr + max_ammo = 10 + caliber = ".22" + multiload = 1 diff --git a/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm b/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm index 4c39ad5a58..fbd5f321dc 100644 --- a/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/modular_splurt/code/modules/projectiles/guns/ballistic/automatic.dm @@ -6,3 +6,75 @@ name = "security semi-auto PDW (rubber)" desc = "An outdated personal defence weapon. Uses 4.6x30mm rounds and is designated the WT-550 Semi-Automatic SMG. This one seems to only fire rubber bullets." mag_type = /obj/item/ammo_box/magazine/wt550m9/wtrubber + +// PLEASE BE CAREFUL WITH THIS!!! -Radar +/obj/item/gun/ballistic/automatic/m2a1 + name = "\improper M2A1 HMG (.50)" + desc = "A favorite by spaceship door gunners. This one has been ripped off it's mount." + icon_state = "m2a1closed100" + icon = 'modular_splurt/icons/obj/guns/projectile.dmi' + item_state = "m2a1closedmag" + lefthand_file = 'modular_splurt/icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'modular_splurt/icons/mob/inhands/weapons/guns_righthand.dmi' + fire_sound = "sound/weapons/gunshotshotgunshot.ogg" + w_class = WEIGHT_CLASS_HUGE + slot_flags = 0 + mag_type = /obj/item/ammo_box/magazine/m127x99mmbelt + weapon_weight = WEAPON_HEAVY + var/cover_open = FALSE + can_suppress = FALSE + burst_size = 5 + burst_shot_delay = 5 + spread = 10 //You are firing a .50 cal machine gun from a staning position + pin = /obj/item/firing_pin + automatic_burst_overlay = FALSE + +/obj/item/gun/ballistic/automatic/m2a1/restricted //for if Central command wants to have some fun + pin = /obj/item/firing_pin/implant/mindshield + +/obj/item/gun/ballistic/automatic/m2a1/examine(mob/user) + . = ..() + if(cover_open && magazine) + . += "It seems like you could use an empty hand to remove the magazine." + +/obj/item/gun/ballistic/automatic/m2a1/attack_self(mob/user) + cover_open = !cover_open + to_chat(user, "You [cover_open ? "open" : "close"] [src]'s cover.") + if(cover_open) + playsound(user, 'sound/weapons/sawopen.ogg', 60, 1) + else + playsound(user, 'sound/weapons/sawclose.ogg', 60, 1) + update_icon() + +/obj/item/gun/ballistic/automatic/m2a1/update_icon_state() + icon_state = "m2a1[cover_open ? "open" : "closed"][magazine ? CEILING(get_ammo(0)/25, 1)*25 : "-empty"]" + item_state = "m2a1[cover_open ? "openmag" : "closedmag"]" + +/obj/item/gun/ballistic/automatic/m2a1/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) + if(cover_open) + to_chat(user, "[src]'s cover is open! Close it before firing!") + else + . = ..() + update_icon() + +/obj/item/gun/ballistic/automatic/m2a1/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) + if(loc != user) + ..() + return //let them pick it up + if(!cover_open || (cover_open && !magazine)) + ..() + else if(cover_open && magazine) + //drop the mag + magazine.update_icon() + magazine.forceMove(drop_location()) + user.put_in_hands(magazine) + magazine = null + update_icon() + to_chat(user, "You remove the magazine from [src].") + playsound(user, 'sound/weapons/magout.ogg', 60, 1) + +/obj/item/gun/ballistic/automatic/m2a1/attackby(obj/item/A, mob/user, params) + if(!cover_open && istype(A, mag_type)) + to_chat(user, "[src]'s cover is closed! You can't insert a new mag.") + return + ..() diff --git a/modular_splurt/code/modules/projectiles/guns/ballistic/pistol.dm b/modular_splurt/code/modules/projectiles/guns/ballistic/pistol.dm index 6f6200fba3..b378b6e77b 100644 --- a/modular_splurt/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/modular_splurt/code/modules/projectiles/guns/ballistic/pistol.dm @@ -67,3 +67,98 @@ /obj/item/gun/ballistic/automatic/pistol/enforcergold/update_icon_state() icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" +/obj/item/gun/ballistic/automatic/pistol/m9mmpistol + name = "\improper Cheap 9mm Handgun" + desc = "An extremly cheap 9mm handgun produced by M&A Firearms." + icon = 'modular_splurt/icons/obj/guns/projectile.dmi' + icon_state = "ninemil" + w_class = WEIGHT_CLASS_NORMAL + mag_type = /obj/item/ammo_box/magazine/m9 + can_suppress = FALSE + obj_flags = UNIQUE_RENAME + unique_reskin = list("Default" = "ninemil", + "Maria" = "maria" + ) + +/obj/item/gun/ballistic/automatic/pistol/m9mmpistol/update_icon_state() + if(current_skin) + icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"]" + else + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +/obj/item/gun/ballistic/automatic/pistol/m22pistol + name = "\improper Cheap .22 Handgun" + desc = "An extremly cheap .22 handgun produced by a Martain weapons maker. Great for mouse hunting, not much else." + icon = 'modular_splurt/icons/obj/guns/projectile.dmi' + icon_state = "silenced22" + w_class = WEIGHT_CLASS_NORMAL + mag_type = /obj/item/ammo_box/magazine/m22 + can_suppress = FALSE + +/obj/item/gun/ballistic/automatic/pistol/m22pistol/update_icon_state() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +//gun parts + +/obj/item/gunpart //the parent + name = "generic gun part" + icon_state = "shotstock" + icon = 'modular_splurt/icons/obj/items_and_weapons.dmi' + item_state = "assembly" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + desc = "generic gun part is generic." + force = 3 + w_class = WEIGHT_CLASS_NORMAL + throwforce = 5 + throw_speed = 3 + throw_range = 6 + hitsound = 'sound/weapons/genhit.ogg' + attack_verb = list("stubbed", "poked") + resistance_flags = NONE + +/obj/item/gunpart/pistol22frame + name = ".22 pistol frame" + desc = "a .22 pistol frame" + icon_state = "silenced22frame" + +/obj/item/gunpart/pistol22barrel + name = ".22 pistol barrel" + desc = "a .22 pistol barrel" + icon_state = "silenced22barrel" + +/obj/item/gunpart/pistol22bolt + name = ".22 pistol bolt" + desc = "a .22 pistol bolt" + icon_state = "silenced22bolt" + +/obj/item/gunpart/pistol9frame + name = "9mm pistol frame" + desc = "a 9mm pistol frame" + icon_state = "ninemilframe" + +/obj/item/gunpart/pistol9slide + name = "9mm pistol slide" + desc = "a 9mm pistol slide and barrel" + icon_state = "ninemilslide" + +/datum/crafting_recipe/pistol22assemble + name = "Assemble .22 Pistol" + result = /obj/item/gun/ballistic/automatic/pistol/m22pistol + reqs = list(/obj/item/gunpart/pistol22frame = 1, + /obj/item/gunpart/pistol22barrel = 1, + /obj/item/gunpart/pistol22bolt = 1) + tools = list(TOOL_SCREWDRIVER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/pistol9assemble + name = "Assemble 9mm Pistol" + result = /obj/item/gun/ballistic/automatic/pistol/m9mmpistol + reqs = list(/obj/item/gunpart/pistol9frame = 1, + /obj/item/gunpart/pistol9slide = 1) + tools = list(TOOL_SCREWDRIVER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON diff --git a/modular_splurt/code/modules/projectiles/guns/ballistic/revolver.dm b/modular_splurt/code/modules/projectiles/guns/ballistic/revolver.dm index cfee6657c7..6b212cea5b 100644 --- a/modular_splurt/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/modular_splurt/code/modules/projectiles/guns/ballistic/revolver.dm @@ -9,11 +9,36 @@ "Fitz Special" = "detective_fitz", "Police Positive Special" = "detective_police", "Blued Steel" = "detective_blued", - "Stainless Steel" = "detective_stainless" + "Stainless Steel" = "detective_stainless", + "Deckard Revolver" = "detective_bladerunner" ) LAZYADD(unique_reskin, extra_reskin) . = ..() +/obj/item/gun/ballistic/revolver/r22lr + name = "\improper .22 Revolver" + icon = 'modular_splurt/icons/obj/guns/projectile.dmi' + desc = "A cheap .22LR Revolver. Pray the timing keeps." + icon_state = "22revolver" + mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev22lr + +/obj/item/gunpart/revolver22frame + name = ".22 revolver frame" + desc = "a .22 revolver frame" + icon_state = "22revolverframe" + +/obj/item/gunpart/revolver22cylinder + name = ".22 revolver cylinder" + desc = "a .22 revolver cylinder" + icon_state = "22revolvercylinder" + +/datum/crafting_recipe/revolver22assemble + name = "Assemble .22 revolver" + result = /obj/item/gun/ballistic/revolver/r22lr + reqs = list(/obj/item/gunpart/revolver22frame = 1, + /obj/item/gunpart/revolver22cylinder = 1) + tools = list(TOOL_SCREWDRIVER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON -/obj/item/gun/ballistic/revolver/doublebarrel/update_icon_state() - icon_state = "[initial(icon_state)][chambered ? "" : "_broke"]" diff --git a/modular_splurt/code/modules/projectiles/guns/ballistic/shotgun.dm b/modular_splurt/code/modules/projectiles/guns/ballistic/shotgun.dm index e49b22da2a..cd4cff2f3a 100644 --- a/modular_splurt/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/modular_splurt/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -11,3 +11,137 @@ w_class = WEIGHT_CLASS_NORMAL slot_flags = ITEM_SLOT_BELT weapon_weight = WEAPON_LIGHT + +/obj/item/gun/ballistic/revolver/doublebarrel/sawn //a dedicated sawn off shotgun for crates and what not + name = "sawn-off double-barreled shotgun" + desc = "Omar's coming!" + icon_state = "sawnshotgun" + item_state = "sawnshotgun" + w_class = WEIGHT_CLASS_NORMAL + weapon_weight = WEAPON_MEDIUM + force = 10 + flags_1 = CONDUCT_1 + slot_flags = ITEM_SLOT_BELT + mag_type = /obj/item/ammo_box/magazine/internal/shot/dual + obj_flags = UNIQUE_RENAME + unique_reskin = list("Default" = "sawnshotgun", + "Dark Red Finish" = "sawnshotgun-d", + "Ash" = "sawnshotgun-f", + "Faded Grey" = "sawnshotgun-g", + "Maple" = "sawnshotgun-l", + "Rosewood" = "sawnshotgun-p" + ) + +// Rifles + +/obj/item/gun/ballistic/shotgun/huntingrifle + name = "cheap hunting rifle (7.62mm)" + desc = "A cheap hunting rifle chambered 7.62mm." + icon = 'modular_splurt/icons/obj/guns/projectile.dmi' + icon_state = "308" + item_state = "308" + lefthand_file = 'modular_splurt/icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'modular_splurt/icons/mob/inhands/weapons/guns_righthand.dmi' + fire_sound = "sound/weapons/Gunshot4.ogg" + fire_delay = 5 + mag_type = /obj/item/ammo_box/magazine/internal/boltaction + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_MEDIUM + sawn_desc = "A cheap hunting rifle that bubba got ahold of." + +/obj/item/gun/ballistic/shotgun/huntingrifle/attackby(obj/item/A, mob/user, params) + ..() + if(A.tool_behaviour == TOOL_SAW || istype(A, /obj/item/gun/energy/plasmacutter)) + sawoff(user) + if(istype(A, /obj/item/melee/transforming/energy)) + var/obj/item/melee/transforming/energy/W = A + if(W.active) + sawoff(user) + +/obj/item/gun/ballistic/shotgun/varmintrifle + name = "cheap varmint rifle (.22)" + desc = "A cheap varmint rifle chambered in .22 Long rifle. It has a nonremovable magazine" + icon = 'modular_splurt/icons/obj/guns/projectile.dmi' + icon_state = "varmint_rifle" + item_state = "varmintrifle" + lefthand_file = 'modular_splurt/icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'modular_splurt/icons/mob/inhands/weapons/guns_righthand.dmi' + fire_sound = "sound/weapons/Gunshot2.ogg" + fire_delay = 5 + mag_type = /obj/item/ammo_box/magazine/internal/shot/varmitrifle + w_class = WEIGHT_CLASS_NORMAL + weapon_weight = WEAPON_MEDIUM + +/obj/item/gunpart/rifle308sotck + name = "hunting rifle stock" + desc = "a hunting rifle stock" + icon_state = "308stock" + +/obj/item/gunpart/rifle308barrel + name = "hunting rifle barrel assmebly" + desc = "a hunting rifle barrel and bolt" + icon_state = "308barrel" + +/obj/item/gunpart/riflevarmintsotck + name = "varmint rifle stock" + desc = "a varmit rifle stock" + icon_state = "varmint_riflestock" + +/obj/item/gunpart/riflevarmintbarrel + name = "varmint rifle barrel assebmly" + desc = "a varmint rifle barrel and bolt" + icon_state = "308barrel" + +/obj/item/gunpart/shotgunstock + name = "shotgun stock" + desc = "a shotgun stock for double barrel shotguns" + +/obj/item/gunpart/shotgunbarrel + name = "double barrel shotgun assembly" + desc = "a double barrel shotgun assembly" + icon_state = "shotbarrel" + +/obj/item/gunpart/shotgunbarrelsawn + name = "sawn double barrel shotgun assembly" + desc = "a pre-sawn double barrel shotgun assembly" + icon_state = "sawnshotbarrel" + +/datum/crafting_recipe/riflehuntingassemble + name = "Assemble hunting rifle" + result = /obj/item/gun/ballistic/shotgun/huntingrifle + reqs = list(/obj/item/gunpart/rifle308sotck = 1, + /obj/item/gunpart/rifle308barrel = 1) + tools = list(TOOL_SCREWDRIVER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/riflevarmintassemble + name = "Assemble varmint rifle" + result = /obj/item/gun/ballistic/shotgun/varmintrifle + reqs = list(/obj/item/gunpart/riflevarmintsotck = 1, + /obj/item/gunpart/riflevarmintbarrel = 1) + tools = list(TOOL_SCREWDRIVER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/doublebarrelsawnassemble + name = "Assemble sawn off double barrel shotgun" + result = /obj/item/gun/ballistic/revolver/doublebarrel/sawn + reqs = list(/obj/item/gunpart/shotgunstock = 1, + /obj/item/gunpart/shotgunbarrelsawn = 1) + tools = list(TOOL_SCREWDRIVER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/doublebarrelassemble + name = "Assemble double barrel shotgun" + result = /obj/item/gun/ballistic/revolver/doublebarrel + reqs = list(/obj/item/gunpart/shotgunstock = 1, + /obj/item/gunpart/shotgunbarrel = 1) + tools = list(TOOL_SCREWDRIVER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON diff --git a/modular_splurt/icons/mob/inhands/weapons/guns_lefthand.dmi b/modular_splurt/icons/mob/inhands/weapons/guns_lefthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..878c8db9ec313bd0508a1f17d5878fa15a9b4bbb GIT binary patch literal 1540 zcmV+f2K)JmP)(^aEG#THH#bB?L{d^xC@3g-d3ib<5lbW%EDr`dJ3Bo+JvB8oU|?WMN=h#;FCh~P zOG`^nPfvD2B~2|GGcz*^3JNJHDLy_vA`$>C8V|t0z+@_2H~;_u0d!JMQvg8b*k%9# z0HS(SSad{Xb7OL8aCB*JZU6vyoR!f#4udcd1kl<(g#~@YCqep-2~;Zbo`L&6eWU--l6jkAcq^B6%mS;(V$&TSz9ombT$cBTYK(B_>F?#zHv- zrr=Cch}#ioDuBf;*I#8DsGr71loqBe?O*6}?Y`{%KiheFhG5C1K+51DZmY|oiLkgI zt`z;)eg5zUHZgK2h2hBj000DcNklw2O(7==+(pskL$DfL(_y1{9u_kVjk zCon(~5U}X%_4>#Iy86Fi9Fk>+`oen+m8_#AQeg4WN^y}B9fg$}3*d9gUIT%VaKn<9OssXYIc@g2yR(}Q^4QUi5dDXx>o(1$n7=3-GdQAHUybv2mG zX3aC-1zpWRZ(s)crfLTM`I#~R000000093-#!p>D(Fk*$#W#Qk82vRc5D8l9`%hy{ zfI*!GhUWAGCamfhQ_-@SzJJMY+4>o-GJ7eruu6zpzaCg^}ltx%MvKoeBZpD+TXZ-@iJ43C|{LkZJF^0Mws60lTE# zcdYMUoxgEv+oBSyTfwDro>_*#co?l=PC@ZwfZq()G`30DPmS6@Reg*&l z000000O04jxqNG|6H zvc7M7H`ez(^Y?{D`DK0Iwr{NO+ve{JZS$L6fo}AD<15fjegMGV4EFB>00000008cs z9=E@D0~+X?cKi4HruF{)zGVxhH98 zB_z5Z=R4S+VxOlqa}=;s^31>3-LE80r0TVNi4evN>_BGeOK(H#OmZEN`V*^81NmH1 z12xL0cC|wr8zB7omOG&JfB&f)TuO5kOQ_D{XLeVI)+2Sm>aQL8Zpb=#(E3RS-{ms^ z0000000000008uq#d!&XPJb_y#d!&))89KqabAM!^mk99>p2P)6%`dmMn)|yEe{V5Z#N!LP*7D>RSOFXARr)-Yb4Ui zP%JDgQc_YxL_~Rcc_=6-H#av+Bo;ax5j#6OEDr`fJv}uwH7_qOU|?WMN=hLU3rkB& zO)VRCLM2a6Pbn!W3JMA{Gc!IuJ}nv#A`$@oDoFMK0004WQchCV=-0C=30(K`-ngOK zl7=La#~0(1S$->rPp&Ik?CE=+HMPC`Z@DDPB|oFX_PK#yze<5VeLAiyp3SP;W})@F zu3yqPN$3>lAcN)e>!TjSvaIQ;evdc6&)D#}0b-YaDgJ^&j|;ji!$BZTZ??@Potm$*R5foQ4{>ghqi4xsH0Av0itspq74cWFLvPDGv|kWsHi! z3fu-*fwB4aD*ylh00000_`b|rU6H{8)48FvVSZx)G|<9bp5M^tR|?#9X~5R|^LNBn z4+?+3-CWk^Czg5zETYRV=IFdhy>WROY~Mqg2~{uF#P*{3G??09hN{f;rjl*cis03*Z23W z>%L#OzQ3>6zDRxm0000000000fYBKH^LJy=z}T35zdts{-|vr&@%Q@@LFL$sKzpfX z?&%xQ`1`-Z$8fXR{0_z6Q}`sZ2J|eX$M8H;ou7&biKkM@RD<5!Y#u{RY+mFLe}B7W z{~vb+LBkWv#Q=1v$@9(#~xadsNibv-&R?2o?5!n|a%^M~V zW0c)~-!wrm#NQ8hJaYHP9yV zELJAEcmw+=YM)dgifUV^vq+@dLI3~&0000000000e0N?d$04!975Wn&USD4iFC|#= z;-r|FP!uAi(E82z5UT>;`qcVXdL)N~s3(4n<2X&zjI;VfVRI>~jGm-L0GpB|heMM{ z5i5<+s};YWrt12ApJd&t&xr5K9mMbNSytrESZ$2I$Kz3oksF|+blUrSToOt71Q9KT zGLFZ;i3s9}>Rr6NWxkw23!Ua?QU@RWd5XFc&F(0XBx#m@oUcFV)8&EM=v@4xdY{&x zl0FTPRO)~>(5dEXG1Ue-i=@>CSpA=0eUg8DN*%=Ao_UQVk+)C}k)*PPc>R5|%N>l& zp!#pB1M)eb{-IF-00000000000N_WW^}705_@hwv-79bl|JL!yb?Qh|aMRNxOE$~rj>fk%oukhVr#sdJr&*UGB3SU5`hgL@b0000{P-blVt8zxzr?0Of%bl>p9PPe!o9n@7w47d4HbQ>v=!V=Y?7!!t9E_ub0L~ z{fz(sXdFI-!z(=J2VhWzjaDkz3jmOa0y8{l9F)3s?-3LVwe0}G)YMc*-$WO^4}m}+ zk;q#y2nYo7pv1#wr_R=hpIvqWhGt0lWcVL)dEb?TxZ`L$Pyf5*y^e>BD{cjMKlHoz zTR>=NXhuc`iA0k30;lEjmIUYE;9x418Wt8tBod>dqVRZpKtKS2K!}Tr3l9$u0YgG! zN!U<7+m1T>fo}h#q@>PV-}K`ytVH*-NB7y=?ejf)?ChC%B7s~)bT>A)w6eDIIPBx- zinX=14GIe4a5y<}*8NQ<#-2saj8OK;H{b9)f7n1rN5{&-@icb#iIb<@ za3K|!^w`D7oSdAjcm$nJPmTk9E+vQ8L;~N3$%&r3#>)+gb546W>AUZrlPhLGXn5ZM z06RN;QjvT~2|P~2MN=aaV=1)Qgm?g8loSrOYi3$&seCQMc$!c(wi!7++IsEh{3QQB z25@z;2J$CuIGU{x^RRXHHp_#h*V7S4c$@h6j~7AC37MzYgH`@!h8 zF>8CwnG0Wf3NVIsW2dYBRd8AVLn`=d&PRUB9h6|tMvubxHz~#M>^oyK-l+L{m-vPj z>pB0@dGkFfmICiza6jdq6m{n=PTQ?e(~gtcy4iMP)RSH4`){h4Y*~b3K;gOz7?V+@ zQ~Fmn@hV(|TZSJMgRa6RtIsD1JVyQwmh6^`>6)-0@^Q^=7D1+reNfarw;9?D04j5b zaqfYPl7%7(3E{Q5!$C{ql2Hcp;@ZdD+h=vdbjR?O4>YRp59VZ+4IMGOqFh~3KPzAC zRe9Fe*G9e3*4o?Omn2=NYn|)u`?3k`&KELd-qUMqlE*0^27FnJn(o`8qLO$*x+x{Q zZpA3XeEE*$tbcCbyfIl$j)gh@Nhg$0(#ecQmrN4pETP1DG{i#V+B-eIKA-OY zx*Ss=yp`sQ7;#o3;sg&4y?&j<*-bG{!89p`BmBC~DQ<;X6u#`|)}^^740fnJFT^L0 zQy^gH$}{o1h}f>LIgjddneR<3Cv8%J@u3d2ITi02o97$Ghi04u?fu*peb^3{4HJr! zvrmv@wpu^9)X@3W3QN6^CIi4nB~tGxD$L=L^pTJe%*5mCE}{`j?Hh($3bB7S}; zOLnB20jXMP5~-OC2Y1t5yS7tz(euF055nIvR?^FIe_%m@SLxsZkGJT(9E0QYtLVw= z+UnNHJ5+Rx#$+fSU9MLMu;t!lAYA$s1Mc1hSr${(Hj?Y7${ua=(y&f8)6`*(aM45P z-R<8RGPm&CR&^VJmbEl(ED|(g+R7LJRbE+R$X3mPgPWH;RLtC+n|5h0#BfPOYF)w@l~2OcIFHT7;v@_SX&PTl*XR~5ufO?v!ML7-UY`vg&yy#A+wmg zyDI%J<@#Isxs^+|y=R=05_Ui+Y2fVnGwb&OUeJBu+paL?23<$a5?)+exwORdJ_MZ5 zgWMFVDw%(PEBn7Rgq2@)+rlqhj)5@+4a$!UQeHsI*_*6&_m=|!1<;NE1nLyDJp-Y^ z6xecT(@Z5FFHQ4*0xOQg%#3FM5SV1idAQmO0k(rFsyCwn#{Ze+i;nh;Y#1=lITc9A zUg1`=HRsD-4?ESR9n83f>*N!RnGI0&qW}C4$e6D?wE^ChJJnAMFMoRB8#r}@qnQT; zg{>-7&ih+z_`d~5=ojyX|IWUb(#{TBAS8WQeAUt>0WE90wi?iC%G}hPL?|oF@y|hM zN%G4*=A9|GMInX_t|#V?p(Wz!_HtTft>`JjE5T`ki4?l-Q9$iO9>~}%lL%j@{N)tQ zvXp={x3W;6$oEhw7V!)1ThFs=5SZ#T&d!puQpJ z59D>RK`&OjFzN;aI4S+OG@D+U3)+)3IP+E7Ou?KpN@t+Ouuhp{HoeIP`P(w{%UqtH zpqoD3jv7^EaX|p*27ata!?Px#9qGmw2)#y;@<~yD_wbEXX3HL_wp~|U_Nw*DqOjPJ zAhB>^_Lo+Gc@M|)JEuh>kn5k{>DI;>4kATGb{~gP&oN7JA+1f^UqE1DbpC*sPQGYA z1b-j?bTncPJ9etKyk>;RVyCCs$Ox%aq+M6c9t~HfNW($}R`dH-BY)qPlR=U2iOX1tsG=&{UU8t=To+4-7& zTt=<;`J~qK>R9FK#X*B>2kWmR`GU-eHrIp7H6Y93*?y)$l%PVcNCn&$cIx`G3x67U z!=;NoFi^yIQrdfA8Yq@FE%(bUkz|KZpk@RHR#Do1E`7g=5HmiCfn@8SzBcbD*4*Q zuYzm6rnYxY0nKnq|7J)Eb^D+3%;4JX%$X^{F0F&)?+@3317Y2BARh;yqU6NW)`K2# xD`#l?0@Dc2QP6Xow&6+5*i~FCpHrk6B!v9mS__J0Rgp~L%_hm z7-C@`B^jyz|IUdfFDZ*Bkpc$|&WyAFade;5VexqXTTW(=32EG`CO7~~xgerN}2^3!;E zdm9;z@oeXueB+7LsX4cusxPg)6R*}S>ZtTCmEvJXZ$c?@DGb@!_^qtI_Y`78%j9?< zPSQw<(efI`Op1y78*TZUW;o4pTHsXUw8ZHirw5!?f2l67?un^{LH7dP06GV{fBBb- zRnyg7(RW6af%0&QZ_E1skc(7yk( zRi1XHTJ5fcLzYWtkA5DF^huW1a}-4?)nzH}bh{xxNp8gaD85azEDrfM>A(*9q->HLlx;7$C5^`m$g*dbxxbeNV!F=MZ(v~N0$%3?hC3?S^M!%NK-M=Mdi`QN^9&&CH)kaGe?nnD%}W0#l=V%APCqXu9za>&f9z1#beMW} zP}YxP^Q+Fs^LOk3(tesv%Y5KFBBFj%sC#AZyF{{n)1g}y-T_4Y*`E#*?pGo0NAW+M z#aF3Rmm=x>f8hIoT>jVhfh%|)I4-)e--UkwWAJF#!e|;a&_W_ma!WGQ#;sBxiE)EdL@8a`&^7{e_`b#9}uaHOp zHoq_4J8}S)ca9u@)dxom0GHqK{PzF=&;I}b@cb1Cz~y(m|Mvg@@Bae;!24fO0Bn9= ztX)BX<)bSIu=?nV0pRlcV*Tke5CZt}6$k-TP#gf4-wgm*KLG&Ne@_5__45Esem@-m zliwSFZ&srKHddnmHdbQ*`25}g)K;SaYO7HIwbeKPHouil{_f_{Yr{b!_>^M7~b08~F5IRMWu zj#>iX`L_T7&%Xlzc>aAW0KETO0D$*@2LSN??^^*p{d5HZs$Z@k09yY`Yk(~j0@y(z zfIZYJ0KobQ0I+@n0IdHy0X9~n05(>m05(>86+mq@3ZS+cRRvI6?K%P6GXTl}aRxvc zAkIL$I)twwtb_O(I&~0T!0QHmWu@F&EjxaIsRl}dF+{RZ;Y VTMM|?_V=-0C=2r%CQQAFce1NIrk}kbT6^(nx#Za27QMM-kJ<5Bo_ldeFwqK?Hu@8 zeEM$~;fFxG2DTP*e~qPL1&ryu@Xakj2}kS+Y$5U1FqC z97MT9$d=(iiz1?fBG+-_xGHzw@b&<_tudE?{rhrc>$c$PXHcgrlcS?mf~Vlm`#e|u)!$~wg4qO$aqQc# zaoA^DYKE-zQKIzqqpz?B;#jdFW?uBDC=&b-|mctGmleQwvvp zgGkTZE-0K0;KI-6ZQC+HbZjimwKthQdy$RP*GM|=F}%hJ#5*$Rd$yISNy8- zDw1k+{QKcbRuvU;&Fn{XZ0rbrSG$3j*kye7aV1x7sQ7g0O@6zkLJ~#ZYV2jeH~@gd z1gO(e7i$5Knn|1?$%(132}8mIi9-AG?a( zEx+AoaKmel&c5_Vx}=g)Kxd zbb=so$%;RD$|Q=f>ktHy=3lBPHeKNUPgQ99FCa-0w>m{~j%GXF1Jr4$vafF-%5i># zgoF?ivy^k^&a-xH5=U}!+zvc2V1nB|yZ2@~E&tK*%_f0>fbp0G0nBE)ySfo2`GxpS zE1>CN6UoU*6c^v1>0uLjc|Wqu^n{t~zNYcaaXXL6IN%lxaQw&#@+;fq{okw+wOXyy zP1P-bjSYYM==q}QqHLB{KdXTB9U2*+qrDy9@e;!`(D>j106{_1h=`1!`^s7Vo3o6m zf0x+#?SOD*g@-b8#tiD}>X|+JU21FZjPSbpyEHa5vS`5)zD!wdnFUYrKbrq0!NC)` z_uw(%p~2MYAB}MRy~kYt>j^0-OPRkQL4cuyP)|<}QBhF<7`sfgwY1Uvs0oEaLZOf_ z7+TO3U#G%9ga*Cd&Tj{V10YEfQ>RQp5+o)~oQOE&!);75e*Vf4!F!Z1iUbBtLi7Ru z$!{P^Lq60tE6w=%D=opp&=MHv@294^nw+Bt1$A1gJax0Y7 zD1Uc+>pq?+e{hlj>+R&)eGuN{k4S)4tCa%-m2`AG zn}O<@Y5+<~O64I3pjfB#c=?ZpKP*r29Ug=-v$98Z^JBX%J*8L4cX=l`7BuE=g>CgZ h0p1>fw>9Py@IMyaXal92gJl2!002ovPDHLkV1kQ91^fU2 literal 0 HcmV?d00001 diff --git a/modular_splurt/icons/obj/guns/projectile.dmi b/modular_splurt/icons/obj/guns/projectile.dmi index 4cec2902acc574cf38f557464342d8e436d889a8..ec4309350495ec61286d4425912585d0aab85b67 100644 GIT binary patch literal 65264 zcmcG#byQqUvpzaNfDjxKBtU@R!9$Rs!5xwiB)Gd1TtjeocL?sTgIjP2?(XgbGjliZ z`<-*{Z{4--A9tObHCeOSyQg<|byf9KRZjx|F!`I@&vumozh69&Hb3NwTk1m(H2bIRA zR=o|dfA-a838xdDjj!#YNotTz^BlyOW=&*Ks#Se@IrD=T$AXtElrtTxKSe>(5Ka5L ztGjV$Yt##cufmM4Op7{x`YMZUzu@_5V?0jw`h&KO@f7f7ZmBRcdo(1Ykd7ajt|h6lD*KT(y>#;#Z&mkcbGyID3hSCwW^u|T2s2W&gL|iLa_i(7=EJ~* z15SBFW%pfRTE+PH`$bm)DDRIov{$l3vnD|8_=O_xk(7_VG>ArbQydYa?D7YK^3Iy7 z?4_euf8#>GF58i(6)@slHxIBq57O5%gnjlvXu{aMsGv~QUBVCe*#_c^&Yp-3vyVnI zS>qS9m!?hF(%Fs?VRFS|+)7Wp6^IR&alf7^!m)xBx{KERMmd|&v9LnoMm^DL?Q+TZ zy?fo|%~vNmIo~*(xM{IegNq zUVAW7C|@BraRaR*8%78^2|;dd9&fZ-sCiv$Z3#iN+^Hu8bfY_^{2|d3w%@pLvMa8E zfWFl88);@&d^|}9_>gqmAdgoRPhibv89c+JS}SPf-M?y0s?3U)9>es{P>kEls~T6M zDz%nLhO1Nhb{6_1D-3cZ`PSq%GtPhM6|}8jtA6bvwfg<9c!2ASIEp%p8CJEH?y#GJ zbJXRqejoJGIDd6Gd+bw!%V<{p%^300=!^rTWv}eT1cud++1OeV|F_#FHzW0clg)u5 zi4JGY%ykU*?mJ8ws#d#?X!j}u7L=!K8IL;>Yh;dcipyx-kCRhhh#iSw^c~j1c4G#V zl>($w1@Po}qup8ZMo9;zlgFyuJ$g&WOQFTEGO>ojJhThthFA8VTyAZwwO-TsYcxoi zt+%x;&56-Ek`O9Nr?b6xAYkqEoFXD`P*BroXY1?lm*dxumEqN_k>OE^mErjuE5#!d zE5$1&@o{TqiM}5;uEeX?pu%k%Ziz|NODoEpd<8b_qP`E;Z046?dCnZoIgY%Jd{{U0 z$xtyR%iyz7zdhTUvW`*zSD%bH$x-EavY`l%T;)aa?*`V@En>PzgR_Q>r33EfKg~QJ-e?(}-QK{^**-VLX2a!#b^W&GK}%vlRDB`hfDa+-C~piz>Ff z(DJn_IRk&qG6)zaDS+W&A5^$R0KDVp<2u&J2hZ6m1rot}0 z1HN4xiPWNRFgqrlf{CT6f)bPV`a|0}Zpwo%7 zl-*C?F+$(nCe!b=1L`-p@msDWn zLdct5JETFTNowMbBB$=R`q>2YtF5-!QNo`3Ma;^|@`)DQ4-5%j z@l$+iy+BV-uRAz6XliXOp{)GMk}Ea%N?M4B9`T?4Uw?0~PA_U|A_iIv3=dO#PGYBI zVa#pxhW^58XVz{_Lau4YO)*zvN{EVl^@m+5^D6u=T~J0uBR-ctPuLYJCe$Z@Vz#~J zk8ELcGp+6fxgr<=zEn@9C;$yx9Z$zik!e-a)$=a77!K@qyu{gQc0BwLZzAm_xVSK> zp9HfA-K`4Of$Ao~x;Ea{d)p-IK`b(odspV2y4aw<{jsZ=*1fTdyg}*KfZePihTtQ)t&|US0j`po7EaFu@}17jtkki zAy?+PIOXjYmCGt9%;dFG3+X7s6Yg9xA7)HU0!!fw z8?MC=4ja-FhgH!LJIX^=CYG<$sfvdS!M5=ElR=L<=G^>YS?5K zs`9nX$e-&b8!i3QsB5ZeSRG!`O+~y^op+g7G1P+Q>#+`Fv^iWoy20D-iiedId!o)r zN?}Y?SQsJH4=t*}y9w4|(C>3}6tq9I*skeqSWOZbMau5!`jB`iDJ~i$CN8400^5dc zeod{!W)R+&6wrRONJyB`v7_NOR@LD|H1kxN`1_Zsw4@9ooCM#kKaPPG7n2E!bD+AH zFTjRXsXtV}C%j$C@H2HmXLrrzdAwj2tsi6~LzkLYcmBE_LRmA%^Ah}J76>V+sq5J1 zXeb~>n-$BLiWU|wf=4W=a&Ik5CQ>UasnFnPxybkV(mEc#2p!#HW$y=Pmw!Oj&iE*r zVDht(;@iRMhM3Zca*@iJfAd%cJ3(vP+l+D-jo7*Wr!Us*Z%0;&$%DUM+8!D)mG^f3bUO`p?tE1;3>$F;Hi6CB5LL^+zhE zA8GaOR(m|lg>F%uzc~Ev$@tpE)pa=37ng#=AY{YA47$1VR}b~xZ)+|X)t&@#z9{v@g3Uhz<#bM1VToXhU63yM@4 z!3$l!quPGLJ7yti0VJf6VZ*|0G6JaUB+yP--lKU4b3&oPGVEY zI@TejLGSgmL$rcFxvWYDo6odNFV4i;NehngHj!P1Re{w8uJ53DW6j8y^|M0DiZP#!}8*Bd-iE|87pvgM6woU%yHy2h6!q4Tt92MmpZuA!~gHbV}bHM z^R*k9S#0S*S_^iTvM_1K?@t~%Lb3d>IdbtU>pMFA})Bfxo9(l;RIUGGSbPh0bHhNDSC(G6FQ7qF* zY}E&y%VDO3)Qq4({C;;iHG>cx&)5-TrPf?Ez>ohe71 zDY@&!s0-9Ox!M24W51qMmF@W}tHX?|#OhfmCf9Z~jTa5vw1B&7_Mmxt__IRH zP~a>+s1y~9cYgh;2#Shtw%Pw3mOVo4WzbB3PYWBS(*AjHxyj$=>hK97b1X#U>6Heo z*sCb;*9UBgO!8g8cOp)zn!`KyE;omPWlOp8zx63fW}~=!{*5hNxG=>H*R)>>lIP8^ zk1wW3@ppanlN@OOmfv$QRIN^|=n?mbjOPh${NNTjChXQjl!8zGRrSF4%JMaA25?4@ zY_e|7C_$+ID*}RzP*yOGwuh#Q3c)uaX-HxQcr5enSA2{-&=WSXE7~Z@e0dw5Eujze zF@?R?K!Nszah^v=K{c`Vb{ujU$ek}qcfST5s zp6|yB?#m|gIkTklIa?3#sz+uwWC*R)tIaJE$PV;FHscslBC;E_op)1JcPnkQ)A8-K zYTt<32>7zS2DAd*rNGx0F(EB2Y-h*#o3e7JaZPfU&Ic>V;Y`_-aw>qsCLv&q;YhD5 zDnmoV=b5YCaLmDzY+FyUC}qA@Dh$CRpbFIKDB`{S!kg3xWh73euQIF^iFNVNl4a(@{O5P_t+5G^gr z`T4o2nVImnxZMu|4m%j2to(e5YAX>D-&xr1SZ1P!Q_HgOp_ZViHcQTgfS#@remYOZz86@zxUWDh>n|!Q zLX%P)x)pN2`E@jtxnselS7RbX&mNjh)Q}_T)vMA9@gBUp*7bd_`)O?NnKS@nCnJM{ zg$)d-Vq#*}e(>TF5(fJDJ$pRVfyY=95)$qjd5yX*eNwyHnyC78HCo@WdA8mS0@+Cx z`uq8r{+(^nY9?%@7`9aa>tc2;oPCKnw;Y<>)-@~47u=?Y%?oeHsj5-3~sc5uM2O{#oa znZY9I0kZf&s=z<~Mxb%;aSFW_B}d1YG5b46(j3pURhO`rmtbgkcyC`g2`0O%#36}R z#N*>U;g9LXIAf&x+B4z$-;+~&E^{f^-Fp*g;D3O)uO3A9;&Of_fuQ>zA8hq_fZBaU zNI+Nxbsxf*dU9?zqxJX!`y>;vrU_hkNVMOZ<< z+>32|E~6~qKEp9>-tjh@&>Y$={QY|}8#y@%5_*^)1A!{Qkaw{0N#8(yeMH_JlT6Qibr#q1nZHF! z^I5{bY!g~ufRK@q5e^m8d6n-nJobm?U*i7~KL2IwbcPJ=6y6&ux6HIsp7s8efXeB3 z@QsUpS`w=9>S|kcQoBP^ct%LmFD7-7)36a0WD5yt2c2zs{Pz0xv(KzsOyeQK8UcJ+ zRqkpSzMr`bvc>$2<#Bm%h!G{RprE7oYF~(DN>w6FV~3Ue2!6b}%VCb}@>UfzPDiV) zHse~41d2*yB1=s0PS~_*OFIQWM4VgvTs#g~wpNvc+qEnc@z`b=CQt2SNDUEkrH1bp zk;}Ag`!$em4-AtQe8nnia^gKyj8l->wdD;SL@0%G^ zvBlTP!55R60Pr|`dMA9jKJ;H4Zv57#WcXQ(e>e!zuh)z!rU#=E2r>GrG zxN6A+PY`K&w_TZxc}3Z6Dtopf{{C&@i6smuFQthg%ex3NBv5TbT~^Zs@n0NjQ0v*F z4QJw_aZS~9iE8(;Q*K?|tL^}4c~ei%HhpS(P43?k`=})($@U&^-}T2=+mk94wcB5z z<19Bkp&K>&lc+m;$y7R5C1yWQ*-=wV0eiMRsZY&?OZuXHiL=^4cSZY=r>IAmlz2{B zmZfa0T!tP^xn&~-FhG=ZuSBSi@(=r8Ts}2c%_zJs@}9aj_*rp_N`{sS1W|h0mIHSe z%?rGl5FoblAzO5QdSHM3`9BYo3Oo;l*p_`8xaWN%{D_xf+jEv&v5yS(fP?%yJBxnk zQb4uJLK+3Gf=C$rfL>3Y?wx7Q)+JROS~nuJ)Z6sqx_rgWag)q#nh4H|Gpwz1!jv8q z8ai*##2yU{TOQuY43uRRktYz(v1euyVuo zjEl4hh)1?fjJsCGZL?ukG1rpB-2iTX_^T6>IVO=L2SnPPB~&0RY(6`iNX}+ zNjTCLkI=E_g>m{OOv2KVN&S^J-Q?sXV$D3M6P11(c;Z@xMY1{4o-}YijU)|$gxfYK zZxfK}>AMbft5aUIdVII4j;_hgyuQ$Xbfk6<)uJn5Yq#c5-+-p?kp8gwBkr!>J)Z&_ zZCENDdw;Rw3n08;W9~=$>&MK*q7PUF1-tgES9E@^b_z-Do6iioX8se5^ti;&I<+-Q zr{V9M@^mJ#RP5ib{7<{lomlQwBDI>n2o-Xn_Hbg9aS5n$Jt`jeYXEHwDtQk(7j-Lbuu zEZP6cH+q3>g|Po1(}VrYE3JUr21{yH^{p4h*(R`{#XeV_G#jXhLZg5ye3p00h%1D1 zXSc)uu>0==k;-G8u!ZGz+;sB&!-^;M*0J&A#Ls^T4e^V3ZJrK4kk0^HEjK&nKR$ZY z-;3zr2kS|eK_vDiF0MtvL+h?}VqP%Ide=)nTAhlNGym1hw=eqqg7>k6NDTZ~_G7&& zAq1h~F25SSOrTD3E3BG^l>>=4upCh)_IBBACx$9ZiaVpy!Q(w7nZx8gg?*FaKZbI= z?eh6sM8^nW)_DVk>xpb7ozDbq7zGPK+zAW;%KK@OTjigwq9NH^Kl~pWFGk7FxIoc8 z^nl>XoIieO3z}Zt1cMbYfMfuWA35(O)S>wJkyu<@ycGB+sX6@oEm7FXqjbAT3Two~ zHMdNA?T<2saZ+Y)zoEaxdLqrg09A_k@evWiEL9iVG3%~&C+P3*FG4*WM1Dpa6p8=~ zK?e=|`STX~CjTFwVCrd|(506q@=?N53Dsxs^Ok7We~krGH~>G_!T$M%KIPwR@5%PY z>+rrk2uT@v>CYFcFRf0l$~yvZzfj~}g_k#EY>zMhlkx58^?5WZg2^f8T?_=t;{Th> z%|_4(2pcBErT;fBdi%WR|Nf^h#gG4A!z8hW{KCSZ`_*@qoBj_;Kmhj>&*%rjbKgdu zGb44CQnmGKK9}~#ZB}B?<2ttYa|riENJxlUg|_F1WVYY$>B(4y;8>O`k3VUls@ggg zgM|W+@wSx1fk@&3!DqsnZb0Tb2$UoUW#O{i!(sBi_xIr))4h#VYCS_sh~*%~W^rN5 z+I-eRUH}YY*|r-q?3^6P-BNzra?xPk_URPH}{c&&iZaSJV5u4L9UU z8WGf}DPO!uN1G1<<+vln7CaUZpgm34yywXBRIt?Y76EuW<{P&kZ?wIQ;%B+ye-T>1^HB#sQ@=$iFbVX{Pk;>jEsygECVPBl$4hGb+3a!F9`{C{;oFl>g#c(G8giy zF%h7EI!|n<6V2NOeXem{m=IRp-MO^F`cj2CyJBMS65`|iySlovNbCv;m2#h?iUR5m z!0L3I)e6;WxpA?IooT2zfKk~8praU#q&Oo+_}XnI0%BHV(hO1*d}x{FYNC=TKJmT} zS|1=gp2*}r^=d~s`XP^bm>R9O@ueaq<#ne=aIP*VCnt~V1+}_{Ms#B0ZVi@^kx@#( za|B)ZXu9Qf%c;!pY_>D@#<3?O%_0zrA_J*-9*2C);9!QJ6XZN>vTSk0K=5jTdWPr2 z5Ha^RqZaHA$6E|JUbk=RnaikA+b6>Y_ zqCPAJ*HH>~Po1cn|6#kY7qNUWEUOG-9c%sLTUyEl${;}t?VT(GJC{uV0cF+Jeyh^- zXv1rBzr~Vq0KD4r0pI5wy1#rmqEYL6wXDX_MDonea+1tn(lfiiW?0j-IzSYHf^S9& zNc^`4J(b$(t$--k!-HR4UA=Y22%97zwm@M$8~HL>2)`akH==yHTLD&W=+7S!BctDy z3K;E;3}3!~XP8&;Itu-%CmIL>?F=V}b6TwYvl3r&CDvO`!APJqLC@Ec5syCkv;`Y5 zA<~i_A=r64$R{o?&*$2~J^%@%Ql=hk#0m~t%!j>f%9YH1%#wtkO^|=~x{5l0ZA)S^ zq;PRUj17}+PL~EJ7tFsXDN%iIuvrxx+?|_KtF5nhbBqAlUTjGZIz3rvasvI_f%B?( zg?0v|q}|qGNd-8@a@VP)?Z%PIm34E;d3E`2Ds!dV^L9CW74DUJ;It$ce=G=4Bi1{< z@IRa)X)oGd(1u0JQHcY^hKE5#FT|4R*Jn*NCSz}IW>RhRrw^tDZ_~M*S=?=59-8jQ zbqE%52?^DTLeLME>6+5gXflh|j$Nkz%1T5$tn)+WQjo`RxY~oBfuQTA7M5S1QfWu@j#}#5Zu0JrC(q4a>=i z3up|$fe(u4FJ7os!s!HZzNnPMJ2tpU`etDeadXK8C0+(t*UYQ&obtM;&C^2@30C_~ zpr_JZyF%qKLYP7IZn?$m3RR=E2bR;ZfN$#;QFeW?7YfI&8Q1MM3?mT#8g#XrNn55X!fR z-|cXrqufaDoX0iiyDfuA7+ofmOy_hzq>Gd1HOM7L*ZcmEj_2*WR8r=NhL{HvHc;a` z0o+%wT7K%``#B<^VBqYeE6@Q}jQ}DhCXO*UT5M39OJEP^{Do@JA3-MQ2ng5@ZnFx8 zPR!3o^z^*!^ur|KlB;fuK|tb{kR8s1U1cb0jpiyc8OawMf^cKGXdUAeX{%xTtwjt)raAu znQiS43I^I2qan*u&AMH2)*g_XfA|;^q+35p=B7mF%MQa8peMgLAH4V2W7^{Rg zgM3nd&`Laa7+I7e#tGLSen5uq<^*Y+<^Lb586~S@2S;0#**ByH)1%Yk?P(I8Z7b+EM z!eLOmgTD+OH}fXN@L$R$s;T)3>3<-%r;#ZO>J``Q?Cg6cT-{3* zzEIAyFf(HU5RE7;8n^OZ-KD|5w@(ZSL<*{|_WCKG%0($ig>8=?1%So2GqG-uDgZHb zuF;EkxKR5$j{hf@Ms{hOaa;fUzSh~4u9*=Er%8&WE zHUuc2zk`C6x~gg*P|%R??s-bAjy0f3Wu zE2%x~V397SA-R8v136|T`LEQze-GA>te2iy<)Oqcfzz~s0+rxU!rjVLFMhn#2GX8^ zqfYHZo3yCl3MW|-oyvQi%iS@PUnp0EIT~=-iF*a5lr>m=alu!i{5H^~@jJu8Ae?-C zbbkX=NI-zhpyI1{S9xg2$&K{$VS>Uf7l>>>V_g9(Aj$CF8Tx%}T&+w-{VlgK|Lu@>q--%BU&REtsp^nD+XIgRb@#{eC=$1Gfi2d+$ zzL*El<6Wz$Ti2<7cXMl=y;wl!rr6)#w{6k{$}M8%#UD^B+uE-xU@4wC>r=9`Hgj}?}#g!xO;ENE86>( z_FAwmC(awsJ?$wlblY-iPBS|qQm`rx*c5WsPWDA$s*RcEX?)9F)gx^a^E-o3#I;v; z9+3Tlwzs+-sh>v(h5AO*`TWy3T%UzmIHW1i2|}-wfc=P)FCPieAGIvn(z-IFS*&xh zdn~Rb+p~#emxK6l5XFT1QB{AX*%Yl@rXZO{gEc1aLPkPDz$-?Tq!$4A7IGP$$#NOv z9jq089sDJ={Y6IV*#de$9=YOE7BioKY?HQU-L}J$3w`hqjJGx|7eGXF`P=YQquyFH z$(jgEMLB-PG&?w9Do2G+PY6dS8(I$#DFF>%VV z2%FB-i4E5M>oR)_#1E6+J7Zr(^=ppB^z>MGQRKzp7R>p!$rUuLZ5@z2>J6z1cB1{@ z_XZpBxqhazLhUdtA+Xm=C)fjD7!mtme{}8nUPY!MfON$j+r93*ZnZo8f?2@|1^7;Z zNd1QEaNA1LlQPR6LID#{w_GGGV-1F`?_a;-snjrY>o__(O3Cj>uClsLKLerf2z9Nv zTq=*OJ1{SXd7poWL6kME|{~suZil=Au8c;jhRhAV>I% z&KV(!dJ`pXGY8r3N_M!(;kbBVovHf?P;Z#3(lqDj%6wB%L2J^iXsx6_f(NELxNWLY zvGEkY8J#2j_D$t20|OcW<2wdp>FlodzA$Oj%T;5yOB4dR!0sp0ci2^+rlH9$Y9f{= zan5Ihww0Zi@%8nNYZG0IQLgd+1>htgwq0y?WCWaj z6|e#N0QqYmQ$aluPl(PGCRx@qwN3tx1mxmKnVfZ&NN)uKe&8#APkigepzJB$M!5gDmTj$d8$Vg@NLS#vT zOMMEE*)LaMd?Lh!B@%I7DgzlSt*f8q>yqxWsH7&mpARi10cb&$&%mw2qN@5$HFEED zq-k*MX77##V6K!eZvGq|ey7GrOlq29KH5oJ8BjpR;sRaMDZb_6BCxZwE3Bv>#B+^* z-anq3gx;?Yggf7+9eLA%${dBhfx#E=3+k8{pQFF!&8ERXF=E=WEb;5tulgGm`Hi+p zMA2~JtdAP{qLkbp?Ku+4({i4Ff;`Kc^YeSXj<)rR#D0@zMN;;|i!<`*i#l(fLo#}q zZa)t}ydCtj%eN{vmq>rP9d)m1Q-j+Vezt3JELFJS918KmX`iB$Ig7<-P_o~ORY0;t zo|PFKE^xC%m;XuUIt#h!{$RF(yf~7yJJklvuy?s{B-GkDij57;>BpP{RtEtDZ0)8+ zHlMy_nkG$6`mIX{3=^*1dn4h%cB4s+2_)NZPL@d~mm}K~N#13@gd+0a>y!w>0&%W4 zhOUFW5HcQF?f!knqqQqVVN zEU{DiG0)55=@R*kS(!VxUa`i{lc_*{0?DT)J)MYDnRVU^u;#JIwCOnXz6zlY-pj)_ z9zxEqtV)=>BvZY(Z{EDZmuz#fPUgXu%YgUp{^ESAeqd0ip3EbO=3~3bSRu-0^gN&6 zLmL|jh%!I)WgcxChf22Gc~D+wH!>Ys`fp`QkLL5$dgQgO^B`12CvHud}pu&Kzcw}9gtfp5}*XbatHbbUybh5 zuc{RO#g8_=v8P(ukBHb}%aj4tDfJd%U9aJRyt4d=sJD`)!*(93-aEl6aP@JS67oCo z9x*TY*5|Lsem1M*zUDLjT>}#lS~p2?Vtp`=Iqi|930=`Rj_f)y*h zS*-msQ}A0A+*iKrZ!Rb~e?zw>*ykKRyWb^*KDJ4d42o8Pbmds4^Es!GqL}E+q z!fHn|Gqs}K>e|b}5pI$BJ{@)3+vV=FXS>m|Qy#XbLKTN*rbA0e$lc{LfCm<{|yw~kyLH>x*oNBi{R*}aFo z6Li3jQ_9u6PktyC@UhXnMkSH+MY}{Ed%%l5g8pIG`uy4n-H@EK_BG2t!)2QlV19UZ znf^@UO&fcci`@qyWV3I9mK9drtLC@F`K#mOK3-5rc5(3wZx5Oa=N|rBS<61R7ZRDJ zPwHp3att5jw}DQOXRI0pHHKBI6HdlL_KJ&c$8+(P86e1osjLwheX=Dd2l8A~OZx;W ztA8oQx~)g|k2wgR_EA)lu#cx6dRLs%a?T90&J6v(eToq-)9(7xaU>2KxSObfm1-tm4i*N{86g)cTeyXzfsrk#FT zmbRC_ubaODFAR3$Y$&pk#YsdIbm(xQC;r@y6iO{|IF>1tiO_K`_@!B_y)pl=i%iM>AvRU%mC^mD#Ms)t1Hsd7Pg( z%C!A=%|E8b2z`L0LVWL07{qn!Sw)zis9iVP~^9Hi@&qank zYfKnnJhz!Eu9AtF$&{YZYj^#0>CAC-2*X=nibwm^qxn)BnUIa^ z$t2yC-&=qWfA_nrjckM^(eQidV)$Jn4`~y`{4w^5_2YjvvIiLT<6@GMsOn4B>#Uv~ zpxVY|qG}7meVrVLK-FlT;vVu75C5?m2ECOx;p3a&dna>OBH;Qpsr|ORg$Pu^u&>kl zPs@s7tWf`ZNN8L+K}cxmcRRZ(J)`I1nNKhHES3RUnpt7_o++pcGFQxa2I{%m&vi@F zbx{7V@!lE_#?Xj-%(q+)(V=>My@xY{tyzz8ttf~FDnvbF@R8<9rTl2t+uLh-ceZ}F z9!O3-l*p=6F6$~XK?l&|{CpabaOgnf6-AwKB-T-u58F4#L@Ckhw@E*#F-rE^?bbln z! z(c2^b)#FBVTx)ooLdIMX> z`9S@8n=E<-lIRAdQr>NC<=3144_T~~Jc2hcXI1H--Ea`k>3UifJyS_ZsmdGfl{8{J zckBd;N@C^w`YmJb+kyo67#Qt*t=SY1A3OrFiQS`b^2;%Yp3I@4A^-cOB~4aLPJ>ri zP}X7NPlnC4dlp=}Q~B}+Kv77o&CRhRJ!;zA2=rN9{qJ9tZ4PfThr=EOhlC-JLrEEqC@bkz9#89luS!ZZLp9aaAdtpsBhuX((qOZq_yjAc zuo3QM+LTjF%m%X6VaovF0Ms|TP5#*hd^&}-J`$U&6zn)4TAV0A;}FrA@^%A2850c+ zau_=xu|Nc$!N1C=eMwt2X+X^Z)RFelVJ?N!!uKHPF+RJhYN7;zp_2%|eo8&V*8E`- zI46Mu5}Qr9=O5LUob}MwegiOt&h&r!3xHYP)0VCgMkax^xqc~Ak)b-BiVoc?R9Ic0 z{=Mf9Xghf}Y3+#!IvagRwH@+a+EPs<$$S#z_6Hjzmc7%trp2K`36V^EOK8*1wyGk= zg2%ZT+cma$=BmG>q-04sk`G|`z1JJtfcZjSV^4Bx3oWI9KC8?)GKWTn$9vFvZeEjn zUVT9UZLCXzT)rAs_IaKC93y1|snyuiyv}qHsk2T4_6X@8Js&=NkP^H+{fT`ZylY`$ z;lGAN$I1CBJUm=bh>nJ4{btd|gxveFYW7~&53GpPN2NMHKQAREg_DrUV~5y&KVk#W z3xQJ2uW%CX9DoKC92_hqC+9b`eUZ|v$zo`1{O+K%b?kv54Ou{>^?Oqi>EFLO=K;_;SqQcID)A*cb4x0vX zf;gJc_z%A*=OBT_tl+sJ)+1(X?wNKtcz>6}q#8coIFWa?rR<@Zwndb;3caSvCYJh^ zaTPwX+Um+NG&uNk**b9EQbI;1q=&RjvkA`tA^5%+mF=wS8wR%>c#XDywtjniTM+5> z(j&bUl}a+7@U|2!}a z+b`=5R{s>0MBCXd=d`Sv8VQA~mX5`G+k7c0e#>}T z!`4G-yl|JHY-qF6!h>4IaAIWF^op!XcvI_aA3e2MtcW`A9dz35;nE!gJ zwN6dzkv5_jC4>k3X&Lpzpmm@JOEvLs*fJW4vj`zY7&0X|3@- z7^It9g~PCydA;42(FWNT42MRVld;NIV-K9ipw{8YglgjKQ=^WBg@x7~DkJdLnQ8P~ zPaHR5|7d~vJ5ioLrg=_Th2iI{@bQ{fmjHjvkXsBzbN^jzgbdQ0!*%vIpsc|2sKcRI zNnS`S$Kfl=(?3Cwq3i9#>j*Do*_t8$tsb$-Q{g9sk{BYWNTgG#i;ypu?91BzhzEMg z7!T_>jBo;VSuuqOy20$~YCM4W(0H?8;qU4_1vtI+gOZBAKk!sIFX*FP1|r5n z<#D{-LEJ(>kOB}fYJ2WT`CZ0O$8&KZ+9+X??su&fh=J%$=jt%M*{Ijt_-=Z6PK~&; z$Y)#84Aa5b@Ifk;G%4ph*wx1+53vQmfuXF1^)C-tSH(iYI0C-_iUnKMef8ooFeX31 zpG=$gB4P9U0HuA8`|ZTWofHcodrgC(bn#dTWX_R4$ji%Lzo$~y@pvb}faiF&CJbab z*4H|Jb+Kg=TpGoJ_3^+N6QrEo26^{QbK!|Z%#PnLyjMRUWYa~WhE72I-gjd7N5Oi_ zR`Cy)rmh*^y{j~xcncr|J(u&RtUM~YhY#RbNMsXP#DPN%02ZQFl)m8J;pXB(`A}9^ z*pVk4+x6AS+P5e3o?oY&bARPI)cTzEQFibQCpx!4(%a1qist*A72rXrHQCeDTQ9$3 za^DE1JL^JcT?1YKS|c{!x`aZm@iB-Lmu$?oGKAe4ID&z^v+7Jvl9my{!OU!G zY1yNJ`$$}UQn-rG4&j^C@V?v`34`BkRvQgH!>net|<_EFfVVG3QNH zbi(Q)?q$E)zuz#(_|-0Ci3Eh(>GZFht^K^byuiV`#sX&@NNlMi00G7q7|rBwS^ss3 z_d3x(pF#;g>ZFiu$2GGA_U#1g4`Fi##x7W_e zr?x!QDDRS7b^0S;s0s&SlVjZ{R(agpD>X(aLh=+L%Zlv+x0LI)C5GUiZUMeiY`%mz&mIEO1 zkp3xqxk)5 z@26iKK;3I4X96sJ(@_57e_4V~} z$jFX=Z~owIOAr@#Wl{n1koxn~C_rjaxH=~E>~p3I7zkegXBTq}#1Ip6b9M zN;U!e4L{NJ^fW*)Gqtg~U8qpZ6a+3LfdU8!1ju4{}Jj_1Y%yTUN&sWg#_Z|<@FnwabEQd1neDj&>aqRD)P6a ztxb!~T;?g$_tMbHs%*plK9RyX^$C2Oz@9X+-F;6|h7be*a~yJ#P~e<1D1-9(zcZk^ zg0BDI1;}Vs`n@k=c|NxP{w?m934oNd0=mu3O<<@wNj}&E7;2J|frh__w!g}I3=I!I zTf6@{1K=;xMxelLWNe&MRfVfipwu|W3LGcDmkpqL5)Sk_yz~~(Q{sP@3KwDzEE5Re z9&1;`eGWDKUZyfLGxMY@0O3uqIH1R;Ns|SXk*E2_Db?fh8>pjkqRHi`>i;6{EyJSh z`nS=G79|8kx}>B_q)Vj)K?FfT7#gH|=$4RF6i@_2KtQ^CKvKFva_E%qq4pZ@=YIb0 zmwoL0et7rx5P|WUxvo{e^^5a77irzWGyEeu?)Hj489;GKXT@89VM2v`awo!P~OAN9*%_YzLiv{qh*^*a-5vF+a z-PhBd*=$WWna}xb6jv7#$oHYPHNn6u0%JWYfW0+*nj>`uy#cQDkY?R zXaPgFgnJeKTbKH%(QUQOlmoAd%S^ZFHC~kQ2d9SNNX@F71c@@|!V0|rV)G8vkg|q2 zxQQ247%#R8`@T)lX5LBbA1lc?p{6JNF%asw(N#@gPm+k^yMZ&P z)4sDKvfPpov-qud<%l{2$ zGa5yUHas9kUQ-*ROFt9?lQ`isV$}4^fuslntBx*bhQbd$_9AKxS;hy)YUq`lFzU*8 z7Yo zD#He~!|YahNWbi-0-B+sp32DU28?lw{9{c`AyU%!K%KxVLt5_DA2iA|;sfCJe-T?~ zS!h+KCVd0?OXS&q-=O;70ja?&ME4_L^~etK=Z(?Y3a?ry=>ouYS=T7#utQ;3M?1~L zq25klE}EC?uCcI&@te3{2ZC0EBohg(FJWTyTr6d_;WD$1ci`&yf8XoKQ3^_~VdeIG zSZw!I0Wz(%y`7ndr^kAFs@j=#vbC-4aRsp1gdN_yaTCaU&%mOl$tfgHXTAwK*K-YN zTV7Hte8iz!xk02mt&FBehyZZ&OEopMN2YDoq)Zde}HD zSk~!O#cFN1`oPOV6_$AR=n}5uIDg8Mkr4 zXC&qG!JhWGQ^0zZ`w3FLYW+HdCMA||?eFyuPW(`Y1Da&jQoLR;$4&2gEFMKTGc$9u z^>_dlUR`_?l@Knpb2tY3yAe4#Ii1s=H3neK04KSz>g75pSX)@ILopZ3{n`LxUc_T5dto;mZ5I>w5lOt}_uqLBXAI3q6(%j}|%FH&1nmA-kxey#S%u#BlarGHi&TTo_m(0}OTm7B+V;DYtEp1MLoh$et_kZ7IXc^)XnzkeUuCxhh7yRmE`&_Y50V_{)2 z8crTdN0kOSi0ea=%};`|qTAp!2<^yduwc&?Hb2^b_Aj8lclq*0lJt3)Ex^!he?(Z% zpIOskepH&bigT`}8UN#}7{Q4ETE$F3S&^F>uX!AA72mkfG#D8#I0axUN+g`|==L3V?|? zLZg7n6WW|+*|b$L(>ypN6s-0n9IWEu(NRVzsfU7#*zTmV$!ZDTqd%k`!1cC`<~?{& zYFRfvRlW)j7!Pv%zWV^1MHv6E{f9>RAre?Dxizdo+A{D7P-C`6y2JdV@}linrl8$v zIFdtJvau(1l_C5vI}XeFi=c%$a`Z@lKsQcp!giaEKs>MNGo02+InR^d^BYui%OEYrg~-$tgpnAGQW0#_1Whv((6 zo;xqFM!&dNnxqcvp%77p&v;}#Wt*u0c6&Tgz{Fv;5hG8(_Wsuzkn730eSukX$56+> zgLQplL%_J@8m*M)Ei62uM-Lugx@}G@nITT@(Q5FYCX=cAr-<%~dtaVvPl1_YFqA9- z=WvUiCmKk#1FJ#MzM8baYApymJZR|YzdaG*+z)NnVdaZip3^?{a))*vMZ&kHSY1l| zEi8p^`jpd34sKJS=Is1*L+&h@e@#!v0?ciSl#>OzjYujXN+l3D6J#gmw*Hdk}zy0hJ#f`c^*oylJxL&811h`5}pK_sH+G0++jOD0*Rj-tc~s zQRO5CBO}@OM69+ssMr%ciD@_4 zc9q9u&gYv!WNoyINm0Cn4_2!@kf9ZewdfTE@CV+^W-q3gqc_ZWF$Z2D(qotzVzD5f z_W(GoeTQ@R41TVL4h65~jOcg%Or6K}CiZf2kNzBQ`!O5txi{9rW@GV&j$NOAA;%QK zNkGU@>Q9)hlieDw>f+sE=p#&h4l zC|DG0laPanVWAhO=j+qlKiyR9q-4%%_YTV&ZeM)#L#3}(6BY_Ul%MHi=F&5X@3OG5 zaju7`z#<1weD#yqU-9b&YpC;6P`n9QSgRjRBN3!O*Hgt7J}e4!k`Pz>?f2NFip5@r z$c=;;maj%Q&pw_xAb1$&Jgd~Ovg+KFwoUB8f(waHOb*Np1W*Z?7nPOW>rNC1!e|U- z@TJ^UddhMbRbUOj8~R(R73N-D%XcyqZ>9d$>P-@7W;O+MzLzpN-eP2~C9do6^?Qf4 zRH)+5vUwrQ?`_tF^=yen06B}bQUdN+ty#pZg{e~FIv39 zA2RFIqdxfNo8NMzW z?H~mS8`06ZDhOVDiyrP+?ZCAvQA-4}Mj@&CrJP;`I%c0OF%f+wiQ0AkQS{ zZYW&l{>6Dk>a|T+k9T;b=0pfhp=@X)xnE>$P7a45`&e9+$(&te?GjD%0Vp%nrQovq zT!^}?o)sZ_E`iJT1h{XMVtdzrzKW*xz?tFl8DrTh8y0`s_mrIh^LYx2rfKY3pGV6e z4c~O~otFwI)LOfk7rsYWLLh=#;~PwOHzD-a>w{sDngUwpE+bI*1HtXi@fg@9!M4{h z8ID|IUGbAX9d5bu{-|tAQ#l#si(enOr}|b#{??Ah1KIPtoH@=Ae(<;y8N!*6$utR*vWUY&#lJB>kM zSr+$O;ZfNuQKx>ee%669%A5a&F?SImXx$RQq8zmR30mN-_L@iC ziSiNf;NHqa=DLEY41Mc`u)&gnK%5)DL4nTbH{Z;$i;n>D6uRR7Nl0zVwmvj7%K~ho zSiA{0K%EJib)H#r`c_fF#&YqS8JTYMG{gwy?|6v*s4xdZkjIf0xy#LM3b36&-!UuR zv?JR)S%@j6fO!wB2zb>XDD9-#)ar-;6bW-y;LexeU>2iK6OvFQn15DQRy#+XB3M6& zMPS=l?nI3#U$|Vx@FH_TJ{Maq_{MWA?H4b8b(@!d4+42rusU}(0gnfyX6EPTy|+y6 zC#9Lo1`ae_qBbxfkiR>W&*>u!;cE$505hG{tYOlVc%kc}hni{wp3RP9SnbHMHNq2~ks#@;95^4)8(w2m&>Spb1S3!b0J3?%k#2ENG~RcnXr zzo3u+2n#E#I%l)CNUDYMFEqpukji_cIIU4eZ>J??S6@ngXpvrQ)Qp>Y6>NCWV=naV zvo#;}1>RO_AK2KQg4!P$`;T|AvB7{7kdeXSwV4nb%ks$I_o#Gor?SCkUKq!Jb(PY{ zvpso;gn=Pub=C3!;G#hC&2XhQy4w4+YqbM~o)+RDA#Dbh?a6YIJtbr_ULs#|3CfS{ z2%j^SE+7JuRl^N~`ntJ4RskU$_~7up$A;oH=l#*ijR zoZJL@fFF0nK-P_)fr@HS=^>B@1j7^TqiVZJnRqKAugtx0K^qwU!I5afRPR6gUBp_c zNjVbRb#eMODC39lrs8)zIWfNgSHvMW7va(q+d zPN5ky^!2CfR#S;8LEaSuB-_wp@ZRi5=$zjII*sr0y!FbMZk4l?v@W_< zLXtxf1dTwdrSqAc-If6a(nRfTTy#M+Lg5&C;z-WL+5dX0|N699`l1fA5NNu?;x7^- zhArwI^HRe{zP^*{FVJJ#tIcyr9D(p|h>*VmyEpJypX%vhC3Fe>LA&m9LAV@tNRK00 zw?DrzpeC0|nJd;$PHgIzB+^&jTy}`l+l6ZtwpXN1-#kkY->!kw2=UxiDSUZXLu+m3 z>iPW=7g9`oQ>-TOV0l8hNAiPmyPUHG>HZ;x*RBPGMH&Ql`_v;03btQu)4hwNxx;Tm zb^GNbbL?aZ@qR`-%COGc?^tE;tA34BV-L1jxkz{B92q&&CA{#KN%gjpc;4V#1OD;s z)y#_Leku4iiHD<@vnyRonXogwD}h97gp(JRZ?D+bl^|ff*8Y8EY3w^sFy{>ztk;?yvWclO&zvM!1ZyxopZ@qu1j(u?Sm=;Uw21+ z3ktQ)ypFX?XX-zmT~;HWZ8D(hJ`?&FR3AC}WKLXdaR_@Ie{kAdLCsh-4115POSCj- zlIJUZ+41WBB1ZPNS9FXK-gI^dN!N2g3tj-Jnf4f3vG>w;Q&lF!GUxoDelP?`wL|L9 z%jUJ@b5F!DzvGI8!Q+$(e~D07JC@I}K?{~dB3x!;1Qg2j7@mNJ0tP(J>0Uq&9jf4K znRGunhLw%YBOjmSj-!$7LQ->cv(m4#vc;3!oSdZZ-n|QZ`}S6?0P@9Y4RG$;4ZBQZ z5oRtmxOuc+CaU{q{}_E~Q-WcD7bH=?ZXx@1W}W-jsCSZJ&iZBuKMmv&)(HIo1F_j8 z-#XXuB?D5c;^G^EVgfeQ&)d->=)#QI$ZGUL9Hf_b7h?7;i9hjag7_+C-<$99H0%_1 znAPL<5c54Pza3|{ybm-BAJ-iJeOY|Bb~KEEbDi6*^wS1$IUaf_pP>eebGknfJ9G2A zU|W9TxWCudIrb(Kr|UNj7mR|IYM~Q($OCAS;onA)S=f+;vAGI&G&AlibRdY^XMh!d-GVk4|zK-rpB-`yOks85`vBN#S8~c z9i5k(Z-biWyk_iPhKrZObL8_6qbnM8c8_d64y{qgCR)}-5gUINkx3P^l0Mf*(u(V2 zNo$E>9;G#r6xE%cBGL+^W$yQ$ZH`-0U)3As;tzie&^Qy#^suXionSuA8A=kt#54lVmq zEjZ;aHo>#P>tmsz3wtZ2VEX!};C+|Xr|GLPwJFQ{a32oOdLpS@g7${^*>SS3JU-h< zKbnL6+ue9jo_?vC#)W2A0@pVg%c8k`nd4GHq|Dg1&+m=B{tefvl@PhBNq)15zQdqD zHzI5G{eHUy?TXiP4Jy3uTlW&gY}1%<=m@9!#MMoWZ>er$Jm|XI=`@6M62JT2WJ{>x zlvl|M#NW6oPu8M@%yg#XDdZ`cecq@&d-ne1*=u{k%-QX~8>^F2&kL7VFvohnBwjt> zd%cPMe3R86ec|u_V$bnTnKzzDq9K83A8ezl^*?gGH;+tC^|8RtjNY6T|5dD;GyAtd z=>A`MUW5Poi3$G-`~Dxg%yAN(&III)#KLtvk5a*Zo-Re!&JCA{HVhP^&hn(G_?xmk zKw*6x0N+4b6&t!nOswecUZwGgSuxshs>*TxU~j3*eeMkfwpVnac5c+AQCl=skbN}0 zFlYLJCARulGs)CT3a`oS4sp=-s>gsIP6HIAs_INu3?#>^CE;7IDu6o_lj60A0z~im zI#wS+!{EL>!0IUlNr11JnKr}%s^ak4jE z@UM6D@`85QN;r->7Nk69v$-*E(b3szw@i*;WGk1YDEwf03aIrSKjCyIxGt2EAt!9*0{g17G5zKB;NeguZPLZw~{Iu6?$usJxnhdwCZRvPF;5j zVbV?nT+zw-qX-JVJCc%9=2R-Us>(j4xPSIV=uH50kjkCnXGMpBX;4i$shA!^nnX@n?azh9jAu39_h7*t*6 z+Zp^?oYiNz3cRkGw?Qy*WqTlZv^szV>KBlIH6J1%rMNz=!QFq;+b?sVMunmQ4`#6y z=z^wmUR@kR{-dMXP{@s!*4A8sK|!rfDS3SYWsG!8qNayK&QS!1&3|H-8F=N#>HW?f zjX?YUfGRV^F|5jg>1=x2Hj?^0pTNN36Sa^@Okqmgm z^ufCMNBBMoPK{_6@j3+J2>730@0i!XhSTm2Z-u7Y!y*V;KK;<99l7XSQc4{9_@{+_ z-;8i3#yZ;mxUe-d0=du_FB87un|xJc>8^HuXbXizys!O+xm6JJINyBj+E1n)8A&%% zN1co)8vi!{!f}lBgWcugGC|tt2ETX?4GvN7G{7D~JKop||1*q<-+G@4Wp-Bz{qAfi z!Bw{#vnto_vMkrVCoKHwNuS0uWM;sN8^8ge082>*=tZE=KA+V2PBW-_0ip`e6Pf1& z*PpyDRRI~sx52Jj3=XJ=^UEq;#&JXKzw5m!8Lt*L3a3_?pvIiH+QaJ-k=?xkJbt9L zw$tIY8|h<~!6udgkK@S}d8a&H(ZBHk`0HYTf??~Csq-$7xLgWQfGeMxN_nSUAfDm{ zGOB6-2*eDgFW)2d6x31AO1PQ<*1?dRM5hJLy|B>C%#dtv&B+otubWUox3yGnj9! zu77X~z-YviDX=I<5j8heZ=EFIt?&HY>*yXLq0C&LyRmuv23Yesy{giUQ&7GE5LQ`$ zc;MvZY&jGY6N@CaO&?k-f^QpW?00^2%GT1jorTEQu5fHzROq5>Q;D7mQyx=(r%|py$-ZE%o~3JoS?I9>!|;MhLB#uiPI0R$dJHIC z@(65EO@^E`r~91d1semJY^rYySpvA86T>X!O1h)|#R4?&4F@n@Ln?q07IA}e_}jNl z0CfUE009owL=qd$oZCzyM&_*FzDM1=$u)PAYCSZH;N#Sz@rf;E_XAdKa(`W)P-Fbr z$0N-Y6Wcdjff&(|@%nHMo5H7`0yXHg`6nSzdi`xzi6bUuK&64-=tLCe@_wk|KKuu5knw(nFpXA9=f4_{iAtp zreD)|ACmGxJ#-!bZnol?&~8&;m6@Y8Hu^$BTG5;5eB9isQ}=d=Mum>0qimk%ED!f-_l{SrRn_}Z>|Sct|58{eGw{8hmgqvm*wf!D=_+)9R@)`r=EKq>^xg_U}uLKe`~-Krwv}b z2;13l;C@xrKQB;)&um9*;I%1y1QJDJK5}r^tIVr?nLk^X7Xp4ZLwC@$if+m&HC@NK$hIMYM9jV4e;)b+=%4+A<&nn4L9(aQDgSFzU`bjJ|9j zVFoVZkmNl}7Jkc&9`TJsLbvjsM^`CcI}cw{4I1*la`LTm#De%ueAvU<)63O?Bz-T61vpfEM3vQnb>Kv?G7ZndAQ+z zoTi;up!U$$JG{ep@UYK^KJquc6a?AVpB13{*1U^9$J&!w0MI<8pc*v`zZ{hfwE6XJv zryjo>Jo707YCu=#`LZQ&7DVhXEy?I{yl&LS?*8ICUu^PA!f(a~+h(&dUJrm$}B?U2GMaG%@(dC05 z)%MlpHUaecv#WO3M_P%1v+V}h`4WK`;l;4MDalvG+KF0KgHqqoh6o^zD}|N%FU9u31X&PN;WJT-DOMJmBLfdT1NZj$<~GQoH)eqnF<=myaw29=oxiBW$h2u`DYC`7n)fD-TS)c*y( zWovPIYg&oo6J5w0e><49gph`Z>m!toW7NY|wZ8UW>NX*MOj+_#^C$AU%L?AR`rKR9 z$g-`T%uLF(b&TW!?N>U_hb+N?CH4rW-u5;&EXc~b3qv%)%SJfRQ z@8M&k@%;IcrEpYszHol-y>B2p?GJFbBa5XD&&QtoaEukgsn$%P?P8p!0xAT7Js~Xs-ShOkTS2&lf)m?d;Zu?$@d}rC%U&}su|1&tiG@0D ze-lB$6ECFb-1X#(_&(VnD4nA7eFigE!;MWyjCmu)TX7cdA7r->C9U?$L`2 zM1zkrby5TOEtv`%0lls0*q3?jK5gG0qz_!XLBVSZD#)w!pstXen}2&u&o(dk7%5V3 z($mplgoPU^Yn%VmC|Z>+?8j#X%kr_WBf26tp6xH$AU+EFD83sV8$j(u{O)g2a-?f$ z#Ay7v&6hT>gtJc74DUW+zS_OC7Ql;k-#?@`QDLCn6bLDqvFPrPVrgTZjm(56lu&L(NJ28vn=zS z{rZ#btnjQ$t@fMgm2OeuAs9`N@eJ_Rb@~&meA=G%1QTLmp|)$RCW+gxZ16Q63GVQN z?`?bU&vBU_$N8;%`H2;o-ei4jX>*BdL&f0?glphbPCQ;ApB0c8UoA}UL9?Z)>eQe3 z=`nK8Gu!S4NWk5QBErICUs&F?D%5Z8iPwg3n{QGN5}N6B4#;GtzH4hOQ3;FLj#3b6 zP=~6<2jAK;{hTj$-xFQq%HpFg^4hA#1DV<67oxx{U!AYW>;mtuKm_1Lh(5Ti|ln`7!#N3mH&_g1L`)8vjzorcbA)0-PF0rutbV*>s7XX!13 z+K+XqFKvHf#&|0Z(!9^keldWpU*$0P?H#E27!?em}%)5GqMpN#LWb1C530I%pa=G&(zEanrwVIl)Z{G;sCEcLlGafP@a>iH#A}K@uIM~>XOh0$}v;YMqrN0_v2g1L4 z9dD6ChUVJ$&qfNLX=rE!fMBUq6M9i=SFTR|WwO=V3`8%X_pWX(YI=xOW5gvDr0a%& zC3US&=9t!NV;cVE&nKamHZk<8$-i9#;jEuhXgG7`-t#s9N@UaUYxQu~$e2yL`%X)C z-16VJKk;Aotrf5n=C4ggRHk}!}S7zYf^8JHE#wLA?P4ov8$XdcgE>!$COG(o80%VGq&+7wK ztF|h90AQyNcx_kBu}oDQ?e<7P{$b{`xe4KgUvLlyqW#MEr1KhHo7Bc$NB2I(!wpQ9 zyo*e-lxvk?FMS65Gcz&_XBz|Nap@0%^oHO>0L@(x#X<@(^g;9U>9@1|Pp?tV`9wFI z2X`cYuRG)ST2?KN9QLj@uFFtjHkjepIbsx+-FwAtPf3$`m@IGQn_=U<^qNgrE`{F^ z@s;ll+~l!Xd*UQPqA)jAF<9Z#=8b;>;AWUNoqtW4HQF#;^k!;2wf8=jO`wWfj?@2< zD=c6*Xhc+DkL2wJ{PK=;zC9C}!$pFlpV7&I-s_fh$s<=ig?>FvO%KwBgc-q%$miiX z*-5YWP2Vo)gY{e9OB8qgG45cmrS*YQZ9$AEARu7g&3QQ@awH#5#OP?*_7uwri-k~* z%c!v~e;Yqz`q50yHO_p#?aqUc)Ax7OJCDDg&MPq+&j`Y3J#@a4Hb}hI>Yj>w4|q$F zD-1lI_fuKfSR;rjUkE~5EmRln-&KtS1O~Fl)&^>IxB<*mBO%e#cn^y#++Y7cI8mJcgAbBKvrQ3_FcLT}mv7m4(_fxy}gj1+>j1rg&zz z{;8f9T@Whk>$jTgpaE)0U-h0K^?zRo+R?Awv6K1b4i0g<+lMFNcD*3-@hs1UUE1{5 zdV^4)d^TsbDNH~mc`Y+j<}?aX>o8f%h(GW4^BHz0>;Ta0ZQcoSCFN*wT5hc0q@^Xe zh5^-4r0M7)>9FtWV+8I91BKn-8x(4s=Dr_BLG8Xse!u7T@bKsz(F~diT|LM29FizE z1nQ4lKOFDYKPSUA8JVkk1>)f17@grs+^W{l(nUW1pRDvcnoI*CvK_(yLm^{iI7XL# zY?l+oqM#SCVNM-$JAhTQ`yl(#$b-6|fm%jqip7#GqiGFzdhZ&Roo=aeEWO3h=O=Cr zEOBU9`NyHZSB8EauBMh4zX!;;=n z`Nnu(Ti5b|ir**hh3lGUITv3hi!acb`D1)ce{io>GEa9^QRu7kWH6g;Tn7=5mAvQm zRb?arf;8FG1a$pC@wX08voY}E>{nu`J;lX$ji1}q?!zwKnDxa|~3{|H$e|K*SjHs~J&L0#|O zQ5d)fyj)-B56zcwQxVVbJKI3Bi=mq&x7m8*fTJ?mCDe!bHLv+>U}7-v)64NZi+Nc{ z)k?Vm8;AajeD(WalArk%L>V6z70%Aktd_puCJYW zopCV;t;UF_#a^~2qaxPMvbL{A?HUrX%!%g&=8Q!`^IPoHWzqD7tuY31m%DExV!l<{ z_;^3&jJ}onK955Y{4|=8@tKy{poCYH1$*p3Jli-<^}7gXUpnZzJioqJtas>w+K<$N zB1A)_%w=#B`ZhYxkjMri9t1Y#6-hIF6A^IjM17jPmAn!>G`d6X_S8Ix+jVD@g*w4{NpIE6+3OULCR^l?>v_m1!X?S3(k+}asZ7ykmRL{EuG znXIufDFCLnxDN6o3<}AbH_%sszxGt2HQ*4Xs*CJw{x7OpKklv`iUZi7T$c6CN=143 zw_RY50ZdAMPXaGcieuyHt6b{ov#=h^zaKult5}U@{iGgTyhQS1E&uY5P4P$nDuvg8 zHN4>p8M?snWMA>6;t{Za0$Z_T1DKQ7Rc^!=i)bV4iX*h7Lx}#FKQil+-q%U_uSDxa zoDBiwSQ#mV5-KgBYS=FouKHTWZCGWZ3V@yuAC85qP)Ccvj}=jf+`?z_;qbG;THmi5 zy?>u#I?Fx*gPCA^qZU3~e}V!>G}h^sXDe1139-Cuh5@b9}qtyW`RxIVAgX-0T(w0}lGxYSmK-5|bBsf0<1;*Q9SLBpXv0 zvK|5rBN@NUL$SfQj|b5M<8cgYXDPlj=iY2F&`zxfn)Cusm1dnI!!{BbjEj`~^zp!+ z*vDF*{qM*~UqCvv&vzs+s(@gwRi0Qs{D_^0;h3g^GYxm#HlwMlakN_C3JU-rCiK^9t!b_Pbc3z33$2} zAYoX3uxVXk2R+r&GIfdswJUSGdZ}OP@j#*t@&}PxdO-ovWTid)qzZTo-7^>7`Z7#R z7=~$X)=0}yaV>lBq<#YwAp~mVt)5u~SkS$7fJqxMv)~8p^Wl*ZxHcnoEqq&Hshu41 z*N9*sC2mnKIy^kQMtr0Bi9TVCeCsFGB)chot;c%!(9@i6vqhIC$td<)gIPyh6PH)n zf~$qqI#d^L)h=A#9N1?a*@Lw4YQ~3L?b2>MhPI!6msoVk->qB1ykgTE-j+QKWi-)I zR%koO;)S(+EfG|DGLfyZ;BbCIQo5`feIA@UwgEtFN>HP{^eHy9Go~EZvdPNIO7!U~ zAWH*&We6bM8v+RywzHQ*NMw%8OQs9;_k^gp&Zxs$#rFAw_?rYtBgW3UIk|FGDldl6U1Ihylt|ujSA&37;I`}-{%-J9E0+)Ax6ik{L;e1I;<_XlPr%@O!9;L{JLM(?3##ked^4oH;nmg&C;t4gNuu zTKE;cZv3vE+KXl`ffQXNtr(i1s-&i-;Nc+#R3#nP27#Ri*zgvg15YVxYHHPJ)@zuQ zLYuFj=4ge1Ouu%nyn_QjI1iI+6r5rUjF=8gNma?1^ZBgfiTi!4OaE8ll-sudQOwIu-IU3O26n%_UB=m)+rpLv9*5v8sqPr z%<{bnp;_ozsV<^^do)RSwP`q{WN}YlzGNzhb29-Jy4dTd!CyP+cewQ7zQ{vi<6AB@ zx{mtKpQN|$_4MeQ4-C{5wzVnjNX!;22uJMikrn12R#@8F3XA&!QR2UM$pLrK(xO!R zey%1eAb>BfpU@06Id3JTf4c(|=#4(q7MB@P#l^2o?k%sBmTzb$eYv?5llGSld$q2z zwmL~c0V=-b#sY$_j6bZX(?$$}wDrthi$Kvyd{9_en7?)|c>)#|76~==TfkZ=K4TIU zrIeEk5eLQ5wEX-huZSsYC_%Npe`+eSzyE3OP({W4KNICDc@}`K^Ox9pH7xShf9+5l z;;*U2VJt}K!wQMB0eFilWW}c5zaX1Rcfk+rGw;#v0eCD95HA3t)T1D`c>;d$V32HX zeu-sC#+hi~JxpzYo{W#bou^mXo7V=^X24Ms^$=wZBbXl`zx4FQi@Q*W=`qk&xem0B zNjC0ConrEfpZ@)5zYRR74c-_YuB@PWnUI*s5|2RuFFs$K?C*Dd)|-^t2are+@P_5T zzUkFSLi3YRe+*^_V(bE&=6S*+5B4fqrc;z*J7^8)QBUXGemE0mb|4D)HP# z{!FRZ5FjYuy(c09;yby_XK6s01=t#jZmDW;wxT-fGMCTt9(6izz(9KYY{2gELPRrc z9{s&@i3{>CDe1b)E6thW@1cVOHaLHS!ctGTHU580r}N_CA|Pcd03D@?yA%Wt1-S#% zLs{w;oFA`)@*y}NA+5C*37}(P>ax3WZXn+e7@tt1DH0e0+{WctlD`{QDoW1(b%HF| z=WYW)ldJVu#Ky^V-hpZUkZ{;3Q^6N+v^_@p9d63a2(PK#xpU_x85vfxnni69whFuT z*Nw&8XE`=Rfsg+-CWpb)F0;GZ@szLHMelJlcA4p z0=o}~IbmWwD3d*(Wj9ivx%g*L)>N1cwzix;FsnzpQtS!%p_fGJL1vX{BV?v_j(%w1 z+;&AJWJM*`zKiyM^4H_xV{eQ&1fF)4*&O>Yy_Dx{ID1Ob_(f+ecLo+8`g5h%oUx-6 z7UDZW3^r8&0)^1sfLjvc;(t0ZijO(C|8}W50HOQ?hcO62`%ma<)&EAVtf??j%B$jA zVV{OBz$gap5Q2cpxB1U_={Pw5GCL9f**`DSp3w+s9mv@v?$NI>E! z->kfjW*ohINu`!7{-!5M#OtCy5FK;Mo!sEk&bw*vgg3I)Zhw`%yDm0H??a8BTDAEJ zh(FLsdy9g1;6Mf>}ij_Ea%4iDqD?-^Sk-rnD9A!aQ-AegmHGXNj5f3&gbGl zwy1*o5Uf5Gf7kY(sB=f8>a_a#0s7PF9w#wm9)b>hC7-X2e5P)N1T3ED+icfhim&$< zUS9~~487ddbEcIR5U*vJqXDv{kvw`JCAQu7t_1OYTiy2144`owaubX62D~xc*yj3x zkO4+x2qDcE#Mi}@l~Pdll_-~4JF7%U?KqZy5QL=+!Zi7lGmoDe9qiNKz^Sqa`s_2Z zr+5M-c()20E^CI6l@bRr^irI?F?2$>NTqn;&jrDYlWF-*J~;u!qi%XT3!)`4)h42) z4P0#9A5jw#Qp=$$h8}nDk>oz5$|vAZ0R@H=U`1LE(aNq$O3;h!Y4W;(Jb8WneabcAiDkjgaFO5F9HG&xv4n{=|(`j*X?8d^Yt>DalxZTEaF+90n!BO zn&9L)9yN?vAc~`~bauRLzbo2HNhY!$vEQs1{m5kHbP-6qrt}+wgH4)anI5*df-@A# zdMdo0fdKX$o2`gqZ(Zx{C^e)Uv*YO$ejSi?$pb=%`1tq^F6#tS-U8;Ygyn9kj&_h> z_aRrNI{`Z4p5fk&0)s*dzk8{5K&anvkn10>VwIjQVo2`+zm0Z;X!#?3A3C5@&u`I7 zTj7|#HeD%vf%G=+zuI8wLRC1(`}t*En!Y*6FGm_kj`#wYCFb`00$W&8DwyL7TeaJ6 zOa0QhsWUn_ko!>|!|boC?)Iuc+No>4kWoGif~K8Oej`Om^x~}zAP`V`_H8}gJLXlu8Wx* zLicdtXgEzE5Sl=9>i}Fx`19xV@85CJT4xp|y$OfY`6HhDY@ikal4=S{_pDGg% zH|%Q*GAVvQ(4m^@8J#)}*1uQ)BI>oL$)b@0WX-K(9O0hxkJ@x~Z*91_gd)HPw*NnS zGs*w)W{AyylILo1K2lJ4kUMe*Y^{K$K;BRdP8*CvFl9s1qNF3U_%IU77k|aG! znss|CMl?}JZgNgoquGUcPp4xo>$xCtE6>1`6oU)=G$nMGbek@_#Hu9E(X##3?jP~j-jdOm z?t~^=tKsP~23XMWXu0mR-{6UR3sGX=w(^w)qo8LT^TjX14F#J zC(gma0n|^*RmM`TB`Tzo)V*Z?+J&wBj^>US%zO9EKuNBcM#eVX#TSo=mo{JKe*c)g z?M?E#d^6yPmu$4M@;dP0=kHgaK3=8bOlepeng}5Z1xMMy{P(BBLC!Y%QHtciMRtnl zJMzl%JM}^1wvF6tH1drnI8{KD8x;N7fb%@90b?%H5s-8)rKmb5>9rZX}#+3))G zHwRZKQk@-rLuS zh!md2GQk@1^9g}s+Pr6De=Dd+gn)AifFe{G`;IF)K$Ys(qB2HB*)G^JLn>nEbJnUYip+g;)vhyBTiPS75sK| zDn~-u%bgeXed}t8S3BGHOdlXb*0pwmKR;2%_#w{M)NbWJtY~30Q|E!HUI4$}k#gXp zC}S~We4Cc^y8e?-9TnMCx5_H+C2b8WJA|!aX^eJGnlu8vlN^lN=iOr;I5fo{^lrm* zPv=or1mxn<>v(0@cYHQqYa18TNulI`du5EB0jw8bj-w%<<4x#OJ?cFVF%4G(2R9DU zKrJJqGzfiqnGFd2n!bqX$8@RiAs|&=fY3ssMq?Gey3f~6ovWruQh^Pn@;H_#Edw#^ z4bE7ke|NIuKWgloz}`*a-)nj<6M@XCzLxkwok#~OlrY5h)eHV;$wQiDUb64nxj1(2 zK=;`6eOzloW{BnK-colQTX&M{4;!bpa>rI&z1KtVTF1fY=t3y|46*8^i*VQ8W2T&4&y6v5!9$0%3#D9vx6Bi;XuQ zHrwF6z)O1B7;W@GS4kpziI7ZHHL)HgSL?P(3fA3bZ=Pn37Ft2hpiogowEQgzpIsS5x#azXnjvP-EK~L=)b<9a zd9S`|!J)YnY&WIqbdSf%UtM-ab_SbH6OL)a&^b!lmp%7X293otx$tpnk z(Etg7sz6H%OI`8cS1}NfmJ1uSgW!l~RL%+kbmq7hmzKsQk=FO9K_ZC_wqlty6_6hE zMf&bFx*!Zjo}P4+wR-9MI&gg9RIu1LbbJBC`IABUVAVz38=w?#r!)AV4oFh{7xc9- zFfdkES0O0Q2MB>u8cOxyL2GB#2-a@GLq^aIw8vcrKCdYdEP-~57>#+2HtRjZO^{irVnu=P`RS&F>7AO(Lu&bFS^7U-#zx@ zdG2pwWNPrRx0og#oB(r!yZ3Y9C4@+nqyi2urGy)|7UxGz*Gfg1LLt&o(y)Vl3x{r! z3r2LrDhse+F5<}#KbE=_dnpf^ z4<6h5Sa+vLB|QO)6_5~SuGda>rCc` zD5t|R6XV?K#ff{Ll*9!#`*2(EwaZQrF@u|1U@hl;d{eL13mZNX4m2n8w!Fc2w z{!Cw)tB~1M+~e3&d!^$z0*-=Bxeud#xR^^P(uOzF>*!}~EIek-@VgBp2uZ8K-6lUO+L-pa4ZQ^kzJ zFPG>vNU4QNYeD;DGPoz2kFWYkuyxA^C^XJ%?=SIQ{2BSY@H1+2ZIdbR2^kw$-?c5^ zJi+D@+0Q_v#BB+xM%|)aJ4;0f?=v${H&w@L9tag!qx~@SW$_Cx8 z{lAEM4|uBo_kH|jlMx|%mxin)Wfn!Hj1;n0W}J*{$H>ZVSg9mQWoOT0k0?UOIyTwc z!QuSw)BFGZ{Chk+;&9IEoagH~?)$p0`?`ddE}D^#+fB_-1?bVob?=pOb&IK?QpAJ! zop`|ivu=H3qX7Mv#i;AG)2w(=!g=4p_K7MHl{=nyF;b-NbjNSALwm_72{y0ui7V4z zxF!B2iumMMbe?tMf+%W*%dyH=tWV;&B`5@{&$RdK8E*VemkoM+?){J6;O8VlEMaO1 z;A{}padhnMDX;%>XFB25?u#B(o!V#qy-~+Bl9r&?a#8i#f00t(uLsG=!Z=H-I(Ft(m;Bdg?rD`Jb85mI^%R9&8sF0z+;?aL7Kee)#@ArV4cUl^sO*U?Ux={Ux>yc5P-ayN! z06%|Fc|$O+lK7s1fLfPMNt8K{t!1g!GeIs zxTN={t&`&LF_QIA#aQ%OYhuy9_TO#54>yM@#@UVmk!Dv#; z71-DIGN0lUTND-5h-L$pfui$au4h`q@cyf*nTB7>MIiZ@mY&XpNN6$k8JYd1MfUH6 zXKv*ri=*b`T+aE7&xo+nAOS_qdJ?LBJFlggKB-2jwOwKn{rB=BWCdSOX;?Km=4hmd z`+WKOwf;*gx)urp6lxtUbx%{NrEC;|R$)O-ehoofNaz@2a_Y*h2OJd34kx9hD~EGX z?Y>@jl~&qb{vA4hzVAj@)nl0%wHTrm5OIYRO1jqRU2VAP#!R;SY6qb*72I1r8Q|xOU zTl@OQFLt7`>VbrtN@qRGaF{tivuYBtSiT5f44Ja}$~h%?4H?v&Vg21|MfAS*_S#VF z**>(#f?>VEK2{_t&31p}3yMZ<;kqZ=)=H<;-_-Q|((IJA4D=GSDFnd1iNE;dxBmTP zAcDF`W2)dRXela6^1o=+qHnP0QA&FJ^ZH7D(UTLE%CI#0Ql$kbYZZ_Ql1HTZS1mC= zOQNFQ+M88S4oHLM6G!fxhhZTl=4bm;(T(Y^xuSlE`|r9()h8~SAQF@wdGYRi>q{q@ z@+@>Fy{1&@8iSf+``4Xr)Ep?%HRxT6-j|>wlRymfJE!!6{d>B)#(qWKwX*v7dm}(@ z^M~DltQb~pzll7yL}@0FOm}F70myeHG3`6MxFxkeWko5M?sn5pc00X(HM#J1#3}0_ zciyl&|A~>|mS7c?jN#RT7Qy#5EY$O%G2w@{l{k9j%0^3|yPuxuf_45gCcnUdpQ-4u zfbH$$++KT*h5IQ}0S^H^8(qSgNzo2S-cI7^juG{0ATP78m#0{%NP*f2%3MOA{B8U8 z>-^*}h96_rwuY+B8fqPJ_b~Q9IPqfQNBs>ekEe?3$I0lVua*7E|48Vkpv|wN@%!S% z89;&rhz=xD6`RY+Xnxpz?IV8C5y$Bu$SdWh@>M_;BQ{2AZGNQ0jIXBN?!0O6100!L z-zA^z>`U=+TfJ*2X0F|mee*4?zARbGHSa&3uuNjSft$72YLf@brsMo&w z7CX6?iuB zM?wLjyKu69g;ghJpI4m{@!fLnmp9GpdDl=@l(ikh z-&|R2Rny+=yF4YYMC}u~tpfb!$`_SGk1&OM34??&cKsZ-aYOPgKH3Yf(lYSm2>(Yu zl^ZT+4Zdq$J=jl8o{4?x=>04_4ngP~pVFsukRQAXz+gW&)+%*A)SGpb_=BC%iGwiN zk$4*{>g72OUVOWn&h+ZMIkL)V=};I@Rob6>y*`M7VWBcYZgYBOfm94ZWVA!WlLiaC z*FLk2jhw&-(Me}yVoCKK8eIZ5a-nxtRye-QT2ehL@IVq=a;a~@A15Dcb=P#U+ zUiTEQbo(C+E8ltAR4#O~`}~N6^sE5$OC6sH9k?G+LMKxvQ`IUT*eg!$C3MumQ(kyk z`n_WJFjc%1%Gd8wop892zF2_uJ8M+V@+?nrdGArGFCN_M47o(QGEK>HjUpQ1TLe)` zpqTugaRXsh9qLRtIX)a>J-m}tH$}(EIB4fCY}q`DD%cnhKRzVhKf8oA+n1r?;m7$cuA`j*p1McVT~#M>_l>fDj+6zG1uz81Z8H?Av%#n=Ns4=rP3QPspt z%)+-H&#@B`!3eFJnIOlin+_pt7#)Yj-Q23G;iauxK;4N~e{SK{c17aQ(J4zs7N&mF z^A`+JPycRy&*1fRjhv>f{!%00A~bu0X4pjhXF2VUqzmIVz3(oOyrlR$^yrmkq-e!W`w$Vc;96Fzv5S!uH6o7wHxT@eaYLE1hOHi*Le0_Q`iJ{j!c zlF#_IH&cxY6hI%BnIAd-VS5rJlaYXuu}l2#NvP*SH3@~WX<6&*51}+9frLj#QvgQQ zM~ZA~o>y=(3qaBY=$>iklnD=6zaZNIhziyIY~xECWbWNe2yH9viW{L$J( z(;_s3YA^ch+WBchO4APOE-Wt{9h(qQh{!U&kzhYpBsVB_5HL30^Y{|s{Ic<;^y5XZ z$d=0m5==s}$GR@!&XSW*%MWp#BKs;)lzBW;MCkq7>Y+7i_Lle?Nisj!5F?g)Z6l*7 z0hMKzmbM8iYmINa%h!B_%oE;zX;5g#(Tf-rFkf))cpLH5$R`+o5am!bun&5ETjd#exvWX7-&A1F>5H zRkaohItofN0P{ZphipXULc2k=d|KX#gsA5y%giVCmxjwSvf16uTp# zuY_M(`uF@=e4j^=NCX#U4VJd>(>H-?mHc_7JTl}{P8lDPzuzRjro`vQFPV;e)*S zIfVa20gvskG!<&nF1wE@4s<>ItO&n|NPGQrhG(wR_vsFB%4%}#QVMV7@M1Tdi23ZE zo5vI}kbO1(&G$%hWcFd^{jro5=`B}-i6r&Rz$^P_7lCS z<^4t-{azeNQP%|B*KAcxf|&95Z-s?mI;RWPgy5e|4#RuNZ?8zZ98}*q;-9;M2}a?F z3K1(+#Q)Z>`6!-46>9{}qLaxs@65X=y$lGt&~>9TCTt6b+#^7?>p^FiLq-w6vU=$B zwn*G9XWdFQE{DIE3VEROC&h64$O>zR*)Z<0pNA3N?|!P1(RPp!P!$^02x)zLGtWE5K%9?Pp|{?3KpAW=q< zX7f0*VXoS)Tzmibe6Eol<)C4sACW)HDfw4EGws)Q%S3N`SvieEbiPwPG4qR`@=?EW z=LR?kvD3(UEWa6Pk+7*RTO-Lnx-rJ!r#>L{Gbw#<*z;ysDneIoI@6)IJnVCQg96bf zh)j{z#+WWf_>zR${y3HDOPZrglyQb_Q1XRPh)3$$U#Kr=qdze`e3*mN?+O2Qexv+M z_hdqReDWi*_hpKyd=h5FNym-cFZG~)X`o1=n<~X z_WC)xbI247{FY0zYkKEe%Y_88UA-x4S>I1xLdJ5*Zwj>eM%FAGGaT#+F7=NJeg#S| zDMnA@`*u!VAoS>IVSHauY;jRglMury<-O5oG22`NFM5LCL3$Q}Xw-8WjIc$w~)C;hq@`CMG&qfoUg=Ik1-d#O8|U53>6 zyXz~@YvHKL%NlHA?DIOtKFn9hw+}bIK05@-*u~te?mZ+Qec(M#oMbM3h^m+IyKW5Y za}O?F7^$0gG%YLy0evJ1$N`Rmkha9ht?3bKm{k(L2tzbusEt`{!rr?1N#cY`=;ixk z=Qc%Qut|E0>-BAqd}bf|*zUcW;F+V<6kF{r^p-*NUer7}-ixV*AuXc|feG_`cfM=B zm1RX9Pk(219{Cb*t0?h2`Hk~`$tXhIrMxw`hyx+XJ{zp?4<4*ltC089=P6 zd~&9J^s2^4TBmcP@1HDj9&b_!u%N%%uP(n^5+ALmoo^Xselj*lVS_n;l1-9^FOJ?+ z;JTxP`Q6DndMX+A?kB$Q#67Nu%{R6(snvAMPA}kI2HaZMkOix2lL2sul!Fb%%3?G;zoLY>R{ zxpS3Yrx$DwyN2TWce)elNCK0L+>Q=@y>KP}7I)l}mC0E`}=?SnrA-Nq@B2DxL} zf6|W?_g4l*s#NxmUCa8blPC6XE~NDYzg2oF`jljoYW2F!=uH3@vd%kA7WbQ|C@Tjo z1z9I~&1vyD)nB+$E+y1a`C%n$*X3I3Q3dBuQua+ZL+XO<(yr54JSJh2K**x*u$x)c zc=kq}S|STwt6gr8uuYS8bNyNg`14lc>tjxLJCZpNcP_e&t&E3-g@qxDi;p6=)?Xbi zU9qlz2jJ-d=n9J%-_b@Z+buUwmgG$pY?Y>6*93 z$-N!av#)={k^LKDqa3t4EJiX(K#Ah55=go-x4GsRqa&(T;g^Rs;TPZ0i&U!8$zNRK&kUNnfHR5?2TnC2H zU|TOIA2R@2Dt>pBJV!Os9*#t*wB;zY=oPC8D4b#NM`1#BQaxJUS_`s$ATcbkpa4;* z2G~c>)kNw3B<`o7$c?}{0E5A~?E`>gtX{<-qDD7^WWv&gJ9zyJpH@`_sUH<+Rc$TR z4_!6n^_pTTB{MfFo zy|TIZcaIvL^mlfHi1cY_MP zt=Ami{oe7W(R-V2r?p^7(tLXk)!sTlbH$;PKQCq?cY8mmuG_viLiqK5WsP*z!y;e{ zDcn$3R{?Dl@~em?9e}6QbadpFbU>T{MG<82lg?BD?6mh-o7O8#R99=C!N$^xq5~P%#%$AY@ZVOW$I}V>YILr+p<@SpD4ecKbyC2BhY3^XQw`~x6^tMSv~{?2WBNs*VF zg&HMo!hNq|Pm{V=o+p~6{s=4mpwxY1;2oiJG`Z!vHo+e+&Al99bT%%C>QlJQCyO&Y z*>=`ps-KPz^ylXZ+_OdBTo5^kxb-DZ?X~ro_J@`XTt!1%8Fm-maj?CS|{hd@{<%ZYVq3^a-V4zO++J=bvEn{kCa)$$!BO%IZ zMY;nL7t8{dzj-eW7L&cFy)tvw?Cu_F7x|=h?RnkP6@(v+YmJB)tVyV2F~s8;g&Qw6 zo)5UUubHNGnk8ajaiHL7z5sO>MH&{p|Kl%7hb}>sr}iW7j#XYNy?M;HpE(UIvdfXm z@Yjy?4Y^kf>Jvo|4P^tgPyf4mnP8AH?F-^>St1->BqiOjI?sVWH~^=Qv)(A`Ev|h# ziYR4gQrH;C5nn$)CN8da@bh^Noo2rjH+wY??(UuGw!rNbMq^aduNoWk$ji&;yDu4J zR`comgMc*Ig|MRq2X|Ne)zO@_r&$8qT3h)A1O)Usi|KBqa%Vp%q=bIQ)t#MLjT`V{ zrC(D8MTZwKUQ)957v{P%Xs28*_v8Be`^g^r?orHp46n>Y(ZAOkJi8bs{%PgBucsZW zudlBJ$m0LvGM&#vpTV=(nVS;E+Y`ncUa{cz_9h@r`w(_?zVxRi8GDEzBRmg$36wr3 zs)!|$A@JPQMrKWZA)%*Lpirq%c|&1K2lEOYQIwzO4JUN_^6<&g>!M0HsD`{!WWv-0=v>5?G# zzMfrHj8+Z#AR;q1y%LGTv2hd_Ck%X*s9~7xxwV#yvHRH>S`ho)`(;Drj!W!y4PQEO zx4p_cu_ES5zJO(z!H|ZRmdZeV)MQcyl6pY-r~uty_2p*x|AuzelmPL+>nsXAX$t8s zNI+jYI8Zw%**A9K&G*0>-_Xr9BD!P))jdr&eVliw*p&*H*Wt0Tu_l+R%RZBP3||gj z@R$~QS*+sYMdj(^qavJ`Zd~c^>G5kww-N@L9f4hqf4c&G_<(H?rZaSBQHhI-mz9?b zT)1#=g(CTnn*)w;T*&#**XL;3NYeVw=aOcD&jWq`aJdJJ427wKcR{DjRV93=5}v?Cjb2X1hj87uRiO zB%D(r<_w7Im%CK5%m^f-VyC~-tWd74%-~tPh@4XX$ zCX_Xw?UZ}FH6Kcy{URC|6;w!7*)(%@j8}}I6G+D*W1G#1dtXec{oUM(v{~_>rsQ49 z5gJ%oDK|VaQYS&@QD?5Hsfko<4E{=2ONN%P7r^^2tE`+%G)0f&kAwuBHs0hb>H9_q zjrND^0&WLmayLne&o+`zf-rJ$oVf)nWFIeF$`vV&IDT~aPOe)B}O7rzUSKV7~u{#$)uBR==}%JAh@+sis>p_pyw9ijLeIditx z`@;h1n=e|7>a4;I{q5Y)Lv6J=_scp_YF4l6wWf=|_r;;%jSqX9uLXm#9H+l|j(lw( zc~~}i3at}us-i;1i^iEZ<{5^3e0~I}1rgi0xVTyt-z$FR6 zfBz(O{?CD8gS@;OVc{sS+5(nSk^zW$@`bU_U>j>RiE$c{-Sm3>e*Jx}D2PcxvOwy3 zCyl?3l+t9L?I-FUiB4nFbLrjP;)t?K-6~lWh!LrM^gFv+ulFUV#2**Xak+~l#_WYG z^}@Gb*IPaGQw9yX(4$Jdces<@;Ew7D{NbdMslh{njE+{^y1&0| z64y33-ViVH*o>eU?6yFew|yR|xW$E>Gp@LcN*QqUT*&bt$A*GZ4D&W71FD7(wn70# z6?hcV*3F*%=FOYqRNpf{eG&v{=o90smoHWJxV>m=3#~=W{MI+3@qCB(f)bZ$y7rCN zN5U@dJDwC#zuLF%bd*ogXvMkd0fqC4V2+DuP+yit=A_X;{Ut-(mL7Bbbn=D0G-MTg zR9^zs+H9in8G@7>G04csIFYu2DxTR!2~S-6wCC)|Nl&S1`B7?yh5}3eh8E;|`{l$R^JOo9TD(y+W{P`;=MXq$6|55a3eb+SXT(IW+u1Q~ z`xR0dmiou!=SzV4{s*|Tz=moJSXIP%V@aZTuyn2cepG3Y2 zx^=b~o~I*8_IOyuME{xU=FSI}j-ONa-cA!HBE^$HCHWf!pUX8MdcqgRz*7&$%N<3V zJt{&_N(xs}Do0tl-;q%Bv6-1rpbC&vQ7!O-E(@5GIXOAO1Sx&Iz4!ng9rEXY6HvU5 zaos=q8$=kZn^S!bnCV&;WJ8M&LI1H~q>%X-`LcBl>w#zt$^M3>F`+cW zy*=<^w57GLU?Gg{Gj1=oTk0a?a7Dn8jH+0&d?2G4~_@LxB8CS7{nx9Mh-h1{g z`%C6H#aaGi%!Y@b(y~xw?cN`_UN*T~zdJQUYcyhGg&@m53x@d0*(U;<-e`3v*TdH$ zCtEwJoHmEF4Zc1eACRo>n!YhM(LngBgmf1>=n;h@b;M~6={4%Yk=G{V! zr9W9MG;kPw-Dk>oBBc7d9O17!+{ly#2U%gHs}yD0ks{OShC9aYaKN^qp3;1)-}2BQ zvUOtTF8QB#hQCqg19-?JS}U2swzO=h?_2BpZdS(kS#)Vrw<0?gT$e9IsHckB99ZgoZm6qlHAaT9TG- zbBCVliM1T5y{SPu z>#?irWQCF;%(@yz3!S$?SxZWowNxn^21Rg(hFUQdSU!>=+6{>(2~GIBo^1;SxDJkv zmHwk9F6PQ{Ip~DGF&WNaCBHql7k9O^D($-@I1svJELX(h;_;RMl3F#DFJPR ztSEiG%>&HEw{I@(p7P#Vj(+jt7_fQM0nI6MnLYw6LZYp5T!&`gUwYfl!J>DK8mVUn zQZ&Chnzd+GZ#jzlGD0^U^jlnn=mfrbIZcIxFXZ+5n1D25IfjSE^zJ?he==KHOkG*M zG=4ymzh+ml;Yk0gWlL>d+#lvL+$xt+{4EMTKEBWQD(cFh&;y5Ba|){F%&kfFgI@7a zC0W_m^6RZaK-wiDj9@R6?>wnWPC)@iTFJ>59XW}Nk>@DjWL*1lk2qqFy`MxfDub8j z5yW%vZzeH7q2Bs&OK;F0J&B5ezA)|j#FI)~io?r$T$-XaQEA2%W@rpr%Rzqp2J)>X zPhl{{=k_Cvfaq@YSu;42yYHOtyLYfRc_HA8j#WsLjP~7bWwyKNYn1w2Rr)b+aXjYc z=0MR2%*;F`>%JHcRYnM?%=;OP|K{mrBEB12yc54oLO*=COU+U9aX55l^@Yle)fOpH zo&OcBBJv(@dOBUpN_N^|cpE1rB}Kt?uQOEK_!DOg&Xbw8SZmzic$Sq#$Uu@XE*gvV zCq#qHD*wfc2@d#g-@ZMT#1u`lj!YavFVQhBE)ks1w_@Dekby(ktkxkqn}j;g-0;1> z1Q4ktL4YTDJT^~%9L%B4p9lE791~Lidpi}2v$3)w?)(G!=43lKh&)$+)HEocU0MgJ zg_7Nof@xdSXX$ryBO(Z(Uc#_7l`fPG%u*E{+of+XRY$)xj(bF1d9Z!;^qKM)B@IG! z-GL9;Tu>w%p~!pEk>0fY^8Pc}Az>#U|NHkDbm+kZn*^n=GQy~K(gm-G9;M;jeENzj zFI7hOO4yd)`EeqvS09~(V;BjxSRJd=c&n~~*zN=l~rH;)>on9jBFX8el-;N*cUR6tUa zY2$~{vxa*+DFdhJ#8QMCm7eAn5%A6aYQ{V@ucc|>pwKU}WonM)TiNWy6r}<=EgJ*#vkH}Kr zzvl;Kp1`*YYKu2-8?MuG)F8$?X{3~=bf1$Zo*5{(7#eNbpKJUtJ+`vCv?Vy5Q@0Ye z+B1m%S1zUwq_CKN#GFkI!O)B80+l-k(OWBNem5x!{;Z#W6HR@s@I zg|H^1f64Z&uiN716u!cb9ox(6hJR4sNUik`EJTzZA+D+?PfJQZ&v$k5^7MRc>@O`X zowWAooQ(5VDd!Nl4Zky?UqK8X&QtYqyOI=!`&#<1_rSK88!Q$<%znI<)^J!f%u<5P zH#jUzE`zk!0RPjIr*WGYWD$#l#Dibus6sGwK2=`BG1BS{`J*X9A3_Q1gWqA!R;Rxs zlQ~st7AzOuiFVOW%nJlDsxf%@q$xKC*Cf86{~nZ#;1H^ZTKMMObp5)P`z3*bqVPT% zTUw~Vq-S7) z2xdIS%gb01yFR+5&Ezj^1*Nq8H?TMGla#JM?|fVaj_+)OKC9cYf_*`!01@T+7yd>w0(EnCf8 z1(Qhdk<9;tZoalh(jyjChsygPmG=zt%aQR+(OqMEI)F7neWkf93x`p2daEpWkwS+pmGOcf{dgI@+0tubjS)?C3-WKBS+m`8Xgo{lLVZ`qSMjy9<1;_2Kotb4j=(gow>12 zd`Ud;pNb zWDzn-LEz$e?>xKgWoNjfbNW>RlP?|n5RTrogpTji$J+jWw*EZReg`}<)}yKPhGn11d!gNH{?rQ@6xA6(}TQg1TGiTrD5yB2jTF76O| z-%_6HfZozaB5-M-nvXQ2@Sra;Ha;E*_HcT zPLta_X5aX@)fKa|Jbb!FjQ5Q#)47nS$O;v%{c9&c!n<+3QfY2^6bFy{yu|#{RWkfF zi0v}_c31IdgG#&qBGev?w7?6&#kChDekZWW5nzGf1378w`*OaXex%MQyxWfDmgg^wSg1PoF;ZMHUlSjx@=V{|&nE8z=hU zTd)HjG}>s9Bq^I1Mp>8@iR*H-x6v#|H8;Xb5Vnr!LxqvrJ#O%?e4CHgda&jrz2E|8^O->B3NQr185rD&2 z-1@iVck|=L5B(x9R18&&J#V34I<+@Kk6$j?V^ds3yp9??q9(hyG*YB3ZIE)P4XykW z38gJ4ar|mirDkv7%Gg_-^ba3~Mb9}oE3^!AsKsEyzF?NFr)e=FT4&=K_|!v`ufCff zWF0y}OYwj&r2Dn=TtgcQPu&0DRul2EoBuGhf&<^%A>xXUc2Ww@Uinm?D0FB}Z%`Vs z?KH@v5cq>^#G?N&T%N?5b{55E3xdup%ppLAWYbP&pHUUSOiHK1B3$s6^b{>YE3lm3L+uKzj z-l+1Ioj!+YvX3l2T%>9_R^qT0$eCl9BlqsP^h6;p(5c{40?5WPO8!20n1|)frZH^@ zQ=?v%UNxjsEW!P8QZtOjWUM}nG)>crQ_@7oqDo_%N{3oVk(yoW)TY^Ce+=mkHm^2L zz{6lm#m=~@@`Uk|gU;qAX7y6~UHf{YEWA5~ zgln{^x3_G>VXi7vj9`kwr+5||Om02Vm$PjP`MPm;r_JcxFRSOD-f=BFjObvc8FVo8 zZ&=prvjjWmAj&#nC7HhOQJ7yQgh5Qv1JMvfJziYxK(sD2Z+O_K@KhBTXD=7i(9=H& z#R|#DluF9T^iMfJzkQEc9=3a}RM=B`xBTWx_Lk}8l+ZPuqh|PC*j&GV2f*v&&6iPV zWDLCJ>l=o%=dWdl=b!55q{eRT{?0`F*8%8e?YV1hH9*^ zTCr$sXY$l|8a>)z#}pH%BXMEZklW@$TSNLUP6Bbq9A9?Qzi(($q`3yO?qM`8yN{#;@%y$$~ z*zd9Ye3c{S1WRV&=Re<)jm`3f%M9BydMNTOE`5)%Sj6lrzU(w4Y&pwU*py$#+?k}f zEsdt9r-$Y6)MV1*5bssy95Y8lt?ef1&jt&A6NEKg0fVOOCM+hU>5 zaoBREK0!Gx;O>`TlxRXkNB{(->vvzQ}SZ^(az?+p)6> z4Vi$^zpc0;^NBRJB;P4Z#0;OeS9tEhH*!EIdK~a#Gl});xmlhN59{MiBKY~(q2jcX zU7(TkknnbTwjos9p~gIsoAEtGz~EY1(0%`zXx=;BS0#+p4YJWEsmL!3PIRIlpOd^# zVmYp7(f3x+FnHVWY4JGiV~wrIw}KXB3DgD$7X6NP^E6K z0ob&Cru&Jl;1SJ_uB;NsC6}7rX?=Vt`lQC^BkWznOS>(*%;9pWN6U?37P zb@BPB&38ij6j4~*4}fR*d{;?;7x>g`V}>N4t@$WYHMNyQ7!;ha6&e`Cr@Oquc@-(U zVc5sBM0x!cOM=A_oTZtBMQS+9tvp&&y1GzBx_d6Asv*rTY#-weAzFHF(;c6pq<-)H z&(4Fw2TzBSrTs4&;N9PK?W5FjE|foXu1RRMjc~GX=IG>RIvi=3O!ds{P&gV=+5d);Ytt=0_uA&QikV}`dsmy0#%9>L*bld6Z(P${z8rL~_V#^Vx@S>Q z7wml>aOWr&UG$H-`^<5pa&nnq+}xSY`eC;z+c$X~`?V!Cw%D>pU)amj_LSJ$XG+JH zYa8Fn@r+U)CgnYKDQ)ibA&ovC8@`EMxZPKK%FFY@;JnP-!hMi+_>T*qMW}|+% z8dxF@ksavEA;TOW>*+fWhy6nI^4KY|qmv!pu6x@v+&=l+)I(*e^2hl64j(lGn(;&F z8~i&R_KiWsy3+A18rQb%pE3p6FJ(Ni&o{{bmVI1FY%dU!YZvy9JSBymOnm;FXc0T7 zpa=$Nk_81O?Fy1;JhI+9Kt@WgA*{_-S>04 zcRIY8KY6@Y0csTpBm#6$EDaQ)^xkmdO3y;Ba-AX9fRIyWl zL4z5^H>~T=iIhp29Z)iar26yk(Q`+@_;I9VzBBuBSiwaZM&C3}2pxj~>`q)zJ{;!h zm$3eMzhlIiK6d%R&tc~ASvrLhj~W^!!j%(=_u*hPI!%SZo+Zen@SNj#M758*B#*48 zp+WS`a|xX8axR{(E~H3xWg+`S*$#k=%FA<+>J6>O6K;b4ES zSw&(Q3l0ESiBuN&ishJm^JtAYUHu)e8`k%`?u@2wVQdf$KE>!~>NbK48x1A4KX#)l zID7o_&4LAGM9;@X6S_`lcr6;VL1jH8dmjI;4}`)B>QRizUe zTCo@X%;S5lZoR5VbKlUs44r9S^Y>Luw!yV)QRK+f^a1I6uSGax_(SiD8~m==!kuuu zNVB~B)FJWy=`w?7{!Z^|n>&i>0T@AJ>U`H&UbPS6Ey99B3r@5o3HV>+L+ z0oIlLyV2N~3Rz!ihvNX?6+p*%6rU0=NQoOwo3ABHU2;BjoYT6c9(_s#N~P~iiI+Lv!}d)>#Zu|d-*&OWjw_2JG-%@+?(p462&6d#t+ zH|#(H$vy4I!#arJ&5C~^^6*;$I7r+&gIe(W~*Xzr>`$Ym+RVgKbOF8Uj8ScpPl67&BwOw2u zykb9qd$Kgh3PhsYs;ZRb|3lVF^r=l@bjgudul|f0_q|AsWjRb$6OlNp_DmFbbB90I zhpNuY*=Dt1GTLc5)`zP-Z0|b-#3t0~MCwW+V+|7SVX+Bf;*IsX^}RerUiPY3LR~5L zn8U%Myjcl6XkVSAiIN?Y`6wMM9$-q7wfnm?&%Js@a2Mi^|3C?(Ru0H5d~#@+}=dti6>jC%@07^VhzsXGP$TaVjQftbI#_C z`g*Hy;_(~nsFd{lqp8w4=I4|gcT4s`F=>O)IaAOupNU*wwTkqpOjJz>y) zhtbr@%irJs-n|P)zgPJdf1jTxgCMZf+IYJQ3eXSGh7J9%_Ng4mXxmRm7h~p# zo7m+dqj_97e!(g}x*;<|Bz9gAp@+N5Bq;Q zwPzVBV=>T8KIkC#Z6wBo$7)rv{P(BH&OCI1+sY{O^z=iR20aVz4j*f9*`rE( zk0@@RqZ41~>F#Av-WUkJ>5VQS6($$feEf+M10+4rIs1^EO$S)l@J**RpEFSglWo%I z#U!pYVE@Q0c~Iuq5kl7eC9LUo1cv@4-m>k9Y!e&xeou=P4Je!F78y*1@yEr*t;SGR z2j9Loj~AntTP~hD8~SIVbY?JS2LJANbZ4(mrGJT4+p)^5!agID@Yuro#Bz1ofgA%0yA=)Kwa)s zjU>Eza~l`UN8qw)Pe@L^<_vGW1Axnh#s6>jLwa9KbxZ1&%)wIKq5gQ@?EaF%Vd!sh6pGIw^;VkJ zVz6A@H+sGyT=iNr7ttfl%IXBMj`nr{cC3!va{x?&&=1%-Ujtm6q;}?Ne=iDyWpWBR z@Mt8|B}q;lppK8d?%S)cJ8|@=BYS{J7kydj-n05$t~;`&?k?Dr>j|L?2pH}~AMuF3u8NpC07)w345iK+C(SbTz+I=`QNfmI&OV{^kkMgX= zUVaQfODTdoz5o7)xZUq>GWAkphLrZya!h+qsA2l!UTl)!&LeKNCu){1SFTK|cV4?- zu&$}D$LopwLKZ%$~j+TXQQ=2V`m?K=@kdYG^QAhKAEW`R3tW~f1HIEpWt_`t4Q8Cql!C zx}Z|gyN^Ad?}k6aa%-qz@me;^k?B55@K&>eWy%iCnU8o*XgYIy!|#vK0_J^->*-s* z2uj56eM_ox8gkLd{;6`>FlYG4YG;Z}EOJFlEAE6bDt9Kc4#=MHYlmoHbuM22x~f71 zs5>KAMNYhR3R%e{iBe9x6b(5W)0qafe+aWR=qOyRc(M=*Jf)k;NolF>SMQ!?$>e{6 zvt2+R3F+>D=iboPW;#6FM**~WYqRs?nSTI3OWku>UjX|M#5ug7q z+Fa$e(F&H2C%9(+_d0Z3Xh1Vh(wlzzhs>8UKAJRrJfU_@{k5<+wJU{x4+@_Dig?8+ zkudQ9N{Pge09}3r3nh0M6Ck}8EtKE&I#XX8ni?oQJ6M!@P?@s}gC~{CTZ6Fi2Ipy= z?s!-G>Q=@NDk(+9cStP||3nq_&Z6AhE;xI5Kn^Gumzvr+>R2QSA%S-(NYF&}{oeGo zC_ASP>^dMWWRxldGg`E@OVE}2LKk7d)WbwruaaKp?(EXvym5oSsp~kr8OaMx@tD)Gqw0)Tn}^b zwH-aA_2UR7aJkFvYc55nYhlfTZ_jr#Zh!4E^vNKY#7lhh(IrkJbx`GKV16 zaZPpfDS#*EJy*@(kNM2lM}+U`-g9aHKD8u}SSn?p=I2L-)D8`)tsK_Y@}D?yg0bOB zqb&F^o-1PxxS6TN9-4~pwhwmSb`SkNec<%A`nmr^%f;!;VNQT$jv?WZk<5$o<}0$s zc7~5Kii5>#DaeRT$!$auIVeFY1M>yQLBO*=EhZLvTbO9-j?^}&l>P-k>T^y`6D*it z@R^CsStzp%uK?qF96TS1)K;Rzn~RAe7@k~)Paix#Z;#(w$YYnZ2>yjCHptm|1CJCg zOo|(Vn)$X@Fk|tta2j9b;Tebj3Krk@BBt(v}5X%nmUM!|zY z=aV9Zsi|rHh{6hnpy=zjr4pN$$G795)#V7$)Nq9uglMIUZ!Q^(X3-96xa{6pV+D>KF2kxs^16xOH=%Z4& z28&;k5P9KU>1vu{t4Kwcj;<~xGK^9WpO$|z&oWqwij6ru6m`;3FZ#V&S3xpDx8eB9 zzxr$Q+zL#}7vQD%-9hu9es>pmC3?cXRY*MN@XD~x5qY35AOUf4jQ?=JU*2?2yFga5 z@qh=aYvA=l8X!klC6IIsWi5<++18kTH`(FH^cq+J6VuZaU+NR9(Jx6Bi;J-@b|zY+ z0>t!5YEd?nR}{;_+Tv{wPuKRu>W=m6^lx^r|KxLBo2u6KZZ|k$2gXMy9+_QsUrdr7 zLLEmpP!sE>Pyak@TKzWO-qX{QyQQnE`?`u)kCgFJ;`08Ql{LP!Q&IC)Lu>Hym0ZFFVGs$n3j?{aqV?;}!heuUVNT|SdR^z7d zgC~tBmRb|TeNm2Xf<{%zw&6N_`ni5N_VICJ=VmEJ=n!~q^o&~}pHRyX#U*zf9xmS( zf2BLIrWWd2+WAhjF)uSWIp_~TWpO2kV1&Y z&(c#0-kSl5iEQ9uTthhYq2rZjCz8`(h61-A62kGx$)~{T^965r;Znj@zo`vk2AHBg z7|otJch2oKcKFJn%{#Bq{Z;#7gXPSV!^5vJtp!}|4fp6D%T7PE%*y_rSvM5Z{AX_1_ge2LwYzbM%zDu_3hGgIO!Hl`z^uOoad+xcN&S`YUZ~MOQ z{eAEAKF{-FI!aOp#gb9E`qv4W)9X?)??yJ|%o@9a-Hz~QXH}$uB-q6&hdVO71yfcJ z^g9G}G*VyVMQImzj4mWZIKFo8I-#{zcLY5R?ZcsKWigjR4yhC3&rW<3#=>s~dKes~ z7N`}G;Y1e%$o$TzVQqJVUl8_&6G2VF}lTj^uT#CkUk*bKIVbE5yD*5DE*b1 z*eAi7fO86$et4~2kU7^oImroe+b^@|=O?{3(2fv2`*B&Y?7X-60}f#c03^5qn=xS4 z!_7CN2GQ59L>vX}Wb?H~tr$qFGRJ{f>zWi9etfoM$dIMXG(tCBH5F+L#J-J(rMSa| zl$jN(Vw)Ifx(i$MXX}>Y=G=ynOH$-nrQoxD9QUR}vGkzlavsre1P!TcYtK#K*V{pk z3`+e@viB`~f_HcAEL+=XMv}7S2O&Pcc_&qQPXxBB>QL^|q+CsRr3{ix4JZ-#!T#Zf zH%=U^D_uRk08s6C4sZq<7U5?{vhwPPflqbrw~5QH{gs~R*b|=%uve#NxLPjnu5gAE z&YVlIg!#E;zq4LVcL58}c;iHcqk?;Glx=-K5mPk7KPPH_+mjk9b`3gIE(Dl0s8WKJ z0@@Rh-USvG5&LW7ZWgjY&i@c(GG5Fe&dYCx4(QZk738@(GP9X<&km77LBkSdrRR@1seHT6S^KQgoHj0ti!(s+ zS$Yl|7)0=%Jq5e5F&+e1Yr%^$Cq%_3kDaNS&g{|5JQliwSG@(^b~1%I4PtDTmX=<# zk3g00EttpYns32`(jKKfOC@oqZu9RD_4AEe^q?mzo3!0|Xga0F9C&b?RJtu(sC6Ep zZ>5tL2Bktnx_}D(_mXE(h12E1pbLAW;a_VT8&b?F+`epxW9)Yx;>Js%QA&}PuyAsg zuFCsrx|_XM@fj1Dp6I1a9&h|sh}S_azVTYVOg~^q0MlerJ`Eang9itSBXU61n)uxr z%LNJ|jfECH_W%Tf2gE_Jg#rxmg}TZoV%A5VYhx|9x0;!h3k;R63>e&}yfo1}Rr@Nj zjq6o7$Gw2vK*6Z|ImPkQ^ZD(#0Yd+cG@PU4$_8TBIe5elS zK3{Txtn#Jo$}XJUJrl|SNUabEtawoGg#1K5140ZM$Sqa7z;q3!Rg@hE?uC8#@2vSc`-NJCKE*}}1XBrTSYfHc5$DH2+_D(b)w}3Yv z?gg2}E!cwSN&vlC5O7ejbuAZaU(D51ZKuDSIerloAW7`OYuCD5ZTWT``K&2)!U0R8{}>xJdo*LecJaoIFH3L84ub}cO)EpSek9adSdRF-720M!i)5kN$D8dd1Lf)FW=P> z1ewqPc~q>EoC7WwJm2q$LFPEJ`n})Z4KW55QS*&PU@>j}O>asBGvNxpuq7gKpI@>3 z=wWEoOeZq|U*ANmE-BHC-Q+DxX%WX2TcAN~*qkD=gni=#AwihbaUj|n&YzlGOV%U( zQJ6o#`im(^XN8kcb5jaK( zwht~AzpVhDPKse1;qpg0y$}JJvwkUkKi13RtiwT((s^N4!`yk#u~@m`4ZK89t44lx z`DAzZd28Ziq{v}1?XB6PcnoT;F~B$`qMQW{cC!On@Th)gV}CGLNbKv`cJBS((}sd^ z4?)rx2=@g|@4_2<=l5#gW1K!rUoyUn4kPQ<-=l#cripM3u1ZdF8IJ3TvWDWmDpGv=Q5++VYn_Cvc^K`=2g$B z;zcchW^UmbaLhHE!rtEG^fKV*(WBC|L(q)xwVj4vtvUfa1>D!pqv#GX_mgWh!Wt!! zF(JnkGc&#lsxwNO7~^=h=rQEe>SE@cx=Hs*bg+eAMIOhmAa1Q0wM;!1o5J9`CcWl$ zIz#6J0yaB|vQq@1I82KIP7EU+@gO_x*`uMb$PtTog&?-vrsbD+6!MiH-g|89qxW=K z*VJ$-t6V{FWRnca4ogA`u0BlHJBsJic01zGvqJ=tFJ}2zNnC``Le+;e*;Q4hVt5=5 z$1NffVILm?&ibkQv&M%L``9XX zyLsW^{@woCNUO&8;p(3`(_4Y={f=xSDfn(vqm=+2J|Ei~_@ z1#@qtvK(kDf!_0rUT(K&uLq30ifpS0pK_tZ{}HRF2Bw&G8~k>`+lnc#Fxh@K2TAWx zUBXimo|Hy|0K4@cF0-dSpQeBfa8~Ao8^y99W^x%L-t~Gfd$kiDiq9%=nUoFf=53dFV$rdyEXRZ{!4Qq?!RQeO!@$cJ7 zN`s>9z;SE7Ha+MO+wx79O?pQ6k@MJ8WF^E z{muO=G1VzA-qIiSgp8G@j<(mSU2DN?}hIQxc_x#q9MovU&KThx|gk!cSt5q zvgTFvvbCF_R^{cz()_}XJ+{O@%IZ?Am_X2PtTV?*YIK=;seoB zB4)|{AnCeAkXp=1fmc1kd_e)EQdn{_Y)iPYPH44vTdk~0%tvb z1@eoph^!o9OLZJ{MLQF=?PXLgRA33Oi)Yjd@|0B~SXzu|ri1qdY$w0~zdIVGX8}n- zXXmbvaq`WjJac~Zt&T|}6e=W?fw#L*Y-1RuJ=IHR#r50CTnkuaF@Vjgy8Cvz?+jsU zt4h=lw45yeA-bG>V%FnK1CG}D>u<;Xz9JL?R7H5j#ONw3WpBLP&Y1d^jU)#7!_K%? z0Kx1T2q>ejSFQtW52^=<7zC<3{;HNNO2l`Z<1QdITq*!t%ri0kNa^jQvD3eM4$PX4 z_Usei^hL%vHB4?=IMQ-)As7H~tnlIm!o2ot{=M6`eR-hiBxg^X#uy2&Ud-sAc86Me zUr}If+&0S5t`q%KCIbf6&s)jKvh$hLsCPI7{)sHpLD7pwx_b@>)+#EQ9Zo84m%@VJ zzwU|%sZ$7pcn+FoSOZrth`R%fTF`-*aj_riw!llznpd4Lh!#33P@zQY^@n9>#RCW0 zy_Mm>NqMGX3qL$`B?ue!H@j5=`rcK(wm?2IWKZ#<)(9m!F)3$7?{wa>sb^afs^36g zY+Lh5f<1*fcN_WmBx|4}OlhGJTt^!VDj#Sx-g$3#@CVeUI9Q|%`f6Rimw5Ly-5O0< z9^-=8UtaNyGlHF(IvEd?sZfeXD6a>ixrUR0705H9&!1|FE{p7J4uVcSQBjs6g&Uhl z3l1LXrGAF?U;z|L)abHc4xw$`j)j}inW+SSY1 zW{C07x`t$3?=tA~S}mBIipQg(?e_pKdf$~H@-|*vGb~I;-#j4tEp?8dQ0gQ6#W5#^ z(=%-#69QHh7v;R!fLAb(uPK0qRpqfJ*a-%$Wsk#<2ZXxuXe|BXLmL~Lhzphg0Rck5 z#Yq|9DY3o*G-!|?H<`K};tP${4o|i9I9x?QN7|Jv97P86d%J9hlbJjrM9x05G3CCE48>223#so0r&+!{4~i>tr7cYK_~*SCju1NgoHttFklpqQ~QAdZn?u3U!!Ij4g=Ne3mAeyOnYHH1>2)cMSKReI7Qg!W+?5n9e zQ)0@p;5LY#@od3@X2r68E#N)@jM_s{^OZ{brC44kXqIPAhH;=uL;IF3hc@-XYTL75~|*RQ7)KMOpv`jRyIpmd&9vS z_H10N$Kdw9hf;E(V7c4zy_j+Qwv-JeggfYi?>sVQz#mWVvmB&PYj zlyr0zi`cqaTjE;9_`35O(0wHdf0*rLczALtxn$uO2=(eXVNssOOS_wV!Ng3~c}6k4 zH)>qIY}v@<#`l=QG*9(2F*9Knmfs;3I2;M`fDn@Ja#hs@uzO$=xAM#3CsprA;bq8K z5F)G3(oRYswXV@ly6$3A@kv5EFxIyT(6{*PL^^Lh2d3A$q3=Hbgz8yQ4m_*aww-s; z4;VaUYdAr=2W|Y)Wr;74CGg(#*bnSx$|(rx+t}{+nmD_feekKOYQE&jhelS2gwdrD z+u&$rY@H84E@5$+w!6n5&Gtft7q>do0zn)f>3s_04SBHE+5`E0ydW*QfI6SKJ?DTJ zr+Aus#0=tTELMmj-_JyvsSf06t7zXXVpRZGZIC?ZnFe}l{Zr4%90Mf2J9O=_NwtRv zZ_CMj%nB~km#8rl|7Yi515Hdiu1-xQBfY+^pQ2iGrNC5fN;^&|diOWVzf7gv8jubF zRrgYy4J|-IybvVSnHyM{<~1++R^0#riEl5-da`rw)Gznrk~sd7rs1l%t~bWMrBwkS0_dFzl!p;drD$em2X1e?y?e#2*_n9|yNcA* zS@1pS;0fEoAlpP0t5Rh_*fiEw)oI4aCz}72r7ZS{{-;!I0 zFX{`NZ=NWl1hi~*;2Q*-MutuRlf6;Y88;r=7L8?Wn0#dg?kywM<+W)+>*oz*dY0+| zfnpEA`m5FmZf5k9bsj%X@yV9h6!}4Fhbe_OvqfdX$6?RjrK-@5O@`M{fD;lTXFEyj4%Sx>Tiq77JH=&z=aK?d zfo!9PDJgg2B^HpMi5E=Dad#A^;z>8PIwDpg&JL=fd;rR80Et;85kE36433^Oe9*cT zSE|0aV}FWZrH66%eVmLpL7>Z*hp?5GxaB8E!?#6>oLNPiZoU#&v>vVnk7s{ZYn_i= zO%Qs_TZRU4@DZGY#f6olJbazCu_svUx;~Wz@`Ff22)r(1(=2Sl=(M{5?I6*-z7-!f z^20VM$B2Qx36Ou@_;Y-@HB*dX6*jI<_68Y*=eES{Lq|(22iX6MJ9wb~7A4L7@_$lr z@<|)57~0y)g^A)vyPbg2GOl%0W^e-`fw%TK!ELr#YWTM?S4^Ea0{senx7vK!JrFlx>t;~^CjzM~9Iz~APj+B_c)WLdOmFwG{jYzy(!PA- z1P@3j8n@!IIqlAxCcz<)SBgF1wJN}}^Amr2;K!@rPpUUCW<6r=dm5UETU&xwvVO8m zuiDhu3t`1Ye=e6{_#SD$j1AnQYB{7igrEvPE_Ec5_4{!z3-RM>Q36Ss_V;=>()(R8 z*8BGMu))L~ab>WhcUKTRPYp_vfeE(`i?1f%IV4R z`yDMGa2cp4IVe-K8Q-%-n81y#+9@CFU@>`C(^Xmp#Z&NH!iNOuIbF$zi}X1LanF=q zJ<)}U!6!3{m(il%HysvmWH%f+0?1*{4&+_(P<{=N>PZJFv)%YRJ3E{1xy>$Vd&lii zkr`kQmqa>t_sShI0Yac)zy0sjSauyyAq62>0^kl|#`o{3FQM1Uh7;;j>HLVi6b_W% zJYJ?&A7$)wMBlKLoC!&JdqD)U*jsWvQ6be?GH7tL%4T?od-uBVJz}72wC7p1?RTje zX^No+ra>JFIK0qEDL*NTOy^viYGV~@t7uyFT!|{F!C1ip9QTO3Ys_a~TK-rEh6+E^ z%D@uciyuQ`(SsWT*6uP@X++@2==LTrP2^HLd#W0M7&yG4XEWKmb`m4Sv#TyB02h_f zI+WS_rtK89bXZ?wl0({ zQ5MXv@7FOiE5uG>F5lk30er9G5lGkg^g_Te>D5z++YU?s+mi`EZKztgn3bn(mBgC%+dKB3l^q7>7RY zlQLSxN`r)(?t)ZXTgqTNdl_u2FbQlHYWW$;W6|J7OkSgiJ|51NhLRv3;%dL#akS~0%yFB#ymykNXTnege{3v6_UNi`PTsDV`pWFeYrlH=^f}G9VG-+H#ufeZZw7^fGXK8}l=yP_ z6lC?+!gD4*T`g5#kX^opU<6)fv2X}D?kWPSVRo$sTh)mjuL_xmg;Etc8Z08F54ZP< z|8`@ZX>WKuNwEs?+25RgO~(k~Kv84WbOEzIeV``g8EU@YUa4Uo!fF;7xW^uCre;Pq9_%GnXbHJ(uX~Gp<0cH+W^8K zl7<@9+UtvF0`NTPU_jmHYQ;T3ZL5zbh%F@D>5KGpEb8r8t|irGlJjjgRFHg;|mri_gWvuXy*DJ_Se7 z8mAug9GK4RC&X7e6Z92CLr?%N6}7ds&u%6QD=;#=pSez6pK`&eQzk=ZH9PiXN^W#v_frcw=9p;+&MD`?2r!rN zdqae*ES>V~VjWJu=0=m3riqFBm-=c|J9BEjZLJ4!4jL)5Kj67V zx3qM4&3bk7G2x?4)A9F<=RyG2@{6gOXP4s;F5LF(>}xu>uCei3(Pq;cW2^WpOKj7YRMUg^){c%;^*IT9{7;3F!W6v z*Ka*|(vnSoQ1_i~QlvuHbyxi8)y=K;TQnQ7@Tm^=%NbmuFD*q%uC)~Xz4=|zsq0c_ z6nJm2UA!1eW(*icpdswRNouFxQ+P)bv^ho8N0X0HL10x0z|N;$Is3IO<{#0SGF?Z z*qG_S-bc^aGs%wPu)Hs7?IUq-)<27~tAiZ%o=FGtf}F^TfSkT?R~iqFd|oT+kBgVr z7*VyBGQO+jiZ>6BDN`C(^95?Tnj7284B_EbeY+=7g2zl;-d`_ojIez+xU$vR@S4s2 z)icaWs^Bp*mv_OH^nK!&Qrh|YYynv>w#b^&;y4QkN_3~D^D>NiPdeGx)sF7g&)p8q zZ7u0V&QNVF4Ai~byS*8pY1c{~UqJf&P2B?tc2Y#9xKjg|De0noEW|jds8E zY^DpePNYMAgv4=uo3DuCwAJQLPPV+396|^@a11*@1s-}t#gu+T$4Fe|Vxq;0EvIh^ z9Q=JHS=#4;VP0B#`pq0Tp-ZFxooQ`{3`!&{9WADZE^Je8_l-@EyG5Iv7DAf(GAZw` zpy23>TjuwiM8S-G|71$|by=J!f?9PA^)PuIzqX;SF_vMn51U6+{xCHWNdJB58w#AM zp^`g*N#S8et>1@vmhRJ!4I*%mex!--WuCM$#ZoFbl(*Uz2YdPQ+kr+bR`mCz<&aFJ z6f=JuK^7ZRi%P@4sGAQibS_j~!{jyRo%ivq&RgibCHp#TL)F*I^-f_rPNyXL{XThs zo5HC_F!fM6A0Dao#2e4)yaPt3h5Zh#x*nBYMKZpSa07lWs=tI43`Zk{(hf90pYVHv zX$M{E|2c5zXCd&Yu4*JbPsT2~hpw_h?A{cQlop;nr|X7OfHH3R;!~WmvNEzdhflrl zI76oI*!EibzL-}b%Ll><>i5jSp@g&)-|M14+^Ms2t8K}csrT$f95Ty>mycDHl^@22 zo=q^^SBum%W;Mw!^rtfTmF{`imjliiPg&RcxK*EBT;bx+&gn2P@RA_t zwVzz8MP%&l<}r*G9b3@3CwpE>-^XGH-o$2TgUKZR75`-Srt+`2Pd}LbMt04oRYw(FhlA`n%|sgWKnKS&$IqykVEq#$bEMuWMd8i)H81d2-%o>^H;IaSJziQ~eg|Ih)YFA1bdb#xu@GE|JbwhJJ6$NEW3VZrV239b5Bg z6P#zoWYDcXbe9F7RgH}&MRBd*r_gpv-B;j0%f}j67#R8nc$VW`m>9sPWh)2_o^poN jX)ExL@=crn{8&mPhYwomOb*|HNPjd`?kN{4S_S+U1~R^n literal 58264 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
  • K>T}uEns9_BKH=d4~s7CqvTyW8hH{<$R*ax$&D{d_1!1(=oXHZD^>^ahzIt z+7ir+Gf?@KUso zcX4jjh1vMOs+t%_?=kci-l#z>TY5^0VhpYyD4kqfB)XSTx*v#>eWoUCau0*DOt$L< zrGi1vcTn9LI?|}JCB@$T^#z#>Vbl911qzv&{G8QI@gLgz`cQ~*m>pCP?=t)c)YpvWeO6{sBo01hU-cqESx*MM}=!+)w?{ZF}j1%IxD z{$gj2!GnI_6n#%z99nnS-953n+2sP6yis3Y-nGEp5-_+d5YEEks2~WW1%7aFczC06 zX-habd=Ocv1S?(}Ck%B6P&5G?-pS8=c5XGgLSyT)&N*Z}%Nz|~`3BsjmaEIiDo;Dybg@YL5g0Az`++moL8-)|V+l1Bm- z6dI8!&-QVk5tox2}v)QkitSgwa+SqMf zC>XTq`mMs}Yi?)L*hSN}k@-^7wK*$Cy!2*9`0CF!*y+mX;O)A)iKWTwHnKi_`w(4{2h zwNj(n9mN>k&?~&Uvi)ie`86=x>-BBFbQb~S_oZyBxUD;p0+83UTzC3Sk?yoj$+BVv zyoozy?Lnkeo)7|<0A1z|!@_Yh+&eDZcfRtyr7=dH8I2JajTwUDRNF`QMr+rdu@{~% z@_r6^#4w>FczlS8{jmWV*`C$)w+chZIGC(OkmTWP6A|yGgAMunmZ7rs=oiA z?3!u^A2!MGlXU6Nul0UhO(Tg=T1i2}O|$`>SrMiAH)-I@gO=RNnFf~G_m?)9kEt`e zx@yJStXT6kjE*P~q;Zvpq_olQtwaZ`KZVTsk&x?bi-l|C#C1GApEG2?e2z2Gf%0I5 zR|4l40^EJUSY4M%xZBlNZ58`H6GI=A1Cd2J3`}BHr>XXpl&xn^WoM}>DAHQ}L2LI!)<)luNn(_%!`97ti zGdJ;E!SGiV8YNgxphc1Z`rTB$bJb2c z(}Yc2#wW?$9)uZ-$Y~9&5wy@s|A$RlQYt;~z)ONxzMq#TZ~sshekd%BojZy`;5rb` zAGW?!dLv53r#7)ak!F?kEj=?{!mxbmhDLy70K%#FeO9X&;=y_6!Ov^)vh_4Dznj}d z<_NY}HBZE@X-hJ;_Poitr7elVuzA>8nL`+#PG3bxxm^Ve3Z|*^?S8J!=vEgz9zg#C zntuKp*-Q>kg&`Cz9WAY*kCp^QpFvIp>F>ETfBtqH8_YJ%;Bni+Tg_fD+KOQ#{&M~k z+_^oioKNUhwcGV+!~1c)!F;+3LvrDGI(391Sj$Yx1xCA>*J|~+3E3cUU0fh+m^Z)<= diff --git a/modular_splurt/icons/obj/items_and_weapons.dmi b/modular_splurt/icons/obj/items_and_weapons.dmi index 7bae0d6d2f252833e7ade5706cafe4eb9e511529..2758e61485a7b75b802a52c2109b48e630c2f478 100644 GIT binary patch literal 5399 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�(qNoi@3@7THEm7xN)a8oh|l?faw7`xk*A>|AJhlhtHB@>8L z{;|wKIN@&T{EwZLi_-f$(G!*zOz77RMhAa{-Ft1TGjwd>e{dV-tI_mTHPIu z)6LDgFPjiwb_t84WtNENVG2DV_ELW3Ss&R{sD_Ea9EWLXFE*F~+0a&PB9-fernw#O zJ0oH&4xoc|%;aQmAqUR~dwA*D`nDYVV)0T6b!J%U*@!$I41xqTTd63V6uRI${j=92 zbz3`m3gaIY(S5(Ano?c(1r*3_f`s97)cODg7(C-OWdz3-qs{cp2BG=qeNg(>8$4^qa-5PXL+a&m9h z*4E|ZBv$EprfUw)&1_i9K@7SlqXmyo*>EW*78lR z%H?uO?5!?lxxmoJ&JN7Z&d!^bz~WBWvTN&vTcTGIMyErV;<_YYCnqPbG{=k#=*Es( z*NDf#<)XsUwQNo79RZ?mr(8|C}@`)!{*VeqPdgt2$`@Zbe( z>MU&QEULX`n^IZyOLmZYJo(1o9iFcXkp|`0pUrsHOGrqdwzoYToSi#kwAcL=y8N?+ zk|lC4F@30e`-h_47wMUEYmch!NG-*fX51x) zmz3=qUPxHDxAO5f2N}v^-buZQ;b9d^v9}Eyr5vx-ad6^wtf9%Y=BJPoi0wz-^2iX# z&^ukr@?M&#wl`}IlDVg=`xH~`@|)mW0lD|E;k^H)i<{fXZ|KO@nVY*ijZ7Y+f@Hzg z3p^fwn+Se$YpdNZXK#JD(C6DMIHzKiPW9o#x0N`HlU5;!kU<5DtrF)cH96IxVMmh|xqXv2(x{Du`ygB0GeUeTt7HCc)g&-Q3y_Nb|;*S%DmaquEZ z8;#*x8G+b6hxbjAqhn*d(lRm>qKb4ci;DOQPBU_%T%&o$B@5>67f$a4?8oaNk*y8Z zpCk)%@l`<#c1QA7d_k5jSLlWjrvrEXu2;h4zbMH-9?>uapNEq z*M=NpT3T9UTEI>2kM_+1+{W{E)iE3-6{FR2c#aX&NRqH(X`cd)Pxt|B{P*u`PD-UM z>HN|)ga~Rg!!PmQ8`=qKygyC6yxR7(N3)aH-fX(tcKG0tEvqf}iR)yZrU zjXGnIA~@^pNOcD9jpsL63Blq=mxd$fR3JBY~)x- z`MEV`WZQ;6!?d>ZP{du_N7-cV0)OhB8bX&&Obz`^$cD;om{1ahQxP5VCvjWm!R zKTI+M;VXW9ZDl1XJNtUeUJtz?UQLE0?39Z;!zUm>mdDhTotAt*sQH?2c@TpncqB$Z zW~R~a4*(=`z-gyYFK;rtP1m`<%|+X>{I@>rSoFD~awSmR098W&xv7cOc`)~Cq1B^l zPoQlXofx5n=YJDhZoW(yA8U_z3ZP`%$72$a*x6^N2fxJYT;ze2lo`!KQFWUOp#hL0b! zA4oc8(xzoPJ2{aw@l7qDdLzE7^K0#^_G^t+592nJC!j8MW)#5P%+ScqO}D^iE8vpx z?(GQ4u{rsqG z{U6nOwr$48#gqTrj?Z0p90EK^U(5fv!xV5a`?^GYd}5*`nDJHyB9fMTX7^Vg&%%Fe zRz@*UCV7DZgHsR*^)1eXFexLccR5+4z`Gi~hEcrejeeyRJ#|1m=bZ~p4x^xC$Hk)d zkH{Gm7j?r|2SukpPK&`S5zniyp=Ki6!YAWdusS;98he3y?>5L%`@=ul!`+nTc{qRt zeQf>Gp=p(vtt?q~PR`X1Pmw9LMoIO^7Qy^ytP>Us9Bc=ZzWxsMNt&(uy}rXCYh6x( z!Ix37y|MW*&i+Tbq+eIh2jgd0xK%~AA~SA)G$14E*oAh;JLW7&1^M{9zn+}lINP%+ zF_7l`oJ7`m_8!(Bnc>xz|I&r^tRsWYOgo}mM(QcC;=tDBw26HvB25*0xc*XurPzMF zj)n$lD@sLm0;=uYn*HN!y)co4l>)R!#lqV|eOpOhOjGFws4hA)DNoRx(}k%#B>c$* udN>`C7r8fbJ-*i;av;v<`@faw1svb}K78t$uO#t@C!nLDuU@HY6aHVNG=~BJ literal 2261 zcmV;`2rBo9P)V=-0C=30i?IsAFcd}Sysx;ltB6%`%OWX~q5TC3&C>+Z1d>?s?;Q#*y2x4X zfqPn<`->i-22Bg+;!}jgal0e&^tL)k9QGs}`@5^FlxiwNqAB$etq(ReB&^Q`5*>+K zHZ!mL`+1FN;t>7_%vAltzk?GA%fY-L(QQ6Zi+)s4gQhnOem^Gd;9o}o00;d^L_t(| zob8=WXcT7{$N$q0YprggiP9Jit*wQPh1SC&9@?yPs4+c>wrDMMp-n=oY!Z-q68F%H zP%sI$pz*L5Jy^t((e|*})PpU7ipB0gqaNZHs7cKTBBk*5kbUDjliB%vKXx~o4gl%wU@B+jPe79vg0x<;z0*WXTN?l% zf8wYn2dtJ)CqL1?F~{cLZ{lWPJK;-KyTRxT^Zz}fux5095xPKxCpeWn}sO7PeIr$;^ye2=L9ZVIM{J6?; zj-7l!qz5pTmp}P?)^Kaq3FcIK?$Z{?jKjID2M9O3WWUcY1#R?GOIOjmtoGFeUxT zs(t*Y4&Th7Z23VII0V_@bYI3KtZ81i;9|RW?UQB%BE}!+bHJ~K3;6So>kHtrw0vbF zRyD7e%48*C{Js}p`;NWjL;Yh+&)l|z0$F1DRMh%q^LdWn*F9kSj=iL%tqm8>pT@%n zcQjxw9CYp42S9xIsl*2$CG?0Kzvn%`2`*EMo$nfg7W?3sJWousDN}5-<68mvN2;O|%dffhh9$Vb_o{+G|!)|fo zF9<=m?%&a0@+1(O%dVXTG%lfLTM&nk9W~*3h%rp;WqM^LSboyPEmJJis*cfkd)! z%rx}f1X!yP?92|O(g4zIeY|K@J71&+v;zPE)@nd^V$;SnEzSNUa}Y!Q6Ma10-!$|Q z)6fU($3^j3mTBlCm0st?7q$S2WTBhxX9rX70@nI?jbLX~2Au@c&_@!2*4`??HeK$b92DGWA$D1-hxl)bR$M2uc6W|{W_#6QD36R03;f@zSk_WI> zU%se^Alg)RFqN^d{ImVjd1%NtBn!h{?(2g)!v4!hDBo@J!}6nsp!pk-Y3Lmw$SnP# zDdSKje4S{x%F*phwtuDY6Ujn%rHm&mKlGyrYW<01;n=L9XEk7@pZa(oRuou4`1Be8 zlqzLSl|(<=MCG%J;sNdD4_X}>u-U0Tezr8(2Y@7!g>lAmN{)Zcr|h}DUq1UDx0Ka| zJL2@7Fnm^#9>$r5-a&x(E?#LJy7c>608D-SUz2%g$d@PI(Q-mE=RL?T-}e3i%o$H) zFAT%CD|8k#Yv@^xVDrV_S~GjTT!uZE17~^~G2Ay%BpR+ZJcqYe{!76`CoUi#0N?Nz zhVP`%{Q<*$6UFkgjd^u$xreT;ck=|e+K?;^i-`9@`1CkW4-CV1Qy>puOSHfG?ydB) z71r}zTkqz|dG59Hp-Azb1D~rz@O|HeebvVkyrBWtXx!svbz%8bJgy@O-$^tn36%xe zOSCB*8fjzF%>_>;dC80K_HOO=*Au-_<$`SzF;xB7h5d{0Q&<6*bB@$3Boiuv{a0LA=ze}H1e zzCWO0)0lKVt9pNcVhQ&EUiJB5zh73}AK<0X9^m&IFJATeVZYp$)t?Ynp%x%$m4T@K zfLh_ZDR2n#JNZ28^TUK6N&N|t71#p;Og^{z{E(BctUn-#xZZ^0&>z5Cywgzb_4xry zOr-QD@RaWb@XC5b)#v-2EXn-|+{EQkM3nk?zjC_~N8xLl^zVBt3gQ73J42$>$NQCA zL!J!2DEab$N~tH0`uHf~!B_18p+gX@j~^}9$5S!&@#p=PXshJc+yd~fj}I!|eANpe zx<7!cRP#khXnz1tspg9km){RKb@(PzA3r91@T&PdRa3toAcC*@9#B)iAE25qLiPRt z#qzZP_Hw-kkM3y2UoOs{_v`*)`^I?jt5RN-TeVms?zOS?`^qJH@ImY4WiP&J#qRe5 zM7OX8m17#ZSSQ~}RhNePsgI|dhzk5)_4F@eE5Wh~00000NkvXXu0mjf=&*qC diff --git a/tgstation.dme b/tgstation.dme index d38c55683d..9048d4cd51 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4262,6 +4262,7 @@ #include "modular_splurt\code\game\object\structures\barricades.dm" #include "modular_splurt\code\game\object\structures\bathroom.dm" #include "modular_splurt\code\game\object\structures\dresser.dm" +#include "modular_splurt\code\modules\cargo\packs\goodies.dm" #include "modular_splurt\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_splurt\code\game\object\structures\false_walls.dm" #include "modular_splurt\code\game\object\structures\flora.dm" @@ -4386,9 +4387,12 @@ #include "modular_splurt\code\modules\power\reactor\fuel_rods.dm" #include "modular_splurt\code\modules\power\reactor\rbmk.dm" #include "modular_splurt\code\modules\power\reactor\reactor_cargo.dm" +#include "modular_splurt\code\modules\projectiles\ammunition\ballistic\pistol.dm" #include "modular_splurt\code\modules\projectiles\ammunition\ballistic\smg.dm" #include "modular_splurt\code\modules\projectiles\boxes_magazines\ammo_boxes.dm" +#include "modular_splurt\code\modules\projectiles\boxes_magazines\external\automatic.dm" #include "modular_splurt\code\modules\projectiles\boxes_magazines\external\pistol.dm" +#include "modular_splurt\code\modules\projectiles\boxes_magazines\internal\revolver.dm" #include "modular_splurt\code\modules\projectiles\boxes_magazines\internal\shotgun.dm" #include "modular_splurt\code\modules\projectiles\guns\ballistic\automatic.dm" #include "modular_splurt\code\modules\projectiles\guns\ballistic\pistol.dm" From 5029af901b173475bb4d5ce480e89f0ca87d3d3b Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 25 Feb 2022 16:58:09 -0300 Subject: [PATCH 34/56] Upload files --- code/__DEFINES/DNA.dm | 2 +- code/__DEFINES/inventory.dm | 125 +++++------- code/__DEFINES/maths.dm | 3 + code/__HELPERS/custom_holoforms.dm | 2 +- code/__HELPERS/pronouns.dm | 18 +- code/__HELPERS/type2type.dm | 40 ++-- code/__HELPERS/unsorted.dm | 2 +- code/_onclick/hud/alien.dm | 2 +- code/_onclick/hud/drones.dm | 6 +- code/_onclick/hud/generic_dextrous.dm | 2 +- code/_onclick/hud/guardian.dm | 2 +- code/_onclick/hud/human.dm | 32 +-- code/_onclick/hud/monkey.dm | 10 +- code/_onclick/telekinesis.dm | 2 +- code/controllers/subsystem/job.dm | 8 +- code/datums/action.dm | 2 +- code/datums/components/anti_magic.dm | 2 +- code/datums/components/nanites.dm | 2 +- code/datums/components/phantomthief.dm | 2 +- code/datums/components/shielded.dm | 2 +- code/datums/components/twohanded.dm | 2 +- code/datums/diseases/_MobProcs.dm | 4 +- .../diseases/advance/symptoms/deafness.dm | 2 +- code/datums/diseases/wizarditis.dm | 6 +- code/datums/elements/earhealing.dm | 4 +- code/datums/elements/polychromic.dm | 2 +- code/datums/elements/spellcasting.dm | 2 +- code/datums/martial/boxing.dm | 4 +- code/datums/martial/krav_maga.dm | 4 +- code/datums/martial/wrestling.dm | 4 +- code/datums/mutations/cluwne.dm | 10 +- code/datums/outfit.dm | 32 +-- code/datums/status_effects/debuffs.dm | 4 +- code/datums/traits/_quirk.dm | 2 +- code/datums/traits/good.dm | 10 +- code/datums/traits/negative.dm | 10 +- code/datums/traits/neutral.dm | 2 +- code/game/gamemodes/changeling/changeling.dm | 2 +- code/game/gamemodes/clock_cult/clock_cult.dm | 4 +- .../game/gamemodes/clown_ops/bananium_bomb.dm | 6 +- .../game/gamemodes/clown_ops/clown_weapons.dm | 4 +- code/game/gamemodes/nuclear/nuclear.dm | 6 +- code/game/gamemodes/objective.dm | 4 +- code/game/objects/items.dm | 8 +- code/game/objects/items/chrono_eraser.dm | 2 +- code/game/objects/items/cigs_lighters.dm | 8 +- code/game/objects/items/defib.dm | 6 +- code/game/objects/items/devices/megaphone.dm | 2 +- .../items/devices/radio/electropack.dm | 4 +- .../objects/items/devices/radio/headset.dm | 4 +- .../items/devices/reverse_bear_trap.dm | 10 +- code/game/objects/items/devices/scanners.dm | 4 +- .../objects/items/devices/traitordevices.dm | 8 +- code/game/objects/items/fluff.dm | 2 +- code/game/objects/items/granters.dm | 2 +- code/game/objects/items/inducer.dm | 2 +- code/game/objects/items/storage/bags.dm | 10 +- code/game/objects/items/storage/book.dm | 2 +- code/game/objects/items/storage/fancy.dm | 4 +- code/game/objects/items/tanks/watertank.dm | 6 +- code/game/objects/items/weaponry.dm | 2 +- code/game/turfs/simulated/lava.dm | 4 +- code/modules/admin/topic.dm | 4 +- code/modules/admin/verbs/debug.dm | 2 +- .../abductor/equipment/abduction_gear.dm | 2 +- .../bloodsucker/bloodsucker_life.dm | 2 +- .../bloodsucker/bloodsucker_powers.dm | 2 +- .../antagonists/bloodsucker/powers/brawn.dm | 4 +- .../changeling/powers/biodegrade.dm | 6 +- .../changeling/powers/mutations.dm | 8 +- .../clockcult/clock_items/clockwork_armor.dm | 8 +- .../clock_items/construct_chassis.dm | 2 +- .../clockcult/clock_items/judicial_visor.dm | 12 +- .../clock_items/wraith_spectacles.dm | 2 +- .../clock_scriptures/scripture_scripts.dm | 24 +-- code/modules/antagonists/cult/blood_magic.dm | 12 +- code/modules/antagonists/cult/cult.dm | 6 +- code/modules/antagonists/cult/runes.dm | 2 +- code/modules/antagonists/devil/devil.dm | 8 +- .../eldritch_cult/eldritch_antag.dm | 6 +- .../eldritch_cult/eldritch_items.dm | 4 +- .../eldritch_cult/knowledge/rust_lore.dm | 2 +- code/modules/antagonists/ert/ert.dm | 4 +- .../antagonists/highlander/highlander.dm | 12 +- .../antagonists/overthrow/overthrow.dm | 6 +- .../antagonists/revolution/revolution.dm | 6 +- .../antagonists/traitor/datum_traitor.dm | 6 +- .../antagonists/wizard/equipment/artefact.dm | 8 +- code/modules/antagonists/wizard/wizard.dm | 12 +- .../awaymissions/mission_code/jungleresort.dm | 2 +- .../awaymissions/mission_code/snowdin.dm | 2 +- code/modules/client/preferences.dm | 4 +- code/modules/clothing/chameleon.dm | 4 +- code/modules/clothing/clothing.dm | 4 +- code/modules/clothing/ears/_ears.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 8 +- code/modules/clothing/glasses/hud.dm | 2 +- code/modules/clothing/glasses/phantomthief.dm | 4 +- code/modules/clothing/gloves/color.dm | 4 +- code/modules/clothing/gloves/miscellaneous.dm | 6 +- code/modules/clothing/gloves/tacklers.dm | 4 +- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/head/jobs.dm | 2 +- code/modules/clothing/head/misc.dm | 2 +- code/modules/clothing/head/misc_special.dm | 8 +- code/modules/clothing/masks/_masks.dm | 2 +- code/modules/clothing/masks/cluwne.dm | 4 +- code/modules/clothing/masks/miscellaneous.dm | 2 +- code/modules/clothing/neck/_neck.dm | 4 +- code/modules/clothing/outfits/vr.dm | 2 +- code/modules/clothing/outfits/vv_outfit.dm | 38 ++-- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/clothing/shoes/cluwne.dm | 2 +- code/modules/clothing/shoes/magboots.dm | 2 +- code/modules/clothing/shoes/miscellaneous.dm | 8 +- code/modules/clothing/shoes/taeclowndo.dm | 4 +- .../modules/clothing/spacesuits/chronosuit.dm | 2 +- code/modules/clothing/spacesuits/hardsuit.dm | 20 +- code/modules/clothing/suits/miscellaneous.dm | 6 +- .../modules/clothing/suits/reactive_armour.dm | 4 +- code/modules/clothing/suits/toggles.dm | 12 +- code/modules/clothing/suits/wiz_robe.dm | 2 +- code/modules/clothing/under/_under.dm | 2 +- code/modules/clothing/under/cluwne.dm | 2 +- code/modules/clothing/under/color.dm | 4 +- code/modules/events/wizard/curseditems.dm | 18 +- code/modules/flufftext/Hallucination.dm | 2 +- .../food_and_drinks/drinks/drinks/bottle.dm | 2 +- code/modules/holiday/halloween/jacqueen.dm | 4 +- code/modules/jobs/job_types/_job.dm | 2 +- .../jobs/job_types/atmospheric_technician.dm | 4 +- code/modules/jobs/job_types/chaplain.dm | 4 +- code/modules/jobs/job_types/chief_engineer.dm | 4 +- code/modules/jobs/job_types/paramedic.dm | 2 +- .../jobs/job_types/research_director.dm | 2 +- code/modules/jobs/job_types/roboticist.dm | 2 +- .../jobs/job_types/security_officer.dm | 2 +- code/modules/jobs/job_types/shaft_miner.dm | 2 +- .../jobs/job_types/station_engineer.dm | 4 +- .../mining/equipment/wormhole_jaunter.dm | 4 +- .../mining/lavaland/necropolis_chests.dm | 2 +- code/modules/mob/inventory.dm | 24 +-- .../living/carbon/alien/special/facehugger.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 10 +- .../mob/living/carbon/carbon_defense.dm | 6 +- .../mob/living/carbon/carbon_stripping.dm | 12 +- .../mob/living/carbon/handle_corruption.dm | 2 +- .../mob/living/carbon/human/examine.dm | 16 +- code/modules/mob/living/carbon/human/human.dm | 6 +- .../living/carbon/human/human_stripping.dm | 22 +- .../mob/living/carbon/human/inventory.dm | 60 +++--- .../mob/living/carbon/human/species.dm | 48 ++--- .../carbon/human/species_types/golems.dm | 2 +- .../carbon/human/species_types/mushpeople.dm | 2 +- .../human/species_types/shadowpeople.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 28 +-- code/modules/mob/living/carbon/inventory.dm | 40 ++-- code/modules/mob/living/carbon/life.dm | 10 +- .../mob/living/carbon/monkey/inventory.dm | 10 +- .../mob/living/carbon/monkey/monkey.dm | 2 +- .../mob/living/carbon/monkey/punpun.dm | 4 +- .../modules/mob/living/carbon/update_icons.dm | 10 +- .../simple_animal/friendly/drone/_drone.dm | 4 +- .../friendly/drone/drones_as_items.dm | 2 +- .../simple_animal/friendly/drone/inventory.dm | 16 +- .../simple_animal/guardian/types/dextrous.dm | 8 +- .../hostile/mining_mobs/goliath.dm | 2 +- code/modules/ninja/energy_katana.dm | 2 +- code/modules/ninja/outfit.dm | 2 +- code/modules/ninja/suit/shoes.dm | 2 +- .../projectiles/boxes_magazines/ammo_boxes.dm | 2 +- .../boxes_magazines/external/rechargable.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- .../modules/projectiles/guns/ballistic/toy.dm | 2 +- .../projectiles/guns/energy/laser_gatling.dm | 2 +- .../chemistry/reagents/other_reagents.dm | 2 +- .../chemistry/reagents/toxin_reagents.dm | 2 +- .../chemistry/recipes/slime_extracts.dm | 2 +- .../reagents/reagent_containers/glass.dm | 26 +-- .../reagents/reagent_containers/rags.dm | 6 +- .../nanites/nanite_programs/protocols.dm | 2 +- .../xenobiology/crossbreeding/_clothing.dm | 6 +- .../xenobiology/crossbreeding/regenerative.dm | 16 +- code/modules/spells/spell_types/lichdom.dm | 14 +- code/modules/surgery/organs/ears.dm | 4 +- code/modules/surgery/organs/organ_internal.dm | 2 +- code/modules/vehicles/scooter.dm | 4 +- .../code/datums/components/souldeath.dm | 2 +- .../code/modules/client/loadout/__donator.dm | 190 +++++++++--------- .../code/modules/client/loadout/backpack.dm | 2 +- .../code/modules/client/loadout/glasses.dm | 2 +- .../code/modules/client/loadout/gloves.dm | 4 +- .../code/modules/client/loadout/hands.dm | 2 +- .../code/modules/client/loadout/head.dm | 6 +- .../code/modules/client/loadout/mask.dm | 2 +- .../code/modules/client/loadout/neck.dm | 2 +- .../code/modules/client/loadout/shoes.dm | 2 +- .../code/modules/client/loadout/suit.dm | 2 +- .../code/modules/client/loadout/uniform.dm | 12 +- .../code/modules/client/loadout/unlockable.dm | 2 +- .../modules/custom_loadout/custom_items.dm | 4 +- .../modules/custom_loadout/load_to_mob.dm | 2 +- .../eventmaps/Spookystation/JTGSZwork.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 2 +- .../code/modules/reagents/objects/clothes.dm | 2 +- 206 files changed, 782 insertions(+), 818 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index cf98755a36..f73d123697 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -158,7 +158,7 @@ #define ORGAN_SLOT_STOMACH "stomach" #define ORGAN_SLOT_STOMACH_AID "stomach_aid" #define ORGAN_SLOT_BREATHING_TUBE "breathing_tube" -#define ORGAN_SLOT_EARS "ears" +#define ORGAN_ITEM_SLOT_EARS "ears" #define ORGAN_SLOT_EYES "eye_sight" #define ORGAN_SLOT_LUNGS "lungs" #define ORGAN_SLOT_HEART "heart" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 7b727fcc5a..6c83a46514 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -6,87 +6,52 @@ #define STORAGE_VIEW_DEPTH 2 //ITEM INVENTORY SLOT BITMASKS -#define ITEM_SLOT_OCLOTHING (1<<0) -#define ITEM_SLOT_ICLOTHING (1<<1) -#define ITEM_SLOT_GLOVES (1<<2) -#define ITEM_SLOT_EYES (1<<3) -#define ITEM_SLOT_EARS (1<<4) -#define ITEM_SLOT_MASK (1<<5) -#define ITEM_SLOT_HEAD (1<<6) -#define ITEM_SLOT_FEET (1<<7) -#define ITEM_SLOT_ID (1<<8) -#define ITEM_SLOT_BELT (1<<9) -#define ITEM_SLOT_BACK (1<<10) -#define ITEM_SLOT_POCKET (1<<11) // this is to allow items with a w_class of WEIGHT_CLASS_NORMAL or WEIGHT_CLASS_BULKY to fit in pockets. -#define ITEM_SLOT_DENYPOCKET (1<<12) // this is to deny items with a w_class of WEIGHT_CLASS_SMALL or WEIGHT_CLASS_TINY to fit in pockets. -#define ITEM_SLOT_NECK (1<<13) -#define ITEM_SLOT_HANDS (1<<14) -#define ITEM_SLOT_BACKPACK (1<<15) -#define ITEM_SLOT_SUITSTORE (1<<16) +/// Suit slot (armors, costumes, space suits, etc.) +#define ITEM_SLOT_OCLOTHING (1<<0) +/// Jumpsuit slot +#define ITEM_SLOT_ICLOTHING (1<<1) +/// Glove slot +#define ITEM_SLOT_GLOVES (1<<2) +/// Glasses slot +#define ITEM_SLOT_EYES (1<<3) +/// Ear slot (radios, earmuffs) +#define ITEM_SLOT_EARS (1<<4) +/// Mask slot +#define ITEM_SLOT_MASK (1<<5) +/// Head slot (helmets, hats, etc.) +#define ITEM_SLOT_HEAD (1<<6) +/// Shoe slot +#define ITEM_SLOT_FEET (1<<7) +/// ID slot +#define ITEM_SLOT_ID (1<<8) +/// Belt slot +#define ITEM_SLOT_BELT (1<<9) +/// Back slot +#define ITEM_SLOT_BACK (1<<10) +/// Dextrous simplemob "hands" (used for Drones and Dextrous Guardians) +#define ITEM_SLOT_DEX_STORAGE (1<<11) +/// Neck slot (ties, bedsheets, scarves) +#define ITEM_SLOT_NECK (1<<12) +/// A character's hand slots +#define ITEM_SLOT_HANDS (1<<13) +/// Inside of a character's backpack +#define ITEM_SLOT_BACKPACK (1<<14) +/// Suit Storage slot +#define ITEM_SLOT_SUITSTORE (1<<15) +/// Left Pocket slot +#define ITEM_SLOT_LPOCKET (1<<16) +/// Right Pocket slot +#define ITEM_SLOT_RPOCKET (1<<17) +/// Handcuff slot +#define ITEM_SLOT_HANDCUFFED (1<<18) +/// Legcuff slot (bolas, beartraps) +#define ITEM_SLOT_LEGCUFFED (1<<19) -//SLOTS -#define SLOT_BACK 1 -#define SLOT_WEAR_MASK 2 -#define SLOT_HANDCUFFED 3 -#define SLOT_HANDS 4 //wherever you provide a slot for hands you provide SLOT_HANDS - //SLOT_HANDS as a slot will pick ANY available hand -#define SLOT_BELT 5 -#define SLOT_WEAR_ID 6 -#define SLOT_EARS 7 -#define SLOT_GLASSES 8 -#define SLOT_GLOVES 9 -#define SLOT_NECK 10 -#define SLOT_HEAD 11 -#define SLOT_SHOES 12 -#define SLOT_WEAR_SUIT 13 -#define SLOT_W_UNIFORM 14 -#define SLOT_L_STORE 15 -#define SLOT_R_STORE 16 -#define SLOT_S_STORE 17 -#define SLOT_IN_BACKPACK 18 -#define SLOT_LEGCUFFED 19 -#define SLOT_GENERC_DEXTROUS_STORAGE 20 - - -#define SLOTS_AMT 20 // Keep this up to date! - -//I hate that this has to exist -/proc/slotdefine2slotbit(slotdefine) //Keep this up to date with the value of SLOT BITMASKS and SLOTS (the two define sections above) - . = 0 - switch(slotdefine) - if(SLOT_BACK) - . = ITEM_SLOT_BACK - if(SLOT_WEAR_MASK) - . = ITEM_SLOT_MASK - if(SLOT_NECK) - . = ITEM_SLOT_NECK - if(SLOT_BELT) - . = ITEM_SLOT_BELT - if(SLOT_WEAR_ID) - . = ITEM_SLOT_ID - if(SLOT_EARS) - . = ITEM_SLOT_EARS - if(SLOT_GLASSES) - . = ITEM_SLOT_EYES - if(SLOT_GLOVES) - . = ITEM_SLOT_GLOVES - if(SLOT_HEAD) - . = ITEM_SLOT_HEAD - if(SLOT_SHOES) - . = ITEM_SLOT_FEET - if(SLOT_WEAR_SUIT) - . = ITEM_SLOT_OCLOTHING - if(SLOT_W_UNIFORM) - . = ITEM_SLOT_ICLOTHING - if(SLOT_L_STORE, SLOT_R_STORE) - . = ITEM_SLOT_POCKET - if(SLOT_HANDS) - . = ITEM_SLOT_HANDS - if(SLOT_IN_BACKPACK) - . = ITEM_SLOT_BACKPACK - if(SLOT_S_STORE) - . = ITEM_SLOT_SUITSTORE +/// Total amount of slots +#define SLOTS_AMT 20 // Keep this up to date! +//SLOT GROUP HELPERS +#define ITEM_SLOT_POCKETS (ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET) //Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. #define HIDEGLOVES (1<<0) @@ -245,4 +210,4 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list( #define GET_INTERNAL_SLOTS(C) list(C.head, C.wear_mask) //Slots that won't trigger humans' update_genitals() on equip(). -GLOBAL_LIST_INIT(no_genitals_update_slots, list(SLOT_L_STORE, SLOT_R_STORE, SLOT_S_STORE, SLOT_IN_BACKPACK, SLOT_LEGCUFFED, SLOT_HANDCUFFED, SLOT_HANDS, SLOT_GENERC_DEXTROUS_STORAGE)) +GLOBAL_LIST_INIT(no_genitals_update_slots, list(ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET, ITEM_SLOT_SUITSTORE, ITEM_SLOT_BACKPACK, ITEM_SLOT_LEGCUFFED, ITEM_SLOT_HANDCUFFED, ITEM_SLOT_HANDS, ITEM_SLOT_DEX_STORAGE)) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index f56cd76a71..60d02c1e49 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -105,6 +105,9 @@ #define TORADIANS(degrees) ((degrees) * 0.0174532925) +/// Gets shift x that would be required the bitflag (1<[pick("You hear a ringing in your ear.", "Your ears pop.")]") if(5) if(power > 2) - var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_ITEM_SLOT_EARS) if(istype(ears) && ears.damage < ears.maxHealth) to_chat(M, "Your ears pop painfully and start bleeding!") ears.damage = max(ears.damage, ears.maxHealth) diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index e769f466b9..0440fb231d 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -61,19 +61,19 @@ STI KALY - blind if(!istype(H.head, /obj/item/clothing/head/wizard)) if(!H.dropItemToGround(H.head)) qdel(H.head) - H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), ITEM_SLOT_HEAD) return if(prob(chance)) if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe)) if(!H.dropItemToGround(H.wear_suit)) qdel(H.wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), SLOT_WEAR_SUIT) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), ITEM_SLOT_OCLOTHING) return if(prob(chance)) if(!istype(H.shoes, /obj/item/clothing/shoes/sandal/magic)) if(!H.dropItemToGround(H.shoes)) qdel(H.shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), SLOT_SHOES) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), ITEM_SLOT_FEET) return else var/mob/living/carbon/H = affected_mob diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index 1c74777845..38afc5e307 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -19,7 +19,7 @@ user_by_item -= target /datum/element/earhealing/proc/equippedChanged(datum/source, mob/living/carbon/user, slot) - if(slot == SLOT_EARS && istype(user)) + if(slot == ITEM_SLOT_EARS && istype(user)) user_by_item[source] = user else user_by_item -= source @@ -30,7 +30,7 @@ var/mob/living/carbon/user = user_by_item[i] if(HAS_TRAIT(user, TRAIT_DEAF)) continue - var/obj/item/organ/ears/ears = user.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = user.getorganslot(ORGAN_ITEM_SLOT_EARS) if(!ears) continue ears.deaf = max(ears.deaf - 0.25, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index 5e888e0609..2649a8ee6f 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -144,7 +144,7 @@ return TRUE /datum/element/polychromic/proc/grant_user_action(atom/source, mob/user, slot) - if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED || slot == SLOT_HANDCUFFED || slot == SLOT_GENERC_DEXTROUS_STORAGE) + if(slot == ITEM_SLOT_BACKPACK || slot == ITEM_SLOT_LEGCUFFED || slot == ITEM_SLOT_HANDCUFFED || slot == ITEM_SLOT_DEX_STORAGE) return var/datum/action/polychromic/P = actions_by_atom[source] if(!P) diff --git a/code/datums/elements/spellcasting.dm b/code/datums/elements/spellcasting.dm index 877bcdbcd3..676168ea49 100644 --- a/code/datums/elements/spellcasting.dm +++ b/code/datums/elements/spellcasting.dm @@ -34,7 +34,7 @@ stacked_spellcasting_by_user -= target /datum/element/spellcasting/proc/on_equip(datum/source, mob/equipper, slot) - if(!(cast_slots & slotdefine2slotbit(slot))) + if(!(cast_slots & slot)) return users_by_item[source] = equipper if(!stacked_spellcasting_by_user[equipper]) diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 4682595aec..5b6c0e222d 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -59,7 +59,7 @@ /obj/item/clothing/gloves/boxing/equipped(mob/user, slot) . = ..() - if(ishuman(user) && slot == SLOT_GLOVES) + if(ishuman(user) && slot == ITEM_SLOT_GLOVES) var/mob/living/carbon/human/H = user style.teach(H,TRUE) @@ -68,5 +68,5 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_GLOVES) == src) + if(H.get_item_by_slot(ITEM_SLOT_GLOVES) == src) style.remove(H) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 3691b2fccc..f8ed72eae8 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -197,7 +197,7 @@ /obj/item/clothing/gloves/krav_maga/equipped(mob/user, slot) . = ..() - if(ishuman(user) && slot == SLOT_GLOVES) + if(ishuman(user) && slot == ITEM_SLOT_GLOVES) var/mob/living/carbon/human/H = user style.teach(H,1) @@ -206,7 +206,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_GLOVES) == src) + if(H.get_item_by_slot(ITEM_SLOT_GLOVES) == src) style.remove(H) /obj/item/clothing/gloves/krav_maga/sec//more obviously named, given to sec diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index 8dc1afba81..466bf5c778 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -485,7 +485,7 @@ /obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot) . = ..() - if(ishuman(user) && slot == SLOT_BELT) + if(ishuman(user) && slot == ITEM_SLOT_BELT) var/mob/living/carbon/human/H = user style.teach(H,1) @@ -494,7 +494,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_BELT) == src) + if(H.get_item_by_slot(ITEM_SLOT_BELT) == src) style.remove(H) //Subtype of wrestling, reserved for the wrestling belts found in the holodeck diff --git a/code/datums/mutations/cluwne.dm b/code/datums/mutations/cluwne.dm index 59b7752372..45a78be27b 100644 --- a/code/datums/mutations/cluwne.dm +++ b/code/datums/mutations/cluwne.dm @@ -17,18 +17,18 @@ if(!istype(H.wear_mask, /obj/item/clothing/mask/gas/cluwne)) if(!H.dropItemToGround(H.wear_mask)) qdel(H.wear_mask) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/cluwne(H), SLOT_WEAR_MASK) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/cluwne(H), ITEM_SLOT_MASK) if(!istype(H.w_uniform, /obj/item/clothing/under/cluwne)) if(!H.dropItemToGround(H.w_uniform)) qdel(H.w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/under/cluwne(H), SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new /obj/item/clothing/under/cluwne(H), ITEM_SLOT_ICLOTHING) if(!istype(H.shoes, /obj/item/clothing/shoes/clown_shoes/cluwne)) if(!H.dropItemToGround(H.shoes)) qdel(H.shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes/cluwne(H), SLOT_SHOES) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes/cluwne(H), ITEM_SLOT_FEET) - owner.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(owner), SLOT_GLOVES) // this is purely for cosmetic purposes incase they aren't wearing anything in that slot - owner.equip_to_slot_or_del(new /obj/item/storage/backpack/clown(owner), SLOT_BACK) // ditto + owner.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(owner), ITEM_SLOT_GLOVES) // this is purely for cosmetic purposes incase they aren't wearing anything in that slot + owner.equip_to_slot_or_del(new /obj/item/storage/backpack/clown(owner), ITEM_SLOT_BACK) // ditto /datum/mutation/human/cluwne/on_life(mob/living/carbon/human/owner) if((prob(15) && owner.IsUnconscious())) diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 0b46629365..4c17874f97 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -153,31 +153,31 @@ //Start with uniform,suit,backpack for additional slots if(uniform) - H.equip_to_slot_or_del(new uniform(H), SLOT_W_UNIFORM, TRUE) + H.equip_to_slot_or_del(new uniform(H), ITEM_SLOT_ICLOTHING, TRUE) if(suit) - H.equip_to_slot_or_del(new suit(H), SLOT_WEAR_SUIT, TRUE) + H.equip_to_slot_or_del(new suit(H), ITEM_SLOT_OCLOTHING, TRUE) if(back) - H.equip_to_slot_or_del(new back(H), SLOT_BACK, TRUE) + H.equip_to_slot_or_del(new back(H), ITEM_SLOT_BACK, TRUE) if(belt) - H.equip_to_slot_or_del(new belt(H), SLOT_BELT, TRUE) + H.equip_to_slot_or_del(new belt(H), ITEM_SLOT_BELT, TRUE) if(gloves) - H.equip_to_slot_or_del(new gloves(H), SLOT_GLOVES, TRUE) + H.equip_to_slot_or_del(new gloves(H), ITEM_SLOT_GLOVES, TRUE) if(shoes) - H.equip_to_slot_or_del(new shoes(H), SLOT_SHOES, TRUE) + H.equip_to_slot_or_del(new shoes(H), ITEM_SLOT_FEET, TRUE) if(head) - H.equip_to_slot_or_del(new head(H), SLOT_HEAD, TRUE) + H.equip_to_slot_or_del(new head(H), ITEM_SLOT_HEAD, TRUE) if(mask) - H.equip_to_slot_or_del(new mask(H), SLOT_WEAR_MASK, TRUE) + H.equip_to_slot_or_del(new mask(H), ITEM_SLOT_MASK, TRUE) if(neck) - H.equip_to_slot_or_del(new neck(H), SLOT_NECK, TRUE) + H.equip_to_slot_or_del(new neck(H), ITEM_SLOT_NECK, TRUE) if(ears) - H.equip_to_slot_or_del(new ears(H), SLOT_EARS, TRUE) + H.equip_to_slot_or_del(new ears(H), ITEM_SLOT_EARS, TRUE) if(glasses) - H.equip_to_slot_or_del(new glasses(H), SLOT_GLASSES, TRUE) + H.equip_to_slot_or_del(new glasses(H), ITEM_SLOT_EYES, TRUE) if(id) - H.equip_to_slot_or_del(new id(H), SLOT_WEAR_ID, TRUE) + H.equip_to_slot_or_del(new id(H), ITEM_SLOT_ID, TRUE) if(suit_store) - H.equip_to_slot_or_del(new suit_store(H), SLOT_S_STORE, TRUE) + H.equip_to_slot_or_del(new suit_store(H), ITEM_SLOT_SUITSTORE, TRUE) if(undershirt) H.undershirt = initial(undershirt.name) @@ -195,9 +195,9 @@ if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon. if(l_pocket) - H.equip_to_slot_or_del(new l_pocket(H), SLOT_L_STORE, TRUE) + H.equip_to_slot_or_del(new l_pocket(H), ITEM_SLOT_LPOCKET, TRUE) if(r_pocket) - H.equip_to_slot_or_del(new r_pocket(H), SLOT_R_STORE, TRUE) + H.equip_to_slot_or_del(new r_pocket(H), ITEM_SLOT_RPOCKET, TRUE) if(box) if(!backpack_contents) @@ -211,7 +211,7 @@ if(!isnum(number))//Default to 1 number = 1 for(var/i in 1 to number) - H.equip_to_slot_or_del(new path(H), SLOT_IN_BACKPACK, TRUE) + H.equip_to_slot_or_del(new path(H), ITEM_SLOT_BACKPACK, TRUE) if(!H.head && toggle_helmet && istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit)) var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index dbec6c6ee2..e45f9cf3a9 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -578,7 +578,7 @@ if(60 to 69) H.adjustOrganLoss(ORGAN_SLOT_EYES,10) if(70 to 79) - H.adjustOrganLoss(ORGAN_SLOT_EARS,10) + H.adjustOrganLoss(ORGAN_ITEM_SLOT_EARS,10) if(80 to 89) H.adjustOrganLoss(ORGAN_SLOT_LUNGS,10) if(90 to 99) @@ -610,7 +610,7 @@ if(60 to 69) H.adjustOrganLoss(ORGAN_SLOT_EYES,5) if(70 to 79) - H.adjustOrganLoss(ORGAN_SLOT_EARS,5) + H.adjustOrganLoss(ORGAN_ITEM_SLOT_EARS,5) if(80 to 89) H.adjustOrganLoss(ORGAN_SLOT_LUNGS,5) if(90 to 99) diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index 22a851da1d..99fa6e73c5 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -129,7 +129,7 @@ Use this as a guideline var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) H.put_in_hands(glasses) - H.equip_to_slot(glasses, SLOT_GLASSES) + H.equip_to_slot(glasses, ITEM_SLOT_EYES) H.regenerate_icons() //This whole proc is called automatically diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 23fd75f982..a0f62a32b8 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -108,10 +108,10 @@ var/mob/living/carbon/human/H = quirk_holder var/obj/item/choice_beacon/music/B = new(get_turf(H)) H.put_in_hands(B) - H.equip_to_slot_if_possible(B, SLOT_IN_BACKPACK) + H.equip_to_slot_if_possible(B, ITEM_SLOT_BACKPACK) var/obj/item/musicaltuner/musicaltuner = new(get_turf(H)) H.put_in_hands(musicaltuner) - H.equip_to_slot_if_possible(musicaltuner, SLOT_IN_BACKPACK) + H.equip_to_slot_if_possible(musicaltuner, ITEM_SLOT_BACKPACK) H.regenerate_icons() /datum/quirk/photographer @@ -127,7 +127,7 @@ var/mob/living/carbon/human/H = quirk_holder var/obj/item/camera/camera = new(get_turf(H)) H.put_in_hands(camera) - H.equip_to_slot(camera, SLOT_NECK) + H.equip_to_slot(camera, ITEM_SLOT_NECK) H.regenerate_icons() /datum/quirk/selfaware @@ -166,7 +166,7 @@ var/mob/living/carbon/human/H = quirk_holder var/obj/item/toy/crayon/spraycan/spraycan = new(get_turf(H)) H.put_in_hands(spraycan) - H.equip_to_slot(spraycan, SLOT_IN_BACKPACK) + H.equip_to_slot(spraycan, ITEM_SLOT_BACKPACK) H.regenerate_icons() /datum/quirk/voracious @@ -188,7 +188,7 @@ /datum/quirk/trandening/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/autosurgeon/gloweyes/gloweyes = new(get_turf(H)) - H.equip_to_slot(gloweyes, SLOT_IN_BACKPACK) + H.equip_to_slot(gloweyes, ITEM_SLOT_BACKPACK) H.regenerate_icons() /datum/quirk/bloodpressure diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 38007023b5..10f66fce0c 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -57,9 +57,9 @@ GLOBAL_LIST_EMPTY(family_heirlooms) heirloom = new heirloom_type(get_turf(quirk_holder)) GLOB.family_heirlooms += heirloom var/list/slots = list( - "in your left pocket" = SLOT_L_STORE, - "in your right pocket" = SLOT_R_STORE, - "in your backpack" = SLOT_IN_BACKPACK + "in your left pocket" = ITEM_SLOT_LPOCKET, + "in your right pocket" = ITEM_SLOT_RPOCKET, + "in your backpack" = ITEM_SLOT_BACKPACK ) where = H.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet" @@ -120,7 +120,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/nearsighted/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) - if(!H.equip_to_slot_if_possible(glasses, SLOT_GLASSES)) + if(!H.equip_to_slot_if_possible(glasses, ITEM_SLOT_EYES)) H.put_in_hands(glasses) /datum/quirk/nyctophobia @@ -383,7 +383,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/blindness/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/sunglasses/blindfold/white/glasses = new(get_turf(H)) - if(!H.equip_to_slot_if_possible(glasses, SLOT_GLASSES, bypass_equip_delay_self = TRUE)) //if you can't put it on the user's eyes, put it in their hands, otherwise put it on their eyes eyes + if(!H.equip_to_slot_if_possible(glasses, ITEM_SLOT_EYES, bypass_equip_delay_self = TRUE)) //if you can't put it on the user's eyes, put it in their hands, otherwise put it on their eyes eyes H.put_in_hands(glasses) H.regenerate_icons() diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 36712ea6bb..6b2cdbd455 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -172,7 +172,7 @@ /datum/quirk/colorist/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/dyespray/spraycan = new(get_turf(quirk_holder)) - H.equip_to_slot(spraycan, SLOT_IN_BACKPACK) + H.equip_to_slot(spraycan, ITEM_SLOT_BACKPACK) H.regenerate_icons() /datum/quirk/colorist/post_add() diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 83c1eec598..77c953567c 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -1,6 +1,6 @@ GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")) GLOBAL_LIST_INIT(slots, list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store")) -GLOBAL_LIST_INIT(slot2slot, list("head" = SLOT_HEAD, "wear_mask" = SLOT_WEAR_MASK, "neck" = SLOT_NECK, "back" = SLOT_BACK, "wear_suit" = SLOT_WEAR_SUIT, "w_uniform" = SLOT_W_UNIFORM, "shoes" = SLOT_SHOES, "belt" = SLOT_BELT, "gloves" = SLOT_GLOVES, "glasses" = SLOT_GLASSES, "ears" = SLOT_EARS, "wear_id" = SLOT_WEAR_ID, "s_store" = SLOT_S_STORE)) +GLOBAL_LIST_INIT(slot2slot, list("head" = ITEM_SLOT_HEAD, "wear_mask" = ITEM_SLOT_MASK, "neck" = ITEM_SLOT_NECK, "back" = ITEM_SLOT_BACK, "wear_suit" = ITEM_SLOT_OCLOTHING, "w_uniform" = ITEM_SLOT_ICLOTHING, "shoes" = ITEM_SLOT_FEET, "belt" = ITEM_SLOT_BELT, "gloves" = ITEM_SLOT_GLOVES, "glasses" = ITEM_SLOT_EYES, "ears" = ITEM_SLOT_EARS, "wear_id" = ITEM_SLOT_ID, "s_store" = ITEM_SLOT_SUITSTORE)) GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "wear_mask" = /obj/item/clothing/mask/changeling, "back" = /obj/item/changeling, "wear_suit" = /obj/item/clothing/suit/changeling, "w_uniform" = /obj/item/clothing/under/changeling, "shoes" = /obj/item/clothing/shoes/changeling, "belt" = /obj/item/changeling, "gloves" = /obj/item/clothing/gloves/changeling, "glasses" = /obj/item/clothing/glasses/changeling, "ears" = /obj/item/changeling, "wear_id" = /obj/item/changeling, "s_store" = /obj/item/changeling)) GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our this objective to all lings diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 08a8d69575..77371ad7bc 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -205,11 +205,11 @@ Credit where due: var/mob/living/carbon/human/L = M var/obj/item/clockwork/slab/S = new var/slot = "At your feet" - var/list/slots = list("In your left pocket" = SLOT_L_STORE, "In your right pocket" = SLOT_R_STORE, "In your backpack" = SLOT_IN_BACKPACK) + var/list/slots = list("In your left pocket" = ITEM_SLOT_LPOCKET, "In your right pocket" = ITEM_SLOT_RPOCKET, "In your backpack" = ITEM_SLOT_BACKPACK) if(ishuman(L)) var/mob/living/carbon/human/H = L var/obj/item/clockwork/replica_fabricator/F = new - if(H.equip_to_slot_or_del(F, SLOT_IN_BACKPACK)) + if(H.equip_to_slot_or_del(F, ITEM_SLOT_BACKPACK)) to_chat(H, "You have been equipped with a replica fabricator, an advanced tool that can convert objects like doors, tables or even coats into clockwork equivalents.") slot = H.equip_in_one_of_slots(S, slots) if(slot == "In your backpack") diff --git a/code/game/gamemodes/clown_ops/bananium_bomb.dm b/code/game/gamemodes/clown_ops/bananium_bomb.dm index 695fc79169..3e8d45b842 100644 --- a/code/game/gamemodes/clown_ops/bananium_bomb.dm +++ b/code/game/gamemodes/clown_ops/bananium_bomb.dm @@ -37,17 +37,17 @@ if(!H.w_uniform || H.dropItemToGround(H.w_uniform)) C = new /obj/item/clothing/under/rank/civilian/clown(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_W_UNIFORM) + H.equip_to_slot_or_del(C, ITEM_SLOT_ICLOTHING) if(!H.shoes || H.dropItemToGround(H.shoes)) C = new /obj/item/clothing/shoes/clown_shoes(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_SHOES) + H.equip_to_slot_or_del(C, ITEM_SLOT_FEET) if(!H.wear_mask || H.dropItemToGround(H.wear_mask)) C = new /obj/item/clothing/mask/gas/clown_hat(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_WEAR_MASK) + H.equip_to_slot_or_del(C, ITEM_SLOT_MASK) H.dna.add_mutation(CLOWNMUT) H.dna.add_mutation(SMILE) diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index a27cb02ea8..081ffbbdc4 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -214,7 +214,7 @@ if(!istype(C.wear_mask, /obj/item/clothing/mask/gas/clown_hat) && !istype(C.wear_mask, /obj/item/clothing/mask/gas/mime)) if(!C.wear_mask || C.dropItemToGround(C.wear_mask)) var/obj/item/clothing/mask/fakemoustache/sticky/the_stash = new /obj/item/clothing/mask/fakemoustache/sticky() - C.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE) + C.equip_to_slot_or_del(the_stash, ITEM_SLOT_MASK, TRUE, TRUE, TRUE, TRUE) /obj/item/clothing/mask/fakemoustache/sticky var/unstick_time = 2 MINUTES @@ -226,7 +226,7 @@ /obj/item/clothing/mask/fakemoustache/sticky/equipped(mob/user, slot) . = ..() - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) ADD_TRAIT(user, TRAIT_NO_INTERNALS, STICKY_MOUSTACHE_TRAIT) /obj/item/clothing/mask/fakemoustache/sticky/dropped(mob/user) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index a82abe9b3d..f7ccae24e4 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -154,7 +154,7 @@ if(tc) var/obj/item/U = new uplink_type(H, H.key, tc) - H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(U, ITEM_SLOT_BACKPACK) var/obj/item/implant/weapons_auth/W = new W.implant(H) @@ -170,7 +170,7 @@ mask = /obj/item/clothing/mask/gas/syndicate suit = /obj/item/clothing/suit/space/hardsuit/syndi r_pocket = /obj/item/tank/internals/emergency_oxygen/engi - internals_slot = SLOT_R_STORE + internals_slot = ITEM_SLOT_RPOCKET belt = /obj/item/storage/belt/military r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ @@ -186,7 +186,7 @@ suit = /obj/item/clothing/suit/space/syndicate/black/red head = /obj/item/clothing/head/helmet/space/syndicate/black/red r_pocket = /obj/item/tank/internals/emergency_oxygen/engi - internals_slot = SLOT_R_STORE + internals_slot = ITEM_SLOT_RPOCKET belt = /obj/item/storage/belt/military backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ /obj/item/tank/jetpack/oxygen/harness=1,\ diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 0358c3af2c..fd43b994e8 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -165,7 +165,7 @@ If not set, defaults to check_completion instead. Set it. It's used by cryo. if(receiver && receiver.current) if(ishuman(receiver.current)) var/mob/living/carbon/human/H = receiver.current - var/list/slots = list("backpack" = SLOT_IN_BACKPACK) + var/list/slots = list("backpack" = ITEM_SLOT_BACKPACK) for(var/eq_path in special_equipment) var/obj/O = new eq_path . += O @@ -1197,7 +1197,7 @@ GLOBAL_LIST_EMPTY(cult_contraband) I.forceMove(get_turf(owner)) if(ishuman(owner)) var/mob/living/carbon/human/H = owner - H.equip_in_one_of_slots(I, list("backpack" = SLOT_IN_BACKPACK), critical = TRUE) + H.equip_in_one_of_slots(I, list("backpack" = ITEM_SLOT_BACKPACK), critical = TRUE) hoarded_item = I diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 953d21d318..54bdeff4de 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -351,7 +351,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb return if(anchored) return - if(loc == user && current_equipped_slot && current_equipped_slot != SLOT_HANDS) + if(loc == user && current_equipped_slot && current_equipped_slot != ITEM_SLOT_HANDS) if(current_equipped_slot in user.check_obscured_slots()) to_chat(user, "You are unable to unequip that while wearing other garments over it!") return FALSE @@ -416,7 +416,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb return if(anchored) return - if(loc == user && current_equipped_slot && current_equipped_slot != SLOT_HANDS) + if(loc == user && current_equipped_slot && current_equipped_slot != ITEM_SLOT_HANDS) if(current_equipped_slot in user.check_obscured_slots()) to_chat(user, "You are unable to unequip that while wearing other garments over it!") return FALSE @@ -568,7 +568,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb //sometimes we only want to grant the item's action if it's equipped in a specific slot. /obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there + if(slot == ITEM_SLOT_BACKPACK || slot == ITEM_SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there return FALSE return TRUE @@ -817,7 +817,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(ismob(location)) var/mob/M = location var/success = FALSE - if(src == M.get_item_by_slot(SLOT_WEAR_MASK)) + if(src == M.get_item_by_slot(ITEM_SLOT_MASK)) success = TRUE if(success) location = get_turf(M) diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 04838103f9..682ce18215 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -34,7 +34,7 @@ user.put_in_hands(PA) /obj/item/chrono_eraser/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_BACK) + if(slot == ITEM_SLOT_BACK) return 1 /obj/item/gun/energy/chrono_gun diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 702cbd8d56..8227097d8f 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -89,7 +89,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM ..() /obj/item/proc/help_light_cig(mob/living/M) - var/mask_item = M.get_item_by_slot(SLOT_WEAR_MASK) + var/mask_item = M.get_item_by_slot(ITEM_SLOT_MASK) if(istype(mask_item, /obj/item/clothing/mask/cigarette)) return mask_item @@ -130,7 +130,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM reagents.add_reagent_list(list_reagents) if(starts_lit) light() - AddComponent(/datum/component/knockoff,90,list(BODY_ZONE_PRECISE_MOUTH),list(SLOT_WEAR_MASK))//90% to knock off when wearing a mask + AddComponent(/datum/component/knockoff,90,list(BODY_ZONE_PRECISE_MOUTH),list(ITEM_SLOT_MASK))//90% to knock off when wearing a mask /obj/item/clothing/mask/cigarette/Destroy() STOP_PROCESSING(SSobj, src) @@ -819,7 +819,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/vape/equipped(mob/user, slot) . = ..() - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) if(!screw) to_chat(user, "You start puffing on the vape.") reagents.reagents_holder_flags &= ~(NO_REACT) @@ -830,7 +830,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/vape/dropped(mob/user) . = ..() var/mob/living/carbon/C = user - if(C.get_item_by_slot(SLOT_WEAR_MASK) == src) + if(C.get_item_by_slot(ITEM_SLOT_MASK) == src) reagents.reagents_holder_flags |= NO_REACT STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 0570de6bcf..476758efee 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -80,13 +80,13 @@ /obj/item/defibrillator/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) if(loc == user) if(slot_flags == ITEM_SLOT_BACK) - if(user.get_item_by_slot(SLOT_BACK) == src) + if(user.get_item_by_slot(ITEM_SLOT_BACK) == src) ui_action_click() else to_chat(user, "Put the defibrillator on your back first!") else if(slot_flags == ITEM_SLOT_BELT) - if(user.get_item_by_slot(SLOT_BELT) == src) + if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) ui_action_click() else to_chat(user, "Strap the defibrillator's belt on first!") @@ -182,7 +182,7 @@ /obj/item/defibrillator/equipped(mob/user, slot) ..() - if((slot_flags == ITEM_SLOT_BACK && slot != SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != SLOT_BELT)) + if((slot_flags == ITEM_SLOT_BACK && slot != ITEM_SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != ITEM_SLOT_BELT)) remove_paddles(user) update_power() diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 365446bad9..a3de2d822f 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -19,7 +19,7 @@ /obj/item/megaphone/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HANDS) + if (slot == ITEM_SLOT_HANDS) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index c51edc8106..2c55bbf8e4 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -156,7 +156,7 @@ category = list("hacked", "Misc") /obj/item/electropack/shockcollar/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - if(loc == user && user.get_item_by_slot(SLOT_NECK)) + if(loc == user && user.get_item_by_slot(ITEM_SLOT_NECK)) to_chat(user, "The collar is fastened tight! You'll need help taking this off!") return return ..() @@ -167,7 +167,7 @@ if(isliving(loc) && on) //the "on" arg is currently useless var/mob/living/L = loc - if(!L.get_item_by_slot(SLOT_NECK)) //**properly** stops pocket shockers + if(!L.get_item_by_slot(ITEM_SLOT_NECK)) //**properly** stops pocket shockers return if(shock_cooldown == TRUE) return diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 58a3eb312b..6feb8bf663 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/ComponentInitialize() . = ..() if (bowman) - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS)) + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) /obj/item/radio/headset/Initialize() . = ..() @@ -373,4 +373,4 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = replacetext(name,"headset", "bowman headset") desc = "[desc] Protects ears from flashbangs." bowman = TRUE - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS)) + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm index de7e3d2812..810f2150e6 100644 --- a/code/game/objects/items/devices/reverse_bear_trap.dm +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -48,7 +48,7 @@ /obj/item/reverse_bear_trap/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) if(iscarbon(user)) var/mob/living/carbon/C = user - if(C.get_item_by_slot(SLOT_HEAD) == src) + if(C.get_item_by_slot(ITEM_SLOT_HEAD) == src) if(HAS_TRAIT_FROM(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) && !struggling) struggling = TRUE var/fear_string @@ -82,26 +82,26 @@ ..() /obj/item/reverse_bear_trap/attack(mob/living/target, mob/living/user) - if(target.get_item_by_slot(SLOT_HEAD)) + if(target.get_item_by_slot(ITEM_SLOT_HEAD)) to_chat(user, "Remove [target.p_their()] headgear first!") return target.visible_message("[user] starts forcing [src] onto [target]'s head!", \ "[target] starts forcing [src] onto your head!", "You hear clanking.") to_chat(user, "You start forcing [src] onto [target]'s head...") - if(!do_after(user, 30, target = target) || target.get_item_by_slot(SLOT_HEAD)) + if(!do_after(user, 30, target = target) || target.get_item_by_slot(ITEM_SLOT_HEAD)) return target.visible_message("[user] forces and locks [src] onto [target]'s head!", \ "[target] locks [src] onto your head!", "You hear a click, and then a timer ticking down.") to_chat(user, "You force [src] onto [target]'s head and click the padlock shut.") user.dropItemToGround(src) - target.equip_to_slot_if_possible(src, SLOT_HEAD) + target.equip_to_slot_if_possible(src, ITEM_SLOT_HEAD) arm() notify_ghosts("[user] put a reverse bear trap on [target]!", source = src, action = NOTIFY_ORBIT, ghost_sound = 'sound/machines/beep.ogg') /obj/item/reverse_bear_trap/proc/snap() reset() var/mob/living/carbon/human/H = loc - if(!istype(H) || H.get_item_by_slot(SLOT_HEAD) != src) + if(!istype(H) || H.get_item_by_slot(ITEM_SLOT_HEAD) != src) visible_message("[src]'s jaws snap open with an ear-piercing crack!") playsound(src, 'sound/effects/snap.ogg', 75, TRUE) else diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index a353a2b76b..c224f98fe7 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -333,7 +333,7 @@ GENETICS SCANNER var/has_stomach = C.dna && !(NOSTOMACH in C.dna.species.species_traits) if(!M.getorganslot(ORGAN_SLOT_EYES)) msg += "\tSubject does not have eyes.\n" - if(!M.getorganslot(ORGAN_SLOT_EARS)) + if(!M.getorganslot(ORGAN_ITEM_SLOT_EARS)) msg += "\tSubject does not have ears.\n" if(!M.getorganslot(ORGAN_SLOT_BRAIN)) msg += "\tSubject's brain function is non-existent!\n" @@ -436,7 +436,7 @@ GENETICS SCANNER if(R) blood_type = R.name - + if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_SAFE * C.blood_ratio) && (C.scan_blood_volume() + C.integrating_blood) > (BLOOD_VOLUME_OKAY*C.blood_ratio)) msg += "LOW [HAS_TRAIT(C, TRAIT_ROBOTIC_ORGANISM) ? "coolant" : "blood"] level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]\n" else if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_OKAY * C.blood_ratio)) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index ac79b3b887..11900d8e42 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -208,7 +208,7 @@ effective or pretty fucking useless. actions_types = list(/datum/action/item_action/toggle) /obj/item/shadowcloak/ui_action_click(mob/user) - if(user.get_item_by_slot(SLOT_BELT) == src) + if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) if(!on) Activate(usr) else @@ -216,7 +216,7 @@ effective or pretty fucking useless. return /obj/item/shadowcloak/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_BELT) + if(slot == ITEM_SLOT_BELT) return 1 /obj/item/shadowcloak/proc/Activate(mob/living/carbon/human/user) @@ -238,11 +238,11 @@ effective or pretty fucking useless. /obj/item/shadowcloak/dropped(mob/user) ..() - if(user && user.get_item_by_slot(SLOT_BELT) != src) + if(user && user.get_item_by_slot(ITEM_SLOT_BELT) != src) Deactivate() /obj/item/shadowcloak/process() - if(user.get_item_by_slot(SLOT_BELT) != src) + if(user.get_item_by_slot(ITEM_SLOT_BELT) != src) Deactivate() return var/turf/T = get_turf(src) diff --git a/code/game/objects/items/fluff.dm b/code/game/objects/items/fluff.dm index 7105e57c30..0df8d5b447 100644 --- a/code/game/objects/items/fluff.dm +++ b/code/game/objects/items/fluff.dm @@ -6,7 +6,7 @@ // 1) Tennis balls, lines 39 - 99 // 2) Chew bones, lines 101 - 138 // 3) Frisbee, lines 140 - 166 -*/ +*/ /obj/item/toy/fluff name = "Fluff Item" diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index d1450c2685..c084b90d6f 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -336,7 +336,7 @@ var/obj/item/clothing/magichead = new /obj/item/clothing/mask/horsehead/cursed(user.drop_location()) if(!user.dropItemToGround(user.wear_mask)) qdel(user.wear_mask) - user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE) + user.equip_to_slot_if_possible(magichead, ITEM_SLOT_MASK, TRUE, TRUE) qdel(src) else to_chat(user,"I say thee neigh") //It still lives here diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index ddcd35f834..a5913c308d 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -188,7 +188,7 @@ icon_state = "inducer-combat" item_state = "inducer-combat" w_class = WEIGHT_CLASS_BULKY - slot_flags = SLOT_BELT + slot_flags = ITEM_SLOT_BELT desc = "A tool for inductively charging internal power cells. This one has been modified and upgraded to be able to charge into guns as well as normal electronics." cell_type = /obj/item/stock_parts/cell/hyper powertransfer = 1300 diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 6bb501807d..56ad6c2534 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -108,7 +108,7 @@ desc = "This little bugger can be used to store and transport ores." icon = 'icons/obj/mining.dmi' icon_state = "satchel" - slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_NORMAL component_type = /datum/component/storage/concrete/stack var/spam_protection = FALSE //If this is TRUE, the holder won't receive any messages when they fail to pick up ore through crossing it @@ -400,7 +400,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bag" desc = "A bag for storing pills, patches, and bottles." - slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_POCKETS resistance_flags = FLAMMABLE /obj/item/storage/bag/chemistry/ComponentInitialize() @@ -420,7 +420,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "biobag" desc = "A bag for the safe transportation and disposal of biowaste and other biological materials." - slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_POCKETS resistance_flags = FLAMMABLE /obj/item/storage/bag/bio/ComponentInitialize() @@ -451,7 +451,7 @@ desc = "A pouch for your ammo that goes in your pocket." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "ammopouch" - slot_flags = ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_BULKY resistance_flags = FLAMMABLE @@ -472,7 +472,7 @@ Bag for holding materials desc = "A pouch for sheets and RCD ammunition that manages to hang where you would normally put things in your pocket." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "materialpouch" - slot_flags = ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_BULKY resistance_flags = FLAMMABLE diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 476f35fe4c..1a3b40d1da 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -73,7 +73,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", var/mob/living/carbon/human/H = usr H.dna.add_mutation(CLOWNMUT) H.dna.add_mutation(SMILE) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), SLOT_WEAR_MASK) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), ITEM_SLOT_MASK) GLOB.bible_icon_state = icon_state GLOB.bibleitemstates = item_state diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index f68084d63a..111e3c96a0 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -248,10 +248,10 @@ return ..() var/obj/item/clothing/mask/cigarette/cig = locate(/obj/item/clothing/mask/cigarette) in contents if(cig) - if(!user.wear_mask && !(SLOT_WEAR_MASK in M.check_obscured_slots())) + if(!user.wear_mask && !(ITEM_SLOT_MASK in M.check_obscured_slots())) var/obj/item/clothing/mask/cigarette/W = cig SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, M) - M.equip_to_slot_if_possible(W, SLOT_WEAR_MASK) + M.equip_to_slot_if_possible(W, ITEM_SLOT_MASK) contents -= W to_chat(user, "You take \a [W] out of the pack.") else diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index fffcd6dada..88131fb197 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -58,7 +58,7 @@ /obj/item/watertank/equipped(mob/user, slot) ..() - if(slot != SLOT_BACK) + if(slot != ITEM_SLOT_BACK) remove_noz() /obj/item/watertank/proc/remove_noz() @@ -348,14 +348,14 @@ toggle_injection() /obj/item/reagent_containers/chemtank/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_BACK) + if(slot == ITEM_SLOT_BACK) return 1 /obj/item/reagent_containers/chemtank/proc/toggle_injection() var/mob/living/carbon/human/user = usr if(!istype(user)) return - if (user.get_item_by_slot(SLOT_BACK) != src) + if (user.get_item_by_slot(ITEM_SLOT_BACK) != src) to_chat(user, "The chemtank needs to be on your back before you can activate it!") return if(on) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 3fd31941f3..b00d736282 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -1229,7 +1229,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/slapper/on_offered(mob/living/carbon/offerer) . = TRUE - + if(!(locate(/mob/living/carbon) in orange(1, offerer))) visible_message(span_danger("[offerer] raises [offerer.p_their()] arm, looking around for a high-five, but there's no one around!"), \ span_warning("You post up, looking for a high-five, but finding no one within range!"), null, 2) diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 8d7da15761..5da3d079c2 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -153,8 +153,8 @@ continue if(iscarbon(L)) var/mob/living/carbon/C = L - var/obj/item/clothing/S = C.get_item_by_slot(SLOT_WEAR_SUIT) - var/obj/item/clothing/H = C.get_item_by_slot(SLOT_HEAD) + var/obj/item/clothing/S = C.get_item_by_slot(ITEM_SLOT_OCLOTHING) + var/obj/item/clothing/H = C.get_item_by_slot(ITEM_SLOT_HEAD) if(S && H && S.clothing_flags & LAVAPROTECT && H.clothing_flags & LAVAPROTECT) return diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 17bad60945..76677dbe10 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1686,8 +1686,8 @@ if(ishuman(L)) var/mob/living/carbon/human/observer = L - observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit/black(observer), SLOT_W_UNIFORM) - observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), SLOT_SHOES) + observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit/black(observer), ITEM_SLOT_ICLOTHING) + observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), ITEM_SLOT_FEET) L.Unconscious(100) sleep(5) L.forceMove(pick(GLOB.tdomeobserve)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 138913b3a4..7957a6d638 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -202,7 +202,7 @@ id.forceMove(W) W.update_icon() else - H.equip_to_slot(id,SLOT_WEAR_ID) + H.equip_to_slot(id,ITEM_SLOT_ID) else alert("Invalid mob") diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 8484732d8d..011d175cfa 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -62,7 +62,7 @@ A.UpdateButtonIcon() /obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to activate the vest if he's actually wearing it. + if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to activate the vest if he's actually wearing it. return TRUE /obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 29e64a4913..c5f1cfbb40 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -84,7 +84,7 @@ return FALSE if(owner.current.reagents.has_reagent(/datum/reagent/consumable/garlic)) return FALSE - if(istype(owner.current.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + if(istype(owner.current.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) return FALSE owner.current.adjustStaminaLoss(-1.5 + (actual_regen * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-0.1 * (actual_regen * 2) * mult, 0) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index 2fb7a2ccca..0a799021e9 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -94,7 +94,7 @@ if(display_error) to_chat(owner, "You have a stake in your chest! Your powers are useless.") return FALSE - if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + if(istype(owner.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) if(display_error) to_chat(owner, "") return FALSE diff --git a/code/modules/antagonists/bloodsucker/powers/brawn.dm b/code/modules/antagonists/bloodsucker/powers/brawn.dm index 5444cccd3f..db3ce92ec1 100644 --- a/code/modules/antagonists/bloodsucker/powers/brawn.dm +++ b/code/modules/antagonists/bloodsucker/powers/brawn.dm @@ -105,7 +105,7 @@ var/mob/living/carbon/user_C = owner //message_admins("DEBUG3: attempt_cast() [name] / [user_C.handcuffed] ") if(user_C.handcuffed) - var/obj/O = user_C.get_item_by_slot(SLOT_HANDCUFFED) + var/obj/O = user_C.get_item_by_slot(ITEM_SLOT_HANDCUFFED) if(istype(O)) user_C.clear_cuffs(O,TRUE) playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1) @@ -124,7 +124,7 @@ return TRUE */ // Destroy Leg Cuffs if(user_C.legcuffed) - var/obj/O = user_C.get_item_by_slot(SLOT_LEGCUFFED) + var/obj/O = user_C.get_item_by_slot(ITEM_SLOT_LEGCUFFED) if(istype(O)) user_C.clear_cuffs(O,TRUE) playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1) diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index 8b3b1659d1..b440228a4e 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -17,7 +17,7 @@ return FALSE if(user.handcuffed) - var/obj/O = user.get_item_by_slot(SLOT_HANDCUFFED) + var/obj/O = user.get_item_by_slot(ITEM_SLOT_HANDCUFFED) if(!istype(O)) return FALSE user.visible_message("[user] vomits a glob of acid on [user.p_their()] [O]!", \ @@ -27,7 +27,7 @@ used = TRUE if(user.legcuffed) - var/obj/O = user.get_item_by_slot(SLOT_LEGCUFFED) + var/obj/O = user.get_item_by_slot(ITEM_SLOT_LEGCUFFED) if(!istype(O)) return FALSE user.visible_message("[user] vomits a glob of acid on [user.p_their()] [O]!", \ @@ -37,7 +37,7 @@ used = TRUE if(user.wear_suit && user.wear_suit.breakouttime && !used) - var/obj/item/clothing/suit/S = user.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/clothing/suit/S = user.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(!istype(S)) return FALSE user.visible_message("[user] vomits a glob of acid across the front of [user.p_their()] [S]!", \ diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index f4b74c5567..ec95ee4ef6 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -130,8 +130,8 @@ user.dropItemToGround(user.head) user.dropItemToGround(user.wear_suit) - user.equip_to_slot_if_possible(new suit_type(user), SLOT_WEAR_SUIT, 1, 1, 1) - user.equip_to_slot_if_possible(new helmet_type(user), SLOT_HEAD, 1, 1, 1) + user.equip_to_slot_if_possible(new suit_type(user), ITEM_SLOT_OCLOTHING, 1, 1, 1) + user.equip_to_slot_if_possible(new helmet_type(user), ITEM_SLOT_HEAD, 1, 1, 1) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.chem_recharge_slowdown += recharge_slowdown @@ -637,7 +637,7 @@ user.dropItemToGround(user.gloves) - user.equip_to_slot_if_possible(new glove_type(user), SLOT_GLOVES, 1, 1, 1) + user.equip_to_slot_if_possible(new glove_type(user), ITEM_SLOT_GLOVES, 1, 1, 1) playsound(user, 'sound/effects/blobattack.ogg', 30, 1) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.chem_recharge_slowdown += recharge_slowdown @@ -733,7 +733,7 @@ /obj/item/clothing/gloves/fingerless/pugilist/cling/equipped(mob/user, slot) . = ..() - if(current_equipped_slot == SLOT_GLOVES) + if(current_equipped_slot == ITEM_SLOT_GLOVES) to_chat(user, "With [src] formed around our arms, we are ready to fight.") /obj/item/clothing/gloves/fingerless/pugilist/cling/dropped(mob/user) diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm index ad507adcec..b5f2a358e6 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm @@ -38,7 +38,7 @@ /obj/item/clothing/head/helmet/clockwork/equipped(mob/living/user, slot) ..() - if(slot == SLOT_HEAD && !is_servant_of_ratvar(user)) + if(slot == ITEM_SLOT_HEAD && !is_servant_of_ratvar(user)) if(!iscultist(user)) to_chat(user, "\"Now now, this is for my servants, not you.\"") user.visible_message("As [user] puts [src] on, it flickers off [user.p_their()] head!", "The helmet flickers off your head, leaving only nausea!") @@ -105,7 +105,7 @@ /obj/item/clothing/suit/armor/clockwork/equipped(mob/living/user, slot) ..() - if(slot == SLOT_WEAR_SUIT && !is_servant_of_ratvar(user)) + if(slot == ITEM_SLOT_OCLOTHING && !is_servant_of_ratvar(user)) if(!iscultist(user)) to_chat(user, "\"Now now, this is for my servants, not you.\"") user.visible_message("As [user] puts [src] on, it flickers off [user.p_their()] body!", "The cuirass flickers off your body, leaving only nausea!") @@ -165,7 +165,7 @@ /obj/item/clothing/gloves/clockwork/equipped(mob/living/user, slot) ..() - if(slot == SLOT_GLOVES && !is_servant_of_ratvar(user)) + if(slot == ITEM_SLOT_GLOVES && !is_servant_of_ratvar(user)) if(!iscultist(user)) to_chat(user, "\"Now now, this is for my servants, not you.\"") user.visible_message("As [user] puts [src] on, it flickers off [user.p_their()] arms!", "The gauntlets flicker off your arms, leaving only nausea!") @@ -215,7 +215,7 @@ /obj/item/clothing/shoes/clockwork/equipped(mob/living/user, slot) ..() - if(slot == SLOT_SHOES && !is_servant_of_ratvar(user)) + if(slot == ITEM_SLOT_FEET && !is_servant_of_ratvar(user)) if(!iscultist(user)) to_chat(user, "\"Now now, this is for my servants, not you.\"") user.visible_message("As [user] puts [src] on, it flickers off [user.p_their()] feet!", "The treads flicker off your feet, leaving only nausea!") diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm index daee9f5c2c..9342cd8ea5 100644 --- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm +++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm @@ -117,4 +117,4 @@ S.no_cost = TRUE if(seasonal_hat && seasonal_hat != "none") var/obj/item/hat = new seasonal_hat(construct) - construct.equip_to_slot_or_del(hat, SLOT_HEAD) + construct.equip_to_slot_or_del(hat, ITEM_SLOT_HEAD) diff --git a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm index e748da8765..138f04feb3 100644 --- a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm +++ b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm @@ -28,13 +28,13 @@ return ..() /obj/item/clothing/glasses/judicial_visor/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot != SLOT_GLASSES) + if(slot != ITEM_SLOT_EYES) return 0 return ..() /obj/item/clothing/glasses/judicial_visor/equipped(mob/living/user, slot) ..() - if(slot != SLOT_GLASSES) + if(slot != ITEM_SLOT_EYES) update_status(FALSE) if(blaster.ranged_ability_user) blaster.remove_ranged_ability() @@ -55,13 +55,13 @@ addtimer(CALLBACK(src, .proc/check_on_mob, user), 1) //dropped is called before the item is out of the slot, so we need to check slightly later /obj/item/clothing/glasses/judicial_visor/proc/check_on_mob(mob/user) - if(user && src != user.get_item_by_slot(SLOT_GLASSES)) //if we happen to check and we AREN'T in the slot, we need to remove our shit from whoever we got dropped from + if(user && src != user.get_item_by_slot(ITEM_SLOT_EYES)) //if we happen to check and we AREN'T in the slot, we need to remove our shit from whoever we got dropped from update_status(FALSE) if(blaster.ranged_ability_user) blaster.remove_ranged_ability() /obj/item/clothing/glasses/judicial_visor/attack_self(mob/user) - if(is_servant_of_ratvar(user) && src == user.get_item_by_slot(SLOT_GLASSES)) + if(is_servant_of_ratvar(user) && src == user.get_item_by_slot(ITEM_SLOT_EYES)) blaster.toggle(user) /obj/item/clothing/glasses/judicial_visor/proc/update_status(change_to) @@ -89,7 +89,7 @@ if(!src) return 0 recharging = FALSE - if(user && src == user.get_item_by_slot(SLOT_GLASSES)) + if(user && src == user.get_item_by_slot(ITEM_SLOT_EYES)) to_chat(user, "Your [name] hums. It is ready.") else active = FALSE @@ -115,7 +115,7 @@ /obj/effect/proc_holder/judicial_visor/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) return - if(ranged_ability_user.incapacitated() || !visor || visor != ranged_ability_user.get_item_by_slot(SLOT_GLASSES)) + if(ranged_ability_user.incapacitated() || !visor || visor != ranged_ability_user.get_item_by_slot(ITEM_SLOT_EYES)) remove_ranged_ability() return diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm index 5e25b8de82..837844d0cb 100644 --- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm +++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm @@ -75,7 +75,7 @@ /obj/item/clothing/glasses/wraith_spectacles/equipped(mob/living/user, slot) ..() - if(slot != SLOT_GLASSES || up) + if(slot != ITEM_SLOT_EYES || up) return if(HAS_TRAIT(user, TRAIT_BLIND)) to_chat(user, "\"You're blind, idiot. Stop embarrassing yourself.\"" ) diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm index 7ba4ce0936..be4785f4a7 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm @@ -200,18 +200,18 @@ /datum/action/innate/clockwork_armaments/Activate() var/do_message = 0 - var/obj/item/I = owner.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/I = owner.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(remove_item_if_better(I, owner)) - do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), SLOT_WEAR_SUIT) - I = owner.get_item_by_slot(SLOT_HEAD) + do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), ITEM_SLOT_OCLOTHING) + I = owner.get_item_by_slot(ITEM_SLOT_HEAD) if(remove_item_if_better(I, owner)) - do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), SLOT_HEAD) - I = owner.get_item_by_slot(SLOT_GLOVES) + do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), ITEM_SLOT_HEAD) + I = owner.get_item_by_slot(ITEM_SLOT_GLOVES) if(remove_item_if_better(I, owner)) - do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/gloves/clockwork(null), SLOT_GLOVES) - I = owner.get_item_by_slot(SLOT_SHOES) + do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/gloves/clockwork(null), ITEM_SLOT_GLOVES) + I = owner.get_item_by_slot(ITEM_SLOT_FEET) if(remove_item_if_better(I, owner)) - do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), SLOT_SHOES) + do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), ITEM_SLOT_FEET) if(do_message) owner.visible_message("Strange armor appears on [owner]!", "A bright shimmer runs down your body, equipping you with Ratvarian armor.") playsound(owner, 'sound/magic/clockwork/fellowship_armory.ogg', 15 * do_message, TRUE) //get sound loudness based on how much we equipped @@ -309,16 +309,16 @@ continue T = get_turf(M) var/heal_ticks = 0 //one heal tick for each piece of ratvarian armor worn - var/obj/item/I = H.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/I = H.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(is_type_in_typecache(I, ratvarian_armor_typecache)) heal_ticks++ - I = H.get_item_by_slot(SLOT_HEAD) + I = H.get_item_by_slot(ITEM_SLOT_HEAD) if(is_type_in_typecache(I, ratvarian_armor_typecache)) heal_ticks++ - I = H.get_item_by_slot(SLOT_GLOVES) + I = H.get_item_by_slot(ITEM_SLOT_GLOVES) if(is_type_in_typecache(I, ratvarian_armor_typecache)) heal_ticks++ - I = H.get_item_by_slot(SLOT_SHOES) + I = H.get_item_by_slot(ITEM_SLOT_FEET) if(is_type_in_typecache(I, ratvarian_armor_typecache)) heal_ticks++ if(heal_ticks) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 521c32fe3d..0efde2d3db 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -678,12 +678,12 @@ uses-- var/mob/living/carbon/C = target C.visible_message("Otherworldly armor suddenly appears on [C]!") - C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,SLOT_W_UNIFORM) - C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), SLOT_HEAD) - C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), SLOT_WEAR_SUIT) - C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), SLOT_SHOES) - C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), SLOT_BACK) - C.equip_to_slot_or_del(new /obj/item/clothing/gloves/fingerless/pugilist/hungryghost(user), SLOT_GLOVES) + C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,ITEM_SLOT_ICLOTHING) + C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), ITEM_SLOT_HEAD) + C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), ITEM_SLOT_OCLOTHING) + C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), ITEM_SLOT_FEET) + C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), ITEM_SLOT_BACK) + C.equip_to_slot_or_del(new /obj/item/clothing/gloves/fingerless/pugilist/hungryghost(user), ITEM_SLOT_GLOVES) if(C == user) qdel(src) //Clears the hands C.put_in_hands(new /obj/item/melee/cultblade(user)) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index a18523069e..ea8ae6cb7e 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -95,9 +95,9 @@ /datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) var/list/slots = list( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/T = new item_path(mob) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 7981a10701..3b73a998e7 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1090,7 +1090,7 @@ structure_check() searches for nearby cultist structures required for the invoca /proc/hudFix(mob/living/carbon/human/target) if(!target || !target.client) return - var/obj/O = target.get_item_by_slot(SLOT_GLASSES) + var/obj/O = target.get_item_by_slot(ITEM_SLOT_EYES) if(istype(O, /obj/item/clothing/glasses/hud/security)) var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] AH.add_hud_to(target) diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 65ce89d33f..9f69f10887 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -460,10 +460,10 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", return -1 currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1) var/mob/living/carbon/human/H = owner.current - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/civilian/lawyer/black(H), SLOT_W_UNIFORM) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), SLOT_SHOES) - H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), SLOT_HANDS) - H.equip_to_slot_or_del(new /obj/item/pen(H), SLOT_L_STORE) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/civilian/lawyer/black(H), ITEM_SLOT_ICLOTHING) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), ITEM_SLOT_FEET) + H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), ITEM_SLOT_HANDS) + H.equip_to_slot_or_del(new /obj/item/pen(H), ITEM_SLOT_LPOCKET) if(SOULVALUE >= BLOOD_THRESHOLD) H.set_species(/datum/species/lizard, 1) H.underwear = "Nude" diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm index fc0a5cdc6a..d7334d6c9c 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm @@ -72,9 +72,9 @@ /datum/antagonist/heretic/proc/ecult_give_item(obj/item/item_path, mob/living/carbon/human/H) var/list/slots = list( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/T = new item_path(H) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index 28228aedd6..c0f3e2be7c 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -145,7 +145,7 @@ /obj/item/clothing/neck/eldritch_amulet/equipped(mob/user, slot) . = ..() - if(ishuman(user) && user.mind && slot == SLOT_NECK && (IS_HERETIC(user) || IS_HERETIC_MONSTER(user))) + if(ishuman(user) && user.mind && slot == ITEM_SLOT_NECK && (IS_HERETIC(user) || IS_HERETIC_MONSTER(user))) ADD_TRAIT(user, trait, CLOTHING_TRAIT) user.update_sight() @@ -239,7 +239,7 @@ /obj/item/clothing/mask/void_mask/equipped(mob/user, slot) . = ..() - if(ishuman(user) && user.mind && slot == SLOT_WEAR_MASK) + if(ishuman(user) && user.mind && slot == ITEM_SLOT_MASK) local_user = user START_PROCESSING(SSobj, src) diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm index 733b2725cb..0eb52746fa 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm @@ -39,7 +39,7 @@ var/datum/status_effect/eldritch/E = H.has_status_effect(/datum/status_effect/eldritch/rust) || H.has_status_effect(/datum/status_effect/eldritch/ash) || H.has_status_effect(/datum/status_effect/eldritch/flesh) || H.has_status_effect(/datum/status_effect/eldritch/void) if(E) E.on_effect() - H.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_EARS,ORGAN_SLOT_EYES,ORGAN_SLOT_LIVER,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_HEART),25) + H.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_ITEM_SLOT_EARS,ORGAN_SLOT_EYES,ORGAN_SLOT_LIVER,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_HEART),25) /datum/eldritch_knowledge/spell/area_conversion name = "Aggressive Spread" diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 43a7e561c0..a8e57ee08b 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -234,8 +234,8 @@ var/obj/O = new C(owner.current) var/list/slots = list ( "backpack" = ITEM_SLOT_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/mob/living/carbon/human/H = owner.current var/equipped = H.equip_in_one_of_slots(O, slots) diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index ffca67b882..b2fce0269a 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -45,11 +45,11 @@ qdel(I) for(var/obj/item/I in H.held_items) qdel(I) - H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/kilt/highlander(H), SLOT_W_UNIFORM) - H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), SLOT_EARS) - H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), SLOT_HEAD) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), SLOT_SHOES) - H.equip_to_slot_or_del(new /obj/item/pinpointer/nuke(H), SLOT_L_STORE) + H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/kilt/highlander(H), ITEM_SLOT_ICLOTHING) + H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), ITEM_SLOT_EARS) + H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), ITEM_SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), ITEM_SLOT_FEET) + H.equip_to_slot_or_del(new /obj/item/pinpointer/nuke(H), ITEM_SLOT_LPOCKET) for(var/obj/item/pinpointer/nuke/P in H) P.attack_self(H) var/obj/item/card/id/W = new(H) @@ -60,7 +60,7 @@ W.registered_name = H.real_name ADD_TRAIT(W, TRAIT_NODROP, HIGHLANDER) W.update_label(H.real_name) - H.equip_to_slot_or_del(W, SLOT_WEAR_ID) + H.equip_to_slot_or_del(W, ITEM_SLOT_ID) sword = new(H) if(!GLOB.highlander) diff --git a/code/modules/antagonists/overthrow/overthrow.dm b/code/modules/antagonists/overthrow/overthrow.dm index f086f5db97..fffd8f9237 100644 --- a/code/modules/antagonists/overthrow/overthrow.dm +++ b/code/modules/antagonists/overthrow/overthrow.dm @@ -127,9 +127,9 @@ // Give AI hacking board var/obj/item/aiModule/core/full/overthrow/O = new(H) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/where = H.equip_in_one_of_slots(O, slots, critical = TRUE) if (!where) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 925527f35e..e4625b4ef2 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -272,9 +272,9 @@ if(give_flash) var/obj/item/assembly/flash/T = new(H) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/where = H.equip_in_one_of_slots(T, slots, critical = TRUE) if (!where) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 78403d4e27..f184961004 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -240,9 +240,9 @@ folder = new/obj/item/folder/syndicate/blue(mob.loc) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/where = "At your feet" diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 44f267358a..6f7ba374f7 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -229,12 +229,12 @@ H.dropItemToGround(I) var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire) - H.equip_to_slot_or_del(new hat(H), SLOT_HEAD) - H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(H), SLOT_W_UNIFORM) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), SLOT_SHOES) + H.equip_to_slot_or_del(new hat(H), ITEM_SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(H), ITEM_SLOT_ICLOTHING) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), ITEM_SLOT_FEET) H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE) H.put_in_hands(new /obj/item/claymore(H), TRUE) - H.equip_to_slot_or_del(new /obj/item/spear(H), SLOT_BACK) + H.equip_to_slot_or_del(new /obj/item/spear(H), ITEM_SLOT_BACK) /obj/item/voodoo diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index c52436a3c4..63bb2b5b57 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -208,17 +208,17 @@ if(!istype(master_mob) || !istype(H)) return if(master_mob.ears) - H.equip_to_slot_or_del(new master_mob.ears.type, SLOT_EARS) + H.equip_to_slot_or_del(new master_mob.ears.type, ITEM_SLOT_EARS) if(master_mob.w_uniform) - H.equip_to_slot_or_del(new master_mob.w_uniform.type, SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new master_mob.w_uniform.type, ITEM_SLOT_ICLOTHING) if(master_mob.shoes) - H.equip_to_slot_or_del(new master_mob.shoes.type, SLOT_SHOES) + H.equip_to_slot_or_del(new master_mob.shoes.type, ITEM_SLOT_FEET) if(master_mob.wear_suit) - H.equip_to_slot_or_del(new master_mob.wear_suit.type, SLOT_WEAR_SUIT) + H.equip_to_slot_or_del(new master_mob.wear_suit.type, ITEM_SLOT_OCLOTHING) if(master_mob.head) - H.equip_to_slot_or_del(new master_mob.head.type, SLOT_HEAD) + H.equip_to_slot_or_del(new master_mob.head.type, ITEM_SLOT_HEAD) if(master_mob.back) - H.equip_to_slot_or_del(new master_mob.back.type, SLOT_BACK) + H.equip_to_slot_or_del(new master_mob.back.type, ITEM_SLOT_BACK) //Operation: Fuck off and scare people owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) diff --git a/code/modules/awaymissions/mission_code/jungleresort.dm b/code/modules/awaymissions/mission_code/jungleresort.dm index 6c82b2c0c4..f520cfdbee 100644 --- a/code/modules/awaymissions/mission_code/jungleresort.dm +++ b/code/modules/awaymissions/mission_code/jungleresort.dm @@ -27,7 +27,7 @@ /obj/item/clothing/head/rice_hat/cursed/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 5d30ccd907..ba3f07bd7d 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -589,7 +589,7 @@ back = /obj/item/storage/backpack mask = /obj/item/clothing/mask/breath r_pocket = /obj/item/tank/internals/emergency_oxygen/engi - internals_slot = SLOT_R_STORE + internals_slot = ITEM_SLOT_RPOCKET /obj/effect/mob_spawn/human/syndicatesoldier/coldres/alive/female mob_gender = FEMALE diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8d6646b8d0..3cec5c3e50 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -3225,10 +3225,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/occupied_slots = L[initial(G.category)] ? L[initial(G.category)] + 1 : 1 LAZYSET(L, initial(G.category), occupied_slots) switch(slot) - if(SLOT_IN_BACKPACK) + if(ITEM_SLOT_BACKPACK) if(L[LOADOUT_CATEGORY_BACKPACK] < BACKPACK_SLOT_AMT) return TRUE - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) if(L[LOADOUT_CATEGORY_HANDS] < HANDS_SLOT_AMT) return TRUE else diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 008772663d..697afd4885 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -63,8 +63,8 @@ // it's TRAIT_NODROP D.dropItemToGround(target, TRUE) qdel(old_headgear) - // where is `SLOT_HEAD` defined? WHO KNOWS - D.equip_to_slot(new_headgear, SLOT_HEAD) + // where is `ITEM_SLOT_HEAD` defined? WHO KNOWS + D.equip_to_slot(new_headgear, ITEM_SLOT_HEAD) return 1 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 1a7c220550..572cce28b2 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -219,7 +219,7 @@ ..() if (!istype(user)) return - if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item? + if(slot_flags & slot) //Was equipped to a valid slot for this item? if(iscarbon(user) && LAZYLEN(zones_disabled)) RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/bristle) if(LAZYLEN(user_vars_to_edit)) @@ -450,7 +450,7 @@ BLIND // can't see anything return FALSE // Skip species restriction checks on non-equipment slots - if(slot in list(SLOT_IN_BACKPACK, SLOT_L_STORE, SLOT_R_STORE)) + if(slot in list(ITEM_SLOT_BACKPACK, ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET)) return TRUE if(species_restricted && ishuman(M)) diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index f58be1373a..a2f0c80041 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -20,7 +20,7 @@ /obj/item/clothing/ears/earmuffs/ComponentInitialize() . = ..() AddElement(/datum/element/earhealing) - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS)) + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) /obj/item/clothing/ears/headphones name = "headphones" diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 737bbbb522..9726ab6b59 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -115,7 +115,7 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) /obj/item/clothing/glasses/science/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_GLASSES) + if(slot == ITEM_SLOT_EYES) return 1 /obj/item/clothing/glasses/night @@ -158,7 +158,7 @@ /obj/item/clothing/glasses/eyepatch/syndicate/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot == SLOT_GLASSES) + if(slot == ITEM_SLOT_EYES) user.visible_message("Circuitry from the eyepatch links itself to your brain as you put on the eyepatch.") if(HAS_TRAIT(user, TRAIT_POOR_AIM)) user.visible_message("You hear a fizzing noise from the circuit. That can't be good.") @@ -351,7 +351,7 @@ /obj/item/clothing/glasses/sunglasses/blindfold/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot == SLOT_GLASSES) + if(slot == ITEM_SLOT_EYES) user.become_blind("blindfold_[REF(src)]") /obj/item/clothing/glasses/sunglasses/blindfold/dropped(mob/living/carbon/human/user) @@ -372,7 +372,7 @@ var/colored_before = FALSE /obj/item/clothing/glasses/sunglasses/blindfold/white/equipped(mob/living/carbon/human/user, slot) - if(ishuman(user) && slot == SLOT_GLASSES) + if(ishuman(user) && slot == ITEM_SLOT_EYES) update_icon(user) user.update_inv_glasses() //Color might have been changed by update_icon. ..() diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index cad91315a3..c848dbdfa8 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -18,7 +18,7 @@ /obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot) ..() - if(hud_type && slot == SLOT_GLASSES) + if(hud_type && slot == ITEM_SLOT_EYES) var/datum/atom_hud/H = GLOB.huds[hud_type] H.add_hud_to(user) diff --git a/code/modules/clothing/glasses/phantomthief.dm b/code/modules/clothing/glasses/phantomthief.dm index ba3ea2830e..db77f17218 100644 --- a/code/modules/clothing/glasses/phantomthief.dm +++ b/code/modules/clothing/glasses/phantomthief.dm @@ -17,7 +17,7 @@ /obj/item/clothing/glasses/phantomthief/syndicate/examine(mob/user) . = ..() - if(user.get_item_by_slot(SLOT_GLASSES) == src) + if(user.get_item_by_slot(ITEM_SLOT_EYES) == src) if(world.time >= nextadrenalinepop) . += "The built-in adrenaline injector is ready for use." else @@ -33,7 +33,7 @@ . = ..() if(!istype(user)) return - if(slot != SLOT_GLASSES) + if(slot != ITEM_SLOT_EYES) return RegisterSignal(user, COMSIG_LIVING_COMBAT_ENABLED, .proc/injectadrenaline) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 836b845faa..1e3f2c08cf 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -31,7 +31,7 @@ C.visible_message("[U] sprays glittery rubber on the hands of [C]!") else user.visible_message("The rubber fails to stick to [C]'s hands!", - "The rubber fails to stick to [C]'s [(SLOT_GLOVES in C.check_obscured_slots()) ? "unexposed" : ""] hands!") + "The rubber fails to stick to [C]'s [(ITEM_SLOT_GLOVES in C.check_obscured_slots()) ? "unexposed" : ""] hands!") qdel(src) @@ -226,7 +226,7 @@ /obj/item/clothing/gloves/color/latex/equipped(mob/user, slot) ..() - if(slot == SLOT_GLOVES) + if(slot == ITEM_SLOT_GLOVES) ADD_TRAIT(user, carrytrait, GLOVE_TRAIT) /obj/item/clothing/gloves/color/latex/dropped(mob/user) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 8c8400a45d..053f21e148 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -36,7 +36,7 @@ /obj/item/clothing/gloves/fingerless/pugilist/equipped(mob/user, slot) . = ..() - if(slot == SLOT_GLOVES) + if(slot == ITEM_SLOT_GLOVES) wornonce = TRUE if((HAS_TRAIT(user, TRAIT_NOPUGILIST))) to_chat(user, "What purpose is there to don the weapons of pugilism if you're already well-practiced in martial arts? Mixing arts is blasphemous!") @@ -195,7 +195,7 @@ /obj/item/clothing/gloves/fingerless/ablative/equipped(mob/user, slot) . = ..() - if(current_equipped_slot == SLOT_GLOVES) + if(current_equipped_slot == ITEM_SLOT_GLOVES) RegisterSignal(user, COMSIG_LIVING_ACTIVE_PARRY_START, .proc/get_component_parry_data) wornonce = TRUE @@ -262,7 +262,7 @@ /obj/item/clothing/gloves/fingerless/pugilist/mauler/equipped(mob/user, slot) . = ..() - if(slot == SLOT_GLOVES) + if(slot == ITEM_SLOT_GLOVES) wornonce = TRUE if((HAS_TRAIT(user, TRAIT_NOPUGILIST))) return diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index 39d39ba58f..7fc1d05d15 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -28,7 +28,7 @@ if(!ishuman(user)) return switch(slot) // I didn't like how it looked - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) var/mob/living/carbon/human/H = user tackler = H.AddComponent(/datum/component/tackler, stamina_cost=tackle_stam_cost, base_knockdown = base_knockdown, range = tackle_range, speed = tackle_speed, skill_mod = skill_mod, min_distance = min_distance) else @@ -103,7 +103,7 @@ /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/equipped(mob/user, slot) . = ..() - if(slot == SLOT_GLOVES) + if(slot == ITEM_SLOT_GLOVES) ADD_TRAIT(user, carrytrait, GLOVE_TRAIT) /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/dropped(mob/user) diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 6ad3a19694..ea58d0bc88 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -34,7 +34,7 @@ var/obj/item/WH = H.head H.visible_message("[src] bounces off [H]'s [WH.name]!", "[src] bounces off your [WH.name], falling to the floor.") return - if(H.equip_to_slot_if_possible(src, SLOT_HEAD, FALSE, TRUE)) + if(H.equip_to_slot_if_possible(src, ITEM_SLOT_HEAD, FALSE, TRUE)) H.visible_message("[src] lands neatly on [H]'s head!", "[src] lands perfectly onto your head!") return if(iscyborg(hit_atom)) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 6b698f9619..126b1af40f 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -27,7 +27,7 @@ /obj/item/clothing/head/helmet/ComponentInitialize() . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_HEAD)) + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_HEAD)) /obj/item/clothing/head/helmet/examine(mob/user) . = ..() diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 5af694ea1b..592614af61 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -220,7 +220,7 @@ /obj/item/clothing/head/warden/drill/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 76e8ca53df..744e29646a 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -354,7 +354,7 @@ /obj/item/clothing/head/frenchberet/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 247062581d..c091bc1d6a 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -147,7 +147,7 @@ beepsky_fashion = /datum/beepsky_fashion/cat /obj/item/clothing/head/kitty/equipped(mob/living/carbon/human/user, slot) - if(ishuman(user) && slot == SLOT_HEAD) + if(ishuman(user) && slot == ITEM_SLOT_HEAD) update_icon(user) user.update_inv_head() //Color might have been changed by update_icon. ..() @@ -186,7 +186,7 @@ /obj/item/clothing/head/cardborg/equipped(mob/living/user, slot) ..() - if(ishuman(user) && slot == SLOT_HEAD) + if(ishuman(user) && slot == ITEM_SLOT_HEAD) var/mob/living/carbon/human/H = user if(istype(H.wear_suit, /obj/item/clothing/suit/cardborg)) var/obj/item/clothing/suit/cardborg/CB = H.wear_suit @@ -265,7 +265,7 @@ /obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot != SLOT_HEAD || warped) + if(slot != ITEM_SLOT_HEAD || warped) return if(paranoia) QDEL_NULL(paranoia) @@ -295,7 +295,7 @@ if(!isliving(loc) || !paranoia) return var/mob/living/target = loc - if(target.get_item_by_slot(SLOT_HEAD) != src) + if(target.get_item_by_slot(ITEM_SLOT_HEAD) != src) return QDEL_NULL(paranoia) if(!target.IsUnconscious()) diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index ef7c6a1926..cca13ce1d8 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -18,7 +18,7 @@ /obj/item/clothing/mask/equipped(mob/M, slot) . = ..() - if (slot == SLOT_WEAR_MASK && modifies_speech) + if (slot == ITEM_SLOT_MASK && modifies_speech) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) diff --git a/code/modules/clothing/masks/cluwne.dm b/code/modules/clothing/masks/cluwne.dm index a1177e2b47..f39f5e73b8 100644 --- a/code/modules/clothing/masks/cluwne.dm +++ b/code/modules/clothing/masks/cluwne.dm @@ -55,7 +55,7 @@ . = ..() if(!ishuman(user)) return - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) var/mob/living/carbon/human/H = user H.dna.add_mutation(CLUWNEMUT) return @@ -88,7 +88,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) if(is_cursed && can_cluwne) //logic predetermined log_admin("[key_name(H)] was made into a cluwne by [src]") message_admins("[key_name(H)] got cluwned by [src]") diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index e6a0425920..45da6a9a75 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -290,7 +290,7 @@ . = ..() if(iscarbon(user)) var/mob/living/carbon/C = user - if((C.get_item_by_slot(SLOT_HEAD == src)) || (C.get_item_by_slot(SLOT_WEAR_MASK) == src)) + if((C.get_item_by_slot(ITEM_SLOT_HEAD == src)) || (C.get_item_by_slot(ITEM_SLOT_MASK) == src)) to_chat(user, "You can't tie [src] while wearing it!") return if(slot_flags & ITEM_SLOT_HEAD) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 28a3343ae6..1f40df0f57 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -226,7 +226,7 @@ return /obj/item/clothing/neck/petcollar/locked/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - if(loc == user && user.get_item_by_slot(SLOT_NECK) && lock != FALSE) + if(loc == user && user.get_item_by_slot(ITEM_SLOT_NECK) && lock != FALSE) to_chat(user, "The collar is locked! You'll need unlock the collar before you can take it off!") return ..() @@ -323,7 +323,7 @@ . = ..() if(iscarbon(user)) var/mob/living/carbon/C = user - if(C.get_item_by_slot(SLOT_NECK) == src) + if(C.get_item_by_slot(ITEM_SLOT_NECK) == src) to_chat(user, "You can't untie [src] while wearing it!") return if(user.is_holding(src)) diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index ac852a35a8..99fc5d1359 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -36,7 +36,7 @@ . = ..() var/key = H.key ? H.key : preference_source ? preference_source.key : null var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, key, 80) - H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(U, ITEM_SLOT_BACKPACK) var/obj/item/implant/weapons_auth/W = new W.implant(H) var/obj/item/implant/explosive/E = new diff --git a/code/modules/clothing/outfits/vv_outfit.dm b/code/modules/clothing/outfits/vv_outfit.dm index b9d9bf0b22..de230b254e 100644 --- a/code/modules/clothing/outfits/vv_outfit.dm +++ b/code/modules/clothing/outfits/vv_outfit.dm @@ -10,35 +10,35 @@ /datum/outfit/varedit/proc/set_equipement_by_slot(slot,item_path) switch(slot) - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) uniform = item_path - if(SLOT_BACK) + if(ITEM_SLOT_BACK) back = item_path - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) suit = item_path - if(SLOT_BELT) + if(ITEM_SLOT_BELT) belt = item_path - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) gloves = item_path - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) shoes = item_path - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) head = item_path - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) mask = item_path - if(SLOT_NECK) + if(ITEM_SLOT_NECK) neck = item_path - if(SLOT_EARS) + if(ITEM_SLOT_EARS) ears = item_path - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) glasses = item_path - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) id = item_path - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) suit_store = item_path - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) l_pocket = item_path - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) r_pocket = item_path @@ -68,7 +68,7 @@ //Copy equipment var/list/result = list() - var/list/slots_to_check = list(SLOT_W_UNIFORM,SLOT_BACK,SLOT_WEAR_SUIT,SLOT_BELT,SLOT_GLOVES,SLOT_SHOES,SLOT_HEAD,SLOT_WEAR_MASK,SLOT_NECK,SLOT_EARS,SLOT_GLASSES,SLOT_WEAR_ID,SLOT_S_STORE,SLOT_L_STORE,SLOT_R_STORE) + var/list/slots_to_check = list(ITEM_SLOT_ICLOTHING,ITEM_SLOT_BACK,ITEM_SLOT_OCLOTHING,ITEM_SLOT_BELT,ITEM_SLOT_GLOVES,ITEM_SLOT_FEET,ITEM_SLOT_HEAD,ITEM_SLOT_MASK,ITEM_SLOT_NECK,ITEM_SLOT_EARS,ITEM_SLOT_EYES,ITEM_SLOT_ID,ITEM_SLOT_SUITSTORE,ITEM_SLOT_LPOCKET,ITEM_SLOT_RPOCKET) for(var/s in slots_to_check) var/obj/item/I = get_item_by_slot(s) var/vedits = collect_vv(I) @@ -79,7 +79,7 @@ //Copy access O.stored_access = list() - var/obj/item/id_slot = get_item_by_slot(SLOT_WEAR_ID) + var/obj/item/id_slot = get_item_by_slot(ITEM_SLOT_ID) if(id_slot) O.stored_access |= id_slot.GetAccess() //Copy hands @@ -98,7 +98,7 @@ result["RHAND"] = vedits O.vv_values = result //Copy backpack contents if exist. - var/obj/item/backpack = get_item_by_slot(SLOT_BACK) + var/obj/item/backpack = get_item_by_slot(ITEM_SLOT_BACK) if(istype(backpack) && SEND_SIGNAL(backpack, COMSIG_CONTAINS_STORAGE)) var/list/bp_stuff = list() var/list/typecounts = list() @@ -136,7 +136,7 @@ for(var/vname in edits) I.vv_edit_var(vname,edits[vname]) //Apply access - var/obj/item/id_slot = H.get_item_by_slot(SLOT_WEAR_ID) + var/obj/item/id_slot = H.get_item_by_slot(ITEM_SLOT_ID) if(id_slot) var/obj/item/card/id/card = id_slot.GetID() if(istype(card)) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index c98824fa7f..d8ac875df5 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -87,7 +87,7 @@ /obj/item/clothing/shoes/equipped(mob/user, slot) . = ..() - if(offset && slot_flags & slotdefine2slotbit(slot)) + if(offset && (slot_flags & slot)) user.pixel_y += offset worn_y_dimension -= (offset * 2) user.update_inv_shoes() diff --git a/code/modules/clothing/shoes/cluwne.dm b/code/modules/clothing/shoes/cluwne.dm index fbe1ba624b..aec57a2148 100644 --- a/code/modules/clothing/shoes/cluwne.dm +++ b/code/modules/clothing/shoes/cluwne.dm @@ -23,7 +23,7 @@ . = ..() if(!ishuman(user)) return - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) var/mob/living/carbon/human/H = user H.dna.add_mutation(CLUWNEMUT) return diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 773b1ac361..cd01d6f099 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -96,7 +96,7 @@ /obj/item/clothing/shoes/magboots/crushing/equipped(mob/user,slot) . = ..() - if (slot == SLOT_SHOES && magpulse) + if (slot == ITEM_SLOT_FEET && magpulse) RegisterSignal(user, COMSIG_MOVABLE_MOVED,.proc/crush) /obj/item/clothing/shoes/magboots/crushing/dropped(mob/user) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 669ffa1780..7a67308760 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -28,7 +28,7 @@ /obj/item/clothing/shoes/combat/sneakboots/equipped(mob/user, slot) . = ..() - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) ADD_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT) /obj/item/clothing/shoes/combat/sneakboots/dropped(mob/user) @@ -112,7 +112,7 @@ /obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot) . = ..() - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) if(enabled_waddle) waddle = user.AddComponent(/datum/component/waddling) if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY)) @@ -340,7 +340,7 @@ /obj/item/clothing/shoes/wheelys/ui_action_click(mob/user, action) if(!isliving(user)) return - if(!istype(user.get_item_by_slot(SLOT_SHOES), /obj/item/clothing/shoes/wheelys)) + if(!istype(user.get_item_by_slot(ITEM_SLOT_FEET), /obj/item/clothing/shoes/wheelys)) to_chat(user, "You must be wearing the wheely-heels to use them!") return if(!(W.is_occupant(user))) @@ -460,7 +460,7 @@ /obj/item/clothing/shoes/wallwalkers/equipped(mob/user,slot) . = ..() - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) RegisterSignal(user, COMSIG_MOB_CLIENT_MOVE,.proc/intercept_user_move) /obj/item/clothing/shoes/wallwalkers/dropped(mob/user) diff --git a/code/modules/clothing/shoes/taeclowndo.dm b/code/modules/clothing/shoes/taeclowndo.dm index c0f8a77543..82f467d8b1 100644 --- a/code/modules/clothing/shoes/taeclowndo.dm +++ b/code/modules/clothing/shoes/taeclowndo.dm @@ -15,7 +15,7 @@ var/mob/living/carbon/human/H = user if(!(HAS_TRAIT(H, TRAIT_CLUMSY)) && !(H.mind && HAS_TRAIT(H.mind, TRAIT_CLOWN_MENTALITY))) return - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) spells = new for(var/spell in spelltypes) var/obj/effect/proc_holder/spell/S = new spell @@ -29,7 +29,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_SHOES) == src) + if(H.get_item_by_slot(ITEM_SLOT_FEET) == src) for(var/spell in spells) var/obj/effect/proc_holder/spell/S = spell H.mind.spell_list.Remove(S) diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 6642731d8b..e30b0953c6 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -107,7 +107,7 @@ teleport_now.UpdateButtonIcon() - var/list/nonsafe_slots = list(SLOT_BELT, SLOT_BACK) + var/list/nonsafe_slots = list(ITEM_SLOT_BELT, ITEM_SLOT_BACK) var/list/exposed = list() for(var/slot in nonsafe_slots) var/obj/item/slot_item = user.get_item_by_slot(slot) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 18138bf4b6..d8a6426295 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -50,12 +50,12 @@ soundloop.stop(user) /obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_HEAD) + if(slot == ITEM_SLOT_HEAD) return 1 /obj/item/clothing/head/helmet/space/hardsuit/equipped(mob/user, slot) ..() - if(slot != SLOT_HEAD) + if(slot != ITEM_SLOT_HEAD) if(suit) suit.RemoveHelmet() soundloop.stop(user) @@ -118,7 +118,7 @@ if(jetpack) to_chat(user, "[src] already has a jetpack installed.") return - if(src == user.get_item_by_slot(SLOT_WEAR_SUIT)) //Make sure the player is not wearing the suit before applying the upgrade. + if(src == user.get_item_by_slot(ITEM_SLOT_OCLOTHING)) //Make sure the player is not wearing the suit before applying the upgrade. to_chat(user, "You cannot install the upgrade to [src] while wearing it.") return @@ -130,7 +130,7 @@ if(!jetpack) to_chat(user, "[src] has no jetpack installed.") return - if(src == user.get_item_by_slot(SLOT_WEAR_SUIT)) + if(src == user.get_item_by_slot(ITEM_SLOT_OCLOTHING)) to_chat(user, "You cannot remove the jetpack from [src] while wearing it.") return @@ -145,7 +145,7 @@ /obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) ..() if(jetpack) - if(slot == SLOT_WEAR_SUIT) + if(slot == ITEM_SLOT_OCLOTHING) for(var/X in jetpack.actions) var/datum/action/A = X A.Grant(user) @@ -158,7 +158,7 @@ A.Remove(user) /obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. + if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. return 1 //Engineering @@ -488,7 +488,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/medical/equipped(mob/living/carbon/human/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] DHUD.add_hud_to(user) @@ -528,7 +528,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/rd/equipped(mob/living/carbon/human/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] DHUD.add_hud_to(user) @@ -702,7 +702,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/equipped(mob/living/carbon/human/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] DHUD.add_hud_to(user) ADD_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "mason_hardsuit") @@ -726,7 +726,7 @@ /obj/item/clothing/suit/space/hardsuit/ancient/equipped(mob/user, slot) . = ..() - if(slot != SLOT_WEAR_SUIT) + if(slot != ITEM_SLOT_OCLOTHING) if(listeningTo) UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) return diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 513ad94365..5d19efac4c 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -206,7 +206,7 @@ /obj/item/clothing/suit/cardborg/equipped(mob/living/user, slot) ..() - if(slot == SLOT_WEAR_SUIT) + if(slot == ITEM_SLOT_OCLOTHING) disguise(user) /obj/item/clothing/suit/cardborg/dropped(mob/living/user) @@ -1012,7 +1012,7 @@ /obj/item/clothing/suit/hooded/wintercoat/ratvar/equipped(mob/living/user,slot) ..() - if (slot != SLOT_WEAR_SUIT || !real) + if (slot != ITEM_SLOT_OCLOTHING || !real) return if (is_servant_of_ratvar(user)) return @@ -1034,7 +1034,7 @@ /obj/item/clothing/suit/hooded/wintercoat/narsie/equipped(mob/living/user,slot) ..() - if (slot != SLOT_WEAR_SUIT || !real) + if (slot != ITEM_SLOT_OCLOTHING || !real) return if (iscultist(user)) return diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 98fb836c38..608aca2aad 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -51,7 +51,7 @@ icon_state = "reactiveoff" item_state = "reactiveoff" add_fingerprint(user) - if(user.get_item_by_slot(SLOT_WEAR_SUIT) == src) + if(user.get_item_by_slot(ITEM_SLOT_OCLOTHING) == src) user.update_inv_wear_suit() /obj/item/clothing/suit/armor/reactive/emp_act(severity) @@ -177,7 +177,7 @@ /obj/item/clothing/suit/armor/reactive/tesla/equipped(mob/user, slot) ..() - if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item? + if(slot_flags & slot) //Was equipped to a valid slot for this item? ADD_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "reactive_tesla_armor") /obj/item/clothing/suit/armor/reactive/tesla/block_action(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 78708f54bb..5ee247e135 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -31,11 +31,11 @@ ToggleHood() /obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_WEAR_SUIT || slot == SLOT_NECK) + if(slot == ITEM_SLOT_OCLOTHING || slot == ITEM_SLOT_NECK) return 1 /obj/item/clothing/suit/hooded/equipped(mob/user, slot) - if(slot != SLOT_WEAR_SUIT && slot != SLOT_NECK) + if(slot != ITEM_SLOT_OCLOTHING && slot != ITEM_SLOT_NECK) RemoveHood() ..() @@ -80,7 +80,7 @@ if(H.head) to_chat(H, "You're already wearing something on your head!") return - else if(H.equip_to_slot_if_possible(hood,SLOT_HEAD,0,0,1)) + else if(H.equip_to_slot_if_possible(hood,ITEM_SLOT_HEAD,0,0,1)) suittoggled = TRUE update_icon() H.update_inv_wear_suit() @@ -102,7 +102,7 @@ /obj/item/clothing/head/hooded/equipped(mob/user, slot) ..() - if(slot != SLOT_HEAD) + if(slot != ITEM_SLOT_HEAD) if(suit) suit.RemoveHood() else @@ -177,7 +177,7 @@ /obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) if(!helmettype) return - if(slot != SLOT_WEAR_SUIT) + if(slot != ITEM_SLOT_OCLOTHING) RemoveHelmet() ..() @@ -222,7 +222,7 @@ if(message) to_chat(H, "You're already wearing something on your head!") return - else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1)) + else if(H.equip_to_slot_if_possible(helmet,ITEM_SLOT_HEAD,0,0,1)) if(message) to_chat(H, "You engage the helmet on the hardsuit.") suittoggled = TRUE diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 977e916f87..5b131749b8 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -167,7 +167,7 @@ actions_types = list(/datum/action/item_action/stickmen) /obj/item/clothing/suit/wizrobe/paper/item_action_slot_check(slot, mob/user, datum/action/A) - if(A.type == /datum/action/item_action/stickmen && slot != SLOT_WEAR_SUIT) + if(A.type == /datum/action/item_action/stickmen && slot != ITEM_SLOT_OCLOTHING) return FALSE return ..() diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 59af632d2a..61e4bb5149 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -114,7 +114,7 @@ if(!alt_covers_chest) body_parts_covered |= CHEST - if(attached_accessory && slot != SLOT_HANDS && ishuman(user)) + if(attached_accessory && slot != ITEM_SLOT_HANDS && ishuman(user)) var/mob/living/carbon/human/H = user attached_accessory.on_uniform_equip(src, user) if(attached_accessory.above_suit) diff --git a/code/modules/clothing/under/cluwne.dm b/code/modules/clothing/under/cluwne.dm index 5a908c5663..e1af4b5171 100644 --- a/code/modules/clothing/under/cluwne.dm +++ b/code/modules/clothing/under/cluwne.dm @@ -16,7 +16,7 @@ /obj/item/clothing/under/cluwne/equipped(mob/living/carbon/user, slot) if(!ishuman(user)) return - if(slot == SLOT_W_UNIFORM) + if(slot == ITEM_SLOT_ICLOTHING) var/mob/living/carbon/human/H = user H.dna.add_mutation(CLUWNEMUT) return ..() diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 824f026e8c..06d2771d88 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -17,7 +17,7 @@ if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.equip_to_slot_or_del(new C(H), SLOT_W_UNIFORM) //or else you end up with naked assistants running around everywhere... + H.equip_to_slot_or_del(new C(H), ITEM_SLOT_ICLOTHING) //or else you end up with naked assistants running around everywhere... else new C(loc) return INITIALIZE_HINT_QDEL @@ -30,7 +30,7 @@ var/obj/item/clothing/under/color/jumpskirt/C = pick(subtypesof(/obj/item/clothing/under/color/jumpskirt) - /obj/item/clothing/under/color/jumpskirt/random) if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.equip_to_slot_or_del(new C(H), SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new C(H), ITEM_SLOT_ICLOTHING) else new C(loc) return INITIALIZE_HINT_QDEL diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index 2f0b9c68f8..061de0ea7c 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -18,23 +18,23 @@ switch(item_set) if("wizardmimic") - loadout[SLOT_WEAR_SUIT] = /obj/item/clothing/suit/wizrobe - loadout[SLOT_SHOES] = /obj/item/clothing/shoes/sandal/magic - loadout[SLOT_HEAD] = /obj/item/clothing/head/wizard + loadout[ITEM_SLOT_OCLOTHING] = /obj/item/clothing/suit/wizrobe + loadout[ITEM_SLOT_FEET] = /obj/item/clothing/shoes/sandal/magic + loadout[ITEM_SLOT_HEAD] = /obj/item/clothing/head/wizard ruins_spaceworthiness = 1 if("swords") - loadout[SLOT_HANDS] = /obj/item/katana/cursed + loadout[ITEM_SLOT_HANDS] = /obj/item/katana/cursed if("bigfatdoobie") - loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/cigarette/rollie/trippy + loadout[ITEM_SLOT_MASK] = /obj/item/clothing/mask/cigarette/rollie/trippy ruins_spaceworthiness = 1 if("boxing") - loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/luchador - loadout[SLOT_GLOVES] = /obj/item/clothing/gloves/boxing + loadout[ITEM_SLOT_MASK] = /obj/item/clothing/mask/luchador + loadout[ITEM_SLOT_GLOVES] = /obj/item/clothing/gloves/boxing ruins_spaceworthiness = 1 if("voicemodulators") - loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/chameleon + loadout[ITEM_SLOT_MASK] = /obj/item/clothing/mask/chameleon if("catgirls2015") - loadout[SLOT_HEAD] = /obj/item/clothing/head/kitty + loadout[ITEM_SLOT_HEAD] = /obj/item/clothing/head/kitty ruins_spaceworthiness = 1 ruins_wizard_loadout = 1 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 5d84901e7f..a2e822ba08 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -739,7 +739,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( if(close_other) //increase the odds for(var/i in 1 to 5) message_pool.Add("You feel a tiny prick!") - var/obj/item/storage/equipped_backpack = other.get_item_by_slot(SLOT_BACK) + var/obj/item/storage/equipped_backpack = other.get_item_by_slot(ITEM_SLOT_BACK) if(istype(equipped_backpack)) for(var/i in 1 to 5) //increase the odds message_pool.Add("[other] puts the [pick(\ diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index f650a935ea..1c151511af 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -35,7 +35,7 @@ //If they have a hat/helmet and the user is targeting their head. if(affecting == BODY_ZONE_HEAD) - var/obj/item/I = target.get_item_by_slot(SLOT_HEAD) + var/obj/item/I = target.get_item_by_slot(ITEM_SLOT_HEAD) if(I) headarmor = I.armor.melee diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index 1ebacf0968..723b404717 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -432,7 +432,7 @@ var/obj/item/W = C.head C.dropItemToGround(W, TRUE) var/jaqc_latern = new /obj/item/clothing/head/hardhat/pumpkinhead/jaqc - C.equip_to_slot(jaqc_latern, SLOT_HEAD, 1, 1) + C.equip_to_slot(jaqc_latern, ITEM_SLOT_HEAD, 1, 1) if(4) visible_message("[src] waves their arms around, \"In your body there's something amiss, you'll find it's a chem made by my sis!\"") jacqrunes("In your body there's something amiss, you'll find it's a chem made by my sis!", C) @@ -449,7 +449,7 @@ var/obj/item/W = H.wear_suit H.dropItemToGround(W, TRUE) var/ghost = new /obj/item/clothing/suit/ghost_sheet/sticky - H.equip_to_slot(ghost, SLOT_WEAR_SUIT, 1, 1) + H.equip_to_slot(ghost, ITEM_SLOT_OCLOTHING, 1, 1) poof() //Blame Fel diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 1f5becace8..6eaad5e2dc 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -241,7 +241,7 @@ var/satchel = /obj/item/storage/backpack/satchel var/duffelbag = /obj/item/storage/backpack/duffelbag - var/pda_slot = SLOT_BELT + var/pda_slot = ITEM_SLOT_BELT /datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) var/preference_backpack = preference_source?.prefs.backbag diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index de66c32138..82eae55bde 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -40,7 +40,7 @@ satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering box = /obj/item/storage/box/survival/engineer - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) /datum/outfit/job/atmos/rig @@ -49,4 +49,4 @@ mask = /obj/item/clothing/mask/gas suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index a9e891a303..7789e3c614 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -34,7 +34,7 @@ B.icon_state = GLOB.bible_icon_state B.item_state = GLOB.bible_item_state to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the Chaplain.") - H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(B, ITEM_SLOT_BACKPACK) var/nrt = GLOB.holy_weapon_type || /obj/item/nullrod var/obj/item/nullrod/N = new nrt(H) H.put_in_hands(N) @@ -108,7 +108,7 @@ GLOB.bible_name = B.name GLOB.deity = B.deity_name - H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(B, ITEM_SLOT_BACKPACK) SSblackbox.record_feedback("text", "religion_name", 1, "[new_religion]", 1) SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1) diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 804952dbb2..6fbf546e95 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -55,7 +55,7 @@ satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering box = /obj/item/storage/box/survival/engineer - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET chameleon_extras = /obj/item/stamp/ce /datum/outfit/job/ce/rig @@ -68,4 +68,4 @@ glasses = /obj/item/clothing/glasses/meson/engine gloves = /obj/item/clothing/gloves/color/yellow head = null - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 331bad9bfe..b9fc5809e3 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -41,7 +41,7 @@ r_pocket = /obj/item/pinpointer/crew l_pocket = /obj/item/pda/medical backpack_contents = list(/obj/item/roller=1) - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 6c2cb94d13..e70e747ae6 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -63,4 +63,4 @@ mask = /obj/item/clothing/mask/breath suit = /obj/item/clothing/suit/space/hardsuit/rd suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index b44d536cd2..90dacc0482 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -37,4 +37,4 @@ backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/tox - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 3462fb96c9..1823a2498a 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S if(ears) if(H.ears) qdel(H.ears) - H.equip_to_slot_or_del(new ears(H),SLOT_EARS) + H.equip_to_slot_or_del(new ears(H),ITEM_SLOT_EARS) var/obj/item/card/id/W = H.wear_id W.access |= dep_access diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 0c04380afe..273f74defa 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -60,7 +60,7 @@ mask = /obj/item/clothing/mask/gas/explorer glasses = /obj/item/clothing/glasses/meson suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE backpack_contents = list( /obj/item/flashlight/seclite=1,\ /obj/item/kitchen/knife/combat/survival=1, diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 25bd2196a0..83b11b22f6 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -43,7 +43,7 @@ satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering box = /obj/item/storage/box/survival/engineer - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) /datum/outfit/job/engineer/gloved @@ -56,6 +56,6 @@ suit = /obj/item/clothing/suit/space/hardsuit/engine suit_store = /obj/item/tank/internals/oxygen head = null - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 9c503279d4..9eed296851 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -20,7 +20,7 @@ /obj/item/wormhole_jaunter/equipped(mob/user, slot) . = ..() - if(slot == SLOT_BELT) + if(slot == ITEM_SLOT_BELT) RegisterSignal(user, COMSIG_MOVABLE_CHASM_DROP, .proc/chasm_react) /obj/item/wormhole_jaunter/dropped(mob/user) @@ -68,7 +68,7 @@ var/mob/M = loc if(istype(M)) - if(M.get_item_by_slot(SLOT_BELT) == src) + if(M.get_item_by_slot(ITEM_SLOT_BELT) == src) if(prob(severity)) M.visible_message("[src] overloads and activates!") SSblackbox.record_feedback("tally", "jaunter", 1, "EMP") // EMP accidental activation diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 0d46912a5a..0b394e0fc5 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -307,7 +307,7 @@ var/mob/living/carbon/human/active_owner /obj/item/clothing/neck/necklace/memento_mori/item_action_slot_check(slot, mob/user, datum/action/A) - return slot == SLOT_NECK + return slot == ITEM_SLOT_NECK /obj/item/clothing/neck/necklace/memento_mori/dropped(mob/user) ..() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 67a95006ab..849bbb9e38 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -182,7 +182,7 @@ held_items[hand_index] = I I.layer = ABOVE_HUD_LAYER I.plane = ABOVE_HUD_PLANE - I.equipped(src, SLOT_HANDS) + I.equipped(src, ITEM_SLOT_HANDS) if(I.pulledby) I.pulledby.stop_pulling() update_inv_hands() @@ -375,14 +375,14 @@ if(!slot_priority) slot_priority = list( \ - SLOT_BACK, SLOT_WEAR_ID,\ - SLOT_W_UNIFORM, SLOT_WEAR_SUIT,\ - SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\ - SLOT_SHOES, SLOT_GLOVES,\ - SLOT_EARS, SLOT_GLASSES,\ - SLOT_BELT, SLOT_S_STORE,\ - SLOT_L_STORE, SLOT_R_STORE,\ - SLOT_GENERC_DEXTROUS_STORAGE\ + ITEM_SLOT_BACK, ITEM_SLOT_ID,\ + ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\ + ITEM_SLOT_MASK, ITEM_SLOT_HEAD, ITEM_SLOT_NECK,\ + ITEM_SLOT_FEET, ITEM_SLOT_GLOVES,\ + ITEM_SLOT_EARS, ITEM_SLOT_EYES,\ + ITEM_SLOT_BELT, ITEM_SLOT_SUITSTORE,\ + ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET,\ + ITEM_SLOT_DEX_STORAGE\ ) for(var/slot in slot_priority) @@ -424,7 +424,7 @@ if(M.active_storage && M.active_storage.parent && SEND_SIGNAL(M.active_storage.parent, COMSIG_TRY_STORAGE_INSERT, src,M)) return TRUE - var/list/obj/item/possible = list(M.get_inactive_held_item(), M.get_item_by_slot(SLOT_BELT), M.get_item_by_slot(SLOT_GENERC_DEXTROUS_STORAGE), M.get_item_by_slot(SLOT_BACK)) + var/list/obj/item/possible = list(M.get_inactive_held_item(), M.get_item_by_slot(ITEM_SLOT_BELT), M.get_item_by_slot(ITEM_SLOT_DEX_STORAGE), M.get_item_by_slot(ITEM_SLOT_BACK)) for(var/i in possible) if(!i) continue @@ -446,10 +446,10 @@ //used in code for items usable by both carbon and drones, this gives the proper back slot for each mob.(defibrillator, backpack watertank, ...) /mob/proc/getBackSlot() - return SLOT_BACK + return ITEM_SLOT_BACK /mob/proc/getBeltSlot() - return SLOT_BELT + return ITEM_SLOT_BELT diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index ca2946fd8a..7dedf5a739 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -172,7 +172,7 @@ if(target.dropItemToGround(W)) target.visible_message("[src] tears [W] off of [target]'s face!", \ "[src] tears [W] off of [target]'s face!") - target.equip_to_slot_if_possible(src, SLOT_WEAR_MASK, 0, 1, 1) + target.equip_to_slot_if_possible(src, ITEM_SLOT_MASK, 0, 1, 1) return TRUE // time for a smoke /obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M) @@ -259,7 +259,7 @@ return 1 var/mob/living/carbon/C = M - if(ishuman(C) && !(SLOT_WEAR_MASK in C.dna.species.no_equip)) + if(ishuman(C) && !(ITEM_SLOT_MASK in C.dna.species.no_equip)) var/mob/living/carbon/human/H = C if(H.is_mouth_covered(head_only = 1)) return FALSE diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 61839ce123..969e63563d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -261,7 +261,7 @@ // too soon. var/buckle_cd = 600 if(handcuffed) - var/obj/item/restraints/O = src.get_item_by_slot(SLOT_HANDCUFFED) + var/obj/item/restraints/O = src.get_item_by_slot(ITEM_SLOT_HANDCUFFED) buckle_cd = O.breakouttime MarkResistTime() visible_message("[src] attempts to unbuckle [p_them()]self!", \ @@ -1137,15 +1137,15 @@ /mob/living/carbon/check_obscured_slots() if(head) if(head.flags_inv & HIDEMASK) - LAZYOR(., SLOT_WEAR_MASK) + LAZYOR(., ITEM_SLOT_MASK) if(head.flags_inv & HIDEEYES) - LAZYOR(., SLOT_GLASSES) + LAZYOR(., ITEM_SLOT_EYES) if(head.flags_inv & HIDEEARS) - LAZYOR(., SLOT_EARS) + LAZYOR(., ITEM_SLOT_EARS) if(wear_mask) if(wear_mask.flags_inv & HIDEEYES) - LAZYOR(., SLOT_GLASSES) + LAZYOR(., ITEM_SLOT_EYES) // if any of our bodyparts are bleeding /mob/living/carbon/proc/is_bleeding() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index a12d6614fa..8f954c0239 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -24,7 +24,7 @@ /mob/living/carbon/get_ear_protection() var/number = ..() - var/obj/item/organ/ears/E = getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/E = getorganslot(ORGAN_ITEM_SLOT_EARS) if(!E) number = INFINITY else @@ -417,7 +417,7 @@ SEND_SIGNAL(src, COMSIG_CARBON_SOUNDBANG, reflist) intensity = reflist[1] var/ear_safety = get_ear_protection() - var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = getorganslot(ORGAN_ITEM_SLOT_EARS) var/effect_amount = intensity - ear_safety if(effect_amount > 0) if(stun_pwr) @@ -457,7 +457,7 @@ /mob/living/carbon/can_hear() . = FALSE - var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = getorganslot(ORGAN_ITEM_SLOT_EARS) if(istype(ears) && !ears.deaf) . = TRUE diff --git a/code/modules/mob/living/carbon/carbon_stripping.dm b/code/modules/mob/living/carbon/carbon_stripping.dm index 45ff02f0d5..afbd6edaeb 100644 --- a/code/modules/mob/living/carbon/carbon_stripping.dm +++ b/code/modules/mob/living/carbon/carbon_stripping.dm @@ -1,10 +1,10 @@ /datum/strippable_item/mob_item_slot/head key = STRIPPABLE_ITEM_HEAD - item_slot = SLOT_HEAD + item_slot = ITEM_SLOT_HEAD /datum/strippable_item/mob_item_slot/back key = STRIPPABLE_ITEM_BACK - item_slot = SLOT_BACK + item_slot = ITEM_SLOT_BACK /datum/strippable_item/mob_item_slot/back/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -18,15 +18,15 @@ /datum/strippable_item/mob_item_slot/mask key = STRIPPABLE_ITEM_MASK - item_slot = SLOT_WEAR_MASK + item_slot = ITEM_SLOT_MASK /datum/strippable_item/mob_item_slot/neck key = STRIPPABLE_ITEM_NECK - item_slot = SLOT_NECK + item_slot = ITEM_SLOT_NECK /datum/strippable_item/mob_item_slot/handcuffs key = STRIPPABLE_ITEM_HANDCUFFS - item_slot = SLOT_HANDCUFFED + item_slot = ITEM_SLOT_HANDCUFFED /datum/strippable_item/mob_item_slot/handcuffs/should_show(atom/source, mob/user) if (!iscarbon(source)) @@ -41,7 +41,7 @@ /datum/strippable_item/mob_item_slot/legcuffs key = STRIPPABLE_ITEM_LEGCUFFS - item_slot = SLOT_LEGCUFFED + item_slot = ITEM_SLOT_LEGCUFFED /datum/strippable_item/mob_item_slot/legcuffs/should_show(atom/source, mob/user) if (!iscarbon(source)) diff --git a/code/modules/mob/living/carbon/handle_corruption.dm b/code/modules/mob/living/carbon/handle_corruption.dm index b56752453b..06256f6f8e 100644 --- a/code/modules/mob/living/carbon/handle_corruption.dm +++ b/code/modules/mob/living/carbon/handle_corruption.dm @@ -102,7 +102,7 @@ if("jamcoolanthud") hud_used.coolant_display.jam(10) if("receporgandamage") - adjustOrganLoss(ORGAN_SLOT_EARS, rand(10, 20)) + adjustOrganLoss(ORGAN_ITEM_SLOT_EARS, rand(10, 20)) adjustOrganLoss(ORGAN_SLOT_EYES, rand(10, 20)) to_chat(src, "Power spike detected in auditory and visual systems!") if("longlimbdisable") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index c3fb82de36..32a4fac90f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -31,7 +31,7 @@ . += "[t_He] [t_is] a [spec_trait_examine_font()][dna.custom_species ? dna.custom_species : dna.species.name]!" //uniform - if(w_uniform && !(SLOT_W_UNIFORM in obscured)) + if(w_uniform && !(ITEM_SLOT_ICLOTHING in obscured)) //accessory var/accessory_msg if(istype(w_uniform, /obj/item/clothing/under)) @@ -47,7 +47,7 @@ if(wear_suit && !(wear_suit.obj_flags & EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]." //suit/armor storage - if(s_store && !(SLOT_S_STORE in obscured)) + if(s_store && !(ITEM_SLOT_SUITSTORE in obscured)) . += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name]." //back if(back) @@ -59,7 +59,7 @@ . += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))]." //gloves - if(gloves && !(SLOT_GLOVES in obscured)) + if(gloves && !(ITEM_SLOT_GLOVES in obscured)) . += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands." else if(length(blood_DNA)) var/hand_number = get_num_arms(FALSE) @@ -78,18 +78,18 @@ . += "[t_He] [t_has] [belt.get_examine_string(user)] about [t_his] waist." //shoes - if(shoes && !(SLOT_SHOES in obscured)) + if(shoes && !(ITEM_SLOT_FEET in obscured)) . += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] on [t_his] feet." //mask - if(wear_mask && !(SLOT_WEAR_MASK in obscured)) + if(wear_mask && !(ITEM_SLOT_MASK in obscured)) . += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face." - if(wear_neck && !(SLOT_NECK in obscured)) + if(wear_neck && !(ITEM_SLOT_NECK in obscured)) . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck." //eyes - if(!(SLOT_GLASSES in obscured)) + if(!(ITEM_SLOT_EYES in obscured)) if(glasses) . += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes." else if((left_eye_color == BLOODCULT_EYE || right_eye_color == BLOODCULT_EYE) && iscultist(src) && HAS_TRAIT(src, TRAIT_CULT_EYES)) @@ -100,7 +100,7 @@ . += "[t_His] eyes are flickering a bright yellow!" //ears - if(ears && !(SLOT_EARS in obscured)) + if(ears && !(ITEM_SLOT_EARS in obscured)) . += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] ears." //ID diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5a58289316..9af03ef0d0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -372,11 +372,11 @@ . = ..() if(wear_suit) if(wear_suit.flags_inv & HIDEGLOVES) - LAZYOR(., SLOT_GLOVES) + LAZYOR(., ITEM_SLOT_GLOVES) if(wear_suit.flags_inv & HIDEJUMPSUIT) - LAZYOR(., SLOT_W_UNIFORM) + LAZYOR(., ITEM_SLOT_ICLOTHING) if(wear_suit.flags_inv & HIDESHOES) - LAZYOR(., SLOT_SHOES) + LAZYOR(., ITEM_SLOT_FEET) /mob/living/carbon/human/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) if(judgement_criteria & JUDGE_EMAGGED) diff --git a/code/modules/mob/living/carbon/human/human_stripping.dm b/code/modules/mob/living/carbon/human/human_stripping.dm index 6197241ef3..cd05e06731 100644 --- a/code/modules/mob/living/carbon/human/human_stripping.dm +++ b/code/modules/mob/living/carbon/human/human_stripping.dm @@ -35,15 +35,15 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/eyes key = STRIPPABLE_ITEM_EYES - item_slot = SLOT_GLASSES + item_slot = ITEM_SLOT_EYES /datum/strippable_item/mob_item_slot/ears key = STRIPPABLE_ITEM_EARS - item_slot = SLOT_EARS + item_slot = ITEM_SLOT_EARS /datum/strippable_item/mob_item_slot/jumpsuit key = STRIPPABLE_ITEM_JUMPSUIT - item_slot = SLOT_W_UNIFORM + item_slot = ITEM_SLOT_ICLOTHING /datum/strippable_item/mob_item_slot/jumpsuit/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -75,7 +75,7 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/suit key = STRIPPABLE_ITEM_SUIT - item_slot = SLOT_WEAR_SUIT + item_slot = ITEM_SLOT_OCLOTHING /datum/strippable_item/mob_item_slot/suit/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -108,11 +108,11 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/gloves key = STRIPPABLE_ITEM_GLOVES - item_slot = SLOT_GLOVES + item_slot = ITEM_SLOT_GLOVES /datum/strippable_item/mob_item_slot/feet key = STRIPPABLE_ITEM_FEET - item_slot = SLOT_SHOES + item_slot = ITEM_SLOT_FEET /datum/strippable_item/mob_item_slot/feet/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -141,7 +141,7 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/suit_storage key = STRIPPABLE_ITEM_SUIT_STORAGE - item_slot = SLOT_S_STORE + item_slot = ITEM_SLOT_SUITSTORE /datum/strippable_item/mob_item_slot/suit_storage/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -155,11 +155,11 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/id key = STRIPPABLE_ITEM_ID - item_slot = SLOT_WEAR_ID + item_slot = ITEM_SLOT_ID /datum/strippable_item/mob_item_slot/belt key = STRIPPABLE_ITEM_BELT - item_slot = SLOT_BELT + item_slot = ITEM_SLOT_BELT /datum/strippable_item/mob_item_slot/belt/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -212,12 +212,12 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/pocket/left key = STRIPPABLE_ITEM_LPOCKET - item_slot = SLOT_L_STORE + item_slot = ITEM_SLOT_LPOCKET pocket_side = "left" /datum/strippable_item/mob_item_slot/pocket/right key = STRIPPABLE_ITEM_RPOCKET - item_slot = SLOT_R_STORE + item_slot = ITEM_SLOT_RPOCKET pocket_side = "right" /proc/get_strippable_alternate_action_internals(obj/item/item, atom/source) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 199a6b44be..4c30a1d742 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -17,39 +17,39 @@ // Return the item currently in the slot ID /mob/living/carbon/human/get_item_by_slot(slot_id) switch(slot_id) - if(SLOT_BACK) + if(ITEM_SLOT_BACK) return back - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) return wear_mask - if(SLOT_NECK) + if(ITEM_SLOT_NECK) return wear_neck - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) return handcuffed - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) return legcuffed - if(SLOT_BELT) + if(ITEM_SLOT_BELT) return belt - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) return wear_id - if(SLOT_EARS) + if(ITEM_SLOT_EARS) return ears - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) return glasses - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) return gloves - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) return head - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) return shoes - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) return wear_suit - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) return w_uniform - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) return l_store - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) return r_store - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) return s_store return null @@ -98,17 +98,17 @@ var/not_handled = FALSE //Added in case we make this type path deeper one day switch(slot) - if(SLOT_BELT) + if(ITEM_SLOT_BELT) belt = I update_inv_belt() - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) wear_id = I sec_hud_set_ID() update_inv_wear_id() - if(SLOT_EARS) + if(ITEM_SLOT_EARS) ears = I update_inv_ears() - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) glasses = I var/obj/item/clothing/glasses/G = I if(G.glass_colour_type) @@ -121,13 +121,13 @@ if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() update_inv_glasses() - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) gloves = I update_inv_gloves() - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) shoes = I update_inv_shoes() - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) wear_suit = I if(I.flags_inv & HIDEJUMPSUIT) update_inv_w_uniform() @@ -135,17 +135,17 @@ stop_pulling() //can't pull if restrained update_action_buttons_icon() //certain action buttons will no longer be usable. update_inv_wear_suit() - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) w_uniform = I update_suit_sensors() update_inv_w_uniform() - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) l_store = I update_inv_pockets() - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) r_store = I update_inv_pockets() - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) s_store = I update_inv_s_store() else @@ -296,7 +296,7 @@ if(incapacitated()) return var/obj/item/thing = get_active_held_item() - var/obj/item/equipped_back = get_item_by_slot(SLOT_BACK) + var/obj/item/equipped_back = get_item_by_slot(ITEM_SLOT_BACK) if(!equipped_back) // We also let you equip a backpack like this if(!thing) to_chat(src, "You have no backpack to take something out of!") @@ -327,7 +327,7 @@ if(incapacitated()) return var/obj/item/thing = get_active_held_item() - var/obj/item/equipped_belt = get_item_by_slot(SLOT_BELT) + var/obj/item/equipped_belt = get_item_by_slot(ITEM_SLOT_BELT) if(!equipped_belt) // We also let you equip a belt like this if(!thing) to_chat(src, "You have no belt to take something out of!") diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e6ac8ae881..847664d957 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -337,7 +337,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/obj/item/organ/lungs/lungs = C.getorganslot(ORGAN_SLOT_LUNGS) var/obj/item/organ/appendix/appendix = C.getorganslot(ORGAN_SLOT_APPENDIX) var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES) - var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_ITEM_SLOT_EARS) var/obj/item/organ/tongue/tongue = C.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) var/obj/item/organ/stomach/stomach = C.getorganslot(ORGAN_SLOT_STOMACH) @@ -1260,11 +1260,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/num_legs = H.get_num_legs(FALSE) switch(slot) - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) if(H.get_empty_held_indexes()) return TRUE return FALSE - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) if(H.wear_mask) return FALSE if(!(I.slot_flags & ITEM_SLOT_MASK)) @@ -1272,25 +1272,25 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_NECK) + if(ITEM_SLOT_NECK) if(H.wear_neck) return FALSE if( !(I.slot_flags & ITEM_SLOT_NECK) ) return FALSE return TRUE - if(SLOT_BACK) + if(ITEM_SLOT_BACK) if(H.back) return FALSE if( !(I.slot_flags & ITEM_SLOT_BACK) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) if(H.wear_suit) return FALSE if( !(I.slot_flags & ITEM_SLOT_OCLOTHING) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) if(H.gloves) return FALSE if( !(I.slot_flags & ITEM_SLOT_GLOVES) ) @@ -1298,7 +1298,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(num_arms < 2) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) if(H.shoes) return FALSE if( !(I.slot_flags & ITEM_SLOT_FEET) ) @@ -1311,7 +1311,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_BELT) + if(ITEM_SLOT_BELT) if(H.belt) return FALSE if(!(I.item_flags & NO_UNIFORM_REQUIRED)) @@ -1323,7 +1323,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!(I.slot_flags & ITEM_SLOT_BELT)) return return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) if(H.glasses) return FALSE if(!(I.slot_flags & ITEM_SLOT_EYES)) @@ -1331,7 +1331,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) if(H.head) return FALSE if(!(I.slot_flags & ITEM_SLOT_HEAD)) @@ -1339,7 +1339,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_EARS) + if(ITEM_SLOT_EARS) if(H.ears) return FALSE if(!(I.slot_flags & ITEM_SLOT_EARS)) @@ -1347,13 +1347,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) if(H.w_uniform) return FALSE if( !(I.slot_flags & ITEM_SLOT_ICLOTHING) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) if(H.wear_id) return FALSE if(!(I.item_flags & NO_UNIFORM_REQUIRED)) @@ -1365,7 +1365,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if( !(I.slot_flags & ITEM_SLOT_ID) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) if(HAS_TRAIT(I, TRAIT_NODROP)) //Pockets aren't visible, so you can't move TRAIT_NODROP items into them. return FALSE if(H.l_store) @@ -1377,11 +1377,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(return_warning) return_warning[1] = "You need a jumpsuit before you can attach this [I.name]!" return FALSE - if(I.slot_flags & ITEM_SLOT_DENYPOCKET) - return FALSE - if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKET) ) + if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKETS) ) return TRUE - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) if(HAS_TRAIT(I, TRAIT_NODROP)) return FALSE if(H.r_store) @@ -1393,12 +1391,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(return_warning) return_warning[1] = "You need a jumpsuit before you can attach this [I.name]!" return FALSE - if(I.slot_flags & ITEM_SLOT_DENYPOCKET) - return FALSE - if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKET) ) + if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKETS) ) return TRUE return FALSE - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) if(HAS_TRAIT(I, TRAIT_NODROP)) return FALSE if(H.s_store) @@ -1418,7 +1414,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if( istype(I, /obj/item/pda) || istype(I, /obj/item/pen) || is_type_in_list(I, H.wear_suit.allowed) ) return TRUE return FALSE - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) if(H.handcuffed) return FALSE if(!istype(I, /obj/item/restraints/handcuffs)) @@ -1426,7 +1422,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(num_arms < 2) return FALSE return TRUE - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) if(H.legcuffed) return FALSE if(!istype(I, /obj/item/restraints/legcuffs)) @@ -1434,7 +1430,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(num_legs < 2) return FALSE return TRUE - if(SLOT_IN_BACKPACK) + if(ITEM_SLOT_BACKPACK) if(H.back) if(SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE)) return TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index ac25c9e021..f90199c8ee 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -12,7 +12,7 @@ punchdamagelow = 5 punchdamagehigh = 14 punchstunthreshold = 10 - no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE) + no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE) nojumpsuit = 1 sexes = 1 damage_overlay_type = "" diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 0655b28197..afcec291e9 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -16,7 +16,7 @@ punchdamagehigh = 12 //still better than humans punchstunthreshold = 10 - no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM) + no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING) burnmod = 1.25 heatmod = 1.5 diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index bfef310cdf..f412099831 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -37,7 +37,7 @@ limbs_id = SPECIES_SHADOW burnmod = 1.5 blacklisted = TRUE - no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE) + no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE) species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES,NOGENITALS,NOAROUSAL) inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER) mutanteyes = /obj/item/organ/eyes/night_vision/nightmare diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 52d736f9ce..cb2458e376 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -128,7 +128,7 @@ There are several things that need to be remembered: remove_overlay(UNIFORM_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_ICLOTHING) + 1] inv.update_icon() if(istype(w_uniform, /obj/item/clothing/under)) @@ -180,7 +180,7 @@ There are several things that need to be remembered: remove_overlay(ID_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_ID) + 1] inv.update_icon() var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER] @@ -204,8 +204,8 @@ There are several things that need to be remembered: if(!HAS_TRAIT(src, TRAIT_HUMAN_NO_RENDER)) remove_overlay(GLOVES_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES]) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES] + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1] inv.update_icon() if(!gloves && bloody_hands) @@ -242,7 +242,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_EYES) + 1] inv.update_icon() if(glasses) @@ -269,7 +269,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_EARS) + 1] inv.update_icon() if(ears) @@ -295,7 +295,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_FEET) + 1] inv.update_icon() if(dna.species.mutant_bodyparts["taur"]) @@ -330,7 +330,7 @@ There are several things that need to be remembered: remove_overlay(SUIT_STORE_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_SUITSTORE) + 1] inv.update_icon() if(s_store) @@ -357,7 +357,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1] inv.update_icon() if(head) @@ -394,7 +394,7 @@ There are several things that need to be remembered: remove_overlay(BELT_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BELT) + 1] inv.update_icon() if(belt) @@ -416,7 +416,7 @@ There are several things that need to be remembered: remove_overlay(SUIT_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_OCLOTHING) + 1] inv.update_icon() if(wear_suit) @@ -479,10 +479,10 @@ There are several things that need to be remembered: if(client && hud_used) var/atom/movable/screen/inventory/inv - inv = hud_used.inv_slots[SLOT_L_STORE] + inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_LPOCKET) + 1] inv.update_icon() - inv = hud_used.inv_slots[SLOT_R_STORE] + inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_RPOCKET) + 1] inv.update_icon() if(l_store) @@ -506,7 +506,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_MASK) + 1] inv.update_icon() if(wear_mask) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 13f811196e..2422528d21 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -1,16 +1,16 @@ /mob/living/carbon/get_item_by_slot(slot_id) switch(slot_id) - if(SLOT_BACK) + if(ITEM_SLOT_BACK) return back - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) return wear_mask - if(SLOT_NECK) + if(ITEM_SLOT_NECK) return wear_neck - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) return head - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) return handcuffed - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) return legcuffed return null @@ -20,17 +20,17 @@ return slot if(critical) //it is CRITICAL they get this item, no matter what //do they have a backpack? - var/obj/item/backpack = get_item_by_slot(SLOT_BACK) + var/obj/item/backpack = get_item_by_slot(ITEM_SLOT_BACK) if(!backpack) //nothing on their back backpack = new /obj/item/storage/backpack(get_turf(src)) - if(equip_to_slot(backpack, SLOT_BACK)) //worst-case-scenario, something that shouldnt wear a backpack gets one + if(equip_to_slot(backpack, ITEM_SLOT_BACK)) //worst-case-scenario, something that shouldnt wear a backpack gets one I.forceMove(backpack) - return SLOT_BACK + return ITEM_SLOT_BACK else if(istype(backpack) && SEND_SIGNAL(backpack, COMSIG_CONTAINS_STORAGE)) //place it in here, regardless of storage capacity I.forceMove(backpack) - return SLOT_BACK + return ITEM_SLOT_BACK else //this should NEVER happen, but if it does, report it with the appropriate information var/conclusion = qdel_on_fail ? "deleted" : "not moved, staying at current position [I.x], [I.y], [I.z]" @@ -69,28 +69,28 @@ I.appearance_flags |= NO_CLIENT_COLOR var/not_handled = FALSE switch(slot) - if(SLOT_BACK) + if(ITEM_SLOT_BACK) back = I update_inv_back() - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) wear_mask = I wear_mask_update(I, toggle_off = 0) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) head = I head_update(I) - if(SLOT_NECK) + if(ITEM_SLOT_NECK) wear_neck = I update_inv_neck(I) - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) handcuffed = I update_handcuffed() - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) legcuffed = I update_inv_legcuffed() - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) put_in_hands(I) update_inv_hands() - if(SLOT_IN_BACKPACK) + if(ITEM_SLOT_BACKPACK) if(!back || !SEND_SIGNAL(back, COMSIG_TRY_STORAGE_INSERT, I, src, TRUE)) not_handled = TRUE else @@ -170,7 +170,7 @@ if(!offered_item) to_chat(src, "You're not holding anything to give!") return - + if(IS_DEAD_OR_INCAP(src)) to_chat(src, span_warning("You're unable to offer anything in your current state!")) return @@ -184,7 +184,7 @@ visible_message(span_notice("[src] is offering [offered_item]."), \ span_notice("You offer [offered_item]."), null, 2) - + apply_status_effect(STATUS_EFFECT_OFFERING, offered_item) /** diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 182ae1afb8..27f795015e 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -676,7 +676,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put /mob/living/carbon/proc/get_cooling_efficiency() if(!HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM)) return 1 - + var/integration_bonus = min(blood_volume * SYNTH_INTEGRATION_COOLANT_CAP, integrating_blood * SYNTH_INTEGRATION_COOLANT_PENALTY) //Integration blood somewhat helps, though only at 40% impact and to a cap of 25% of current blood level. var/blood_effective_volume = blood_volume + integration_bonus var/coolant_efficiency = min(blood_effective_volume / BLOOD_VOLUME_SAFE, 1) //Low coolant is only a negative, adding more than needed will not help you. @@ -706,13 +706,13 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put return total_environment_efficiency /mob/living/carbon/proc/check_suitlinking() - var/suit_item = get_item_by_slot(SLOT_WEAR_SUIT) - var/head_item = get_item_by_slot(SLOT_HEAD) + var/suit_item = get_item_by_slot(ITEM_SLOT_OCLOTHING) + var/head_item = get_item_by_slot(ITEM_SLOT_HEAD) var/turf/T = get_turf(src) - + if(istype(head_item, /obj/item/clothing/head/helmet/space) && istype(suit_item, /obj/item/clothing/suit/space)) return 1 - + if(T && is_mining_level(T.z) && istype(head_item, /obj/item/clothing/head/hooded/explorer) && istype(suit_item, /obj/item/clothing/suit/hooded/explorer)) return 1 diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm index 34599028f7..156eef9b6b 100644 --- a/code/modules/mob/living/carbon/monkey/inventory.dm +++ b/code/modules/mob/living/carbon/monkey/inventory.dm @@ -5,29 +5,29 @@ return FALSE switch(slot) - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) if(get_empty_held_indexes()) return TRUE return FALSE - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) if(wear_mask) return FALSE if( !(I.slot_flags & ITEM_SLOT_MASK) ) return FALSE return TRUE - if(SLOT_NECK) + if(ITEM_SLOT_NECK) if(wear_neck) return FALSE if( !(I.slot_flags & ITEM_SLOT_NECK) ) return FALSE return TRUE - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) if(head) return FALSE if( !(I.slot_flags & ITEM_SLOT_HEAD) ) return FALSE return TRUE - if(SLOT_BACK) + if(ITEM_SLOT_BACK) if(back) return FALSE if( !(I.slot_flags & ITEM_SLOT_BACK) ) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index f8ac8c6716..8a029613e2 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -184,5 +184,5 @@ GLOBAL_LIST_INIT(strippable_monkey_items, create_strippable_list(list( . = ..() if(prob(10)) var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src) - equip_to_slot_or_del(helmet,SLOT_HEAD) + equip_to_slot_or_del(helmet,ITEM_SLOT_HEAD) INVOKE_ASYNC(helmet, /obj/item.proc/attack_self, src) // todo encapsulate toggle diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index c59218a8a3..d71a989c1d 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -29,9 +29,9 @@ if(ancestor_chain > 1) generate_fake_scars(rand(ancestor_chain, ancestor_chain * 4)) if(relic_hat) - equip_to_slot_or_del(new relic_hat, SLOT_HEAD) + equip_to_slot_or_del(new relic_hat, ITEM_SLOT_HEAD) if(relic_mask) - equip_to_slot_or_del(new relic_mask, SLOT_WEAR_MASK) + equip_to_slot_or_del(new relic_mask, ITEM_SLOT_MASK) /mob/living/carbon/monkey/punpun/BiologicalLife(seconds, times_fired) if(!(. = ..())) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 43e0db1f08..cd9cd5db4c 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -91,7 +91,7 @@ return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_MASK) + 1] inv?.update_icon() if(wear_mask) @@ -104,8 +104,8 @@ /mob/living/carbon/update_inv_neck() remove_overlay(NECK_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_NECK]) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_NECK] + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_NECK) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_NECK) + 1] inv.update_icon() if(wear_neck) @@ -119,7 +119,7 @@ remove_overlay(BACK_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1] inv?.update_icon() if(back) @@ -135,7 +135,7 @@ return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1] inv?.update_icon() if(head) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index ecd5db3ccf..dfb00f2657 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -88,10 +88,10 @@ if(default_storage) var/obj/item/I = new default_storage(src) - equip_to_slot_or_del(I, SLOT_GENERC_DEXTROUS_STORAGE) + equip_to_slot_or_del(I, ITEM_SLOT_DEX_STORAGE) if(default_hatmask) var/obj/item/I = new default_hatmask(src) - equip_to_slot_or_del(I, SLOT_HEAD) + equip_to_slot_or_del(I, ITEM_SLOT_HEAD) ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index 948be53abc..df4d1e0673 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -61,7 +61,7 @@ if(!D.default_hatmask && seasonal_hats && possible_seasonal_hats.len) var/hat_type = pick(possible_seasonal_hats) var/obj/item/new_hat = new hat_type(D) - D.equip_to_slot_or_del(new_hat, SLOT_HEAD) + D.equip_to_slot_or_del(new_hat, ITEM_SLOT_HEAD) D.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) user.transfer_ckey(D, FALSE) qdel(src) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index 00be08bb1d..4c112858da 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -21,13 +21,13 @@ /mob/living/simple_animal/drone/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, clothing_check = FALSE, list/return_warning) switch(slot) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) if(head) return 0 if(!((I.slot_flags & ITEM_SLOT_HEAD) || (I.slot_flags & ITEM_SLOT_MASK))) return 0 return 1 - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) if(internal_storage) return 0 return 1 @@ -36,9 +36,9 @@ /mob/living/simple_animal/drone/get_item_by_slot(slot_id) switch(slot_id) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) return head - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) return internal_storage return ..() @@ -63,10 +63,10 @@ I.plane = ABOVE_HUD_PLANE switch(slot) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) head = I update_inv_head() - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) internal_storage = I update_inv_internal_storage() else @@ -77,7 +77,7 @@ I.equipped(src, slot) /mob/living/simple_animal/drone/getBackSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE /mob/living/simple_animal/drone/getBeltSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index a079507a63..6d421d326e 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -52,7 +52,7 @@ /mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, clothing_check = FALSE, list/return_warning) switch(slot) - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) if(internal_storage) return 0 return 1 @@ -63,17 +63,17 @@ return switch(slot) - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) internal_storage = I update_inv_internal_storage() else to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!") /mob/living/simple_animal/hostile/guardian/dextrous/getBackSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE /mob/living/simple_animal/hostile/guardian/dextrous/getBeltSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE /mob/living/simple_animal/hostile/guardian/dextrous/proc/update_inv_internal_storage() if(internal_storage && client && hud_used && hud_used.hud_shown) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index fa67fd8e3b..6bd55d06ae 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -191,7 +191,7 @@ continue visible_message("[src] grabs hold of [L]!") var/mob/living/carbon/C = L - var/obj/item/clothing/S = C.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/clothing/S = C.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(S && S.resistance_flags & GOLIATH_RESISTANCE) L.Stun(25) else if(S && S.resistance_flags & GOLIATH_WEAKNESS) diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index cf895924b0..f59a06dc69 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -111,7 +111,7 @@ if(user.put_in_hands(src)) msg = "Your Energy Katana teleports into your hand!" - else if(user.equip_to_slot_if_possible(src, SLOT_BELT, 0, 1, 1)) + else if(user.equip_to_slot_if_possible(src, ITEM_SLOT_BELT, 0, 1, 1)) msg = "Your Energy Katana teleports back to you, sheathing itself as it does so!" else msg = "Your Energy Katana teleports to your location!" diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm index ca740d9ad7..f9ce438ed9 100644 --- a/code/modules/ninja/outfit.dm +++ b/code/modules/ninja/outfit.dm @@ -11,7 +11,7 @@ l_pocket = /obj/item/grenade/plastic/c4/ninja r_pocket = /obj/item/hypospray/mkii/CMO/combat suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE belt = /obj/item/energy_katana implants = list(/obj/item/implant/explosive) diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index 6fba60a6ef..4f46a1bfc6 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -22,7 +22,7 @@ /obj/item/clothing/shoes/space_ninja/equipped(mob/user, slot) . = ..() - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) ADD_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT) /obj/item/clothing/shoes/space_ninja/dropped(mob/user) diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index f07ad0bc39..8c26f40d8b 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -163,7 +163,7 @@ icon = 'icons/obj/ammo.dmi' icon_state = "shotgunclip" caliber = "shotgun" // slapped in to allow shell mix n match - slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_NORMAL w_volume = ITEM_VOLUME_STRIPPER_CLIP ammo_type = /obj/item/ammo_casing/shotgun diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm index 5b774b111a..76d8f217ab 100644 --- a/code/modules/projectiles/boxes_magazines/external/rechargable.dm +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -54,7 +54,7 @@ desc = "A miniature battery for an energy weapon." icon = 'icons/obj/ammo.dmi' icon_state = "mws_batt" - slot_flags = SLOT_BELT | SLOT_EARS + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_EARS throwforce = 1 caliber = "mws" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index bbd77ad665..a1c7c312ab 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -619,7 +619,7 @@ . += knife_overlay /obj/item/gun/item_action_slot_check(slot, mob/user, datum/action/A) - if(istype(A, /datum/action/item_action/toggle_scope_zoom) && slot != SLOT_HANDS) + if(istype(A, /datum/action/item_action/toggle_scope_zoom) && slot != ITEM_SLOT_HANDS) return FALSE return ..() diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index e7f26670d4..1f0601ac77 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -140,6 +140,6 @@ recoil = 0.1 inaccuracy_modifier = 0.25 dualwield_spread_mult = 1.4 - slot_flags = SLOT_BELT + slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_NORMAL weapon_weight = WEAPON_MEDIUM diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index a0274d76d7..2bb1ece906 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -32,7 +32,7 @@ /obj/item/minigunpack/on_attack_hand(var/mob/living/carbon/user) if(src.loc == user) if(!armed) - if(user.get_item_by_slot(SLOT_BACK) == src) + if(user.get_item_by_slot(ITEM_SLOT_BACK) == src) armed = 1 if(!user.put_in_hands(gun)) armed = 0 diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index ec628255fa..5521bf80f4 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2670,7 +2670,7 @@ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -100) M.adjustOrganLoss(ORGAN_SLOT_HEART, -100) M.adjustOrganLoss(ORGAN_SLOT_LIVER, -100) - M.adjustOrganLoss(ORGAN_SLOT_EARS, -100) + M.adjustOrganLoss(ORGAN_ITEM_SLOT_EARS, -100) M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -100) M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -100) M.adjustOrganLoss(ORGAN_SLOT_EYES, -100) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index af670c00dc..a70c17ec25 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -1073,7 +1073,7 @@ taste_description = "sugary sweetness" /datum/reagent/toxin/leadacetate/on_mob_life(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_SLOT_EARS,1) + M.adjustOrganLoss(ORGAN_ITEM_SLOT_EARS,1) M.adjustOrganLoss(ORGAN_SLOT_BRAIN,1) if(prob(1)) to_chat(M, "Ah, what was that? You thought you heard something...") diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index fddff17a9d..03b0e1b715 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -581,7 +581,7 @@ if(istype(extract)) if(extract.Uses > 0) var/mob/lastheld = get_mob_by_key(holder.my_atom.fingerprintslast) - if(lastheld && !lastheld.equip_to_slot_if_possible(extract, SLOT_HANDS, disable_warning = TRUE)) + if(lastheld && !lastheld.equip_to_slot_if_possible(extract, ITEM_SLOT_HANDS, disable_warning = TRUE)) extract.forceMove(get_turf(lastheld)) use_slime_core(holder) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 6e1b753c32..cc7ff43bab 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -300,14 +300,14 @@ resistance_flags = NONE armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 50) //Weak melee protection, because you can wear it on your head slot_equipment_priority = list( \ - SLOT_BACK, SLOT_WEAR_ID,\ - SLOT_W_UNIFORM, SLOT_WEAR_SUIT,\ - SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\ - SLOT_SHOES, SLOT_GLOVES,\ - SLOT_EARS, SLOT_GLASSES,\ - SLOT_BELT, SLOT_S_STORE,\ - SLOT_L_STORE, SLOT_R_STORE,\ - SLOT_GENERC_DEXTROUS_STORAGE + ITEM_SLOT_BACK, ITEM_SLOT_ID,\ + ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\ + ITEM_SLOT_MASK, ITEM_SLOT_HEAD, ITEM_SLOT_NECK,\ + ITEM_SLOT_FEET, ITEM_SLOT_GLOVES,\ + ITEM_SLOT_EARS, ITEM_SLOT_EYES,\ + ITEM_SLOT_BELT, ITEM_SLOT_SUITSTORE,\ + ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET,\ + ITEM_SLOT_DEX_STORAGE ) container_flags = APTFT_ALTCLICK|APTFT_VERB container_HP = 1 @@ -330,11 +330,11 @@ /obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) if(reagents.total_volume) to_chat(user, "[src]'s contents spill all over you!") var/R = reagents.log_list() - log_reagent("SPLASH: [user] splashed [src] on their head via bucket/equipped(self, SLOT_HEAD) - [R]") + log_reagent("SPLASH: [user] splashed [src] on their head via bucket/equipped(self, ITEM_SLOT_HEAD) - [R]") reagents.reaction(user, TOUCH) reagents.clear_reagents() reagent_flags = NONE @@ -345,10 +345,10 @@ /obj/item/reagent_containers/glass/bucket/equip_to_best_slot(var/mob/M) if(reagents.total_volume) //If there is water in a bucket, don't quick equip it to the head - var/index = slot_equipment_priority.Find(SLOT_HEAD) - slot_equipment_priority.Remove(SLOT_HEAD) + var/index = slot_equipment_priority.Find(ITEM_SLOT_HEAD) + slot_equipment_priority.Remove(ITEM_SLOT_HEAD) . = ..() - slot_equipment_priority.Insert(index, SLOT_HEAD) + slot_equipment_priority.Insert(index, ITEM_SLOT_HEAD) return return ..() diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm index c26ed4db31..78cb9d43ea 100644 --- a/code/modules/reagents/reagent_containers/rags.dm +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -150,11 +150,11 @@ /obj/item/reagent_containers/rag/towel/equipped(mob/living/user, slot) . = ..() switch(slot) - if(SLOT_BELT) + if(ITEM_SLOT_BELT) body_parts_covered = GROIN|LEGS - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) body_parts_covered = CHEST|GROIN|LEGS - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) body_parts_covered = HEAD flags_inv = HIDEHAIR diff --git a/code/modules/research/nanites/nanite_programs/protocols.dm b/code/modules/research/nanites/nanite_programs/protocols.dm index 3716bc61ac..56f083d31f 100644 --- a/code/modules/research/nanites/nanite_programs/protocols.dm +++ b/code/modules/research/nanites/nanite_programs/protocols.dm @@ -244,7 +244,7 @@ if(eyes) eyes.applyOrganDamage(0.75) if(prob(13)) - var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_ITEM_SLOT_EARS) if(ears) ears.applyOrganDamage(0.75) current_stage++ diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index 1ac09652b5..b30a53c27d 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -19,7 +19,7 @@ Slimecrossing Armor /obj/item/clothing/mask/nobreath/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) ADD_TRAIT(user, TRAIT_NOBREATH, "breathmask_[REF(src)]") user.failed_last_breath = FALSE user.clear_alert("not_enough_oxy") @@ -39,7 +39,7 @@ Slimecrossing Armor var/glasses_color = "#FFFFFF" /obj/item/clothing/glasses/prism_glasses/item_action_slot_check(slot) - if(slot == SLOT_GLASSES) + if(slot == ITEM_SLOT_EYES) return TRUE /obj/structure/light_prism @@ -111,7 +111,7 @@ Slimecrossing Armor /obj/item/clothing/head/peaceflower/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot == SLOT_HEAD) + if(slot == ITEM_SLOT_HEAD) ADD_TRAIT(user, TRAIT_PACIFISM, "peaceflower_[REF(src)]") /obj/item/clothing/head/peaceflower/dropped(mob/living/carbon/human/user) diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index dee7b1cf45..f871cac778 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -127,10 +127,10 @@ Regenerative extracts: /obj/item/slimecross/regenerative/darkpurple/core_effect(mob/living/target, mob/user) var/equipped = 0 - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/purple(null), SLOT_SHOES) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(null), SLOT_W_UNIFORM) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(null), SLOT_GLOVES) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/head/soft/purple(null), SLOT_HEAD) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/purple(null), ITEM_SLOT_FEET) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(null), ITEM_SLOT_ICLOTHING) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(null), ITEM_SLOT_GLOVES) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/head/soft/purple(null), ITEM_SLOT_HEAD) if(equipped > 0) target.visible_message("The milky goo congeals into clothing!") @@ -142,13 +142,13 @@ Regenerative extracts: return var/mob/living/carbon/human/H = target var/fireproofed = FALSE - if(H.get_item_by_slot(SLOT_WEAR_SUIT)) + if(H.get_item_by_slot(ITEM_SLOT_OCLOTHING)) fireproofed = TRUE - var/obj/item/clothing/C = H.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/clothing/C = H.get_item_by_slot(ITEM_SLOT_OCLOTHING) fireproof(C) - if(H.get_item_by_slot(SLOT_HEAD)) + if(H.get_item_by_slot(ITEM_SLOT_HEAD)) fireproofed = TRUE - var/obj/item/clothing/C = H.get_item_by_slot(SLOT_HEAD) + var/obj/item/clothing/C = H.get_item_by_slot(ITEM_SLOT_HEAD) fireproof(C) if(fireproofed) target.visible_message("Some of [target]'s clothing gets coated in the goo, and turns blue!") diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index fbe7a0ea40..bf6051c87c 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -63,9 +63,9 @@ H.dropItemToGround(H.w_uniform) H.dropItemToGround(H.wear_suit) H.dropItemToGround(H.head) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), SLOT_WEAR_SUIT) - H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), SLOT_HEAD) - H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), ITEM_SLOT_OCLOTHING) + H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), ITEM_SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), ITEM_SLOT_ICLOTHING) // you only get one phylactery. M.mind.RemoveSpell(src) @@ -132,10 +132,10 @@ var/mob/old_body = mind.current var/mob/living/carbon/human/lich = new(item_turf) - lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(lich), SLOT_SHOES) - lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), SLOT_W_UNIFORM) - lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), SLOT_WEAR_SUIT) - lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), SLOT_HEAD) + lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(lich), ITEM_SLOT_FEET) + lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), ITEM_SLOT_ICLOTHING) + lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), ITEM_SLOT_OCLOTHING) + lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), ITEM_SLOT_HEAD) lich.real_name = mind.name mind.transfer_to(lich) diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 80b7599ec3..71fa88233a 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -3,7 +3,7 @@ icon_state = "ears" desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible." zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EARS + slot = ORGAN_ITEM_SLOT_EARS gender = PLURAL healing_factor = STANDARD_ORGAN_HEALING @@ -138,7 +138,7 @@ icon_state = "ears-c" desc = "A pair of microphones intended to be installed in an IPC head, that grant the ability to hear." zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EARS + slot = ORGAN_ITEM_SLOT_EARS gender = PLURAL organ_flags = ORGAN_SYNTHETIC diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index a3c6ea06c8..60628e6db0 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -333,7 +333,7 @@ if(only_one) return TRUE - if(!getorganslot(ORGAN_SLOT_EARS)) + if(!getorganslot(ORGAN_ITEM_SLOT_EARS)) var/obj/item/organ/ears/ears if(dna && dna.species && dna.species.mutantears) ears = new dna.species.mutantears diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 3e0e71446d..d4a87a0f1e 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -102,7 +102,7 @@ var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals)) unbuckle_mob(H) H.throw_at(throw_target, 3, 2) - var/head_slot = H.get_item_by_slot(SLOT_HEAD) + var/head_slot = H.get_item_by_slot(ITEM_SLOT_HEAD) if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat))) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) H.updatehealth() @@ -281,7 +281,7 @@ H.throw_at(throw_target, 4, 3) H.DefaultCombatKnockdown(30) H.adjustStaminaLoss(30) - var/head_slot = H.get_item_by_slot(SLOT_HEAD) + var/head_slot = H.get_item_by_slot(ITEM_SLOT_HEAD) if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat))) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1) H.updatehealth() diff --git a/modular_citadel/code/datums/components/souldeath.dm b/modular_citadel/code/datums/components/souldeath.dm index ab45210a46..01e6acb795 100644 --- a/modular_citadel/code/datums/components/souldeath.dm +++ b/modular_citadel/code/datums/components/souldeath.dm @@ -32,4 +32,4 @@ playsound(wearer, 'sound/misc/souldeath.ogg', 100, FALSE) /datum/component/souldeath/neck - equip_slot = SLOT_NECK + equip_slot = ITEM_SLOT_NECK diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index f2c7b398cf..fe53574470 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -2,289 +2,289 @@ /datum/gear/donator name = "IF YOU SEE THIS, PING A CODER RIGHT NOW!" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/bikehorn/golden category = LOADOUT_CATEGORY_DONATOR ckeywhitelist = list("This entry should never appear with this variable set.") //If it does, then that means somebody fucked up the whitelist system pretty hard /datum/gear/donator/pet name = "Pet Beacon" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/choice_beacon/pet ckeywhitelist = list() donator_group_id = DONATOR_GROUP_TIER_1 // can be accessed by all donators /datum/gear/donator/carpet name = "Carpet Beacon" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/choice_beacon/box/carpet ckeywhitelist = list() donator_group_id = DONATOR_GROUP_TIER_1 /datum/gear/donator/chameleon_bedsheet name = "Chameleon Bedsheet" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/bedsheet/chameleon ckeywhitelist = list() donator_group_id = DONATOR_GROUP_TIER_1 /datum/gear/donator/donortestingbikehorn name = "Donor item testing bikehorn" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/bikehorn geargroupID = list("DONORTEST") //This is a list mainly for the sake of testing, but geargroupID works just fine with ordinary strings /datum/gear/donator/kevhorn name = "Airhorn" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/bikehorn/airhorn ckeywhitelist = list("kevinz000") /datum/gear/donator/kiaracloak name = "Kiara's cloak" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/cloak/inferno ckeywhitelist = list("inferno707") /datum/gear/donator/kiaracollar name = "Kiara's collar" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/petcollar/inferno ckeywhitelist = list("inferno707") /datum/gear/donator/kiaramedal name = "Insignia of Steele" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/clothing/accessory/medal/steele ckeywhitelist = list("inferno707") /datum/gear/donator/hheart name = "The Hollow Heart" - slot = SLOT_WEAR_MASK + slot = ITEM_SLOT_MASK path = /obj/item/clothing/mask/hheart ckeywhitelist = list("inferno707") /datum/gear/donator/engravedzippo name = "Engraved zippo" - slot = SLOT_HANDS + slot = ITEM_SLOT_HANDS path = /obj/item/lighter/gold ckeywhitelist = list("dirtyoldharry") /datum/gear/donator/geisha name = "Geisha suit" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/costume/geisha ckeywhitelist = list("atiefling") /datum/gear/donator/specialscarf name = "Special scarf" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/scarf/zomb ckeywhitelist = list("zombierobin") /datum/gear/donator/redmadcoat name = "The Mad's labcoat" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/toggle/labcoat/mad/red ckeywhitelist = list("zombierobin") /datum/gear/donator/santahat name = "Santa hat" - slot = SLOT_HEAD + slot = ITEM_SLOT_HEAD path = /obj/item/clothing/head/santa/fluff ckeywhitelist = list("illotafv") /datum/gear/donator/reindeerhat name = "Reindeer hat" - slot = SLOT_HEAD + slot = ITEM_SLOT_HEAD path = /obj/item/clothing/head/hardhat/reindeer/fluff ckeywhitelist = list("illotafv") /datum/gear/donator/treeplushie name = "Christmas tree plushie" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/toy/plush/tree ckeywhitelist = list("illotafv") /datum/gear/donator/santaoutfit name = "Santa costume" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/space/santa/fluff ckeywhitelist = list("illotafv") /datum/gear/donator/treecloak name = "Christmas tree cloak" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/cloak/festive ckeywhitelist = list("illotafv") /datum/gear/donator/carrotplush name = "Carrot plushie" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/toy/plush/carrot ckeywhitelist = list("improvedname") /datum/gear/donator/carrotcloak name = "Carrot cloak" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/cloak/carrot ckeywhitelist = list("improvedname") /datum/gear/donator/albortorosamask name = "Alborto Rosa mask" - slot = SLOT_WEAR_MASK + slot = ITEM_SLOT_MASK path = /obj/item/clothing/mask/luchador/zigfie ckeywhitelist = list("zigfie") /datum/gear/donator/mankini name = "Mankini" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/misc/stripper/mankini ckeywhitelist = list("zigfie") /datum/gear/donator/pinkshoes name = "Pink shoes" - slot = SLOT_SHOES + slot = ITEM_SLOT_FEET path = /obj/item/clothing/shoes/sneakers/pink ckeywhitelist = list("zigfie") /datum/gear/donator/reecesgreatcoat name = "Reece's Great Coat" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/trenchcoat/green ckeywhitelist = list("geemiesif") /datum/gear/donator/russianflask name = "Russian flask" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/reagent_containers/food/drinks/flask/russian cost = 2 ckeywhitelist = list("slomka") /datum/gear/donator/stalkermask name = "S.T.A.L.K.E.R. mask" - slot = SLOT_WEAR_MASK + slot = ITEM_SLOT_MASK path = /obj/item/clothing/mask/gas/stalker ckeywhitelist = list("slomka") /datum/gear/donator/stripedcollar name = "Striped collar" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/petcollar/stripe ckeywhitelist = list("jademanique") /datum/gear/donator/performersoutfit name = "Bluish performer's outfit" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/costume/singer/yellow/custom ckeywhitelist = list("killer402402") /datum/gear/donator/vermillion name = "Vermillion clothing" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/suit/vermillion ckeywhitelist = list("fractious") /datum/gear/donator/AM4B name = "Foam Force AM4-B" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/gun/ballistic/automatic/AM4B ckeywhitelist = list("zeronetalpha") /datum/gear/donator/carrotsatchel name = "Carrot Satchel" - slot = SLOT_HANDS + slot = ITEM_SLOT_HANDS path = /obj/item/storage/backpack/satchel/carrot ckeywhitelist = list("improvedname") /datum/gear/donator/naomisweater name = "worn black sweater" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/sweater/black/naomi ckeywhitelist = list("technicalmagi") /datum/gear/donator/naomicollar name = "worn pet collar" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/petcollar/naomi ckeywhitelist = list("technicalmagi") /datum/gear/donator/gladiator name = "Gladiator Armor" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/under/costume/gladiator ckeywhitelist = list("aroche") /datum/gear/donator/bloodredtie name = "Blood Red Tie" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/tie/bloodred ckeywhitelist = list("kyutness") /datum/gear/donator/puffydress name = "Puffy Dress" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/puffydress ckeywhitelist = list("stallingratt") /datum/gear/donator/labredblack name = "Black and Red Coat" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/toggle/labcoat/labredblack ckeywhitelist = list("blakeryan", "durandalphor") /datum/gear/donator/torisword name = "Rainbow Zweihander" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/dualsaber/hypereutactic/toy/rainbow ckeywhitelist = list("annoymous35") /datum/gear/donator/darksabre name = "Dark Sabre" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/toy/darksabre ckeywhitelist = list("inferno707") /datum/gear/donator/darksabresheath name = "Dark Sabre Sheath" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/storage/belt/sabre/darksabre ckeywhitelist = list("inferno707") /datum/gear/donator/toriball name = "Rainbow Tennis Ball" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/toy/fluff/tennis_poly/tri/squeak/rainbow ckeywhitelist = list("annoymous35") /datum/gear/donator/izzyball name = "Katlin's Ball" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/toy/fluff/tennis_poly/tri/squeak/izzy ckeywhitelist = list("izzyinbox") /datum/gear/donator/cloak name = "Green Cloak" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/cloak/green ckeywhitelist = list("killer402402") /datum/gear/donator/steelflask name = "Steel Flask" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/reagent_containers/food/drinks/flask/steel cost = 2 ckeywhitelist = list("nik707") /datum/gear/donator/paperhat name = "Paper Hat" - slot = SLOT_HEAD + slot = ITEM_SLOT_HEAD path = /obj/item/clothing/head/paperhat ckeywhitelist = list("kered2") /datum/gear/donator/cloakce name = "Polychromic CE Cloak" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/clothing/neck/cloak/polychromic/polyce ckeywhitelist = list("worksbythesea", "blakeryan") loadout_flags = LOADOUT_CAN_COLOR_POLYCHROMIC @@ -292,290 +292,290 @@ /datum/gear/donator/ssk name = "Stun Sword Kit" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/ssword_kit ckeywhitelist = list("phillip458") /datum/gear/donator/techcoat name = "Techomancers Labcoat" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/clothing/suit/toggle/labcoat/mad/techcoat ckeywhitelist = list("wilchen") /datum/gear/donator/leechjar name = "Jar of Leeches" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/custom/leechjar ckeywhitelist = list("sgtryder") /datum/gear/donator/darkarmor name = "Dark Armor" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/clothing/suit/armor/vest/darkcarapace ckeywhitelist = list("inferno707") /datum/gear/donator/devilwings name = "Strange Wings" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/devilwings ckeywhitelist = list("kitsun") /datum/gear/donator/flagcape name = "US Flag Cape" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/clothing/neck/flagcape ckeywhitelist = list("darnchacha") /datum/gear/donator/luckyjack name = "Lucky Jackboots" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/clothing/shoes/lucky ckeywhitelist = list("donaldtrumpthecommunist") /datum/gear/donator/raiqbawks name = "Miami Boombox" - slot = SLOT_HANDS + slot = ITEM_SLOT_HANDS cost = 2 path = /obj/item/boombox/raiq ckeywhitelist = list("chefferz") /datum/gear/donator/m41 name = "Toy M41" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/toy/gun/m41 ckeywhitelist = list("thalverscholen") /datum/gear/donator/Divine_robes name = "Divine robes" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/custom/lunasune ckeywhitelist = list("invader4352") /datum/gear/donator/gothcoat name = "Goth Coat" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/gothcoat ckeywhitelist = list("norko") /datum/gear/donator/corgisuit name = "Corgi Suit" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/hooded/ian_costume ckeywhitelist = list("cathodetherobot") /datum/gear/donator/sharkcloth name = "Leon's Skimpy Outfit" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/under/custom/leoskimpy ckeywhitelist = list("spectrosis") /datum/gear/donator/mimemask name = "Mime Mask" - slot = SLOT_WEAR_MASK + slot = ITEM_SLOT_MASK path = /obj/item/clothing/mask/gas/mime ckeywhitelist = list("pireamaineach") /datum/gear/donator/mimeoveralls name = "Mime's Overalls" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/under/custom/mimeoveralls ckeywhitelist = list("pireamaineach") /datum/gear/donator/soulneck name = "Soul Necklace" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/undertale ckeywhitelist = list("twilightic") /datum/gear/donator/frenchberet name = "French Beret" - slot = SLOT_HEAD + slot = ITEM_SLOT_HEAD path = /obj/item/clothing/head/frenchberet ckeywhitelist = list("notazoltan") /datum/gear/donator/zuliecloak name = "Project: Zul-E" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/hooded/cloak/zuliecloak ckeywhitelist = list("asky") /datum/gear/donator/blackredgold name = "Black, Red, and Gold Coat" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/blackredgold ckeywhitelist = list("ttbnc") /datum/gear/donator/fritzplush name = "Fritz Plushie" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/toy/plush/mammal/dog/fritz ckeywhitelist = list("analwerewolf") /datum/gear/donator/kimono name = "Kimono" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/kimono ckeywhitelist = list("sfox63") /datum/gear/donator/commjacket name = "Dusty Commisar's Cloak" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/commjacket ckeywhitelist = list("sadisticbatter") /datum/gear/donator/mw2_russian_para name = "Russian Paratrooper Jumper" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/custom/mw2_russian_para ckeywhitelist = list("investigator77") /datum/gear/donator/longblackgloves name = "Luna's Gauntlets" - slot = SLOT_GLOVES + slot = ITEM_SLOT_GLOVES path = /obj/item/clothing/gloves/longblackgloves ckeywhitelist = list("bigmanclancy") /datum/gear/donator/trendy_fit name = "Trendy Fit" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/custom/trendy_fit ckeywhitelist = list("midgetdragon") /datum/gear/donator/singery name = "Yellow Performer Outfit" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/costume/singer/yellow ckeywhitelist = list("maxlynchy") /datum/gear/donator/csheet name = "NT Bedsheet" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/bedsheet/captain ckeywhitelist = list("tikibomb") /datum/gear/donator/borgplush name = "Robot Plush" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/toy/plush/borgplushie ckeywhitelist = list("nicholaiavenicci") /datum/gear/donator/donorberet name = "Atmos Beret" - slot = SLOT_HEAD + slot = ITEM_SLOT_HEAD path = /obj/item/clothing/head/blueberet ckeywhitelist = list("foxystalin") /datum/gear/donator/donorgoggles name = "Flight Goggles" - slot = SLOT_HEAD + slot = ITEM_SLOT_HEAD path = /obj/item/clothing/head/flight ckeywhitelist = list("maxlynchy") /datum/gear/donator/onionneck name = "Onion Necklace" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/necklace/onion ckeywhitelist = list("cdrcross") /datum/gear/donator/mikubikini name = "starlight singer bikini" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/custom/mikubikini ckeywhitelist = list("grandvegeta") /datum/gear/donator/mikujacket name = "starlight singer jacket" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/mikujacket ckeywhitelist = list("grandvegeta") /datum/gear/donator/mikuhair name = "starlight singer hair" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/head/mikuhair ckeywhitelist = list("grandvegeta") /datum/gear/donator/mikugloves name = "starlight singer gloves" - slot = SLOT_GLOVES + slot = ITEM_SLOT_GLOVES path = /obj/item/clothing/gloves/mikugloves ckeywhitelist = list("grandvegeta") /datum/gear/donator/mikuleggings name = "starlight singer leggings" - slot = SLOT_SHOES + slot = ITEM_SLOT_FEET path = /obj/item/clothing/shoes/sneakers/mikuleggings ckeywhitelist = list("grandvegeta") /datum/gear/donator/cosmos name = "cosmic space bedsheet" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/bedsheet/cosmos ckeywhitelist = list("grunnyyy") /datum/gear/donator/customskirt name = "custom atmos skirt" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/clothing/under/custom/customskirt ckeywhitelist = list("thakyz") /datum/gear/donator/hisakaki name = "halo" - slot = SLOT_HEAD + slot = ITEM_SLOT_HEAD path = /obj/item/clothing/head/halo ckeywhitelist = list("hisakaki") /datum/gear/donator/vest name = "vest and shirt" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/custom/vest ckeywhitelist = list("maylowfox") /datum/gear/donator/exo name = "exo frame" - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/custom/exo ckeywhitelist = list("jesterz7") /datum/gear/donator/choker name = "NT Choker" - slot = SLOT_NECK + slot = ITEM_SLOT_NECK path = /obj/item/clothing/neck/petcollar/donorchoker ckeywhitelist = list("trigillass") /datum/gear/donator/strangemask name = "Strange Metal Mask" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/clothing/mask/breath/mmask ckeywhitelist = list("sneka") /datum/gear/donator/smaiden name = "shrine maiden outfit" - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/smaiden ckeywhitelist = list("ultimarifox") /datum/gear/donator/mgasmask name = "Military Gas Mask" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/clothing/mask/gas/military ckeywhitelist = list("unclebourbon") /datum/gear/donator/clownmask name = "Clown Mask" - path = SLOT_WEAR_MASK + path = ITEM_SLOT_MASK path = /obj/item/clothing/mask/gas/clown_hat ckeywhitelist = list("djkouta") /datum/gear/donator/spacehoodie name = "Space Hoodie" - path = SLOT_WEAR_SUIT + path = ITEM_SLOT_OCLOTHING path = /obj/item/clothing/suit/spacehoodie ckeywhitelist = list("bidlink2") /datum/gear/donator/pokerchips name = "pokerchip set" - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK path = /obj/item/storage/box/pockerchips ckeywhitelist = list("greed2323") diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index 466ee50474..3824993009 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -1,7 +1,7 @@ /datum/gear/backpack category = LOADOUT_CATEGORY_BACKPACK subcategory = LOADOUT_SUBCATEGORY_BACKPACK_GENERAL - slot = SLOT_IN_BACKPACK + slot = ITEM_SLOT_BACKPACK /datum/gear/backpack/plushbox name = "Plushie Choice Box" diff --git a/modular_citadel/code/modules/client/loadout/glasses.dm b/modular_citadel/code/modules/client/loadout/glasses.dm index f3b07657f4..fe44abc3de 100644 --- a/modular_citadel/code/modules/client/loadout/glasses.dm +++ b/modular_citadel/code/modules/client/loadout/glasses.dm @@ -1,6 +1,6 @@ /datum/gear/glasses category = LOADOUT_CATEGORY_GLASSES - slot = SLOT_GLASSES + slot = ITEM_SLOT_EYES /datum/gear/glasses/blindfold name = "Blindfold" diff --git a/modular_citadel/code/modules/client/loadout/gloves.dm b/modular_citadel/code/modules/client/loadout/gloves.dm index 09694ddec7..2a80d43bb1 100644 --- a/modular_citadel/code/modules/client/loadout/gloves.dm +++ b/modular_citadel/code/modules/client/loadout/gloves.dm @@ -1,6 +1,6 @@ /datum/gear/gloves category = LOADOUT_CATEGORY_GLOVES - slot = SLOT_GLOVES + slot = ITEM_SLOT_GLOVES /datum/gear/gloves/fingerless name = "Fingerless Gloves" @@ -9,7 +9,7 @@ /datum/gear/gloves/evening name = "Evening gloves" path = /obj/item/clothing/gloves/evening - + /datum/gear/gloves/midnight name = "Midnight gloves" path = /obj/item/clothing/gloves/evening/black diff --git a/modular_citadel/code/modules/client/loadout/hands.dm b/modular_citadel/code/modules/client/loadout/hands.dm index eb496ed78c..5dbe8b33dd 100644 --- a/modular_citadel/code/modules/client/loadout/hands.dm +++ b/modular_citadel/code/modules/client/loadout/hands.dm @@ -1,6 +1,6 @@ /datum/gear/hands category = LOADOUT_CATEGORY_HANDS - slot = SLOT_HANDS + slot = ITEM_SLOT_HANDS /datum/gear/hands/cane name = "Cane" diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm index 6d6c803ef1..f2a7ead5be 100644 --- a/modular_citadel/code/modules/client/loadout/head.dm +++ b/modular_citadel/code/modules/client/loadout/head.dm @@ -1,7 +1,7 @@ /datum/gear/head category = LOADOUT_CATEGORY_HEAD subcategory = LOADOUT_SUBCATEGORY_HEAD_GENERAL - slot = SLOT_HEAD + slot = ITEM_SLOT_HEAD /datum/gear/head/baseball name = "Ballcap" @@ -156,12 +156,12 @@ /*Commenting out Until next Christmas or made automatic /datum/gear/santahatr name = "Red Santa Hat" - category = SLOT_HEAD + category = ITEM_SLOT_HEAD path = /obj/item/clothing/head/christmashat /datum/gear/santahatg name = "Green Santa Hat" - category = SLOT_HEAD + category = ITEM_SLOT_HEAD path = /obj/item/clothing/head/christmashatg */ diff --git a/modular_citadel/code/modules/client/loadout/mask.dm b/modular_citadel/code/modules/client/loadout/mask.dm index 52e79884c2..16b47e60e7 100644 --- a/modular_citadel/code/modules/client/loadout/mask.dm +++ b/modular_citadel/code/modules/client/loadout/mask.dm @@ -1,6 +1,6 @@ /datum/gear/mask category = LOADOUT_CATEGORY_MASK - slot = SLOT_WEAR_MASK + slot = ITEM_SLOT_MASK /datum/gear/mask/balaclava name = "Balaclava" diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm index 128285628a..b07ddf98db 100644 --- a/modular_citadel/code/modules/client/loadout/neck.dm +++ b/modular_citadel/code/modules/client/loadout/neck.dm @@ -1,7 +1,7 @@ /datum/gear/neck category = LOADOUT_CATEGORY_NECK subcategory = LOADOUT_SUBCATEGORY_NECK_GENERAL - slot = SLOT_NECK + slot = ITEM_SLOT_NECK /datum/gear/neck/bluetie name = "Blue tie" diff --git a/modular_citadel/code/modules/client/loadout/shoes.dm b/modular_citadel/code/modules/client/loadout/shoes.dm index e2b3916ae0..394c957f36 100644 --- a/modular_citadel/code/modules/client/loadout/shoes.dm +++ b/modular_citadel/code/modules/client/loadout/shoes.dm @@ -1,6 +1,6 @@ /datum/gear/shoes category = LOADOUT_CATEGORY_SHOES - slot = SLOT_SHOES + slot = ITEM_SLOT_FEET /datum/gear/shoes/laceup name = "Laceup shoes" diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm index 066bcf14c7..1d4a29ef3e 100644 --- a/modular_citadel/code/modules/client/loadout/suit.dm +++ b/modular_citadel/code/modules/client/loadout/suit.dm @@ -1,7 +1,7 @@ /datum/gear/suit category = LOADOUT_CATEGORY_SUIT subcategory = LOADOUT_SUBCATEGORY_SUIT_GENERAL - slot = SLOT_WEAR_SUIT + slot = ITEM_SLOT_OCLOTHING /datum/gear/suit/poncho name = "Poncho" diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm index c16aa5ea55..2b2f3b53e4 100644 --- a/modular_citadel/code/modules/client/loadout/uniform.dm +++ b/modular_citadel/code/modules/client/loadout/uniform.dm @@ -1,7 +1,7 @@ /datum/gear/uniform category = LOADOUT_CATEGORY_UNIFORM subcategory = LOADOUT_SUBCATEGORY_UNIFORM_GENERAL - slot = SLOT_W_UNIFORM + slot = ITEM_SLOT_ICLOTHING /datum/gear/uniform/suit name = "Black suit" @@ -636,27 +636,27 @@ /*Commenting out Until next Christmas or made automatic /datum/gear/uniform/christmasmaler name = "Red Masculine Christmas Suit" - category = SLOT_W_UNIFORM + category = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/costume/christmas /datum/gear/uniform/christmasmaleg name = "Green Masculine Christmas Suit" - category = SLOT_W_UNIFORM + category = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/costume/christmas/green /datum/gear/uniform/christmasfemaler name = "Red Feminine Christmas Suit" - category = SLOT_W_UNIFORM + category = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/costume/christmas/croptop /datum/gear/uniform/christmasfemaleg name = "Green Feminine Christmas Suit" - category = SLOT_W_UNIFORM + category = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/costume/christmas/croptop/green /datum/gear/uniform/pinkstripper name = "Pink stripper outfit" - category = SLOT_W_UNIFORM + category = ITEM_SLOT_ICLOTHING path = /obj/item/clothing/under/misc/stripper cost = 3 */ diff --git a/modular_citadel/code/modules/client/loadout/unlockable.dm b/modular_citadel/code/modules/client/loadout/unlockable.dm index 67e0c06d8c..9db05a66e9 100644 --- a/modular_citadel/code/modules/client/loadout/unlockable.dm +++ b/modular_citadel/code/modules/client/loadout/unlockable.dm @@ -1,6 +1,6 @@ /datum/gear/unlockable category = LOADOUT_CATEGORY_UNLOCKABLE - slot = SLOT_NECK + slot = ITEM_SLOT_NECK var/progress_required //what does our progress need to be to unlock it var/progress_key //what is the key used to retrieve existing progress for this unlockable diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index cb1b9728af..b8ee221e73 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -77,7 +77,7 @@ item_state = "gold_zippo" w_class = WEIGHT_CLASS_TINY flags_1 = CONDUCT_1 - slot_flags = SLOT_BELT + slot_flags = ITEM_SLOT_BELT heat = 1500 resistance_flags = FIRE_PROOF light_color = LIGHT_COLOR_FIRE @@ -404,7 +404,7 @@ mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' hoodtype = /obj/item/clothing/head/hooded/cloakhood/zuliecloak body_parts_covered = CHEST|GROIN|ARMS - slot_flags = SLOT_WEAR_SUIT | ITEM_SLOT_NECK //it's a cloak. it's cosmetic. so why the hell not? what could possibly go wrong? + slot_flags = ITEM_SLOT_OCLOTHING | ITEM_SLOT_NECK //it's a cloak. it's cosmetic. so why the hell not? what could possibly go wrong? mutantrace_variation = NONE /obj/item/clothing/head/hooded/cloakhood/zuliecloak diff --git a/modular_citadel/code/modules/custom_loadout/load_to_mob.dm b/modular_citadel/code/modules/custom_loadout/load_to_mob.dm index 79f17afc74..1d28c7320c 100644 --- a/modular_citadel/code/modules/custom_loadout/load_to_mob.dm +++ b/modular_citadel/code/modules/custom_loadout/load_to_mob.dm @@ -52,7 +52,7 @@ loaded_atom.forceMove(T) continue var/obj/item/loaded = loaded_atom - var/obj/item/storage/S = H.get_item_by_slot(SLOT_BACK) + var/obj/item/storage/S = H.get_item_by_slot(ITEM_SLOT_BACK) if(istype(S)) SEND_SIGNAL(S, COMSIG_TRY_STORAGE_INSERT,loaded, TRUE, H) //Force it into their backpack continue diff --git a/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm b/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm index dbf5ad0648..85bbf109bf 100644 --- a/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm +++ b/modular_citadel/code/modules/eventmaps/Spookystation/JTGSZwork.dm @@ -1024,7 +1024,7 @@ GLOBAL_LIST_EMPTY(rain_sounds) lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' righthand_file = 'icons/mob/inhands/items_righthand.dmi' icon_state = "umbrella_closed" - slot_flags = SLOT_BELT + slot_flags = ITEM_SLOT_BELT force = 5 throwforce = 5 w_class = WEIGHT_CLASS_SMALL diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm index 537eb76a66..bc598e81e3 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm @@ -48,7 +48,7 @@ var/obj/item/W = M.head M.dropItemToGround(W, TRUE) var/hat = new /obj/item/clothing/head/hattip() - M.equip_to_slot(hat, SLOT_HEAD, 1, 1) + M.equip_to_slot(hat, ITEM_SLOT_HEAD, 1, 1) /datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M) diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index ab4d49c56f..b6391ba82d 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -37,7 +37,7 @@ /obj/item/clothing/head/hattip/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) From de96a68bf52823a7a40f4ddab91b2b02dbaf7413 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 25 Feb 2022 17:01:48 -0300 Subject: [PATCH 35/56] mistake --- code/__DEFINES/DNA.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index f73d123697..cf98755a36 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -158,7 +158,7 @@ #define ORGAN_SLOT_STOMACH "stomach" #define ORGAN_SLOT_STOMACH_AID "stomach_aid" #define ORGAN_SLOT_BREATHING_TUBE "breathing_tube" -#define ORGAN_ITEM_SLOT_EARS "ears" +#define ORGAN_SLOT_EARS "ears" #define ORGAN_SLOT_EYES "eye_sight" #define ORGAN_SLOT_LUNGS "lungs" #define ORGAN_SLOT_HEART "heart" From e1f1848904e03f1f25ed293e4f4adad7fe1d7acd Mon Sep 17 00:00:00 2001 From: BongaTheProto <93835010+BongaTheProto@users.noreply.github.com> Date: Fri, 25 Feb 2022 15:03:59 -0500 Subject: [PATCH 36/56] yeah ok that should be it --- .../code/datums/interactions/lewd/_lewd.dm | 4 +- .../interactions/lewd/lewd_interactions.dm | 16 -- .../code/datums/interactions/lewd/_lewd.dm | 205 ++++++++++++++---- .../datums/interactions/lewd/lewd_datums.dm | 65 ++++++ .../interactions/lewd/lewd_interactions.dm | 74 +++++++ .../hostile/deathclaw/funclaw.dm | 12 +- 6 files changed, 313 insertions(+), 63 deletions(-) diff --git a/modular_sand/code/datums/interactions/lewd/_lewd.dm b/modular_sand/code/datums/interactions/lewd/_lewd.dm index 8e385cc9b6..03261d449b 100644 --- a/modular_sand/code/datums/interactions/lewd/_lewd.dm +++ b/modular_sand/code/datums/interactions/lewd/_lewd.dm @@ -1743,7 +1743,7 @@ moan() return FALSE -/mob/living/proc/get_unconsenting(var/extreme = FALSE, var/list/ignored_mobs, var/unholy = FALSE) +/mob/living/proc/get_unconsenting(var/extreme = FALSE, var/list/ignored_mobs) var/list/nope = list() nope += ignored_mobs for(var/mob/M in range(7, src)) @@ -1751,8 +1751,6 @@ var/client/cli = M.client if(!(cli.prefs.toggles & VERB_CONSENT)) //Note: This probably could do with a specific preference nope += M - else if(unholy && (cli.prefs.unholypref == "No")) - nope += M else if(extreme && (cli.prefs.extremepref == "No")) nope += M else diff --git a/modular_sand/code/datums/interactions/lewd/lewd_interactions.dm b/modular_sand/code/datums/interactions/lewd/lewd_interactions.dm index cec48bfa15..97aac67d0a 100644 --- a/modular_sand/code/datums/interactions/lewd/lewd_interactions.dm +++ b/modular_sand/code/datums/interactions/lewd/lewd_interactions.dm @@ -291,14 +291,6 @@ to_chat(user, "Your earsockets need to be unexposed.") return FALSE - if(unholy) - var/client/cli = user.client - if(cli) - if(cli.prefs.unholypref == "No") - if(!silent) - to_chat(user, "That's way too much for you.") - return FALSE - if(extreme) var/client/cli = user.client if(cli) @@ -535,14 +527,6 @@ to_chat(user, "Their clothes are in the way.") return FALSE - if(unholy) - var/client/cli = target.client - if(cli) - if(target.client.prefs.unholypref == "No") - if(!silent) - to_chat(user, "For some reason, you don't want to do this to [target].") - return FALSE - if(extreme) var/client/cli = target.client if(cli) diff --git a/modular_splurt/code/datums/interactions/lewd/_lewd.dm b/modular_splurt/code/datums/interactions/lewd/_lewd.dm index 259d6e6265..ea98149f44 100644 --- a/modular_splurt/code/datums/interactions/lewd/_lewd.dm +++ b/modular_splurt/code/datums/interactions/lewd/_lewd.dm @@ -1,21 +1,20 @@ #define CUM_TARGET_NIPPLE "nipple" #define CUM_TARGET_URETHRA "urethra" +#define CUM_TARGET_THIGHS "thighs" /mob/living/cum(mob/living/partner, target_orifice) var/message - var/u_His = p_their() - var/u_He = p_they() - var/u_S = p_s() - var/t_His = partner?.p_their() + //var/u_His = p_their() + //var/u_He = p_they() + //var/u_S = p_s() + //var/t_His = partner?.p_their() var/cumin = FALSE - var/partner_carbon_check = FALSE var/obj/item/organ/genital/target_gen var/mob/living/carbon/c_partner var/cum_the_II = FALSE //If the cumming interaction is fully handled here or goes back to ..() //Carbon checks if(iscarbon(partner)) c_partner = partner - partner_carbon_check = TRUE if(src != partner) if(!last_genital) @@ -31,31 +30,39 @@ target_gen = partner.getorganslot(ORGAN_SLOT_BREASTS) else message = "cums on \the [partner]'s chest and neck." - if(partner.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) + if((partner.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) && c_partner) target_gen = new /obj/item/organ/genital/breasts - target_gen.Insert(partner) - + target_gen.Insert(c_partner) if(target_gen) target_gen.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS)) if(CUM_TARGET_URETHRA) cum_the_II = TRUE cumin = TRUE message = "cums down \the [partner]'s [pick(GLOB.dick_nouns + list("[pick("cock", "dick")]hole", "urethra"))]!" - target_gen = partner.getorganslot(ORGAN_SLOT_PENIS) - target_gen.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS)) + if(c_partner) + target_gen = partner.getorganslot(ORGAN_SLOT_PENIS) + target_gen.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS)) + if(CUM_TARGET_THIGHS) + cum_the_II = TRUE + if(partner.has_legs() >= 2) + message = "cums right into \the [partner]'s thighs!" + else + message = "cums... somehow..." + if(CUM_TARGET_MOUTH, CUM_TARGET_THROAT, CUM_TARGET_VAGINA, CUM_TARGET_BELLY, CUM_TARGET_ANUS) - if(partner.client?.prefs.cit_toggles & BELLY_INFLATION) - var/obj/item/organ/genital/belly/gut = partner.getorganslot(ORGAN_SLOT_BELLY) - if(!gut) - gut = new - gut.Insert(partner) - gut.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS), target_orifice) - else if((partner.client?.prefs.cit_toggles & BUTT_ENLARGEMENT) && target_orifice == CUM_TARGET_ANUS) - var/obj/item/organ/genital/butt/ass = partner.getorganslot(ORGAN_SLOT_BUTT) - if(!ass) - ass = new - ass.Insert(partner) - ass.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS)) + if(c_partner) + if(partner.client?.prefs.cit_toggles & BELLY_INFLATION) + var/obj/item/organ/genital/belly/gut = partner.getorganslot(ORGAN_SLOT_BELLY) + if(!gut) + gut = new + gut.Insert(partner) + gut.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS), target_orifice) + else if((partner.client?.prefs.cit_toggles & BUTT_ENLARGEMENT) && target_orifice == CUM_TARGET_ANUS) + var/obj/item/organ/genital/butt/ass = partner.getorganslot(ORGAN_SLOT_BUTT) + if(!ass) + ass = new + ass.Insert(partner) + ass.climax_modify_size(src, getorganslot(ORGAN_SLOT_PENIS)) else switch(last_genital.type) if(/obj/item/organ/genital/penis) @@ -70,7 +77,7 @@ target_gen = partner.getorganslot(ORGAN_SLOT_BREASTS) else message = "cums on \the [partner]'s chest and neck." - if(partner.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) + if((partner.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) && c_partner) target_gen = new /obj/item/organ/genital/breasts target_gen.Insert(partner) @@ -80,21 +87,30 @@ cum_the_II = TRUE cumin = TRUE message = "cums down \the [partner]'s [pick(GLOB.dick_nouns + list("[pick("cock", "dick")]hole", "urethra"))]!" - target_gen = partner.getorganslot(ORGAN_SLOT_PENIS) - target_gen.climax_modify_size(src, last_genital) + if(c_partner) + target_gen = partner.getorganslot(ORGAN_SLOT_PENIS) + target_gen.climax_modify_size(src, last_genital) + if(CUM_TARGET_THIGHS) + cum_the_II = TRUE + if(partner.has_legs() >= 2) + message = "cums right into \the [partner]'s thighs!" + else + message = "cums... somehow..." + if(CUM_TARGET_MOUTH, CUM_TARGET_THROAT, CUM_TARGET_VAGINA, CUM_TARGET_BELLY, CUM_TARGET_ANUS) - if(partner.client?.prefs.cit_toggles & BELLY_INFLATION) - var/obj/item/organ/genital/belly/gut = partner.getorganslot(ORGAN_SLOT_BELLY) - if(!gut) - gut = new - gut.Insert(partner) - gut.climax_modify_size(src, last_genital, target_orifice) - else if((partner.client?.prefs.cit_toggles & BUTT_ENLARGEMENT) && target_orifice == CUM_TARGET_ANUS) - var/obj/item/organ/genital/butt/ass = partner.getorganslot(ORGAN_SLOT_BUTT) - if(!ass) - ass = new - ass.Insert(partner) - ass.climax_modify_size(src, last_genital) + if(c_partner) + if(partner.client?.prefs.cit_toggles & BELLY_INFLATION) + var/obj/item/organ/genital/belly/gut = partner.getorganslot(ORGAN_SLOT_BELLY) + if(!gut) + gut = new + gut.Insert(partner) + gut.climax_modify_size(src, last_genital, target_orifice) + else if((partner.client?.prefs.cit_toggles & BUTT_ENLARGEMENT) && target_orifice == CUM_TARGET_ANUS) + var/obj/item/organ/genital/butt/ass = partner.getorganslot(ORGAN_SLOT_BUTT) + if(!ass) + ass = new + ass.Insert(partner) + ass.climax_modify_size(src, last_genital) if(!cum_the_II) return ..() if(gender == MALE) @@ -130,6 +146,28 @@ set_lust(0) SEND_SIGNAL(src, COMSIG_MOB_CAME, target_orifice, partner) +/mob/living/get_unconsenting(extreme, list/ignored_mobs, var/unholy) + for(var/mob/M in range(7, src)) + if(M.client) + var/client/cli = M.client + if(unholy && (cli.prefs.unholypref == "No")) + LAZYADD(ignored_mobs, M) + . = ..() + +/mob/living/proc/has_legs(nintendo = REQUIRE_ANY) + var/legs = has_left_leg() + has_right_leg() + if(legs) + switch(nintendo) + if(REQUIRE_EXPOSED) + if(is_bottomless()) + return legs + if(REQUIRE_UNEXPOSED) + if(!is_bottomless()) + return legs + if(REQUIRE_ANY) + return legs + return FALSE + // Interaction Procs /mob/living/proc/do_breastsmother(mob/living/target) @@ -280,6 +318,97 @@ handle_post_sex(NORMAL_LUST, CUM_TARGET_URETHRA, target) target.handle_post_sex(NORMAL_LUST, CUM_TARGET_URETHRA, src) +/mob/living/proc/do_nipfuck(mob/living/target) + var/message + var/list/lines + var/u_His = p_their() + var/t_His = target.p_their() + if(is_fucking(target, CUM_TARGET_NIPPLE) && target.has_breasts(REQUIRE_EXPOSED)) + lines = list( + "slides [u_His] [pick(GLOB.dick_nouns)] back and forth into \the [target]'s nipple", + "thrusts in and out of \the [target]'s leaky and puffy nip, making [t_His] [pick(GLOB.breast_nouns)] slosh and leak", + "'s balls slap loudly against \the [target]'s jostling [pick(GLOB.breast_nouns)] as [t_His] nipple swallows [u_His] [pick(GLOB.dick_nouns)] whole" + ) + else if(target.has_breasts(REQUIRE_EXPOSED)) + lines = list( + "presses [u_His] throbbing tip against \the [target]'s puffy nipple, forcing the whole lenght all the way in with a wet smack", + "stretches \the [target]'s nipple with his fingers, before forcing it open with the whole girth of [u_His] twitching [pick(GLOB.dick_nouns)]" + ) + else + lines = list( + "rubs [u_His] tip gently against \the [target]'s [pick("nipple", "chest")]", + "slaps [u_His] snaky [pick(GLOB.dick_nouns)] into \the [target]'s chest", + "smooches \the [target]'s nipple with [u_His] dickhole" + ) + + if(!is_fucking(target, CUM_TARGET_NIPPLE)) + set_is_fucking(target, CUM_TARGET_NIPPLE, getorganslot(ORGAN_SLOT_PENIS)) + + message = "\The [src] [pick(lines)]!" + visible_message(message, ignored_mobs = get_unconsenting()) + playlewdinteractionsound(src, pick('modular_sand/sound/interactions/bang1.ogg', + 'modular_sand/sound/interactions/bang2.ogg', + 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1) + handle_post_sex(NORMAL_LUST, CUM_TARGET_NIPPLE, target) + target.handle_post_sex(NORMAL_LUST, null, src) + +/mob/living/proc/do_thighfuck(mob/living/target) + var/message + var/list/lines + var/u_His = p_their() + var/t_His = target.p_their() + + if(is_fucking(target, CUM_TARGET_THIGHS)) + lines = list( + "thrusts in and out of \the [target]'s [pick("pudgy ", "soft ", "")]thighs, making them jiggle", + "lustfully rolls [u_His] [pick(GLOB.dick_nouns)] back and forth between \the [target]'s thighs", + "vigorously fucks \the [target]'s legs, making [u_His] tip pop in and out of [t_His] supple thighs" + ) + else + lines = list( + "presses [u_His] tip against \the [target]'s [pick("pudgy ", "soft ", "")] thighs, soon shoving [u_His] whole lenght right in between them", + "presents [u_His] [pick(GLOB.dick_nouns)] to \the [target]'s legs, ramming its full size right into [t_His] thigh lock", + "smooches \the [target]'s crotch with [u_His] throbbing tip, right before piercing between [t_His] thighs with [u_His] full [pick(GLOB.dick_nouns)]" + ) + set_is_fucking(target, CUM_TARGET_THIGHS, getorganslot(ORGAN_SLOT_PENIS)) + + message = "\The [src] [pick(lines)]!" + visible_message(message, ignored_mobs = get_unconsenting()) + playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg', + 'modular_sand/sound/interactions/bang2.ogg', + 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1) + handle_post_sex(NORMAL_LUST, CUM_TARGET_THIGHS, target) + target.handle_post_sex(LOW_LUST, CUM_TARGET_PENIS, src) + +/mob/living/proc/do_thighjob(mob/living/target) + var/message + var/list/lines + var/u_His = p_their() + var/t_He = target.p_they() + var/t_His = target.p_their() + + if(target.is_fucking(src, CUM_TARGET_THIGHS)) + lines = list( + "grinds and presses [u_His] thighs [pick("deeply ", "")] against \the [target]'s [pick(GLOB.dick_nouns)], massaging it all over with [u_His] thighs", + "squeezes \the [target]'s [pick(GLOB.dick_nouns)] between [u_His] supple thighs, smothering it deep under [u_His] crotch", + "rides \the [target]'s [pick(GLOB.dick_nouns)] with [u_His] [pick("pudgy ", "soft ", "")]thighs, [t_He] can feel [u_His] flesh smothering it down" + ) + else + lines = list( + "presents [u_His] [pick("pudgy ", "soft ", "")] thighs to \the [target]'s [pick(GLOB.dick_nouns)], slamming them right into it[pick(" with a [pick("wet ", "")]smack", "")]", + "grinds \the [target]'s tip against [u_His] supple thighs, before slamming them right down into [t_His] [pick(GLOB.dick_nouns)]", + "forces \the [target]'s [pick(GLOB.dick_nouns)] right into the tight hold of [u_His] thighs, giving it a deep and lewd squeeze" + ) + target.set_is_fucking(src, CUM_TARGET_THIGHS, target.getorganslot(ORGAN_SLOT_PENIS)) + + message = "\The [src] [pick(lines)]!" + visible_message(message, ignored_mobs = get_unconsenting()) + playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/bang1.ogg', + 'modular_sand/sound/interactions/bang2.ogg', + 'modular_sand/sound/interactions/bang3.ogg'), 70, 1, -1) + handle_post_sex(LOW_LUST, CUM_TARGET_PENIS, target) + target.handle_post_sex(NORMAL_LUST, CUM_TARGET_THIGHS, src) + //////////////////////////////////////////////////////////////////////////////////////////////////////// ///////// U N H O L Y ///////// //////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm index cd1b04802e..8cbff18d9d 100644 --- a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm +++ b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm @@ -459,6 +459,71 @@ playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) +/datum/interaction/lewd/nipple_fuck + command = "nipple_fuck" + description = "Fuck their nipple" + require_target_topless = TRUE + require_user_penis = REQUIRE_EXPOSED + write_log_user = "fucked nipples" + write_log_target = "got their nipples fucked by" + interaction_sound = null + max_distance = 1 + +/datum/interaction/lewd/nipple_fuck/display_interaction(mob/living/user, mob/living/target) + user.do_nipfuck(target) + + if(!isclownjob(target) || isclownjob(user)) + return + + if(prob(50) && isclownjob(target)) + target.visible_message("\The [target]'s [pick(GLOB.breast_nouns)] honk[pick(" loudly", "")]!") + + playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) + +/datum/interaction/lewd/fuck_thighs + command = "fuck_thighs" + description = "Fuck their thighs" + require_user_penis = REQUIRE_EXPOSED + require_target_legs = REQUIRE_ANY + require_target_num_legs = 2 + write_log_user = "fucked thighs" + write_log_target = "got their thighs fucked by" + interaction_sound = null + max_distance = 1 + +/datum/interaction/lewd/fuck_thighs/display_interaction(mob/living/user, mob/living/target) + user.do_thighfuck(target) + + if(!isclownjob(user)) + return + + if(prob(50)) + user.visible_message("\The [user]'s [pick(GLOB.dick_nouns)] honks[pick(" loudly", "")]!") + + playlewdinteractionsound(user, 'sound/items/bikehorn.ogg', 40, 1, -1) + +/datum/interaction/lewd/do_thighjob + command = "do_thighjob" + description = "Give them a thighjob" + require_target_penis = REQUIRE_EXPOSED + require_user_legs = REQUIRE_ANY + require_user_num_legs = 2 + write_log_user = "Gave a thighjob" + write_log_target = "Got a thighjob from" + interaction_sound = null + max_distance = 1 + +/datum/interaction/lewd/do_thighjob/display_interaction(mob/living/user, mob/living/target) + user.do_thighjob(target) + + if(!isclownjob(target)) + return + + if(prob(50)) + target.visible_message("\The [target]'s [pick(GLOB.dick_nouns)] honks[pick(" loudly", "")]!") + + playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) + //////////////////////////////////////////////////////////////////////////////////////////////////////// ///////// U N H O L Y ///////// //////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm b/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm index f8849e04ee..80ed4a9470 100644 --- a/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm +++ b/modular_splurt/code/datums/interactions/lewd/lewd_interactions.dm @@ -2,3 +2,77 @@ /datum/interaction/lewd var/unholy = FALSE //Same as extreme but... we don't talk about this one... + + var/require_user_legs + var/require_user_num_legs + + var/require_target_legs + var/require_target_num_legs + +/datum/interaction/lewd/evaluate_user(mob/living/user, silent = TRUE, action_check = TRUE) + if(require_user_legs) + switch(require_user_legs) + if(REQUIRE_EXPOSED) + if(!user.has_legs(REQUIRE_EXPOSED)) + if(!silent) + to_chat(user, "Your legs need to be exposed.") + return FALSE + if(REQUIRE_UNEXPOSED) + if(!user.has_legs(REQUIRE_UNEXPOSED)) + if(!silent) + to_chat(user, "Your legs need to be unexposed.") + return FALSE + if(REQUIRE_ANY) + if(!user.has_legs(REQUIRE_ANY)) + if(!silent) + to_chat(user, "You don't have enough legs.") + return FALSE + + if(require_user_num_legs && (user.has_legs() < require_user_num_legs)) + if(!silent) + to_chat(user, "Your don't have enough legs.") + return FALSE + + + if(unholy) + var/client/cli = user.client + if(cli) + if(cli.prefs.unholypref == "No") + if(!silent) + to_chat(user, "That's way too much for you.") + return FALSE + . = ..() + +/datum/interaction/lewd/evaluate_target(mob/living/user, mob/living/target, silent = TRUE) + if(require_target_legs) + switch(require_target_legs) + if(REQUIRE_EXPOSED) + if(!target.has_legs(REQUIRE_EXPOSED)) + if(!silent) + to_chat(user, "[target.p_their()] legs need to be exposed.") + return FALSE + if(REQUIRE_UNEXPOSED) + if(!target.has_legs(REQUIRE_UNEXPOSED)) + if(!silent) + to_chat(user, "[target.p_their()] legs need to be unexposed.") + return FALSE + if(REQUIRE_ANY) + if(!target.has_legs(REQUIRE_ANY)) + if(!silent) + to_chat(user, "[target.p_they()] [target.p_do()]n't have enough legs.") + return FALSE + + if(require_target_num_legs && (target.has_legs() < require_target_num_legs)) + if(!silent) + to_chat(user, "[target.p_they()] [target.p_do()]n't have enough legs.") + return FALSE + + if(unholy) + var/client/cli = target.client + if(cli) + if(target.client.prefs.unholypref == "No") + if(!silent) + to_chat(user, "For some reason, you don't want to do this to [target].") + return FALSE + . = ..() + diff --git a/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm b/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm index 77546c8b9f..ff08f4ec2e 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm @@ -25,7 +25,7 @@ if(get_refraction_dif() > 0) onLewdCooldown = TRUE - if(M.client && M.client.prefs.erppref == "Yes" && CHECK_BITFIELD(M.client.prefs.toggles, VERB_CONSENT) && M.client.prefs.nonconpref == "Yes") + if(M.client && M.client?.prefs.erppref == "Yes" && CHECK_BITFIELD(M.client?.prefs.toggles, VERB_CONSENT) && M.client?.prefs.nonconpref == "Yes") wantsNoncon = TRUE switch(deathclaw_mode) @@ -67,7 +67,7 @@ addtimer(CALLBACK(src, .proc/do_lewd_action, M), rand(8, 12)) // Regular sex has an extra action per tick to seem less slow and robotic - if(deathclaw_mode != "abomination" || M.client.prefs.unholypref != "Yes") + if(deathclaw_mode != "abomination" || M.client?.prefs.unholypref != "Yes") addtimer(CALLBACK(src, .proc/do_lewd_action, M), rand(12, 16)) @@ -98,7 +98,7 @@ return // Abomination deathclaws do other stuff instead - if(deathclaw_mode == "abomination" && M.client.prefs.unholypref == "Yes") + if(deathclaw_mode == "abomination" && M.client?.prefs.unholypref == "Yes") if(prob(1)) do_grindmouth(M) else @@ -114,7 +114,7 @@ return // Abomination deathclaws do other stuff instead - if(deathclaw_mode == "abomination" && M.client.prefs.unholypref == "Yes") + if(deathclaw_mode == "abomination" && M.client?.prefs.unholypref == "Yes") do_footjob_v(M) handle_post_sex(10, null, M) else @@ -127,7 +127,7 @@ return // Abomination deathclaws do other stuff instead - if(deathclaw_mode == "abomination" && M.client.prefs.unholypref == "Yes") + if(deathclaw_mode == "abomination" && M.client?.prefs.unholypref == "Yes") if(prob(1)) do_faceshit(M) else @@ -166,7 +166,7 @@ else message = "cums on the floor!" - if(deathclaw_mode == "abomination" && M.client.prefs.unholypref == "Yes") + if(deathclaw_mode == "abomination" && M.client?.prefs.unholypref == "Yes") message = "cums all over [M]'s body" if(istype(M, /mob/living/carbon)) From f7ea1f377d842352f19e06e00ac28bcf120f2cf7 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Fri, 25 Feb 2022 17:09:31 -0300 Subject: [PATCH 37/56] oops, replace all is a hell of a drug --- code/datums/components/nanites.dm | 2 +- code/datums/diseases/advance/symptoms/deafness.dm | 2 +- code/datums/elements/earhealing.dm | 2 +- code/datums/status_effects/debuffs.dm | 4 ++-- code/game/objects/items/devices/scanners.dm | 2 +- .../antagonists/eldritch_cult/knowledge/rust_lore.dm | 2 +- code/modules/mob/living/carbon/carbon_defense.dm | 6 +++--- code/modules/mob/living/carbon/handle_corruption.dm | 2 +- code/modules/mob/living/carbon/human/species.dm | 2 +- code/modules/reagents/chemistry/reagents/other_reagents.dm | 2 +- code/modules/reagents/chemistry/reagents/toxin_reagents.dm | 2 +- code/modules/research/nanites/nanite_programs/protocols.dm | 2 +- code/modules/surgery/organs/ears.dm | 4 ++-- code/modules/surgery/organs/organ_internal.dm | 2 +- 14 files changed, 18 insertions(+), 18 deletions(-) diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index d16b5c692e..50ac5e5cc5 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -317,7 +317,7 @@ host_mob.Paralyze(120) if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_ITEM_SLOT_EARS) + var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) if(ears) ears.adjustEarDamage(0, 30) //nanites coming out of your ears C.vomit(0, FALSE, TRUE, 2, FALSE, VOMIT_NANITE, FALSE, TRUE, 0) //nanites coming out of your mouth diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index b4ad65c86b..b6dd185b36 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -51,7 +51,7 @@ Bonus to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]") if(5) if(power > 2) - var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_ITEM_SLOT_EARS) + var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) if(istype(ears) && ears.damage < ears.maxHealth) to_chat(M, "Your ears pop painfully and start bleeding!") ears.damage = max(ears.damage, ears.maxHealth) diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index 38afc5e307..2ceb261622 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -30,7 +30,7 @@ var/mob/living/carbon/user = user_by_item[i] if(HAS_TRAIT(user, TRAIT_DEAF)) continue - var/obj/item/organ/ears/ears = user.getorganslot(ORGAN_ITEM_SLOT_EARS) + var/obj/item/organ/ears/ears = user.getorganslot(ORGAN_SLOT_EARS) if(!ears) continue ears.deaf = max(ears.deaf - 0.25, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index e45f9cf3a9..dbec6c6ee2 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -578,7 +578,7 @@ if(60 to 69) H.adjustOrganLoss(ORGAN_SLOT_EYES,10) if(70 to 79) - H.adjustOrganLoss(ORGAN_ITEM_SLOT_EARS,10) + H.adjustOrganLoss(ORGAN_SLOT_EARS,10) if(80 to 89) H.adjustOrganLoss(ORGAN_SLOT_LUNGS,10) if(90 to 99) @@ -610,7 +610,7 @@ if(60 to 69) H.adjustOrganLoss(ORGAN_SLOT_EYES,5) if(70 to 79) - H.adjustOrganLoss(ORGAN_ITEM_SLOT_EARS,5) + H.adjustOrganLoss(ORGAN_SLOT_EARS,5) if(80 to 89) H.adjustOrganLoss(ORGAN_SLOT_LUNGS,5) if(90 to 99) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index c224f98fe7..0ca2e40b45 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -333,7 +333,7 @@ GENETICS SCANNER var/has_stomach = C.dna && !(NOSTOMACH in C.dna.species.species_traits) if(!M.getorganslot(ORGAN_SLOT_EYES)) msg += "\tSubject does not have eyes.\n" - if(!M.getorganslot(ORGAN_ITEM_SLOT_EARS)) + if(!M.getorganslot(ORGAN_SLOT_EARS)) msg += "\tSubject does not have ears.\n" if(!M.getorganslot(ORGAN_SLOT_BRAIN)) msg += "\tSubject's brain function is non-existent!\n" diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm index 0eb52746fa..733b2725cb 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm @@ -39,7 +39,7 @@ var/datum/status_effect/eldritch/E = H.has_status_effect(/datum/status_effect/eldritch/rust) || H.has_status_effect(/datum/status_effect/eldritch/ash) || H.has_status_effect(/datum/status_effect/eldritch/flesh) || H.has_status_effect(/datum/status_effect/eldritch/void) if(E) E.on_effect() - H.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_ITEM_SLOT_EARS,ORGAN_SLOT_EYES,ORGAN_SLOT_LIVER,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_HEART),25) + H.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_EARS,ORGAN_SLOT_EYES,ORGAN_SLOT_LIVER,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_HEART),25) /datum/eldritch_knowledge/spell/area_conversion name = "Aggressive Spread" diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 8f954c0239..a12d6614fa 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -24,7 +24,7 @@ /mob/living/carbon/get_ear_protection() var/number = ..() - var/obj/item/organ/ears/E = getorganslot(ORGAN_ITEM_SLOT_EARS) + var/obj/item/organ/ears/E = getorganslot(ORGAN_SLOT_EARS) if(!E) number = INFINITY else @@ -417,7 +417,7 @@ SEND_SIGNAL(src, COMSIG_CARBON_SOUNDBANG, reflist) intensity = reflist[1] var/ear_safety = get_ear_protection() - var/obj/item/organ/ears/ears = getorganslot(ORGAN_ITEM_SLOT_EARS) + var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) var/effect_amount = intensity - ear_safety if(effect_amount > 0) if(stun_pwr) @@ -457,7 +457,7 @@ /mob/living/carbon/can_hear() . = FALSE - var/obj/item/organ/ears/ears = getorganslot(ORGAN_ITEM_SLOT_EARS) + var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) if(istype(ears) && !ears.deaf) . = TRUE diff --git a/code/modules/mob/living/carbon/handle_corruption.dm b/code/modules/mob/living/carbon/handle_corruption.dm index 06256f6f8e..b56752453b 100644 --- a/code/modules/mob/living/carbon/handle_corruption.dm +++ b/code/modules/mob/living/carbon/handle_corruption.dm @@ -102,7 +102,7 @@ if("jamcoolanthud") hud_used.coolant_display.jam(10) if("receporgandamage") - adjustOrganLoss(ORGAN_ITEM_SLOT_EARS, rand(10, 20)) + adjustOrganLoss(ORGAN_SLOT_EARS, rand(10, 20)) adjustOrganLoss(ORGAN_SLOT_EYES, rand(10, 20)) to_chat(src, "Power spike detected in auditory and visual systems!") if("longlimbdisable") diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 847664d957..ee98288c5d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -337,7 +337,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/obj/item/organ/lungs/lungs = C.getorganslot(ORGAN_SLOT_LUNGS) var/obj/item/organ/appendix/appendix = C.getorganslot(ORGAN_SLOT_APPENDIX) var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES) - var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_ITEM_SLOT_EARS) + var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) var/obj/item/organ/tongue/tongue = C.getorganslot(ORGAN_SLOT_TONGUE) var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) var/obj/item/organ/stomach/stomach = C.getorganslot(ORGAN_SLOT_STOMACH) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 5521bf80f4..ec628255fa 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2670,7 +2670,7 @@ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -100) M.adjustOrganLoss(ORGAN_SLOT_HEART, -100) M.adjustOrganLoss(ORGAN_SLOT_LIVER, -100) - M.adjustOrganLoss(ORGAN_ITEM_SLOT_EARS, -100) + M.adjustOrganLoss(ORGAN_SLOT_EARS, -100) M.adjustOrganLoss(ORGAN_SLOT_STOMACH, -100) M.adjustOrganLoss(ORGAN_SLOT_TONGUE, -100) M.adjustOrganLoss(ORGAN_SLOT_EYES, -100) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index a70c17ec25..af670c00dc 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -1073,7 +1073,7 @@ taste_description = "sugary sweetness" /datum/reagent/toxin/leadacetate/on_mob_life(mob/living/carbon/M) - M.adjustOrganLoss(ORGAN_ITEM_SLOT_EARS,1) + M.adjustOrganLoss(ORGAN_SLOT_EARS,1) M.adjustOrganLoss(ORGAN_SLOT_BRAIN,1) if(prob(1)) to_chat(M, "Ah, what was that? You thought you heard something...") diff --git a/code/modules/research/nanites/nanite_programs/protocols.dm b/code/modules/research/nanites/nanite_programs/protocols.dm index 56f083d31f..3716bc61ac 100644 --- a/code/modules/research/nanites/nanite_programs/protocols.dm +++ b/code/modules/research/nanites/nanite_programs/protocols.dm @@ -244,7 +244,7 @@ if(eyes) eyes.applyOrganDamage(0.75) if(prob(13)) - var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_ITEM_SLOT_EARS) + var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) if(ears) ears.applyOrganDamage(0.75) current_stage++ diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 71fa88233a..80b7599ec3 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -3,7 +3,7 @@ icon_state = "ears" desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible." zone = BODY_ZONE_HEAD - slot = ORGAN_ITEM_SLOT_EARS + slot = ORGAN_SLOT_EARS gender = PLURAL healing_factor = STANDARD_ORGAN_HEALING @@ -138,7 +138,7 @@ icon_state = "ears-c" desc = "A pair of microphones intended to be installed in an IPC head, that grant the ability to hear." zone = BODY_ZONE_HEAD - slot = ORGAN_ITEM_SLOT_EARS + slot = ORGAN_SLOT_EARS gender = PLURAL organ_flags = ORGAN_SYNTHETIC diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 60628e6db0..a3c6ea06c8 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -333,7 +333,7 @@ if(only_one) return TRUE - if(!getorganslot(ORGAN_ITEM_SLOT_EARS)) + if(!getorganslot(ORGAN_SLOT_EARS)) var/obj/item/organ/ears/ears if(dna && dna.species && dna.species.mutantears) ears = new dna.species.mutantears From fb8158e89359a8c8a82178de944ffa8fbf5234c1 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 26 Feb 2022 00:33:23 +0000 Subject: [PATCH 38/56] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-15523.yml | 4 ---- html/changelogs/archive/2022-02.yml | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-15523.yml diff --git a/html/changelogs/AutoChangeLog-pr-15523.yml b/html/changelogs/AutoChangeLog-pr-15523.yml deleted file mode 100644 index 48767debcb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-15523.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - balance: "Now slightly easier to get 50,000 points with toxins (50,000 point baseline changed from 200 light range to 175)" diff --git a/html/changelogs/archive/2022-02.yml b/html/changelogs/archive/2022-02.yml index 0715711ef7..d46305bd06 100644 --- a/html/changelogs/archive/2022-02.yml +++ b/html/changelogs/archive/2022-02.yml @@ -154,3 +154,7 @@ now' timothyteakettle: - rscadd: adds snake coiling +2022-02-26: + Putnam3145: + - balance: Now slightly easier to get 50,000 points with toxins (50,000 point baseline + changed from 200 light range to 175) From 6080145e15b8867f809b14d45576ca39ef0221b4 Mon Sep 17 00:00:00 2001 From: radar651 Date: Fri, 25 Feb 2022 18:58:49 -0600 Subject: [PATCH 39/56] final updates Final updates before PR --- .../code/modules/cargo/packs/armory.dm | 17 -- .../code/modules/cargo/packs/goodies.dm | 16 +- .../code/modules/cargo/packs/misc.dm | 154 ++++++++++++++++++ .../modules/projectiles/guns/energy/lasers.dm | 60 +++++++ .../icons/obj/items_and_weapons.dmi | Bin 5399 -> 6209 bytes tgstation.dme | 2 + 6 files changed, 230 insertions(+), 19 deletions(-) create mode 100644 modular_splurt/code/modules/cargo/packs/misc.dm create mode 100644 modular_splurt/code/modules/projectiles/guns/energy/lasers.dm diff --git a/modular_splurt/code/modules/cargo/packs/armory.dm b/modular_splurt/code/modules/cargo/packs/armory.dm index fc9dd634c4..c7fcf8ed37 100644 --- a/modular_splurt/code/modules/cargo/packs/armory.dm +++ b/modular_splurt/code/modules/cargo/packs/armory.dm @@ -70,23 +70,6 @@ /obj/item/gun/grenadelauncher) crate_name = "riot gun crate" -/datum/supply_pack/misc/cap_e45 // I am mad I even have to do this. -Radar - name = "Captain's Enforcer .45" - desc = "A gold handgun meant for the Captain." - access = ACCESS_CAPTAIN - cost = 6000 - contains = list(/obj/item/gun/ballistic/automatic/pistol/enforcergold, - /obj/item/ammo_box/magazine/e45/lethal, - /obj/item/ammo_box/magazine/e45/lethal, - /obj/item/ammo_box/magazine/e45, - /obj/item/ammo_box/magazine/e45, - /obj/item/ammo_box/magazine/e45, - /obj/item/ammo_box/magazine/e45/taser, - /obj/item/ammo_box/magazine/e45/taser, - /obj/item/ammo_box/magazine/e45/taser) - crate_name = "captain's .45" - crate_type = /obj/structure/closet/crate/secure/weapon - /datum/supply_pack/security/armory/enfrocer name = "Enforcer pistol crate" desc = "Contains 3 Enforcer handguns. Requires Armory access to open." diff --git a/modular_splurt/code/modules/cargo/packs/goodies.dm b/modular_splurt/code/modules/cargo/packs/goodies.dm index c514dba164..d4b9c17bc4 100644 --- a/modular_splurt/code/modules/cargo/packs/goodies.dm +++ b/modular_splurt/code/modules/cargo/packs/goodies.dm @@ -54,7 +54,7 @@ name = "Varmint Rifle Single-Pack" desc = "Contains a parts kit to assemble a varmint rifle." cost = 600 - contains = list(/obj/item/gunpart/riflevarmintsotck, /obj/item/gunpart/riflevarmintbarrel, /obj/item/ammo_casing/c22lr) + contains = list(/obj/item/gunpart/riflevarmintsotck, /obj/item/gunpart/riflevarmintbarrel, /obj/item/ammo_box/c22lr) /datum/supply_pack/goody/huntingrifle_single name = "Hunting Rifle Single-Pack" @@ -94,6 +94,18 @@ /datum/supply_pack/goody/pistol45_single name = ".45 Pistol Single-Pack" - desc = "Contains a pre-assembled .45 caliber M1911. Comes with .45 Rubber" + desc = "Contains a pre-assembled .45 caliber M1911. Comes with .45 Rubber." cost = 900 contains = list(/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag, /obj/item/ammo_box/magazine/m45/rubber= 3) + +/datum/supply_pack/goody/laserantique_single + name = "Antique Laser Pistol Single-Pack" + desc = "Contains a pre-assembled Antique Laser pistol, not unlike the Captain's." + cost = 1000 + contains = list(/obj/item/gun/energy/laser/antique) + +/datum/supply_pack/goody/lasercivlian_single + name = "Civilian Energy Pistol Single-Pack" + desc = "Contains a parts kit to assemble a civlian energy pistol." + cost = 800 + contains = list(/obj/item/gunpart/civilianlaserframe, /obj/item/gunpart/civilianlaserbarrel) diff --git a/modular_splurt/code/modules/cargo/packs/misc.dm b/modular_splurt/code/modules/cargo/packs/misc.dm new file mode 100644 index 0000000000..2bdcb4baf8 --- /dev/null +++ b/modular_splurt/code/modules/cargo/packs/misc.dm @@ -0,0 +1,154 @@ +/datum/supply_pack/misc/cap_e45 // I am mad I even have to do this. -Radar + name = "Captain's Enforcer .45" + desc = "A gold handgun meant for the Captain." + access = ACCESS_CAPTAIN + cost = 6000 + contains = list(/obj/item/gun/ballistic/automatic/pistol/enforcergold, + /obj/item/ammo_box/magazine/e45/lethal, + /obj/item/ammo_box/magazine/e45/lethal, + /obj/item/ammo_box/magazine/e45, + /obj/item/ammo_box/magazine/e45, + /obj/item/ammo_box/magazine/e45, + /obj/item/ammo_box/magazine/e45/taser, + /obj/item/ammo_box/magazine/e45/taser, + /obj/item/ammo_box/magazine/e45/taser) + crate_name = "captain's .45" + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/misc/m1911s + name = "M1911s" + desc = "A pack of 3 M1911s with 9 mags of rubber." + access = ACCESS_QM + cost = 2800 + contains = list(/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag, + /obj/item/gun/ballistic/automatic/pistol/m1911/no_mag, + /obj/item/gun/ballistic/automatic/pistol/m1911/no_mag, + /obj/item/ammo_box/magazine/m45/rubber, + /obj/item/ammo_box/magazine/m45/rubber, + /obj/item/ammo_box/magazine/m45/rubber, + /obj/item/ammo_box/magazine/m45/rubber, + /obj/item/ammo_box/magazine/m45/rubber, + /obj/item/ammo_box/magazine/m45/rubber, + /obj/item/ammo_box/magazine/m45/rubber, + /obj/item/ammo_box/magazine/m45/rubber, + /obj/item/ammo_box/magazine/m45/rubber) + crate_name = ".45 pistols" + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/misc/m22pistols + name = ".22 Pistols" + desc = "A pack of .22 Pistols with 6 spare magazines." + access = ACCESS_QM + cost = 1700 + contains = list(/obj/item/gun/ballistic/automatic/pistol/m22pistol, + /obj/item/gun/ballistic/automatic/pistol/m22pistol, + /obj/item/gun/ballistic/automatic/pistol/m22pistol, + /obj/item/ammo_box/magazine/m22, + /obj/item/ammo_box/magazine/m22, + /obj/item/ammo_box/magazine/m22, + /obj/item/ammo_box/magazine/m22, + /obj/item/ammo_box/magazine/m22, + /obj/item/ammo_box/magazine/m22) + crate_name = ".22 pistols" + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/misc/r22revolvers + name = ".22 Revolvers" + desc = "A pack of .22 Pistols with 3 spare boxes of ammo." + access = ACCESS_QM + cost = 1700 + contains = list(/obj/item/gun/ballistic/revolver/r22lr, + /obj/item/gun/ballistic/revolver/r22lr, + /obj/item/gun/ballistic/revolver/r22lr, + /obj/item/ammo_box/c22lr, + /obj/item/ammo_box/c22lr, + /obj/item/ammo_box/c22lr) + crate_name = ".22 Revolvers" + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/misc/m22pistols + name = "9mm Pistols" + desc = "A pack of 9mm Pistols with 6 spare magazines." + access = ACCESS_QM + cost = 2800 + contains = list(/obj/item/gun/ballistic/automatic/pistol/m9mmpistol, + /obj/item/gun/ballistic/automatic/pistol/m9mmpistol, + /obj/item/gun/ballistic/automatic/pistol/m9mmpistol, + /obj/item/ammo_box/magazine/m9, + /obj/item/ammo_box/magazine/m9, + /obj/item/ammo_box/magazine/m9, + /obj/item/ammo_box/magazine/m9, + /obj/item/ammo_box/magazine/m9, + /obj/item/ammo_box/magazine/m9) + crate_name = "9mm pistols" + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/misc/c22lrammo + name = ".22 ammo boxes" + desc = "A pack of 6 boxes of .22 ammo." + access = ACCESS_QM + cost = 900 + contains = list(/obj/item/ammo_box/c22lr, + /obj/item/ammo_box/c22lr, + /obj/item/ammo_box/c22lr, + /obj/item/ammo_box/c22lr, + /obj/item/ammo_box/c22lr, + /obj/item/ammo_box/c22lr) + crate_name = ".22 ammo" + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/misc/varmintrifles + name = "Varmint Rifles" + desc = "A pack of varmint rifles with 3 spare boxes of ammo." + access = ACCESS_QM + cost = 1700 + contains = list(/obj/item/gun/ballistic/shotgun/varmintrifle, + /obj/item/gun/ballistic/shotgun/varmintrifle, + /obj/item/gun/ballistic/shotgun/varmintrifle, + /obj/item/ammo_box/c22lr, + /obj/item/ammo_box/c22lr, + /obj/item/ammo_box/c22lr) + crate_name = "Varmint Rifles" + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/misc/huntingrifles + name = "Hunting Rifles" + desc = "A pack of hunting rifles with 9 stripper clips." + access = ACCESS_QM + cost = 2500 + contains = list(/obj/item/gun/ballistic/shotgun/huntingrifle, + /obj/item/gun/ballistic/shotgun/huntingrifle, + /obj/item/gun/ballistic/shotgun/huntingrifle, + /obj/item/ammo_box/a762, + /obj/item/ammo_box/a762, + /obj/item/ammo_box/a762, + /obj/item/ammo_box/a762, + /obj/item/ammo_box/a762, + /obj/item/ammo_box/a762, + /obj/item/ammo_box/a762, + /obj/item/ammo_box/a762, + /obj/item/ammo_box/a762) + crate_name = "Hunting Rifles" + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/misc/civlianlasers + name = "Civilian Energy Pistols" + desc = "A pack of civlian energy pistols." + access = ACCESS_QM + cost = 1700 + contains = list(/obj/item/gun/energy/civilian, + /obj/item/gun/energy/civilian, + /obj/item/gun/energy/civilian) + crate_name = "Civilian Energy Pistols" + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/misc/antiquelasers + name = "Antique Lasers Pistols" + desc = "A pack of antique laser pistols. Who would actually rely on these old things?" + access = ACCESS_QM + cost = 2800 + contains = list(/obj/item/gun/energy/laser/antique, + /obj/item/gun/energy/laser/antique, + /obj/item/gun/energy/laser/antique) + crate_name = "Antique Lasers Pistols" + crate_type = /obj/structure/closet/crate/secure/weapon diff --git a/modular_splurt/code/modules/projectiles/guns/energy/lasers.dm b/modular_splurt/code/modules/projectiles/guns/energy/lasers.dm new file mode 100644 index 0000000000..6bc283de0f --- /dev/null +++ b/modular_splurt/code/modules/projectiles/guns/energy/lasers.dm @@ -0,0 +1,60 @@ +/obj/item/gun/energy/laser/antique + name = "antique laser gun" + icon_state = "caplaser" + item_state = "caplaser" + desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy." + force = 10 + ammo_x_offset = 3 + selfcharge = EGUN_SELFCHARGE + resistance_flags = NONE + +/obj/item/gun/energy/civilian + name = "civlian energy pistol" + desc = "A cheap energy pistol produced by Wattz and Hertz. Has no external ammo indicator. It looks easily modfiable" + icon = 'modular_splurt/icons/obj/guns/energy.dmi' + icon_state = "wattz1000" + item_state = "caplaser" + w_class = WEIGHT_CLASS_SMALL + cell_type = /obj/item/stock_parts/cell{charge = 700; maxcharge = 700} + ammo_type = list(/obj/item/ammo_casing/energy/disabler) + weapon_weight = WEAPON_LIGHT + inaccuracy_modifier = 0.25 + can_flashlight = 0 + +/obj/item/gun/energy/civilian/lethal + name = "moddfied civlian energy pistol" + desc = "A cheap energy pistol produced by Wattz and Hertz. Has no external ammo indicator. It has been modded to shoot lethal lasers, somehow." + icon_state = "magnetowattz" + ammo_type = list(/obj/item/ammo_casing/energy/laser) + +/obj/item/gunpart/civilianlaserframe + name = "civlian energy pistol frame" + desc = "a civilian energy pistol frame" + icon_state = "wattz1000frame" + +/obj/item/gunpart/civilianlaserbarrel + name = "civilian energy pistol barrel" + desc = "a civilian energy pistol barrel" + icon_state = "wattz1000barrel" + +/datum/crafting_recipe/civilianlaserassemble + name = "Assemble civilian energy pistol" + result = /obj/item/gun/energy/civilian + reqs = list(/obj/item/gunpart/civilianlaserframe = 1, + /obj/item/gunpart/civilianlaserbarrel = 1) + tools = list(TOOL_SCREWDRIVER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/civilianlaserupgrade + name = "Moddify civilian energy pistol" + result = /obj/item/gun/energy/civilian/lethal + reqs = list(/obj/item/gun/energy/civilian = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/stock_parts/capacitor = 4, + /obj/item/stock_parts/micro_laser = 1) + tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON diff --git a/modular_splurt/icons/obj/items_and_weapons.dmi b/modular_splurt/icons/obj/items_and_weapons.dmi index 2758e61485a7b75b802a52c2109b48e630c2f478..7f0fb7fb8cb63e0cc237ac624d87db4bd03cc441 100644 GIT binary patch literal 6209 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 literal 5399 zcmaJ_cQjnlx4tu@j2=c1B0ABD77|7;F^DKZMDJaQh&B^M38DmvP9$2CAfhCC7!sWr zy%Rn9FpPPV-&^mGx87Rsk8{sC`|Q2$_wBpSIp4am_w}`CC|M~10HD#)R)0Y3^Zzv{ z8Sxo6=qw5VAgUl^Gk-HKK`!WUH}l7ot84_)+s?9J-BZabE2S`89%Hm#^bm$ z)S~KR??`X5&Gkv}`8m77N%Yg(UCeAPdB-{@tX2V4{h-ZId;V1Ib~RFi#KvB+6@L`v z&khI3$aFqN&G-}aYWe%zW}X0B$6Hzq1>p(3LDf7~SY+>bG;PLT=!Cv&$Mg&5H}Vd5 z)JU_UtB#k`xm?DEaz>7~yU<+g!><;=igrirP4CycUK1u}SN@9mP?zh>yg?@iX7mYM z&#+__JKU+ENIwg(^+wkU-5WgYHOiAcO{iaF54|O2ey!JCcuY#{P@J+|a4)jPUq0C(_DP} z%3xpq)VF|6DGD*!(H;0ff7&EjbF@BV(uBJ@X?H-HG*;xnr{ABq!>$?Dp`7aN%*OT# zc!u?57$AKJc!O=6G1MVn2R54IWXCDKlJ-4|cYT}ud}byXAG8zvcmLO!&clF8cEaHC z+4=JUc`UA4845z1bt_g{51)U%g+;Pd&hO$>$L81P`X3M|3cEo0MJE#GO@Z`Me`<#~ zunlGZToZyVO`f9bIm{bZ59oQ0(RVAG_5(1?_BS3ro{ilZNE@^a;ExDPPfjQ)RYU*_ zqfyvBw|*|3j~SbZ#7H3fUu^Q0HOA;LzoHM{-he))1W}TPb6|2Nc1aebRjo%}$Kbj( zlnc_2W}B&iz`C_7tonEh2}D+bl1!fG@)XYl{2TJhJ5Tjn*+3}ZCHV8;SJw)oGUQU* zaeW=4b@>Kn!#8m&{|Qn$RE=7jXVCi61L7H({CT`M*`VO>n9-=|+MK}feEAqNG%UM> zOlGD5{d9_Ga~AePUfFz}d_+1cz@;i$I@yZ&`fF&t*eVauZU}wRLw@L;F1MQ}o~9UZ z(00rNuzEV~{)*lFJXYMTt8R^fYV#yA^7Jzox0tT^jkC|sx#02y91}Mjm0WRB_u#M2 z>_#x+;CtK#o!%TcY_bu8J1-eGBAI85Jh9eVIA8q?1CC-si0EAbB&eqq=y*(gA7-eB zXOm#p@B-Q(2&^vly|H1lGW=AfOG171dAu}-d#J+Nn4q1z+zveUa-8^^tmb=dfPbYk3?aO)AXu5B;r#5X}u?%-IJV=x{@J ztv0O@&T`nWNx~`4gx7{e2O1U{Oau9|rfZkV-xx*47*+-5_j=IE)(UG>xRv^OU)9#h z-R?G3zck=3>>jclKQIl%RP=?Kr-)6fwOGX8#Nh0Hzr9TK@6~(*y_s-Vg#Wt8F{F5$ zH4V4C^DH|^toFVq_%6P<>XrV*nMHwR>yAEzM4F`UnZyk1Qteq{eA)jz^ ztjXQeZOPWznxatRYrF}8=3JU+DYJV1t3sRV0qoS^2|aMS@~k*x-Kd{fi5wI%)4zk0 z&Bu`ELG}wXWj+6Lr+X)e6%4t26BLgfTOY+IbAK+A%>U9^O8Fz(p#?Y{UDSo2$piRNgWI7%)Q33-#Y_L8L z^Hmp*;u5x;)5DCD1F`6DzWBZox_j-9L$Rc+POdR^f2z14Y6m{TG+h=Q$5OiRB?Zo_ zlB<>7Jwu9SHLEng--D7Da2r)sNJkP{0dSNl`aQ2vXcJ=0fS>x)>$LLYjawRU^I=6W ze{iV6)hZYUD{RJrtbsivF=p(f2qrDJI^M8rUV12u4{V*WHx6wv=1XQ23HvQ>@yF$H zp8gKj^0+MVtq`s^-mBK8d2_VOO-b~4S*Nvp3sOYcgit*yHz@81$=pD@Dyb1oLS+J6 zhGlj?H#3Rn9%#5D9I1p$j}DZG@h^NMEoviDP8d&wyMUK zpGUuNr$)3Uf)m7ZkJ+o6ty;Oc*j?x=tHi^oyTDwDX4%hnRj&QZnWy z9=c;!<}FPd9kH^uX6NBS4J;f7!CJWay&y!iZ^6flH&bvv$fWf3kxaxWa*`{F>cxBm zS0u}&B0Z%H7Z9J2z~|A?umve2Lg&jUA=IdG0zQjk_pPj6kB^(~OENiqaDAuQsg5Xd zyQXQ*;T3Cg8JMp$Q<91Eu|&4pq{4%k5gHuAme87;;^O2$27N-Lrm~T@@Dr+Ei$1rt zzw^gWqPUR3YGBb}K4^9S=~(XEh=sLi(3UO@zYOo}{GFXvM@I!gQBl#3uOTnWEh&%q zTsj)W&=1nraq~!m{sWHPxEODxoPPcX3bOQ}qC=0Y-89?0TUrE>O;<@?XnVtc-%G6^ zRrUk(BT8|ojk13X9#LKJLzv#PfApqokX(^tpM6WcR%rOyhhpe1w2vwM(+$|B6~}$O zI)vg;ow@(8<2~NQJ!wDo=)0EpZQ3wy2OY zrKvdn7XuH99lFcnq0rj|Lvcify z4d++>?K;OM;`qCgP0EHdE3sqPat41_;*1uIN^@TJQEjK`v89wFPG?Zpi+mtY-gW#x z2Av1WNsMrRrD@&8>J*SyYWE>xMURMlC{Zd!g?p6PZVSRJ6qbrVC=G)!U_jXbsRC>C% zbnA-FAZ9!~=gzZ~(o(_wzXiLr`-t)6*#-2iN=N!-CG^m4N6Pcd!9r<=w@ za0f?6+psXJuT@{antn&_Ow}c+?)x0A8{WEoJElyCAa2%tJpRbR#s>H^kn=_ccZ{(X zaD(%vmX*!2u&`) zf15Pom_Pti783+0DrWAxBXtNx&3oKSU4sC5gUkoxhL+*pcNF$E-K#pCYGXm0c~&-sZbkxTp5 zF{Sh?U`jJ(o^T2Ke(=+M;9YBCEkIXXHn&pw;)Do~3iY0HyM zOXj-~6&(!%AP_o-`a(J_+j{1OQG)@Mz$J=zV5j=Y@|$7-G5nAVO}1;-K)}8%g9`J9 zs9T&1RpcU~ttN)m87?{9xyZ}sU;vMAwrKItw)6aU)OoT|ocA(h0C&746UsqJNg3l; z@z|+lCfj3%Bd42~�(qNoi@3@7THEm7xN)a8oh|l?faw7`xk*A>|AJhlhtHB@>8L z{;|wKIN@&T{EwZLi_-f$(G!*zOz77RMhAa{-Ft1TGjwd>e{dV-tI_mTHPIu z)6LDgFPjiwb_t84WtNENVG2DV_ELW3Ss&R{sD_Ea9EWLXFE*F~+0a&PB9-fernw#O zJ0oH&4xoc|%;aQmAqUR~dwA*D`nDYVV)0T6b!J%U*@!$I41xqTTd63V6uRI${j=92 zbz3`m3gaIY(S5(Ano?c(1r*3_f`s97)cODg7(C-OWdz3-qs{cp2BG=qeNg(>8$4^qa-5PXL+a&m9h z*4E|ZBv$EprfUw)&1_i9K@7SlqXmyo*>EW*78lR z%H?uO?5!?lxxmoJ&JN7Z&d!^bz~WBWvTN&vTcTGIMyErV;<_YYCnqPbG{=k#=*Es( z*NDf#<)XsUwQNo79RZ?mr(8|C}@`)!{*VeqPdgt2$`@Zbe( z>MU&QEULX`n^IZyOLmZYJo(1o9iFcXkp|`0pUrsHOGrqdwzoYToSi#kwAcL=y8N?+ zk|lC4F@30e`-h_47wMUEYmch!NG-*fX51x) zmz3=qUPxHDxAO5f2N}v^-buZQ;b9d^v9}Eyr5vx-ad6^wtf9%Y=BJPoi0wz-^2iX# z&^ukr@?M&#wl`}IlDVg=`xH~`@|)mW0lD|E;k^H)i<{fXZ|KO@nVY*ijZ7Y+f@Hzg z3p^fwn+Se$YpdNZXK#JD(C6DMIHzKiPW9o#x0N`HlU5;!kU<5DtrF)cH96IxVMmh|xqXv2(x{Du`ygB0GeUeTt7HCc)g&-Q3y_Nb|;*S%DmaquEZ z8;#*x8G+b6hxbjAqhn*d(lRm>qKb4ci;DOQPBU_%T%&o$B@5>67f$a4?8oaNk*y8Z zpCk)%@l`<#c1QA7d_k5jSLlWjrvrEXu2;h4zbMH-9?>uapNEq z*M=NpT3T9UTEI>2kM_+1+{W{E)iE3-6{FR2c#aX&NRqH(X`cd)Pxt|B{P*u`PD-UM z>HN|)ga~Rg!!PmQ8`=qKygyC6yxR7(N3)aH-fX(tcKG0tEvqf}iR)yZrU zjXGnIA~@^pNOcD9jpsL63Blq=mxd$fR3JBY~)x- z`MEV`WZQ;6!?d>ZP{du_N7-cV0)OhB8bX&&Obz`^$cD;om{1ahQxP5VCvjWm!R zKTI+M;VXW9ZDl1XJNtUeUJtz?UQLE0?39Z;!zUm>mdDhTotAt*sQH?2c@TpncqB$Z zW~R~a4*(=`z-gyYFK;rtP1m`<%|+X>{I@>rSoFD~awSmR098W&xv7cOc`)~Cq1B^l zPoQlXofx5n=YJDhZoW(yA8U_z3ZP`%$72$a*x6^N2fxJYT;ze2lo`!KQFWUOp#hL0b! zA4oc8(xzoPJ2{aw@l7qDdLzE7^K0#^_G^t+592nJC!j8MW)#5P%+ScqO}D^iE8vpx z?(GQ4u{rsqG z{U6nOwr$48#gqTrj?Z0p90EK^U(5fv!xV5a`?^GYd}5*`nDJHyB9fMTX7^Vg&%%Fe zRz@*UCV7DZgHsR*^)1eXFexLccR5+4z`Gi~hEcrejeeyRJ#|1m=bZ~p4x^xC$Hk)d zkH{Gm7j?r|2SukpPK&`S5zniyp=Ki6!YAWdusS;98he3y?>5L%`@=ul!`+nTc{qRt zeQf>Gp=p(vtt?q~PR`X1Pmw9LMoIO^7Qy^ytP>Us9Bc=ZzWxsMNt&(uy}rXCYh6x( z!Ix37y|MW*&i+Tbq+eIh2jgd0xK%~AA~SA)G$14E*oAh;JLW7&1^M{9zn+}lINP%+ zF_7l`oJ7`m_8!(Bnc>xz|I&r^tRsWYOgo}mM(QcC;=tDBw26HvB25*0xc*XurPzMF zj)n$lD@sLm0;=uYn*HN!y)co4l>)R!#lqV|eOpOhOjGFws4hA)DNoRx(}k%#B>c$* udN>`C7r8fbJ-*i;av;v<`@faw1svb}K78t$uO#t@C!nLDuU@HY6aHVNG=~BJ diff --git a/tgstation.dme b/tgstation.dme index 9048d4cd51..2e1c8e0074 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4263,6 +4263,7 @@ #include "modular_splurt\code\game\object\structures\bathroom.dm" #include "modular_splurt\code\game\object\structures\dresser.dm" #include "modular_splurt\code\modules\cargo\packs\goodies.dm" +#include "modular_splurt\code\modules\cargo\packs\misc.dm" #include "modular_splurt\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_splurt\code\game\object\structures\false_walls.dm" #include "modular_splurt\code\game\object\structures\flora.dm" @@ -4398,6 +4399,7 @@ #include "modular_splurt\code\modules\projectiles\guns\ballistic\pistol.dm" #include "modular_splurt\code\modules\projectiles\guns\ballistic\revolver.dm" #include "modular_splurt\code\modules\projectiles\guns\ballistic\shotgun.dm" +#include "modular_splurt\code\modules\projectiles\guns\energy\lasers.dm" #include "modular_splurt\code\modules\projectiles\guns\energy\special.dm" #include "modular_splurt\code\modules\projectiles\guns\misc\grenade_launcher.dm" #include "modular_splurt\code\modules\projectiles\projectile\bullets\cannonball.dm" From f1e941fb1920bb87e3421114788e0a598e33ac45 Mon Sep 17 00:00:00 2001 From: radar651 Date: Fri, 25 Feb 2022 20:04:32 -0600 Subject: [PATCH 40/56] Update items_and_weapons.dmi --- .../icons/obj/items_and_weapons.dmi | Bin 6209 -> 7996 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/modular_splurt/icons/obj/items_and_weapons.dmi b/modular_splurt/icons/obj/items_and_weapons.dmi index 7f0fb7fb8cb63e0cc237ac624d87db4bd03cc441..150649e50b64afcda01f05533cf9349e37eb30c5 100644 GIT binary patch literal 7996 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 From 1415b9580f59e0261a6d817c7d277d4da1d5b3e8 Mon Sep 17 00:00:00 2001 From: keronshb Date: Fri, 25 Feb 2022 22:29:09 -0500 Subject: [PATCH 41/56] Last fixes --- code/datums/mind.dm | 4 ++-- code/modules/antagonists/_common/antag_datum.dm | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 91983ead15..7a051f999d 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -201,7 +201,7 @@ . = LAZYLEN(antag_datums) LAZYADD(antag_datums, instanced_datum) if(!.) - current.verbs += /mob/proc/edit_objectives_and_ambitions + add_verb(current, /mob/proc/edit_objectives_and_ambitions) //ambition end /datum/mind/proc/remove_antag_datum(datum_type) @@ -218,7 +218,7 @@ LAZYREMOVE(antag_datums, instanced_datum) if(. && !LAZYLEN(antag_datums)) ambitions = null - current.verbs -= /mob/proc/edit_objectives_and_ambitions + remove_verb(current, /mob/proc/edit_objectives_and_ambitions) //ambition end /datum/mind/proc/remove_all_antag_datums() //For the Lazy amongst us. diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 4fbca1b32a..61936b4b7f 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -82,9 +82,8 @@ GLOBAL_LIST_EMPTY(antagonists) if(!owner) stack_trace("Destroy()ing antagonist datum when it has no owner.") else - LAZYREMOVE(owner.antag_datums, src) //ambition start - owner?.do_remove_antag_datum(src) + owner?.do_remove_antag_datum(src) //ambition end owner = null return ..() @@ -237,7 +236,7 @@ GLOBAL_LIST_EMPTY(antagonists) remove_innate_effects() clear_antag_moodies() - LAZYREMOVE(owner.antag_datums, src) + owner.do_remove_antag_datum(src) // cit skill for(var/A in skill_modifiers) owner.remove_skill_modifier(GET_SKILL_MOD_ID(A, type)) From 681679e67565fc9c22e1d2920d1b50c800d347c6 Mon Sep 17 00:00:00 2001 From: keronshb Date: Fri, 25 Feb 2022 22:42:27 -0500 Subject: [PATCH 42/56] cleanup --- code/modules/antagonists/_common/antag_datum.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 61936b4b7f..a1b1a1288e 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -249,7 +249,6 @@ GLOBAL_LIST_EMPTY(antagonists) farewell() // UnregisterSignal(owner, COMSIG_PRE_MINDSHIELD_IMPLANT) // UnregisterSignal(owner, COMSIG_MINDSHIELD_IMPLANTED) - owner.do_remove_antag_datum(src) var/datum/team/team = get_team() if(team) team.remove_member(owner) From e25ba06a1c2dc0e6ded221a023114ef51e0b1bcd Mon Sep 17 00:00:00 2001 From: radar651 Date: Sat, 26 Feb 2022 13:30:00 -0600 Subject: [PATCH 43/56] Removes the antuiqe Removes the copy --- modular_splurt/code/modules/cargo/packs/goodies.dm | 6 ------ modular_splurt/code/modules/cargo/packs/misc.dm | 11 ----------- .../code/modules/projectiles/guns/energy/lasers.dm | 10 ---------- 3 files changed, 27 deletions(-) diff --git a/modular_splurt/code/modules/cargo/packs/goodies.dm b/modular_splurt/code/modules/cargo/packs/goodies.dm index d4b9c17bc4..5c5b146164 100644 --- a/modular_splurt/code/modules/cargo/packs/goodies.dm +++ b/modular_splurt/code/modules/cargo/packs/goodies.dm @@ -98,12 +98,6 @@ cost = 900 contains = list(/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag, /obj/item/ammo_box/magazine/m45/rubber= 3) -/datum/supply_pack/goody/laserantique_single - name = "Antique Laser Pistol Single-Pack" - desc = "Contains a pre-assembled Antique Laser pistol, not unlike the Captain's." - cost = 1000 - contains = list(/obj/item/gun/energy/laser/antique) - /datum/supply_pack/goody/lasercivlian_single name = "Civilian Energy Pistol Single-Pack" desc = "Contains a parts kit to assemble a civlian energy pistol." diff --git a/modular_splurt/code/modules/cargo/packs/misc.dm b/modular_splurt/code/modules/cargo/packs/misc.dm index 2bdcb4baf8..dce209fb86 100644 --- a/modular_splurt/code/modules/cargo/packs/misc.dm +++ b/modular_splurt/code/modules/cargo/packs/misc.dm @@ -141,14 +141,3 @@ /obj/item/gun/energy/civilian) crate_name = "Civilian Energy Pistols" crate_type = /obj/structure/closet/crate/secure/weapon - -/datum/supply_pack/misc/antiquelasers - name = "Antique Lasers Pistols" - desc = "A pack of antique laser pistols. Who would actually rely on these old things?" - access = ACCESS_QM - cost = 2800 - contains = list(/obj/item/gun/energy/laser/antique, - /obj/item/gun/energy/laser/antique, - /obj/item/gun/energy/laser/antique) - crate_name = "Antique Lasers Pistols" - crate_type = /obj/structure/closet/crate/secure/weapon diff --git a/modular_splurt/code/modules/projectiles/guns/energy/lasers.dm b/modular_splurt/code/modules/projectiles/guns/energy/lasers.dm index 6bc283de0f..8a7ff167e4 100644 --- a/modular_splurt/code/modules/projectiles/guns/energy/lasers.dm +++ b/modular_splurt/code/modules/projectiles/guns/energy/lasers.dm @@ -1,13 +1,3 @@ -/obj/item/gun/energy/laser/antique - name = "antique laser gun" - icon_state = "caplaser" - item_state = "caplaser" - desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy." - force = 10 - ammo_x_offset = 3 - selfcharge = EGUN_SELFCHARGE - resistance_flags = NONE - /obj/item/gun/energy/civilian name = "civlian energy pistol" desc = "A cheap energy pistol produced by Wattz and Hertz. Has no external ammo indicator. It looks easily modfiable" From 6944a048117d468c1343918c750e2221210e5652 Mon Sep 17 00:00:00 2001 From: frontline03 Date: Sat, 26 Feb 2022 21:24:03 +0000 Subject: [PATCH 44/56] Fixes tcomms power issue --- _maps/map_files/BoxStation/BoxStation.dmm | 55 ++++++++++++++++++++--- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 12ca7e9039..64a0085e46 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -39438,6 +39438,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/tcommsat/computer) "bSe" = ( @@ -39906,6 +39909,9 @@ "bTI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/holopad/secure, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/tcommsat/computer) "bTJ" = ( @@ -40234,6 +40240,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/tcommsat/computer) "bUz" = ( @@ -40929,6 +40938,9 @@ /area/science/misc_lab) "bWs" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/tcommsat/computer) "bWt" = ( @@ -40948,12 +40960,18 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/tcommsat/computer) "bWv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/tcommsat/computer) "bWw" = ( @@ -41042,6 +41060,9 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bWK" = ( @@ -41054,6 +41075,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "bWL" = ( @@ -41777,6 +41801,9 @@ /area/hallway/primary/aft) "bYF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/tcommsat/computer) "bYG" = ( @@ -42418,6 +42445,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "can" = ( @@ -42438,6 +42468,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "cao" = ( @@ -42451,6 +42484,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) "cap" = ( @@ -52042,6 +52078,9 @@ /obj/machinery/power/terminal{ dir = 1 }, +/obj/structure/cable{ + icon_state = "0-4" + }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) "cSL" = ( @@ -63082,6 +63121,12 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"spC" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) "spR" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 @@ -92603,7 +92648,7 @@ bXz bYA bZn cah -bWB +bZo ccf cdc cdZ @@ -92860,7 +92905,7 @@ bXC bXC bZp cak -bWB +bZo bWB bWB cec @@ -93117,7 +93162,7 @@ bXB bYC bZo bWB -bWB +bZo cch cde ceb @@ -93373,8 +93418,8 @@ bWG bXD bYz cSE -bWB -bYz +bZn +spC bYz cdf ced From 7e2f2e120859671ff0d05c949f87563b4b659c9e Mon Sep 17 00:00:00 2001 From: SPLURT Bot <97993072+SPLURT-Station-Bot@users.noreply.github.com> Date: Sat, 26 Feb 2022 21:58:54 +0000 Subject: [PATCH 45/56] Automatic changelog generation for PR #215 [ci skip] --- html/changelogs/AutoChangeLog-pr-215.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-215.yml diff --git a/html/changelogs/AutoChangeLog-pr-215.yml b/html/changelogs/AutoChangeLog-pr-215.yml new file mode 100644 index 0000000000..da8f7e7100 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-215.yml @@ -0,0 +1,4 @@ +author: frontline03 +delete-after: true +changes: + - rscadd: Added power cables to Tcomms SMES From 93580e06e4db205ba7ab5ec98cc5b608a420afa4 Mon Sep 17 00:00:00 2001 From: SPLURT Bot <97993072+SPLURT-Station-Bot@users.noreply.github.com> Date: Sat, 26 Feb 2022 21:59:10 +0000 Subject: [PATCH 46/56] Automatic changelog generation for PR #212 [ci skip] --- html/changelogs/AutoChangeLog-pr-212.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-212.yml diff --git a/html/changelogs/AutoChangeLog-pr-212.yml b/html/changelogs/AutoChangeLog-pr-212.yml new file mode 100644 index 0000000000..05b97f1e0f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-212.yml @@ -0,0 +1,9 @@ +author: BongaTheProto +delete-after: true +changes: + - rscadd: Added new cuminflation mechanics + - rscadd: Added nipfuck and thighfuck verbs + - code_imp: Fixed a couple possible null runtimes and modularizes some stuff + - bugfix: Fixed the (horrible) belly inflation mechanics + - imageadd: added new crayon/spraycan drawings + - tweak: Now your roundstart genital size will affect how much fluids you produce From 1bdc66f54a43fd848f99409a40444ce2134a4b14 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 27 Feb 2022 00:28:05 +0000 Subject: [PATCH 47/56] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-212.yml | 9 --------- html/changelogs/AutoChangeLog-pr-215.yml | 4 ---- html/changelogs/archive/2022-02.yml | 10 ++++++++++ 3 files changed, 10 insertions(+), 13 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-212.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-215.yml diff --git a/html/changelogs/AutoChangeLog-pr-212.yml b/html/changelogs/AutoChangeLog-pr-212.yml deleted file mode 100644 index 05b97f1e0f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-212.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: BongaTheProto -delete-after: true -changes: - - rscadd: Added new cuminflation mechanics - - rscadd: Added nipfuck and thighfuck verbs - - code_imp: Fixed a couple possible null runtimes and modularizes some stuff - - bugfix: Fixed the (horrible) belly inflation mechanics - - imageadd: added new crayon/spraycan drawings - - tweak: Now your roundstart genital size will affect how much fluids you produce diff --git a/html/changelogs/AutoChangeLog-pr-215.yml b/html/changelogs/AutoChangeLog-pr-215.yml deleted file mode 100644 index da8f7e7100..0000000000 --- a/html/changelogs/AutoChangeLog-pr-215.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: frontline03 -delete-after: true -changes: - - rscadd: Added power cables to Tcomms SMES diff --git a/html/changelogs/archive/2022-02.yml b/html/changelogs/archive/2022-02.yml index b2a8d66ec2..f621b68d9b 100644 --- a/html/changelogs/archive/2022-02.yml +++ b/html/changelogs/archive/2022-02.yml @@ -321,3 +321,13 @@ not being able to spawn with aviators due to a spelling mistake - imageadd: A crap ton of icons for the CBRN and MOPP gear, including gloves, suits, boots, mask and tanks. +2022-02-27: + BongaTheProto: + - rscadd: Added new cuminflation mechanics + - rscadd: Added nipfuck and thighfuck verbs + - code_imp: Fixed a couple possible null runtimes and modularizes some stuff + - bugfix: Fixed the (horrible) belly inflation mechanics + - imageadd: added new crayon/spraycan drawings + - tweak: Now your roundstart genital size will affect how much fluids you produce + frontline03: + - rscadd: Added power cables to Tcomms SMES From 6ec93ab8c9bd93fc57525c444374394f80fb4381 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 26 Feb 2022 19:08:07 -0600 Subject: [PATCH 48/56] Automatic changelog generation for PR #15495 [ci skip] --- html/changelogs/AutoChangeLog-pr-15495.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15495.yml diff --git a/html/changelogs/AutoChangeLog-pr-15495.yml b/html/changelogs/AutoChangeLog-pr-15495.yml new file mode 100644 index 0000000000..f9a025c584 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15495.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - rscadd: "Configurable weekly high-chaos days" From 89a6385e15e426023bb757cd361113aae4df7b04 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 26 Feb 2022 19:08:15 -0600 Subject: [PATCH 49/56] Automatic changelog generation for PR #15503 [ci skip] --- html/changelogs/AutoChangeLog-pr-15503.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15503.yml diff --git a/html/changelogs/AutoChangeLog-pr-15503.yml b/html/changelogs/AutoChangeLog-pr-15503.yml new file mode 100644 index 0000000000..96dc78ff65 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15503.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - rscadd: "The limbgrower can make human chest parts that you can build onto into a person." From 6da623250f6ea0633c01591dd95430d82092fe89 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 26 Feb 2022 19:08:21 -0600 Subject: [PATCH 50/56] Automatic changelog generation for PR #15505 [ci skip] --- html/changelogs/AutoChangeLog-pr-15505.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15505.yml diff --git a/html/changelogs/AutoChangeLog-pr-15505.yml b/html/changelogs/AutoChangeLog-pr-15505.yml new file mode 100644 index 0000000000..2c5f1ae47c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15505.yml @@ -0,0 +1,4 @@ +author: "SandPoot and Crowbar764" +delete-after: True +changes: + - rscadd: "TGUI for the player playtimes menu." From ae2c49b472e66c91fc5dcc441fd95359f260c48b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 26 Feb 2022 19:08:30 -0600 Subject: [PATCH 51/56] Automatic changelog generation for PR #15528 [ci skip] --- html/changelogs/AutoChangeLog-pr-15528.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15528.yml diff --git a/html/changelogs/AutoChangeLog-pr-15528.yml b/html/changelogs/AutoChangeLog-pr-15528.yml new file mode 100644 index 0000000000..5b22ff00dc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15528.yml @@ -0,0 +1,4 @@ +author: "SandPoot" +delete-after: True +changes: + - refactor: "Kills off SLOT_ in favor of ITEM_SLOT_" From d53c465102832a6fd3061b7a703fe99c3339a333 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 26 Feb 2022 19:08:50 -0600 Subject: [PATCH 52/56] Automatic changelog generation for PR #15526 [ci skip] --- html/changelogs/AutoChangeLog-pr-15526.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15526.yml diff --git a/html/changelogs/AutoChangeLog-pr-15526.yml b/html/changelogs/AutoChangeLog-pr-15526.yml new file mode 100644 index 0000000000..60d49802c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15526.yml @@ -0,0 +1,5 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "adds a cartridge for the bartender's PDA that lets them search drink recipes" + - rscadd: "updates chemist cartridge to be able to search all chemical recipes" From 206f5d1fff24d38af6b0b0261abc0fea96a8a592 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 26 Feb 2022 19:09:02 -0600 Subject: [PATCH 53/56] Automatic changelog generation for PR #15522 [ci skip] --- html/changelogs/AutoChangeLog-pr-15522.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-15522.yml diff --git a/html/changelogs/AutoChangeLog-pr-15522.yml b/html/changelogs/AutoChangeLog-pr-15522.yml new file mode 100644 index 0000000000..40705aba5f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15522.yml @@ -0,0 +1,4 @@ +author: "bunny232" +delete-after: True +changes: + - rscadd: "Cold weather gear can now provide insulation against temperatures of up to 57C (330K)" From fb7a24b333e514fa0423995d36bd44f13f54251c Mon Sep 17 00:00:00 2001 From: SandPoot Date: Sun, 27 Feb 2022 14:17:53 -0300 Subject: [PATCH 54/56] Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 --- code/__DEFINES/admin.dm | 4 + code/__DEFINES/antagonists.dm | 6 + code/__DEFINES/atmospherics.dm | 1 + code/__DEFINES/cooldowns.dm | 3 + code/__DEFINES/inventory.dm | 167 ++- code/__DEFINES/maths.dm | 3 + code/__DEFINES/research.dm | 4 +- code/__DEFINES/say.dm | 3 + code/__HELPERS/_lists.dm | 3 + code/__HELPERS/cmp.dm | 3 + code/__HELPERS/custom_holoforms.dm | 2 +- code/__HELPERS/pronouns.dm | 18 +- code/__HELPERS/roundend.dm | 4 + code/__HELPERS/type2type.dm | 52 +- code/__HELPERS/unsorted.dm | 2 +- code/_globalvars/lists/objects.dm | 2 + code/_onclick/hud/alien.dm | 2 +- code/_onclick/hud/drones.dm | 6 +- code/_onclick/hud/generic_dextrous.dm | 2 +- code/_onclick/hud/guardian.dm | 2 +- code/_onclick/hud/human.dm | 66 +- code/_onclick/hud/monkey.dm | 10 +- code/_onclick/telekinesis.dm | 2 +- .../configuration/entries/dynamic.dm | 4 + .../configuration/entries/general.dm | 6 + code/controllers/subsystem/job.dm | 8 +- code/datums/action.dm | 2 +- code/datums/components/anti_magic.dm | 2 +- code/datums/components/phantomthief.dm | 2 +- code/datums/components/shielded.dm | 2 +- code/datums/components/twohanded.dm | 2 +- code/datums/datum.dm | 1 + code/datums/diseases/_MobProcs.dm | 4 +- code/datums/diseases/wizarditis.dm | 6 +- code/datums/elements/earhealing.dm | 2 +- code/datums/elements/polychromic.dm | 2 +- code/datums/elements/spellcasting.dm | 2 +- code/datums/martial/boxing.dm | 4 +- code/datums/martial/krav_maga.dm | 4 +- code/datums/martial/wrestling.dm | 4 +- code/datums/mind.dm | 994 +++++++++++++++++- code/datums/mutations/cluwne.dm | 10 +- code/datums/outfit.dm | 44 +- code/datums/traits/_quirk.dm | 2 +- code/datums/traits/good.dm | 10 +- code/datums/traits/negative.dm | 10 +- code/datums/traits/neutral.dm | 2 +- code/game/gamemodes/changeling/changeling.dm | 6 +- code/game/gamemodes/clock_cult/clock_cult.dm | 4 +- .../game/gamemodes/clown_ops/bananium_bomb.dm | 8 +- .../game/gamemodes/clown_ops/clown_weapons.dm | 4 +- code/game/gamemodes/nuclear/nuclear.dm | 6 +- code/game/gamemodes/objective.dm | 4 +- code/game/machinery/limbgrower.dm | 123 ++- code/game/objects/items.dm | 8 +- code/game/objects/items/chrono_eraser.dm | 2 +- code/game/objects/items/cigs_lighters.dm | 8 +- code/game/objects/items/defib.dm | 6 +- code/game/objects/items/devices/PDA/PDA.dm | 14 + .../objects/items/devices/PDA/PDA_types.dm | 1 + code/game/objects/items/devices/PDA/cart.dm | 10 +- code/game/objects/items/devices/megaphone.dm | 2 +- .../items/devices/radio/electropack.dm | 4 +- .../objects/items/devices/radio/headset.dm | 4 +- .../items/devices/reverse_bear_trap.dm | 10 +- code/game/objects/items/devices/scanners.dm | 2 +- .../objects/items/devices/traitordevices.dm | 8 +- code/game/objects/items/fluff.dm | 2 +- code/game/objects/items/granters.dm | 2 +- code/game/objects/items/inducer.dm | 2 +- code/game/objects/items/storage/bags.dm | 10 +- code/game/objects/items/storage/book.dm | 2 +- code/game/objects/items/storage/fancy.dm | 4 +- code/game/objects/items/tanks/watertank.dm | 6 +- code/game/objects/items/weaponry.dm | 2 +- code/game/turfs/simulated/lava.dm | 4 +- code/modules/admin/admin.dm | 14 +- code/modules/admin/playtimes.dm | 68 ++ code/modules/admin/topic.dm | 16 +- code/modules/admin/verbs/debug.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 8 +- .../antagonists/_common/antag_datum.dm | 40 +- .../abductor/equipment/abduction_gear.dm | 2 +- .../bloodsucker/bloodsucker_life.dm | 2 +- .../bloodsucker/bloodsucker_powers.dm | 2 +- .../antagonists/bloodsucker/powers/brawn.dm | 4 +- .../antagonists/changeling/powers/absorb.dm | 4 +- .../changeling/powers/biodegrade.dm | 6 +- .../changeling/powers/mutations.dm | 8 +- .../clockcult/clock_items/clockwork_armor.dm | 8 +- .../clock_items/construct_chassis.dm | 2 +- .../clockcult/clock_items/judicial_visor.dm | 12 +- .../clock_items/wraith_spectacles.dm | 2 +- .../clock_scriptures/scripture_scripts.dm | 24 +- code/modules/antagonists/cult/blood_magic.dm | 12 +- code/modules/antagonists/cult/cult.dm | 11 +- code/modules/antagonists/cult/runes.dm | 2 +- code/modules/antagonists/devil/devil.dm | 8 +- .../eldritch_cult/eldritch_antag.dm | 6 +- .../eldritch_cult/eldritch_items.dm | 4 +- code/modules/antagonists/ert/ert.dm | 4 +- .../antagonists/highlander/highlander.dm | 12 +- .../antagonists/overthrow/overthrow.dm | 6 +- .../antagonists/revolution/revolution.dm | 6 +- .../antagonists/traitor/datum_traitor.dm | 6 +- .../antagonists/wizard/equipment/artefact.dm | 8 +- code/modules/antagonists/wizard/wizard.dm | 12 +- code/modules/awaymissions/capture_the_flag.dm | 2 +- .../awaymissions/mission_code/jungleresort.dm | 2 +- .../awaymissions/mission_code/snowdin.dm | 2 +- code/modules/client/preferences.dm | 4 +- code/modules/clothing/chameleon.dm | 4 +- code/modules/clothing/clothing.dm | 4 +- code/modules/clothing/ears/_ears.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 8 +- code/modules/clothing/glasses/hud.dm | 2 +- code/modules/clothing/glasses/phantomthief.dm | 4 +- code/modules/clothing/gloves/color.dm | 4 +- code/modules/clothing/gloves/miscellaneous.dm | 10 +- code/modules/clothing/gloves/mittens.dm | 2 + code/modules/clothing/gloves/tacklers.dm | 6 +- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/head/jobs.dm | 2 +- code/modules/clothing/head/misc.dm | 5 +- code/modules/clothing/head/misc_special.dm | 10 +- code/modules/clothing/masks/_masks.dm | 2 +- code/modules/clothing/masks/cluwne.dm | 4 +- code/modules/clothing/masks/miscellaneous.dm | 2 +- code/modules/clothing/neck/_neck.dm | 4 +- code/modules/clothing/outfits/vr.dm | 2 +- code/modules/clothing/outfits/vv_outfit.dm | 50 +- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/clothing/shoes/cluwne.dm | 2 +- code/modules/clothing/shoes/magboots.dm | 2 +- code/modules/clothing/shoes/miscellaneous.dm | 8 +- code/modules/clothing/shoes/taeclowndo.dm | 4 +- .../modules/clothing/spacesuits/chronosuit.dm | 2 +- code/modules/clothing/spacesuits/hardsuit.dm | 20 +- code/modules/clothing/suits/miscellaneous.dm | 23 +- .../modules/clothing/suits/reactive_armour.dm | 4 +- code/modules/clothing/suits/toggles.dm | 12 +- code/modules/clothing/suits/wiz_robe.dm | 2 +- code/modules/clothing/under/_under.dm | 10 +- code/modules/clothing/under/cluwne.dm | 2 +- code/modules/clothing/under/color.dm | 4 +- code/modules/events/wizard/curseditems.dm | 18 +- code/modules/flufftext/Hallucination.dm | 2 +- .../food_and_drinks/drinks/drinks/bottle.dm | 2 +- code/modules/holiday/dynamic.dm | 10 + code/modules/holiday/halloween/jacqueen.dm | 4 +- code/modules/jobs/job_types/_job.dm | 2 +- .../jobs/job_types/atmospheric_technician.dm | 4 +- code/modules/jobs/job_types/chaplain.dm | 4 +- code/modules/jobs/job_types/chief_engineer.dm | 4 +- code/modules/jobs/job_types/paramedic.dm | 2 +- .../jobs/job_types/research_director.dm | 2 +- code/modules/jobs/job_types/roboticist.dm | 2 +- .../jobs/job_types/security_officer.dm | 2 +- code/modules/jobs/job_types/shaft_miner.dm | 2 +- .../jobs/job_types/station_engineer.dm | 4 +- .../mining/equipment/wormhole_jaunter.dm | 4 +- .../mining/lavaland/necropolis_chests.dm | 2 +- code/modules/mob/inventory.dm | 35 +- .../living/carbon/alien/special/facehugger.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 12 +- .../mob/living/carbon/carbon_stripping.dm | 12 +- .../mob/living/carbon/human/examine.dm | 24 +- code/modules/mob/living/carbon/human/human.dm | 23 +- .../living/carbon/human/human_stripping.dm | 22 +- .../mob/living/carbon/human/inventory.dm | 92 +- .../mob/living/carbon/human/species.dm | 60 +- .../carbon/human/species_types/golems.dm | 2 +- .../carbon/human/species_types/mushpeople.dm | 2 +- .../human/species_types/shadowpeople.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 46 +- code/modules/mob/living/carbon/inventory.dm | 40 +- code/modules/mob/living/carbon/life.dm | 10 +- .../mob/living/carbon/monkey/inventory.dm | 10 +- .../mob/living/carbon/monkey/monkey.dm | 2 +- .../mob/living/carbon/monkey/punpun.dm | 4 +- .../modules/mob/living/carbon/update_icons.dm | 10 +- code/modules/mob/living/login.dm | 5 +- .../simple_animal/friendly/drone/_drone.dm | 4 +- .../friendly/drone/drones_as_items.dm | 2 +- .../simple_animal/friendly/drone/inventory.dm | 16 +- .../simple_animal/guardian/types/dextrous.dm | 8 +- .../hostile/mining_mobs/goliath.dm | 2 +- code/modules/mob/mob.dm | 6 +- code/modules/ninja/energy_katana.dm | 2 +- code/modules/ninja/outfit.dm | 2 +- code/modules/ninja/suit/shoes.dm | 2 +- .../projectiles/boxes_magazines/ammo_boxes.dm | 2 +- .../boxes_magazines/external/rechargable.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- .../modules/projectiles/guns/ballistic/toy.dm | 2 +- .../projectiles/guns/energy/laser_gatling.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 35 + code/modules/reagents/chemistry/recipes.dm | 2 + .../chemistry/recipes/slime_extracts.dm | 2 +- .../reagents/chemistry/recipes/special.dm | 2 + .../reagents/reagent_containers/glass.dm | 33 +- .../reagents/reagent_containers/rags.dm | 6 +- .../research/designs/limbgrower_designs.dm | 12 + .../xenobiology/crossbreeding/_clothing.dm | 6 +- .../xenobiology/crossbreeding/regenerative.dm | 16 +- code/modules/spells/spell_types/lichdom.dm | 14 +- code/modules/unit_tests/outfit_sanity.dm | 8 +- code/modules/vehicles/scooter.dm | 4 +- html/changelogs/AutoChangeLog-pr-15495.yml | 4 + html/changelogs/AutoChangeLog-pr-15503.yml | 4 + html/changelogs/AutoChangeLog-pr-15505.yml | 4 + html/changelogs/AutoChangeLog-pr-15522.yml | 4 + html/changelogs/AutoChangeLog-pr-15526.yml | 5 + html/changelogs/AutoChangeLog-pr-15528.yml | 4 + html/changelogs/archive/2022-02.yml | 3 + icons/obj/pda.dmi | Bin 16000 -> 16140 bytes .../code/datums/components/souldeath.dm | 2 +- .../code/modules/client/loadout/__donator.dm | 190 ++-- .../code/modules/client/loadout/backpack.dm | 2 +- .../code/modules/client/loadout/glasses.dm | 2 +- .../code/modules/client/loadout/gloves.dm | 2 +- .../code/modules/client/loadout/hands.dm | 2 +- .../code/modules/client/loadout/head.dm | 6 +- .../code/modules/client/loadout/mask.dm | 2 +- .../code/modules/client/loadout/neck.dm | 2 +- .../code/modules/client/loadout/shoes.dm | 2 +- .../code/modules/client/loadout/suit.dm | 2 +- .../code/modules/client/loadout/uniform.dm | 12 +- .../code/modules/client/loadout/unlockable.dm | 2 +- .../modules/custom_loadout/custom_items.dm | 4 +- .../modules/custom_loadout/load_to_mob.dm | 2 +- .../eventmaps/Spookystation/JTGSZwork.dm | 2 +- .../chemistry/reagents/fermi_reagents.dm | 2 +- .../reagents/chemistry/recipes/fermi.dm | 2 + .../code/modules/reagents/objects/clothes.dm | 2 +- .../code/datums/elements/holder_micro.dm | 2 +- .../code/datums/interactions/lewd/_lewd.dm | 24 +- .../interactions/lewd/lewd_interactions.dm | 2 +- .../code/game/objects/items/chrono_eraser.dm | 2 +- .../objects/items/devices/radio/headset.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 2 - .../code/game/objects/items/fleshlight.dm | 6 +- .../modules/client/loadout/accessories.dm | 2 +- .../code/modules/client/loadout/boxers.dm | 2 +- .../code/modules/client/loadout/shirts.dm | 2 +- .../code/modules/client/loadout/socks.dm | 2 +- .../code/modules/client/loadout/wrists.dm | 2 +- .../code/modules/clothing/gloves/_gloves.dm | 24 +- .../modules/clothing/spacesuits/hardsuit.dm | 2 +- .../mining/lavaland/necropolis_chests.dm | 2 +- .../living/carbon/human/human_stripping.dm | 10 +- tgstation.dme | 3 +- tgui/packages/tgui/interfaces/Limbgrower.js | 21 +- .../tgui/interfaces/PlayerPlaytimes.js | 119 +++ 255 files changed, 2448 insertions(+), 1057 deletions(-) create mode 100644 code/modules/admin/playtimes.dm create mode 100644 code/modules/holiday/dynamic.dm create mode 100644 html/changelogs/AutoChangeLog-pr-15495.yml create mode 100644 html/changelogs/AutoChangeLog-pr-15503.yml create mode 100644 html/changelogs/AutoChangeLog-pr-15505.yml create mode 100644 html/changelogs/AutoChangeLog-pr-15522.yml create mode 100644 html/changelogs/AutoChangeLog-pr-15526.yml create mode 100644 html/changelogs/AutoChangeLog-pr-15528.yml delete mode 100644 modular_sand/code/game/objects/items/devices/radio/radio.dm create mode 100644 tgui/packages/tgui/interfaces/PlayerPlaytimes.js diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 54c4c1de95..8da60d8af0 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -57,6 +57,10 @@ #define ADMIN_SET_SD_CODE "(SETCODE)" #define ADMIN_FULLMONTY_NONAME(user) "[ADMIN_QUE(user)] [ADMIN_PP(user)] [ADMIN_VV(user)] [ADMIN_SM(user)] [ADMIN_FLW(user)] [ADMIN_TP(user)] [ADMIN_INDIVIDUALLOG(user)] [ADMIN_SMITE(user)]" #define ADMIN_FULLMONTY(user) "[key_name_admin(user)] [ADMIN_FULLMONTY_NONAME(user)]" +//ambition start +#define ADMIN_TPMONTY_NONAME(user) "[ADMIN_QUE(user)] [ADMIN_JMP(user)] [ADMIN_FLW(user)]" +#define ADMIN_TPMONTY(user) "[key_name_admin(user)] [ADMIN_TPMONTY_NONAME(user)]" +//ambition end #define ADMIN_JMP(src) "(JMP)" #define COORD(src) "[src ? "([src.x],[src.y],[src.z])" : "nonexistent location"]" #define AREACOORD(src) "[src ? "[get_area_name(src, TRUE)] ([src.x], [src.y], [src.z])" : "nonexistent location"]" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 20b4f03d71..00751f2cab 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -123,3 +123,9 @@ GLOBAL_LIST_EMPTY(living_heart_cache) //A list of all living hearts in existance /// The dimensions of the antagonist preview icon. Will be scaled to this size. #define ANTAGONIST_PREVIEW_ICON_SIZE 96 + +//Objectives-Ambitions Panel +#define REQUEST_NEW_OBJECTIVE "new_objective" +#define REQUEST_DEL_OBJECTIVE "del_objective" +#define REQUEST_WIN_OBJECTIVE "win_objective" +#define REQUEST_LOSE_OBJECTIVE "lose_objective" diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 2ead5ea068..35de475d35 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -116,6 +116,7 @@ #define GLOVES_MAX_TEMP_PROTECT 1500 //For some gloves #define SHOES_MIN_TEMP_PROTECT 2.0 //For gloves #define SHOES_MAX_TEMP_PROTECT 1500 //For gloves +#define COAT_MAX_TEMP_PROTECT 330 //For winter coats (if they can stop you from getting cold why can't they do it the other way to a lesser extent) #define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE #define MAX_HIGH_PRESSURE_DAMAGE 16 // CITADEL CHANGES Max to 16, low to 8. diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index 92231d3998..b783678c86 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -27,6 +27,9 @@ //INDEXES #define COOLDOWN_EMPLOYMENT_CABINET "employment cabinet" +#define COOLDOWN_AMBITION "ambition" +#define COOLDOWN_OBJECTIVES "objectives" +#define COOLDOWN_OBJ_ADMIN_PING "obj_admin_ping" //car cooldowns #define COOLDOWN_CAR_HONK "car_honk" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 1431ad2109..f9f242e7e3 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -6,116 +6,67 @@ #define STORAGE_VIEW_DEPTH 2 //ITEM INVENTORY SLOT BITMASKS -#define ITEM_SLOT_OCLOTHING (1<<0) -#define ITEM_SLOT_ICLOTHING (1<<1) -#define ITEM_SLOT_GLOVES (1<<2) -#define ITEM_SLOT_EYES (1<<3) -#define ITEM_SLOT_EARS (1<<4) -#define ITEM_SLOT_MASK (1<<5) -#define ITEM_SLOT_HEAD (1<<6) -#define ITEM_SLOT_FEET (1<<7) -#define ITEM_SLOT_ID (1<<8) -#define ITEM_SLOT_BELT (1<<9) -#define ITEM_SLOT_BACK (1<<10) -#define ITEM_SLOT_POCKET (1<<11) // this is to allow items with a w_class of WEIGHT_CLASS_NORMAL or WEIGHT_CLASS_BULKY to fit in pockets. -#define ITEM_SLOT_DENYPOCKET (1<<12) // this is to deny items with a w_class of WEIGHT_CLASS_SMALL or WEIGHT_CLASS_TINY to fit in pockets. -#define ITEM_SLOT_NECK (1<<13) -#define ITEM_SLOT_HANDS (1<<14) -#define ITEM_SLOT_BACKPACK (1<<15) -#define ITEM_SLOT_SUITSTORE (1<<16) -//skyrat edit -#define ITEM_SLOT_UNDERWEAR (1<<17) -#define ITEM_SLOT_SOCKS (1<<18) -#define ITEM_SLOT_SHIRT (1<<19) -#define ITEM_SLOT_WRISTS (1<<20) -// +/// Suit slot (armors, costumes, space suits, etc.) +#define ITEM_SLOT_OCLOTHING (1<<0) +/// Jumpsuit slot +#define ITEM_SLOT_ICLOTHING (1<<1) +/// Glove slot +#define ITEM_SLOT_GLOVES (1<<2) +/// Glasses slot +#define ITEM_SLOT_EYES (1<<3) +/// Ear slot (radios, earmuffs) +#define ITEM_SLOT_EARS_LEFT (1<<4) +/// Mask slot +#define ITEM_SLOT_MASK (1<<5) +/// Head slot (helmets, hats, etc.) +#define ITEM_SLOT_HEAD (1<<6) +/// Shoe slot +#define ITEM_SLOT_FEET (1<<7) +/// ID slot +#define ITEM_SLOT_ID (1<<8) +/// Belt slot +#define ITEM_SLOT_BELT (1<<9) +/// Back slot +#define ITEM_SLOT_BACK (1<<10) +/// Dextrous simplemob "hands" (used for Drones and Dextrous Guardians) +#define ITEM_SLOT_DEX_STORAGE (1<<11) +/// Neck slot (ties, bedsheets, scarves) +#define ITEM_SLOT_NECK (1<<12) +/// A character's hand slots +#define ITEM_SLOT_HANDS (1<<13) +/// Inside of a character's backpack +#define ITEM_SLOT_BACKPACK (1<<14) +/// Suit Storage slot +#define ITEM_SLOT_SUITSTORE (1<<15) +/// Left Pocket slot +#define ITEM_SLOT_LPOCKET (1<<16) +/// Right Pocket slot +#define ITEM_SLOT_RPOCKET (1<<17) +// -- Sandstorm edit -- +/// Underwear slot +#define ITEM_SLOT_UNDERWEAR (1<<17) +/// Socks slot +#define ITEM_SLOT_SOCKS (1<<18) +/// Shirt slot +#define ITEM_SLOT_SHIRT (1<<19) +/// Right ear slot +#define ITEM_SLOT_EARS_RIGHT (1<<20) +/// Wrist slot +#define ITEM_SLOT_WRISTS (1<<21) +// -- End edit -- +/// Handcuff slot +#define ITEM_SLOT_HANDCUFFED (1<<22) +/// Legcuff slot (bolas, beartraps) +#define ITEM_SLOT_LEGCUFFED (1<<23) -//SLOTS -#define SLOT_BACK 1 -#define SLOT_WEAR_MASK 2 -#define SLOT_HANDCUFFED 3 -#define SLOT_HANDS 4 //wherever you provide a slot for hands you provide SLOT_HANDS - //SLOT_HANDS as a slot will pick ANY available hand -#define SLOT_BELT 5 -#define SLOT_WEAR_ID 6 -#define SLOT_EARS_LEFT 7 //skyrat edit -#define SLOT_GLASSES 8 -#define SLOT_GLOVES 9 -#define SLOT_NECK 10 -#define SLOT_HEAD 11 -#define SLOT_SHOES 12 -#define SLOT_WEAR_SUIT 13 -#define SLOT_W_UNIFORM 14 -#define SLOT_L_STORE 15 -#define SLOT_R_STORE 16 -#define SLOT_S_STORE 17 -#define SLOT_IN_BACKPACK 18 -#define SLOT_LEGCUFFED 19 -#define SLOT_GENERC_DEXTROUS_STORAGE 20 -//skyrat edit -#define SLOT_W_UNDERWEAR 21 -#define SLOT_W_SOCKS 22 -#define SLOT_W_SHIRT 23 -#define SLOT_EARS_RIGHT 24 -#define SLOT_WRISTS 25 -// +/// Total amount of slots +#define SLOTS_AMT 25 // Keep this up to date! +//SLOT GROUP HELPERS +#define ITEM_SLOT_POCKETS (ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET) -#define SLOTS_AMT 25 // Keep this up to date! //skyrat edit - extra slots - -//I hate that this has to exist -/proc/slotdefine2slotbit(slotdefine) //Keep this up to date with the value of SLOT BITMASKS and SLOTS (the two define sections above) - . = 0 - switch(slotdefine) - if(SLOT_BACK) - . = ITEM_SLOT_BACK - if(SLOT_WEAR_MASK) - . = ITEM_SLOT_MASK - if(SLOT_NECK) - . = ITEM_SLOT_NECK - if(SLOT_BELT) - . = ITEM_SLOT_BELT - if(SLOT_WEAR_ID) - . = ITEM_SLOT_ID - //skyrat edit - if(SLOT_EARS_RIGHT) - . = ITEM_SLOT_EARS - if(SLOT_EARS_LEFT) - . = ITEM_SLOT_EARS - // - if(SLOT_GLASSES) - . = ITEM_SLOT_EYES - if(SLOT_GLOVES) - . = ITEM_SLOT_GLOVES - //skyrat edit - if(SLOT_WRISTS) - . = ITEM_SLOT_WRISTS - // - if(SLOT_HEAD) - . = ITEM_SLOT_HEAD - if(SLOT_SHOES) - . = ITEM_SLOT_FEET - if(SLOT_WEAR_SUIT) - . = ITEM_SLOT_OCLOTHING - if(SLOT_W_UNIFORM) - . = ITEM_SLOT_ICLOTHING - if(SLOT_L_STORE, SLOT_R_STORE) - . = ITEM_SLOT_POCKET - if(SLOT_HANDS) - . = ITEM_SLOT_HANDS - if(SLOT_IN_BACKPACK) - . = ITEM_SLOT_BACKPACK - if(SLOT_S_STORE) - . = ITEM_SLOT_SUITSTORE - //skyrat edit - if(SLOT_W_UNDERWEAR) - . = ITEM_SLOT_UNDERWEAR - if(SLOT_W_SOCKS) - . = ITEM_SLOT_SOCKS - if(SLOT_W_SHIRT) - . = ITEM_SLOT_SHIRT - // - +//EARS HELPER +#define ITEM_SLOT_EARS (ITEM_SLOT_EARS_LEFT|ITEM_SLOT_EARS_RIGHT) //Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. #define HIDEGLOVES (1<<0) @@ -278,4 +229,4 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list( #define GET_INTERNAL_SLOTS(C) list(C.head, C.wear_mask) //Slots that won't trigger humans' update_genitals() on equip(). -GLOBAL_LIST_INIT(no_genitals_update_slots, list(SLOT_L_STORE, SLOT_R_STORE, SLOT_S_STORE, SLOT_IN_BACKPACK, SLOT_LEGCUFFED, SLOT_HANDCUFFED, SLOT_HANDS, SLOT_GENERC_DEXTROUS_STORAGE)) +GLOBAL_LIST_INIT(no_genitals_update_slots, list(ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET, ITEM_SLOT_SUITSTORE, ITEM_SLOT_BACKPACK, ITEM_SLOT_LEGCUFFED, ITEM_SLOT_HANDCUFFED, ITEM_SLOT_HANDS, ITEM_SLOT_DEX_STORAGE)) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index f56cd76a71..60d02c1e49 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -105,6 +105,9 @@ #define TORADIANS(degrees) ((degrees) * 0.0174532925) +/// Gets shift x that would be required the bitflag (1<= S) && (E == 0 || length(L) >= (E - 1))) { L.Cut(S, E); if(!length(L)) { L = null; } } +//ambition end #define LAZYADD(L, I) if(!L) { L = list(); } L += I; #define LAZYOR(L, I) if(!L) { L = list(); } L |= I; #define LAZYFIND(L, V) (L ? L.Find(V) : 0) diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 4ee622961a..2fbf087288 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -140,3 +140,6 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_typepaths_asc(A, B) return sorttext("[B]","[A]") + +/proc/cmp_playtime(list/A, list/B) + return A["playtime"] - B["playtime"] diff --git a/code/__HELPERS/custom_holoforms.dm b/code/__HELPERS/custom_holoforms.dm index 2733a97e14..8aa8d279ec 100644 --- a/code/__HELPERS/custom_holoforms.dm +++ b/code/__HELPERS/custom_holoforms.dm @@ -18,7 +18,7 @@ if(length(inhand_equipment)) for(var/path in inhand_equipment) var/obj/item/I = new path - mannequin.equip_to_slot_if_possible(I, SLOT_HANDS, TRUE, TRUE, TRUE, TRUE) + mannequin.equip_to_slot_if_possible(I, ITEM_SLOT_HANDS, TRUE, TRUE, TRUE, TRUE) var/icon/combined = new diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index bab286bafe..bfe09ba370 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -203,62 +203,62 @@ /mob/living/carbon/human/p_they(capitalized, temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_their(capitalized, temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_them(capitalized, temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_have(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_are(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_were(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_do(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_s(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() /mob/living/carbon/human/p_es(temp_gender) var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if((SLOT_W_UNIFORM in obscured) && skipface) + if((ITEM_SLOT_ICLOTHING in obscured) && skipface) temp_gender = PLURAL return ..() diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index d9e83eed0d..7a26088c73 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -624,6 +624,10 @@ currrent_category = A.roundend_category previous_category = A result += A.roundend_report() +//ambition start + for(var/count in 1 to LAZYLEN(A.owner.ambitions)) + result += "
    Ambition #[count]: [A.owner.ambitions[count]]" +//ambition end result += "

    " CHECK_TICK diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 850b299ed0..63e0c0a0f9 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -412,25 +412,25 @@ /proc/slot2body_zone(slot) switch(slot) - if(SLOT_BACK, SLOT_WEAR_SUIT, SLOT_W_UNIFORM, SLOT_BELT, SLOT_WEAR_ID) + if(ITEM_SLOT_BACK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_ICLOTHING, ITEM_SLOT_BELT, ITEM_SLOT_ID) return BODY_ZONE_CHEST - if(SLOT_GLOVES, SLOT_HANDS, SLOT_HANDCUFFED, SLOT_WRISTS) //SKYRAT EDIT + if(ITEM_SLOT_GLOVES, ITEM_SLOT_HANDS, ITEM_SLOT_HANDCUFFED, ITEM_SLOT_WRISTS) // Sandstorm edit return pick(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND) - if(SLOT_HEAD, SLOT_NECK, SLOT_NECK, SLOT_EARS_LEFT, SLOT_EARS_RIGHT) //skyrat edit + if(ITEM_SLOT_HEAD, ITEM_SLOT_NECK, ITEM_SLOT_NECK, ITEM_SLOT_EARS) return BODY_ZONE_HEAD - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) return BODY_ZONE_PRECISE_MOUTH - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) return BODY_ZONE_PRECISE_EYES - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) return pick(BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) return pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) //adapted from http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ @@ -652,43 +652,43 @@ /proc/slot_to_string(slot) switch(slot) - if(SLOT_BACK) + if(ITEM_SLOT_BACK) return "Backpack" - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) return "Mask" - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) return "Hands" - if(SLOT_BELT) + if(ITEM_SLOT_BELT) return "Belt" - //skyrat edit - if(SLOT_EARS_LEFT) + // Sandstorm edit + if(ITEM_SLOT_EARS_LEFT) return "Left ear" - if(SLOT_EARS_RIGHT) + if(ITEM_SLOT_EARS_RIGHT) return "Right ear" - if(SLOT_W_UNDERWEAR) + if(ITEM_SLOT_UNDERWEAR) return "Underwear" - if(SLOT_W_SOCKS) + if(ITEM_SLOT_SOCKS) return "Socks" - if(SLOT_W_SHIRT) + if(ITEM_SLOT_SHIRT) return "Shirt" - if(SLOT_WRISTS) + if(ITEM_SLOT_WRISTS) return "Wrist" // - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) return "Glasses" - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) return "Gloves" - if(SLOT_NECK) + if(ITEM_SLOT_NECK) return "Neck" - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) return "Head" - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) return "Shoes" - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) return "Suit" - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) return "Uniform" - if(SLOT_IN_BACKPACK) + if(ITEM_SLOT_BACKPACK) return "In backpack" /proc/tg_ui_icon_to_cit_ui(ui_style) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 1a8852a721..f931dc5e5c 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1600,7 +1600,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) if(!iscarbon(target)) return TRUE if(check_neck) - if(istype(target.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + if(istype(target.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) return FALSE if(check_blood) if(target.reagents.has_reagent(/datum/reagent/consumable/garlic)) diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 14969e6c92..921b512d32 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -16,6 +16,8 @@ GLOBAL_LIST_EMPTY(singularities) //list of all singularities on the stati GLOBAL_LIST_EMPTY(grounding_rods) //list of all grounding rods on the station GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction datums. Used during chemical reactions +GLOBAL_LIST(drink_reactions_list) //list of all /datum/chemical_reaction datums where the output is of type /datum/reagent/consumable for bartender PDA +GLOBAL_LIST(normalized_chemical_reactions_list) //list of all /datum/chemical_reaction datums with actual sane indexing for chemistry PDA GLOBAL_LIST(chemical_reagents_list) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff GLOBAL_LIST_EMPTY(tech_list) //list of all /datum/tech datums indexed by id. GLOBAL_LIST_EMPTY(surgeries_list) //list of all surgeries by name, associated with their path. diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index bf7969a6ba..8a494a05b9 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -117,7 +117,7 @@ for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src - inv_slots[inv.slot_id] = inv + inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_icon() /datum/hud/alien/persistent_inventory_update() diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm index 849936d4ed..a2cae89864 100644 --- a/code/_onclick/hud/drones.dm +++ b/code/_onclick/hud/drones.dm @@ -8,7 +8,7 @@ inv_box.icon_state = "suit_storage" // inv_box.icon_full = "template" inv_box.screen_loc = ui_drone_storage - inv_box.slot_id = SLOT_GENERC_DEXTROUS_STORAGE + inv_box.slot_id = ITEM_SLOT_DEX_STORAGE static_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -17,13 +17,13 @@ inv_box.icon_state = "mask" // inv_box.icon_full = "template" inv_box.screen_loc = ui_drone_head - inv_box.slot_id = SLOT_HEAD + inv_box.slot_id = ITEM_SLOT_HEAD static_inventory += inv_box for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src - inv_slots[inv.slot_id] = inv + inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_icon() diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index 88407bb04c..1762bee1fc 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -60,7 +60,7 @@ for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src - inv_slots[inv.slot_id] = inv + inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_icon() /datum/hud/dextrous/persistent_inventory_update() diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm index 7f360b48dc..2af02d8437 100644 --- a/code/_onclick/hud/guardian.dm +++ b/code/_onclick/hud/guardian.dm @@ -43,7 +43,7 @@ inv_box.icon = ui_style inv_box.icon_state = "suit_storage" inv_box.screen_loc = ui_id - inv_box.slot_id = SLOT_GENERC_DEXTROUS_STORAGE + inv_box.slot_id = ITEM_SLOT_DEX_STORAGE static_inventory += inv_box using = new /atom/movable/screen/guardian/Communicate() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 126aee0f52..684278d9bd 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -17,23 +17,23 @@ if(usr.hud_used.inventory_shown && targetmob.hud_used) usr.hud_used.inventory_shown = FALSE usr.client.screen -= targetmob.hud_used.toggleable_inventory - //SKYRAT EDIT + // Sandstorm edit usr.client.screen -= targetmob.hud_used.extra_inventory - //SKYRAT EDIT END + // Sandstorm edit END else usr.hud_used.inventory_shown = TRUE usr.client.screen += targetmob.hud_used.toggleable_inventory - //SKYRAT EDIT + // Sandstorm edit if(usr.hud_used.extra_shown) usr.client.screen += targetmob.hud_used.extra_inventory - //SKYRAT EDIT END + // Sandstorm edit END targetmob.hud_used.hidden_inventory_update(usr) - //SKYRAT EDIT + // Sandstorm edit targetmob.hud_used.extra_inventory_update(usr) - //SKYRAT EDIT END + // Sandstorm edit END -//skyrat edit +// Sandstorm edit /atom/movable/screen/human/toggle/extra name = "toggle extra" icon_state = "toggle_extra" @@ -267,7 +267,7 @@ inv_box = new /atom/movable/screen/inventory() inv_box.name = "i_clothing" inv_box.icon = ui_style - inv_box.slot_id = SLOT_W_UNIFORM + inv_box.slot_id = ITEM_SLOT_ICLOTHING inv_box.icon_state = "uniform" inv_box.screen_loc = ui_iclothing toggleable_inventory += inv_box @@ -275,7 +275,7 @@ inv_box = new /atom/movable/screen/inventory() inv_box.name = "o_clothing" inv_box.icon = ui_style - inv_box.slot_id = SLOT_WEAR_SUIT + inv_box.slot_id = ITEM_SLOT_OCLOTHING inv_box.icon_state = "suit" inv_box.screen_loc = ui_oclothing toggleable_inventory += inv_box @@ -301,7 +301,7 @@ inv_box.icon = ui_style inv_box.icon_state = "id" inv_box.screen_loc = ui_id - inv_box.slot_id = SLOT_WEAR_ID + inv_box.slot_id = ITEM_SLOT_ID static_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -309,7 +309,7 @@ inv_box.icon = ui_style inv_box.icon_state = "mask" inv_box.screen_loc = ui_mask - inv_box.slot_id = SLOT_WEAR_MASK + inv_box.slot_id = ITEM_SLOT_MASK toggleable_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -317,7 +317,7 @@ inv_box.icon = ui_style inv_box.icon_state = "neck" inv_box.screen_loc = ui_neck - inv_box.slot_id = SLOT_NECK + inv_box.slot_id = ITEM_SLOT_NECK toggleable_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -325,7 +325,7 @@ inv_box.icon = ui_style inv_box.icon_state = "back" inv_box.screen_loc = ui_back - inv_box.slot_id = SLOT_BACK + inv_box.slot_id = ITEM_SLOT_BACK static_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -333,7 +333,7 @@ inv_box.icon = ui_style inv_box.icon_state = "pocket" inv_box.screen_loc = ui_storage1 - inv_box.slot_id = SLOT_L_STORE + inv_box.slot_id = ITEM_SLOT_LPOCKET static_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -341,7 +341,7 @@ inv_box.icon = ui_style inv_box.icon_state = "pocket" inv_box.screen_loc = ui_storage2 - inv_box.slot_id = SLOT_R_STORE + inv_box.slot_id = ITEM_SLOT_RPOCKET static_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -349,7 +349,7 @@ inv_box.icon = ui_style inv_box.icon_state = "suit_storage" inv_box.screen_loc = ui_sstore1 - inv_box.slot_id = SLOT_S_STORE + inv_box.slot_id = ITEM_SLOT_SUITSTORE static_inventory += inv_box using = new /atom/movable/screen/resist() @@ -382,7 +382,7 @@ inv_box.icon = ui_style inv_box.icon_state = "gloves" inv_box.screen_loc = ui_gloves - inv_box.slot_id = SLOT_GLOVES + inv_box.slot_id = ITEM_SLOT_GLOVES toggleable_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -390,15 +390,15 @@ inv_box.icon = ui_style inv_box.icon_state = "glasses" inv_box.screen_loc = ui_glasses - inv_box.slot_id = SLOT_GLASSES + inv_box.slot_id = ITEM_SLOT_EYES toggleable_inventory += inv_box inv_box = new /atom/movable/screen/inventory() - inv_box.name = "left ear" //sandstorm edit + inv_box.name = "left ear" // Sandstorm edit inv_box.icon = ui_style inv_box.icon_state = "ears" inv_box.screen_loc = ui_ears - inv_box.slot_id = SLOT_EARS_LEFT //skyrat edit + inv_box.slot_id = ITEM_SLOT_EARS_LEFT // Sandstorm Edit toggleable_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -406,7 +406,7 @@ inv_box.icon = ui_style inv_box.icon_state = "head" inv_box.screen_loc = ui_head - inv_box.slot_id = SLOT_HEAD + inv_box.slot_id = ITEM_SLOT_HEAD toggleable_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -414,10 +414,10 @@ inv_box.icon = ui_style inv_box.icon_state = "shoes" inv_box.screen_loc = ui_shoes - inv_box.slot_id = SLOT_SHOES + inv_box.slot_id = ITEM_SLOT_FEET toggleable_inventory += inv_box - //skyrat edit + // Sandstorm edit using = new /atom/movable/screen/human/toggle/extra() using.icon = ui_style_modular(ui_style) using.screen_loc = ui_inventory_extra @@ -429,7 +429,7 @@ inv_box.icon = ui_style_modular(ui_style) inv_box.icon_state = "underwear" inv_box.screen_loc = ui_boxers - inv_box.slot_id = SLOT_W_UNDERWEAR //skyrat edit + inv_box.slot_id = ITEM_SLOT_UNDERWEAR // Sandstorm edit extra_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -437,7 +437,7 @@ inv_box.icon = ui_style_modular(ui_style) inv_box.icon_state = "socks" inv_box.screen_loc = ui_socks - inv_box.slot_id = SLOT_W_SOCKS //skyrat edit + inv_box.slot_id = ITEM_SLOT_SOCKS // Sandstorm edit extra_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -445,7 +445,7 @@ inv_box.icon = ui_style_modular(ui_style) inv_box.icon_state = "shirt" inv_box.screen_loc = ui_shirt - inv_box.slot_id = SLOT_W_SHIRT //skyrat edit + inv_box.slot_id = ITEM_SLOT_SHIRT // Sandstorm edit extra_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -453,7 +453,7 @@ inv_box.icon = ui_style_modular(ui_style) inv_box.icon_state = "ears_extra" inv_box.screen_loc = ui_ears_extra - inv_box.slot_id = SLOT_EARS_RIGHT //skyrat edit + inv_box.slot_id = ITEM_SLOT_EARS_RIGHT // Sandstorm edit extra_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -461,7 +461,7 @@ inv_box.icon = ui_style_modular(ui_style) inv_box.icon_state = "wrists" inv_box.screen_loc = ui_wrists - inv_box.slot_id = SLOT_WRISTS + inv_box.slot_id = ITEM_SLOT_WRISTS extra_inventory += inv_box // @@ -471,7 +471,7 @@ inv_box.icon_state = "belt" // inv_box.icon_full = "template_small" inv_box.screen_loc = ui_belt - inv_box.slot_id = SLOT_BELT + inv_box.slot_id = ITEM_SLOT_BELT static_inventory += inv_box throw_icon = new /atom/movable/screen/throw_catch() @@ -551,10 +551,10 @@ zone_select.update_icon() static_inventory += zone_select - for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory + extra_inventory)) //skyrat edit + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory + extra_inventory)) // Sandstorm edit if(inv.slot_id) inv.hud = src - inv_slots[inv.slot_id] = inv + inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_icon() update_locked_slots() @@ -611,7 +611,7 @@ if(!istype(H) || !H.dna.species) return var/datum/species/S = H.dna.species - for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory + extra_inventory)) //skyrat edit + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory + extra_inventory)) // Sandstorm edit if(inv.slot_id) if(inv.slot_id in S.no_equip) inv.alpha = 128 @@ -665,7 +665,7 @@ if(H.head) screenmob.client.screen -= H.head -//skyrat edit +// Sandstorm edit /datum/hud/human/extra_inventory_update(mob/viewer) if(!mymob) return diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index 376db7bf96..b63f8241cb 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -50,7 +50,7 @@ inv_box.icon_state = "mask" // inv_box.icon_full = "template" inv_box.screen_loc = ui_monkey_mask - inv_box.slot_id = SLOT_WEAR_MASK + inv_box.slot_id = ITEM_SLOT_MASK static_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -59,7 +59,7 @@ inv_box.icon_state = "neck" // inv_box.icon_full = "template" inv_box.screen_loc = ui_monkey_neck - inv_box.slot_id = SLOT_NECK + inv_box.slot_id = ITEM_SLOT_NECK static_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -68,7 +68,7 @@ inv_box.icon_state = "head" // inv_box.icon_full = "template" inv_box.screen_loc = ui_monkey_head - inv_box.slot_id = SLOT_HEAD + inv_box.slot_id = ITEM_SLOT_HEAD static_inventory += inv_box inv_box = new /atom/movable/screen/inventory() @@ -76,7 +76,7 @@ inv_box.icon = ui_style inv_box.icon_state = "back" inv_box.screen_loc = ui_monkey_back - inv_box.slot_id = SLOT_BACK + inv_box.slot_id = ITEM_SLOT_BACK static_inventory += inv_box throw_icon = new /atom/movable/screen/throw_catch() @@ -126,7 +126,7 @@ for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src - inv_slots[inv.slot_id] = inv + inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_icon() /datum/hud/monkey/persistent_inventory_update() diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index f8a14b8c30..ed0a9eb4ea 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -101,7 +101,7 @@ //stops TK grabs being equipped anywhere but into hands /obj/item/tk_grab/equipped(mob/user, slot) - if(slot == SLOT_HANDS) + if(slot == ITEM_SLOT_HANDS) return ..() qdel(src) diff --git a/code/controllers/configuration/entries/dynamic.dm b/code/controllers/configuration/entries/dynamic.dm index 935164352e..98203b7d8a 100644 --- a/code/controllers/configuration/entries/dynamic.dm +++ b/code/controllers/configuration/entries/dynamic.dm @@ -94,6 +94,10 @@ config_entry_value = 10 min_val = 0 +/datum/config_entry/keyed_list/dynamic_mode_days + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + /datum/config_entry/keyed_list/storyteller_weight key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_NUM diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 2fe020d544..9966f90ce7 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -349,3 +349,9 @@ /datum/config_entry/flag/dynamic_config_enabled /datum/config_entry/flag/station_name_needs_approval + +//ambition start +/datum/config_entry/number/max_ambitions // Maximum number of ambitions a mind can store. + config_entry_value = 5 +//ambition end + diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 3b36812dbc..af3f99b9a1 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -505,7 +505,7 @@ SUBSYSTEM_DEF(job) tcg_cards = N.client.prefs.tcg_cards if(tcg_cards) var/obj/item/tcgcard_binder/binder = new(get_turf(H)) - H.equip_to_slot_if_possible(binder, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE) + H.equip_to_slot_if_possible(binder, ITEM_SLOT_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE) for(var/card_type in N.client.prefs.tcg_cards) if(card_type) if(islist(H.client.prefs.tcg_cards[card_type])) @@ -715,9 +715,9 @@ SUBSYSTEM_DEF(job) permitted = FALSE if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey)) permitted = FALSE - if(!equipbackpackstuff && G.slot == SLOT_IN_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs + if(!equipbackpackstuff && G.slot == ITEM_SLOT_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs permitted = FALSE - if(equipbackpackstuff && G.slot != SLOT_IN_BACKPACK)//ditto + if(equipbackpackstuff && G.slot != ITEM_SLOT_BACKPACK)//ditto permitted = FALSE if(!permitted) continue @@ -754,7 +754,7 @@ SUBSYSTEM_DEF(job) I.forceMove(get_turf(C)) else qdel(I) - else if(!M.equip_to_slot_if_possible(I, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // Otherwise, try to put it in the backpack + else if(!M.equip_to_slot_if_possible(I, ITEM_SLOT_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // Otherwise, try to put it in the backpack if(can_drop) I.forceMove(get_turf(M)) // If everything fails, just put it on the floor under the mob. else diff --git a/code/datums/action.dm b/code/datums/action.dm index 1a8ea7a60f..ac8c909bd2 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -516,7 +516,7 @@ H.attack_self(owner) return var/obj/item/I = target - if(owner.can_equip(I, SLOT_HANDS)) + if(owner.can_equip(I, ITEM_SLOT_HANDS)) owner.temporarilyRemoveItemFromInventory(I) owner.put_in_hands(I) I.attack_self(owner) diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index 638be08717..840c202bfc 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -29,7 +29,7 @@ expire = _expire /datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot) - if(!(allowed_slots & slotdefine2slotbit(slot))) //Check that the slot is valid for antimagic + if(!(allowed_slots & slot)) //Check that the slot is valid for antimagic UnregisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC) return RegisterSignal(equipper, COMSIG_MOB_RECEIVE_MAGIC, .proc/protect, TRUE) diff --git a/code/datums/components/phantomthief.dm b/code/datums/components/phantomthief.dm index 6b7e7221c3..a73754d04a 100644 --- a/code/datums/components/phantomthief.dm +++ b/code/datums/components/phantomthief.dm @@ -9,7 +9,7 @@ var/filter_size var/filter_color -/datum/component/wearertargeting/phantomthief/Initialize(_x = -2, _y = 0, _size = 0, _color = "#E62111", list/_valid_slots = list(SLOT_GLASSES)) +/datum/component/wearertargeting/phantomthief/Initialize(_x = -2, _y = 0, _size = 0, _color = "#E62111", list/_valid_slots = list(ITEM_SLOT_EYES)) . = ..() if(. == COMPONENT_INCOMPATIBLE) return diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index 3cf70e80ef..79a84427f4 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -108,7 +108,7 @@ SSvis_overlays.add_vis_overlay(holder, 'icons/effects/effects.dmi', to_add, layer, GAME_PLANE, holder.dir) /datum/component/shielded/proc/on_equip(obj/item/source, mob/living/equipper, slot) - if(!(accepted_slots & slotdefine2slotbit(slot))) + if(!(accepted_slots & slot)) return holder = equipper RegisterSignal(parent, COMSIG_ITEM_RUN_BLOCK, .proc/on_run_block) diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index bcbf979101..f451241fb4 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -89,7 +89,7 @@ /// Triggered on equip of the item containing the component /datum/component/two_handed/proc/on_equip(datum/source, mob/user, slot) - if(require_twohands && slot == SLOT_HANDS) // force equip the item + if(require_twohands && slot == ITEM_SLOT_HANDS) // force equip the item wield(user) if(!user.is_holding(parent) && wielded && !require_twohands) unwield(user) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 5f9bf37040..2cc72f7ca9 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -235,6 +235,7 @@ else return returned + /** * Callback called by a timer to end an associative-list-indexed cooldown. * diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index b4e53a7425..d6c11ab452 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -75,8 +75,8 @@ if(isobj(H.wear_suit)) Cl = H.wear_suit passed = prob((Cl.permeability_coefficient*100) - 1) - if(passed && isobj(SLOT_W_UNIFORM)) - Cl = SLOT_W_UNIFORM + if(passed && isobj(ITEM_SLOT_ICLOTHING)) + Cl = ITEM_SLOT_ICLOTHING passed = prob((Cl.permeability_coefficient*100) - 1) if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS) diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm index e769f466b9..0440fb231d 100644 --- a/code/datums/diseases/wizarditis.dm +++ b/code/datums/diseases/wizarditis.dm @@ -61,19 +61,19 @@ STI KALY - blind if(!istype(H.head, /obj/item/clothing/head/wizard)) if(!H.dropItemToGround(H.head)) qdel(H.head) - H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), ITEM_SLOT_HEAD) return if(prob(chance)) if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe)) if(!H.dropItemToGround(H.wear_suit)) qdel(H.wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), SLOT_WEAR_SUIT) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), ITEM_SLOT_OCLOTHING) return if(prob(chance)) if(!istype(H.shoes, /obj/item/clothing/shoes/sandal/magic)) if(!H.dropItemToGround(H.shoes)) qdel(H.shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), SLOT_SHOES) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(H), ITEM_SLOT_FEET) return else var/mob/living/carbon/H = affected_mob diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index 2e0fcb87e1..04f51e6e28 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -19,7 +19,7 @@ user_by_item -= target /datum/element/earhealing/proc/equippedChanged(datum/source, mob/living/carbon/user, slot) - if(((slot == SLOT_EARS_LEFT) || (slot == SLOT_EARS_RIGHT)) && istype(user)) //skyrat edit + if(((slot == ITEM_SLOT_EARS_LEFT) || slot == ITEM_SLOT_EARS_RIGHT) && istype(user)) user_by_item[source] = user else user_by_item -= source diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index 5e888e0609..2649a8ee6f 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -144,7 +144,7 @@ return TRUE /datum/element/polychromic/proc/grant_user_action(atom/source, mob/user, slot) - if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED || slot == SLOT_HANDCUFFED || slot == SLOT_GENERC_DEXTROUS_STORAGE) + if(slot == ITEM_SLOT_BACKPACK || slot == ITEM_SLOT_LEGCUFFED || slot == ITEM_SLOT_HANDCUFFED || slot == ITEM_SLOT_DEX_STORAGE) return var/datum/action/polychromic/P = actions_by_atom[source] if(!P) diff --git a/code/datums/elements/spellcasting.dm b/code/datums/elements/spellcasting.dm index 877bcdbcd3..676168ea49 100644 --- a/code/datums/elements/spellcasting.dm +++ b/code/datums/elements/spellcasting.dm @@ -34,7 +34,7 @@ stacked_spellcasting_by_user -= target /datum/element/spellcasting/proc/on_equip(datum/source, mob/equipper, slot) - if(!(cast_slots & slotdefine2slotbit(slot))) + if(!(cast_slots & slot)) return users_by_item[source] = equipper if(!stacked_spellcasting_by_user[equipper]) diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 4682595aec..5b6c0e222d 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -59,7 +59,7 @@ /obj/item/clothing/gloves/boxing/equipped(mob/user, slot) . = ..() - if(ishuman(user) && slot == SLOT_GLOVES) + if(ishuman(user) && slot == ITEM_SLOT_GLOVES) var/mob/living/carbon/human/H = user style.teach(H,TRUE) @@ -68,5 +68,5 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_GLOVES) == src) + if(H.get_item_by_slot(ITEM_SLOT_GLOVES) == src) style.remove(H) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 3691b2fccc..f8ed72eae8 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -197,7 +197,7 @@ /obj/item/clothing/gloves/krav_maga/equipped(mob/user, slot) . = ..() - if(ishuman(user) && slot == SLOT_GLOVES) + if(ishuman(user) && slot == ITEM_SLOT_GLOVES) var/mob/living/carbon/human/H = user style.teach(H,1) @@ -206,7 +206,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_GLOVES) == src) + if(H.get_item_by_slot(ITEM_SLOT_GLOVES) == src) style.remove(H) /obj/item/clothing/gloves/krav_maga/sec//more obviously named, given to sec diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index 8dc1afba81..466bf5c778 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -485,7 +485,7 @@ /obj/item/storage/belt/champion/wrestling/equipped(mob/user, slot) . = ..() - if(ishuman(user) && slot == SLOT_BELT) + if(ishuman(user) && slot == ITEM_SLOT_BELT) var/mob/living/carbon/human/H = user style.teach(H,1) @@ -494,7 +494,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_BELT) == src) + if(H.get_item_by_slot(ITEM_SLOT_BELT) == src) style.remove(H) //Subtype of wrestling, reserved for the wrestling belts found in the holodeck diff --git a/code/datums/mind.dm b/code/datums/mind.dm index bd25464f3c..1c780c037a 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -29,6 +29,12 @@ */ +//ambition start +#define AMBITION_COOLDOWN_TIME (5 SECONDS) +#define OBJECTIVES_COOLDOWN_TIME (2 SECONDS) +#define ADMIN_PING_COOLDOWN_TIME (10 MINUTES) +//ambition end + /datum/mind var/key var/name //replaces mob/var/original_name @@ -69,6 +75,11 @@ /// Our skill holder. var/datum/skill_holder/skill_holder +//ambition start + /// Lazy list for antagonists to set goals they wish to achieve, to be shown at the round-end report. + var/list/ambitions +//ambition end + ///What character we spawned in as- either at roundstart or latejoin, so we know for persistent scars if we ended as the same person or not var/mob/original_character @@ -176,7 +187,9 @@ qdel(A) return A.owner = src - LAZYADD(antag_datums, A) +//ambition start + do_add_antag_datum(A) +//ambition end A.create_team(team) var/datum/team/antag_team = A.get_team() if(antag_team) @@ -184,6 +197,14 @@ A.on_gain() return A +//ambition start +/datum/mind/proc/do_add_antag_datum(instanced_datum) + . = LAZYLEN(antag_datums) + LAZYADD(antag_datums, instanced_datum) + if(!.) + add_verb(current, /mob/proc/edit_objectives_and_ambitions) +//ambition end + /datum/mind/proc/remove_antag_datum(datum_type) if(!datum_type) return @@ -192,6 +213,14 @@ A.on_removal() return TRUE +//ambition start +/datum/mind/proc/do_remove_antag_datum(instanced_datum) + . = LAZYLEN(antag_datums) + LAZYREMOVE(antag_datums, instanced_datum) + if(. && !LAZYLEN(antag_datums)) + ambitions = null + remove_verb(current, /mob/proc/edit_objectives_and_ambitions) +//ambition end /datum/mind/proc/remove_all_antag_datums() //For the Lazy amongst us. for(var/a in antag_datums) @@ -380,10 +409,10 @@ message_admins("[ADMIN_LOOKUPFLW(current)] has been created by [ADMIN_LOOKUPFLW(creator)], an antagonist.") to_chat(current, "Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalties change, so do yours. This will never change unless your creator's body is destroyed.") -/datum/mind/proc/show_memory(mob/recipient, window=1) - if(!recipient) - recipient = current - var/output = "[current.real_name]'s Memories:
    " +//ambition start +/datum/mind/proc/show_memory() + var/list/output = list("[current.real_name]'s Memories:
    ") +//ambition end output += memory @@ -404,16 +433,910 @@ output += "
  • Conspirator: [M.name]
  • " output += "" - if(window) - recipient << browse(output,"window=memory") - else if(all_objectives.len || memory) - to_chat(recipient, "[output]") +//ambition port start + if(LAZYLEN(ambitions)) + for(var/count in 1 to LAZYLEN(ambitions)) + output += "
    Ambition #[count]: [ambitions[count]]" + + if(!memory && !length(all_objectives) && !LAZYLEN(ambitions)) + output += "
    • NONE
    " + + return output.Join() + + +/datum/mind/proc/show_editable_objectives_and_ambitions() + var/is_admin = check_rights(R_ADMIN, FALSE) + var/self_mind = usr == current + if(!is_admin && !self_mind) + return "" + var/list/output = list() + for(var/a in antag_datums) + var/datum/antagonist/antag_datum = a + output += "Objectives:" + if(is_admin) + output += " Add Objective" + output += "" + if(is_admin) + output += "Announce objectives
    " + output += "
    Requested Objective Changes:" + if(self_mind) + output += " Request objective" + output += "
      " + if(!LAZYLEN(antag_datum.requested_objective_changes)) + output += "
    • NONE

    " + else + for(var/uid in antag_datum.requested_objective_changes) + var/list/objectives_info = antag_datum.requested_objective_changes[uid] + var/obj_request = objectives_info["request"] + switch(obj_request) + if(REQUEST_NEW_OBJECTIVE) + var/datum/objective/type_cast_objective = objectives_info["target"] + var/objective_text = objectives_info["text"] + output += "
  • Request #[uid]: ADD [initial(type_cast_objective.name)] - [objective_text]" + if(self_mind) + output += " Cancel Request" + if(is_admin) + output += " Accept Edit Deny" + if(REQUEST_DEL_OBJECTIVE) + var/datum/objective/objective_ref = locate(objectives_info["target"]) in antag_datum.objectives + if(QDELETED(objective_ref)) + stack_trace("Objective request found with deleted reference. UID: [uid] | Antag: [antag_datum] | Mind: [src] | User: [usr]") + antag_datum.remove_objective_change(uid) + continue + output += "
  • Request #[uid]: DEL [objective_ref.name] - [objective_ref.explanation_text] - [objectives_info["text"]]" + if(self_mind) + output += " Cancel Request" + if(is_admin) + output += " Accept Deny" + if(REQUEST_WIN_OBJECTIVE, REQUEST_LOSE_OBJECTIVE) + var/datum/objective/objective_ref = locate(objectives_info["target"]) in antag_datum.objectives + if(QDELETED(objective_ref)) + stack_trace("Objective request found with deleted reference. UID: [uid] | Antag: [antag_datum] | Mind: [src] | User: [usr]") + antag_datum.remove_objective_change(uid) + continue + output += "
  • Request #[uid]: [obj_request == REQUEST_WIN_OBJECTIVE ? "WIN" : "LOSE"] [objective_ref.name] - [objective_ref.explanation_text] - [objectives_info["text"]]" + if(self_mind) + output += " Cancel Request" + if(is_admin) + output += " Accept Deny" + else + stack_trace("Objective request found with no request index. UID: [uid] | Antag: [antag_datum] | Mind: [src] | User: [usr]") + continue + output += "
    " + if(self_mind) + output += "Ping the admins
    " + if(is_admin) + output += "Clear ping cooldown
    " + output += "
    [current.real_name]'s Ambitions:" + if(LAZYLEN(ambitions) < CONFIG_GET(number/max_ambitions)) + output += " Add Ambition" + output += "
      " + if(!LAZYLEN(ambitions)) + output += "
    • NONE" + else + for(var/count in 1 to LAZYLEN(ambitions)) + output += "
    • Ambition #[count] (Edit) (Remove):
      [ambitions[count]]" + output += "

    (Refresh)" + return output.Join() + + +/mob/proc/edit_objectives_and_ambitions() + set name = "Objectives and Ambitions" + set category = "IC" + set desc = "View and edit your character's objectives and ambitions." + mind.do_edit_objectives_ambitions() + + +/datum/mind/proc/do_edit_objectives_ambitions() + var/datum/browser/popup = new(usr, "objectives and ambitions", "Objectives and Ambitions") + popup.set_content(show_editable_objectives_and_ambitions()) + popup.open() + + +GLOBAL_VAR_INIT(requested_objective_uid, 0) + + +GLOBAL_LIST(objective_player_choices) + +/proc/populate_objective_player_choices() + GLOB.objective_player_choices = list() + var/list/allowed_types = list( + /datum/objective/custom, + /datum/objective/assassinate/once, + /datum/objective/protect, + /datum/objective/escape, + /datum/objective/survive, + /datum/objective/martyr, + /datum/objective/steal, + /datum/objective/download, + ) + + for(var/t in allowed_types) + var/datum/objective/type_cast = t + GLOB.objective_player_choices[initial(type_cast.name)] = t + + +GLOBAL_LIST(objective_choices) + +/proc/populate_objective_choices() + GLOB.objective_choices = list() + var/list/allowed_types = list( + /datum/objective/custom, + /datum/objective/assassinate, + /datum/objective/assassinate/once, + /datum/objective/maroon, + /datum/objective/debrain, + /datum/objective/protect, + /datum/objective/destroy, + /datum/objective/hijack, + /datum/objective/escape, + /datum/objective/survive, + /datum/objective/martyr, + /datum/objective/steal, + /datum/objective/download, + /datum/objective/nuclear, + /datum/objective/absorb, + ) + + for(var/t in allowed_types) + var/datum/objective/type_cast = t + GLOB.objective_choices[initial(type_cast.name)] = t + + +/datum/mind/proc/on_objectives_request_cd_end(datum/source) + UnregisterSignal(src, list(COMSIG_CD_STOP(COOLDOWN_OBJ_ADMIN_PING), COMSIG_CD_RESET(COOLDOWN_OBJ_ADMIN_PING))) + if(!antag_datums) + return + to_chat(current, "You are now again able to ping the admins objective changes review requests.") + for(var/a in antag_datums) + var/datum/antagonist/antag_datum = a + if(!antag_datum.requested_objective_changes) + continue + to_chat(current, "You seem to have unanswered change requests. If there are online admins another gentle reminder might be in order.") + break +//ambition port end /datum/mind/Topic(href, href_list) +//ambition start + + if (href_list["refresh_obj_amb"]) + do_edit_objectives_ambitions() + return + + else if (href_list["add_ambition"]) + if(!check_rights(R_ADMIN, FALSE)) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_AMBITION)) + to_chat(usr, "You must wait [AMBITION_COOLDOWN_TIME * 0.1] seconds between changes.") + return + if(!isliving(current)) + return + if(!antag_datums) + return + var/max_ambitions = CONFIG_GET(number/max_ambitions) + if(LAZYLEN(ambitions) >= max_ambitions) + to_chat(usr, "There's a limit of [max_ambitions] ambitions. Edit or remove some to accomodate for your new additions.") + do_edit_objectives_ambitions() + return + var/new_ambition = stripped_multiline_input(usr, "Write new ambition", "Ambition", "", MAX_AMBITION_LEN) + if(isnull(new_ambition)) + return + if(!check_rights(R_ADMIN, FALSE)) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_AMBITION)) + to_chat(usr, "You must wait [AMBITION_COOLDOWN_TIME * 0.1] seconds between changes.") + return + if(!isliving(current)) + to_chat(usr, "The mind holder is no longer a living creature.") + return + if(!antag_datums) + to_chat(usr, "The mind holder is no longer an antagonist.") + return + if(LAZYLEN(ambitions) >= max_ambitions) + to_chat(usr, "There's a limit of [max_ambitions] ambitions. Edit or remove some to accomodate for your new additions.") + do_edit_objectives_ambitions() + return + TIMER_COOLDOWN_START(src, COOLDOWN_AMBITION, AMBITION_COOLDOWN_TIME) + LAZYADD(ambitions, new_ambition) + if(usr == current) + log_game("[key_name(usr)] has created their ambition of index [LAZYLEN(ambitions)].\nNEW AMBITION:\n[new_ambition]") + else + log_game("[key_name(usr)] has created [key_name(current)]'s ambition of index [LAZYLEN(ambitions)].\nNEW AMBITION:\n[new_ambition]") + message_admins("[ADMIN_TPMONTY(usr)] has created [ADMIN_TPMONTY(current)]'s ambition of index [LAZYLEN(ambitions)].") + do_edit_objectives_ambitions() + return + + else if (href_list["edit_ambition"]) + if(!check_rights(R_ADMIN, FALSE)) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_AMBITION)) + to_chat(usr, "You must wait [AMBITION_COOLDOWN_TIME * 0.1] seconds between changes.") + return + if(!isliving(current)) + return + if(!antag_datums) + return + var/ambition_index = text2num(href_list["edit_ambition"]) + if(!isnum(ambition_index) || ambition_index < 0 || ambition_index % 1) + log_admin_private("[key_name(usr)] attempted to edit their ambitions with and invalid ambition_index ([ambition_index]) at [AREACOORD(usr.loc)].") + message_admins("[ADMIN_TPMONTY(usr)] attempted to edit their ambitions with and invalid ambition_index ([ambition_index]). Possible HREF exploit.") + return + if(ambition_index > LAZYLEN(ambitions)) + return + var/old_ambition = ambitions[ambition_index] + var/new_ambition = stripped_multiline_input(usr, "Write new ambition", "Ambition", ambitions[ambition_index], MAX_AMBITION_LEN) + if(isnull(new_ambition)) + return + if(!check_rights(R_ADMIN, FALSE)) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_AMBITION)) + to_chat(usr, "You must wait [AMBITION_COOLDOWN_TIME * 0.1] seconds between changes.") + return + if(!isliving(current)) + to_chat(usr, "The mind holder is no longer a living creature.") + return + if(!antag_datums) + to_chat(usr, "The mind holder is no longer an antagonist.") + return + if(ambition_index > LAZYLEN(ambitions)) + to_chat(usr, "The ambition we were editing was deleted before we finished. Aborting.") + do_edit_objectives_ambitions() + return + if(old_ambition != ambitions[ambition_index]) + to_chat(usr, "The ambition has changed since we started editing it. Aborting to prevent data loss.") + do_edit_objectives_ambitions() + return + TIMER_COOLDOWN_START(src, COOLDOWN_AMBITION, AMBITION_COOLDOWN_TIME) + ambitions[ambition_index] = new_ambition + if(usr == current) + log_game("[key_name(usr)] has edited their ambition of index [ambition_index].\nOLD AMBITION:\n[old_ambition]\nNEW AMBITION:\n[new_ambition]") + else + log_game("[key_name(usr)] has edited [key_name(current)]'s ambition of index [ambition_index].\nOLD AMBITION:\n[old_ambition]\nNEW AMBITION:\n[new_ambition]") + message_admins("[ADMIN_TPMONTY(usr)] has edited [ADMIN_TPMONTY(current)]'s ambition of index [ambition_index].") + do_edit_objectives_ambitions() + return + + else if (href_list["remove_ambition"]) + if(!check_rights(R_ADMIN, FALSE)) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_AMBITION)) + to_chat(usr, "You must wait [AMBITION_COOLDOWN_TIME * 0.1] seconds between changes.") + return + if(!isliving(current)) + return + if(!antag_datums) + return + var/ambition_index = text2num(href_list["remove_ambition"]) + if(ambition_index > LAZYLEN(ambitions)) + do_edit_objectives_ambitions() + return + if(!isnum(ambition_index) || ambition_index < 0 || ambition_index % 1) + log_admin_private("[key_name(usr)] attempted to remove an ambition with and invalid ambition_index ([ambition_index]) at [AREACOORD(usr.loc)].") + message_admins("[ADMIN_TPMONTY(usr)] attempted to remove an ambition with and invalid ambition_index ([ambition_index]). Possible HREF exploit.") + return + var/old_ambition = ambitions[ambition_index] + if(alert(usr, "Are you sure you want to delete this ambition?", "Delete ambition", "Yes", "No") != "Yes") + return + if(!check_rights(R_ADMIN, FALSE)) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_AMBITION)) + to_chat(usr, "You must wait [AMBITION_COOLDOWN_TIME * 0.1] seconds between changes.") + return + if(!isliving(current)) + to_chat(usr, "The mind holder is no longer a living creature. The ambition we were deleting should no longer exist already.") + return + if(!antag_datums) + to_chat(usr, "The mind holder is no longer an antagonist. The ambition we were deleting should no longer exist already.") + return + if(ambition_index > LAZYLEN(ambitions)) + to_chat(usr, "The ambition we were deleting was deleted before we finished. No need to continue.") + do_edit_objectives_ambitions() + return + if(old_ambition != ambitions[ambition_index]) + to_chat(usr, "The ambition has changed since we started considering its deletion. Aborting to prevent conflicts.") + do_edit_objectives_ambitions() + return + TIMER_COOLDOWN_START(src, COOLDOWN_AMBITION, AMBITION_COOLDOWN_TIME) + LAZYCUT(ambitions, ambition_index, ambition_index + 1) + if(usr == current) + log_game("[key_name(usr)] has deleted their ambition of index [ambition_index].\nDELETED AMBITION:\n[old_ambition]") + else + log_game("[key_name(usr)] has deleted [key_name(current)]'s ambition of index [ambition_index].\nDELETED AMBITION:\n[old_ambition]") + message_admins("[ADMIN_TPMONTY(usr)] has deleted [ADMIN_TPMONTY(current)]'s ambition of index [ambition_index].") + do_edit_objectives_ambitions() + return + + else if (href_list["req_obj_ping"]) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJ_ADMIN_PING)) + to_chat(usr, "You must wait [S_TIMER_COOLDOWN_TIMELEFT(src, COOLDOWN_OBJ_ADMIN_PING) * 0.1] seconds before your next admin ping.") + do_edit_objectives_ambitions() + return + if(!antag_datums) + return + var/pending_request = FALSE + for(var/a in antag_datums) + var/datum/antagonist/antag_datum = a + if(antag_datum.requested_objective_changes) + pending_request = TRUE + break + if(!pending_request) + to_chat(usr, "You have no pending requests to warn the admins about. Request changes for them to review before poking them.") + do_edit_objectives_ambitions() + return + var/justification = stripped_multiline_input(usr, + "Send a message to the admins requesting a review of your objective change requests.\ + There's a [ADMIN_PING_COOLDOWN_TIME * 0.1] seconds cooldown between requests, so try to think it through before sending it. Cancelling this does not trigger the cooldown.", + "Request Admin Review", max_length = MAX_MESSAGE_LEN) + if(isnull(justification)) + return + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJ_ADMIN_PING)) + to_chat(usr, "You must wait [S_TIMER_COOLDOWN_TIMELEFT(src, COOLDOWN_OBJ_ADMIN_PING) * 0.1] seconds before your next admin ping.") + do_edit_objectives_ambitions() + return + if(!antag_datums) + return + pending_request = FALSE + for(var/a in antag_datums) + var/datum/antagonist/antag_datum = a + if(antag_datum.requested_objective_changes) + pending_request = TRUE + break + if(!pending_request) + return + if(!length(GLOB.admins)) + to_chat(usr, "No admins currently connected, failed to notify them. Wait for one to connect before trying to ping them again.") + do_edit_objectives_ambitions() + return + S_TIMER_COOLDOWN_START(src, COOLDOWN_OBJ_ADMIN_PING, ADMIN_PING_COOLDOWN_TIME) + RegisterSignal(src, list(COMSIG_CD_STOP(COOLDOWN_OBJ_ADMIN_PING), COMSIG_CD_RESET(COOLDOWN_OBJ_ADMIN_PING)), .proc/on_objectives_request_cd_end) + log_admin("Objectives review request - [key_name(usr)] has requested a review of their objective changes, pinging the admins.") + for(var/a in GLOB.admins) + var/client/admin_client = a + if(admin_client.prefs.toggles & SOUND_ADMINHELP) + SEND_SOUND(admin_client, sound('sound/effects/adminhelp.ogg')) + window_flash(admin_client) + message_admins("[ADMIN_TPMONTY(usr)] has requested a review of their objective changes. (RPLY)") + do_edit_objectives_ambitions() + return + + else if (href_list["req_obj_add"]) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJECTIVES)) + to_chat(usr, "You must wait [OBJECTIVES_COOLDOWN_TIME * 0.1] seconds between request changes.") + do_edit_objectives_ambitions() + return + var/datum/antagonist/target_antag = locate(href_list["target_antag"]) in antag_datums + if(QDELETED(target_antag)) + to_chat(usr, "No antagonist found for this objective.") + do_edit_objectives_ambitions() + return + if(!GLOB.objective_player_choices) + populate_objective_player_choices() + var/choice = input("Select desired objective type:", "Objective type") as null|anything in GLOB.objective_player_choices + var/selected_type = GLOB.objective_player_choices[choice] + if(!selected_type) + return + var/new_objective = stripped_multiline_input(usr,\ + selected_type == /datum/objective/custom\ + ? "Write the custom objective you'd like to request the admins to grant you. Remember they can edit or deny your request at their own discretion."\ + : "Justify your request for a new objective to the admins. Add the required clarifations, if you have a specific targets in mind and the likes.",\ + "New Objective", max_length = MAX_MESSAGE_LEN) + if(isnull(new_objective)) + return + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJECTIVES)) + to_chat(usr, "You must wait [OBJECTIVES_COOLDOWN_TIME] minutes between request changes.") + return + if(QDELETED(target_antag)) + return + TIMER_COOLDOWN_START(src, COOLDOWN_OBJECTIVES, OBJECTIVES_COOLDOWN_TIME) + var/uid = "[GLOB.requested_objective_uid++]" + target_antag.add_objective_change(uid, list("request" = REQUEST_NEW_OBJECTIVE, "target" = selected_type, "text" = new_objective)) + log_admin("Objectives request [uid] - [key_name(usr)] has requested a [choice] objective: [new_objective]") + do_edit_objectives_ambitions() + return + + else if (href_list["req_obj_cancel"]) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJECTIVES)) + to_chat(usr, "You must wait [OBJECTIVES_COOLDOWN_TIME * 0.1] seconds between request changes.") + return + var/datum/antagonist/target_antag = locate(href_list["target_antag"]) in antag_datums + if(QDELETED(target_antag)) + to_chat(usr, "No antagonist found for this objective.") + do_edit_objectives_ambitions() + return + var/uid = href_list["req_obj_cancel"] + if(!LAZYACCESS(target_antag.requested_objective_changes, uid)) + to_chat(usr, "No requested objective change found. Perhaps it was deleted already?") + do_edit_objectives_ambitions() + return + if(alert(usr, "Are you sure you want to delete this change request?", "Delete change request", "Yes", "No") != "Yes") + return + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJECTIVES)) + to_chat(usr, "You must wait [OBJECTIVES_COOLDOWN_TIME * 0.1] seconds between request changes.") + return + if(QDELETED(target_antag)) + do_edit_objectives_ambitions() + return + if(!LAZYACCESS(target_antag.requested_objective_changes, uid)) + do_edit_objectives_ambitions() + return + TIMER_COOLDOWN_START(src, COOLDOWN_OBJECTIVES, OBJECTIVES_COOLDOWN_TIME) + log_admin("Objectives request deletion - [key_name(usr)] has deleted the objective change request of UID [uid].") + target_antag.remove_objective_change(uid) + do_edit_objectives_ambitions() + return + + else if (href_list["req_obj_delete"]) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJECTIVES)) + to_chat(usr, "You must wait [OBJECTIVES_COOLDOWN_TIME * 0.1] seconds between request changes.") + return + var/datum/antagonist/target_antag = locate(href_list["target_antag"]) in antag_datums + if(QDELETED(target_antag)) + to_chat(usr, "No antagonist found for this objective.") + do_edit_objectives_ambitions() + return + var/objective_reference = href_list["req_obj_delete"] + var/datum/objective/objective_to_delete = locate(objective_reference) in target_antag.objectives + if(!istype(objective_to_delete) || QDELETED(objective_to_delete)) + to_chat(usr, "No objective found. Perhaps it was already deleted?") + do_edit_objectives_ambitions() + return + var/justification = stripped_multiline_input(usr, + "Justify your request for a deleting this objective to the admins.", + "Objective Deletion", max_length = MAX_MESSAGE_LEN) + if(isnull(justification)) + return + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJECTIVES)) + to_chat(usr, "You must wait [OBJECTIVES_COOLDOWN_TIME * 0.1] seconds between request changes.") + return + if(QDELETED(objective_to_delete) || QDELETED(target_antag)) + do_edit_objectives_ambitions() + return + var/matching_request = FALSE + for(var/index in target_antag.requested_objective_changes) + var/list/change_request = target_antag.requested_objective_changes[index] + if(change_request["target"] != objective_reference) + continue + matching_request = TRUE + break + if(matching_request) + if(alert(usr, "There is already a change request tied to this objective waiting to be processed. Adding this request will delete the old ones.", "Delete matching objective requests?", "Yes", "No") != "Yes") + do_edit_objectives_ambitions() + return + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJECTIVES)) + to_chat(usr, "You must wait [OBJECTIVES_COOLDOWN_TIME * 0.1] seconds between request changes.") + return + if(QDELETED(objective_to_delete) || QDELETED(target_antag)) + do_edit_objectives_ambitions() + return + for(var/index in target_antag.requested_objective_changes) + var/list/change_request = target_antag.requested_objective_changes[index] + if(change_request["target"] != objective_reference) + continue + target_antag.remove_objective_change(index) + TIMER_COOLDOWN_START(src, COOLDOWN_OBJECTIVES, OBJECTIVES_COOLDOWN_TIME) + var/uid = "[GLOB.requested_objective_uid++]" + target_antag.add_objective_change(uid, list("request" = REQUEST_DEL_OBJECTIVE, "target" = objective_reference, "text" = justification)) + log_admin("Objectives request [uid] - [key_name(usr)] has requested the deletion of the following objective: [objective_to_delete.explanation_text].\nTheir justification is as follows: [justification]") + do_edit_objectives_ambitions() + return + + else if (href_list["req_obj_completed"]) + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJECTIVES)) + to_chat(usr, "You must wait [OBJECTIVES_COOLDOWN_TIME * 0.1] seconds between request changes.") + return + var/datum/antagonist/target_antag = locate(href_list["target_antag"]) in antag_datums + if(QDELETED(target_antag)) + to_chat(usr, "No antagonist found for this objective.") + do_edit_objectives_ambitions() + return + var/objective_reference = href_list["req_obj_completed"] + var/datum/objective/objective_to_complete = locate(objective_reference) in target_antag.objectives + if(!istype(objective_to_complete) || QDELETED(objective_to_complete)) + to_chat(usr, "No objective found. Perhaps it was deleted?") + do_edit_objectives_ambitions() + return + var/justification = stripped_multiline_input(usr, + "Justify to the admins your request to mark this objective as [objective_to_complete.completed ? "incomplete" : "completed"].", + "Objective [objective_to_complete.completed ? "Incompletion" : "Completion"]", max_length = MAX_MESSAGE_LEN) + if(isnull(justification)) + return + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJECTIVES)) + to_chat(usr, "You must wait [OBJECTIVES_COOLDOWN_TIME * 0.1] seconds between request changes.") + return + if(QDELETED(objective_to_complete) || QDELETED(target_antag)) + do_edit_objectives_ambitions() + return + var/matching_request = FALSE + for(var/index in target_antag.requested_objective_changes) + var/list/change_request = target_antag.requested_objective_changes[index] + if(change_request["target"] != objective_reference) + continue + matching_request = TRUE + break + if(matching_request) + if(alert(usr, "There is already a change request tied to this objective waiting to be processed. Adding this request will delete the old ones.", "Delete matching objective requests?", "Yes", "No") != "Yes") + return + if(usr != current) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJECTIVES)) + to_chat(usr, "You must wait [OBJECTIVES_COOLDOWN_TIME * 0.1] seconds between request changes.") + return + if(QDELETED(objective_to_complete) || QDELETED(target_antag)) + do_edit_objectives_ambitions() + return + for(var/index in target_antag.requested_objective_changes) + var/list/change_request = target_antag.requested_objective_changes[index] + if(change_request["target"] != objective_reference) + continue + target_antag.remove_objective_change(index) + TIMER_COOLDOWN_START(src, COOLDOWN_OBJECTIVES, OBJECTIVES_COOLDOWN_TIME) + var/uid = "[GLOB.requested_objective_uid++]" + target_antag.add_objective_change(uid, list("request" = (objective_to_complete.completed ? REQUEST_LOSE_OBJECTIVE : REQUEST_WIN_OBJECTIVE), "target" = objective_reference, "text" = justification)) + log_admin("Objectives request [uid] - [key_name(usr)] has requested the [objective_to_complete.completed ? "incompletion" : "completion"] of the following objective: [objective_to_complete.explanation_text].\nTheir justification is as follows: [justification]") + do_edit_objectives_ambitions() + return if(!check_rights(R_ADMIN)) return var/self_antagging = usr == current + if(href_list["edit_ambitions_panel"]) + do_edit_objectives_ambitions() + return + + else if(href_list["req_obj_ping_cd_clear"]) + if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJ_ADMIN_PING)) + to_chat(usr, "Mind is not under a cooldown.") + do_edit_objectives_ambitions() + return + if(alert(usr, "Are you sure you want reset this cooldown, letting the user ping the admins again?", "Clear ping cooldown", "Yes", "No") != "Yes") + do_edit_objectives_ambitions() + return + if(!check_rights(R_ADMIN)) + return + if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_OBJ_ADMIN_PING)) + do_edit_objectives_ambitions() + return + S_TIMER_COOLDOWN_RESET(src, COOLDOWN_OBJ_ADMIN_PING) + do_edit_objectives_ambitions() + return + + else if(href_list["refresh_antag_panel"]) + traitor_panel() + return + + else if (href_list["req_obj_edit"]) + var/datum/antagonist/antag_datum = locate(href_list["req_obj_edit"]) in antag_datums + if(QDELETED(antag_datum)) + do_edit_objectives_ambitions() + to_chat(usr, "No antag found.") + return + if(antag_datum.owner != src) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid antag reference.") + return + var/uid = href_list["req_obj_id"] + var/list/requested_obj_change = LAZYACCESS(antag_datum.requested_objective_changes, uid) + if(!requested_obj_change) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid requested objective reference.") + return + if(requested_obj_change["request"] != REQUEST_NEW_OBJECTIVE) + do_edit_objectives_ambitions() + to_chat(usr, "This is not an editable request. How did you even got here?") + return + switch(alert(usr, "Do you want to edit the requested objective type or text?", "Edit requested objective", "Type", "Text", "Cancel")) + if("Type") + if(!check_rights(R_ADMIN)) + return + if(QDELETED(antag_datum)) + to_chat(usr, "No antag found.") + do_edit_objectives_ambitions() + return + if(!LAZYACCESS(antag_datum.requested_objective_changes, uid)) + to_chat(usr, "Invalid requested objective change reference.") + do_edit_objectives_ambitions() + return + var/datum/objective/type_cast = requested_obj_change["target"] + var/selected_type = input("Select new requested objective type:", "Requested Objective type", initial(type_cast.name)) as null|anything in GLOB.objective_choices + selected_type = GLOB.objective_choices[selected_type] + if(!selected_type) + return + if(!check_rights(R_ADMIN)) + return + if(QDELETED(antag_datum)) + to_chat(usr, "No antag found.") + do_edit_objectives_ambitions() + return + if(!LAZYACCESS(antag_datum.requested_objective_changes, uid)) + to_chat(usr, "Invalid requested objective change reference.") + do_edit_objectives_ambitions() + return + log_admin("[key_name(usr)] has edited the requested objective type for [current], of UID [uid], from [requested_obj_change["target"]] to [selected_type]") + message_admins("[key_name_admin(usr)] has edited the requested objective type for [current], of UID [uid], from [requested_obj_change["target"]] to [selected_type]") + requested_obj_change["target"] = selected_type + if("Text") + if(!check_rights(R_ADMIN)) + return + if(QDELETED(antag_datum)) + to_chat(usr, "No antag found.") + do_edit_objectives_ambitions() + return + if(!LAZYACCESS(antag_datum.requested_objective_changes, uid)) + to_chat(usr, "Invalid requested objective change reference.") + do_edit_objectives_ambitions() + return + var/new_text = stripped_multiline_input(usr, "Input new requested objective text", "Requested Objective Text", requested_obj_change["text"], MAX_MESSAGE_LEN) + if (isnull(new_text)) + return + if(!check_rights(R_ADMIN)) + return + if(QDELETED(antag_datum)) + to_chat(usr, "No antag found.") + do_edit_objectives_ambitions() + return + if(!LAZYACCESS(antag_datum.requested_objective_changes, uid)) + to_chat(usr, "Invalid requested objective change reference.") + do_edit_objectives_ambitions() + return + log_admin("[key_name(usr)] has edited the requested objective text for [current], of UID [uid], from [requested_obj_change["text"]] to [new_text]") + message_admins("[key_name_admin(usr)] has edited the requested objective text for [current], of UID [uid], from [requested_obj_change["text"]] to [new_text]") + requested_obj_change["text"] = new_text + do_edit_objectives_ambitions() + return + + else if (href_list["req_obj_accept"]) + var/datum/antagonist/antag_datum = locate(href_list["req_obj_accept"]) in antag_datums + if(QDELETED(antag_datum)) + do_edit_objectives_ambitions() + to_chat(usr, "No antag found.") + return + if(antag_datum.owner != src) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid antag reference.") + return + var/uid = href_list["req_obj_id"] + var/list/requested_obj_change = LAZYACCESS(antag_datum.requested_objective_changes, uid) + if(!requested_obj_change) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid requested objective reference.") + return + + var/datum/objective/request_target + var/request_type = requested_obj_change["request"] + switch(request_type) + if(REQUEST_NEW_OBJECTIVE) + request_target = requested_obj_change["target"] + if(!ispath(request_target, /datum/objective)) + to_chat(usr, "Invalid requested objective target path.") + return + if(REQUEST_DEL_OBJECTIVE, REQUEST_WIN_OBJECTIVE, REQUEST_LOSE_OBJECTIVE) + request_target = locate(requested_obj_change["target"]) in antag_datum.objectives + if(QDELETED(request_target)) + to_chat(usr, "Invalid requested objective target reference.") + return + else + to_chat(usr, "Invalid request type.") + return + if(alert(usr, "Are you sure you want to approve this objective change?", "Approve objective change", "Yes", "No") != "Yes") + return + if(!check_rights(R_ADMIN)) + return + if(QDELETED(antag_datum)) + to_chat(usr, "No antag found.") + do_edit_objectives_ambitions() + return + if(!LAZYACCESS(antag_datum.requested_objective_changes, uid)) + to_chat(usr, "Invalid requested objective change reference.") + do_edit_objectives_ambitions() + return + switch(request_type) //Last checks + if(REQUEST_NEW_OBJECTIVE) + if(!ispath(request_target, /datum/objective)) + stack_trace("Invalid target on objective change request: [request_target]") + do_edit_objectives_ambitions() + return + if(REQUEST_DEL_OBJECTIVE, REQUEST_WIN_OBJECTIVE, REQUEST_LOSE_OBJECTIVE) + if(QDELETED(request_target)) + to_chat(usr, "Invalid requested objective target reference.") + return + else + to_chat(usr, "Invalid request type.") + return + antag_datum.remove_objective_change(uid) + switch(request_type) //All is clear, let get things done. + if(REQUEST_NEW_OBJECTIVE) + request_target = new request_target() + request_target.owner = src + if(istype(request_target, /datum/objective/custom)) + request_target.explanation_text = requested_obj_change["text"] + else + request_target.admin_edit(usr) + antag_datum.objectives += request_target + message_admins("[key_name_admin(usr)] approved a requested objective from [current]: [request_target.explanation_text]") + log_admin("[key_name(usr)] approved a requested objective from [current]: [request_target.explanation_text]") + if(REQUEST_DEL_OBJECTIVE) + message_admins("[key_name_admin(usr)] approved the request to delete an objective from [current]: [request_target.explanation_text]") + log_admin("[key_name(usr)] approved the request to delete an objective from [current]: [request_target.explanation_text]") + qdel(request_target) + if(REQUEST_WIN_OBJECTIVE) + message_admins("[key_name_admin(usr)] approved the victory request for an objective from [current]: [request_target.explanation_text]") + log_admin("[key_name(usr)] approved the victory request for an objective from [current]: [request_target.explanation_text]") + request_target.completed = TRUE + if(REQUEST_LOSE_OBJECTIVE) + message_admins("[key_name_admin(usr)] approved the defeat request for an objective from [current]: [request_target.explanation_text]") + log_admin("[key_name(usr)] approved the defeat request for an objective from [current]: [request_target.explanation_text]") + request_target.completed = FALSE + to_chat(current, "Your objective change request has been approved.") + do_edit_objectives_ambitions() + return + + else if (href_list["req_obj_deny"]) + var/datum/antagonist/antag_datum = locate(href_list["req_obj_deny"]) in antag_datums + if(QDELETED(antag_datum)) + do_edit_objectives_ambitions() + to_chat(usr, "No antag found.") + return + if(antag_datum.owner != src) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid antag reference.") + return + var/uid = href_list["req_obj_id"] + var/list/requested_obj_change = LAZYACCESS(antag_datum.requested_objective_changes, uid) + if(!requested_obj_change) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid requested objective change reference.") + return + var/justification = stripped_multiline_input(usr, "Justify why you are denying this objective request change.", "Deny", memory, MAX_MESSAGE_LEN) + if(isnull(justification)) + return + if(!check_rights(R_ADMIN)) + return + if(QDELETED(antag_datum)) + to_chat(usr, "No antag found.") + do_edit_objectives_ambitions() + return + if(!LAZYACCESS(antag_datum.requested_objective_changes, uid)) + to_chat(usr, "Invalid requested objective change reference.") + do_edit_objectives_ambitions() + return + var/datum/objective/type_cast = requested_obj_change["target"] + var/objective_name = initial(type_cast.name) + message_admins("[key_name_admin(usr)] denied a requested [objective_name] objective from [current]: [requested_obj_change["text"]]") + log_admin("[key_name(usr)] denied a requested [objective_name] objective from [current]: [requested_obj_change["text"]]") + to_chat(current, "Your objective request has been denied for the following reason: [justification]") + antag_datum.remove_objective_change(uid) + do_edit_objectives_ambitions() + return + + else if (href_list["obj_panel_complete_toggle"]) + var/datum/antagonist/antag_datum = locate(href_list["target_antag"]) in antag_datums + if(QDELETED(antag_datum)) + do_edit_objectives_ambitions() + to_chat(usr, "No antag found.") + return + if(antag_datum.owner != src) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid antag reference.") + return + var/datum/objective/objective_to_toggle = locate(href_list["obj_panel_complete_toggle"]) in antag_datum.objectives + if(QDELETED(objective_to_toggle)) + to_chat(usr, "No objective found. Perhaps it was already deleted?") + do_edit_objectives_ambitions() + return + if(objective_to_toggle.owner != src) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid objective reference.") + return + objective_to_toggle.completed = !objective_to_toggle.completed + message_admins("[key_name_admin(usr)] toggled the win state for [current]'s objective: [objective_to_toggle.explanation_text]") + log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective_to_toggle.explanation_text]") + if(alert(usr, "Would you like to alert the player of the change?", "Deny objective", "Yes", "No") == "Yes") + to_chat(current, "[objective_to_toggle.completed ? "" : ""]Your objective status has changed!") + do_edit_objectives_ambitions() + return + + else if (href_list["obj_panel_delete"]) + var/datum/antagonist/antag_datum = locate(href_list["target_antag"]) in antag_datums + if(QDELETED(antag_datum)) + do_edit_objectives_ambitions() + to_chat(usr, "No antag found.") + return + if(antag_datum.owner != src) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid antag reference.") + return + var/datum/objective/objective_to_delete = locate(href_list["obj_panel_delete"]) in antag_datum.objectives + if(QDELETED(objective_to_delete)) + to_chat(usr, "No objective found. Perhaps it was already deleted?") + do_edit_objectives_ambitions() + return + if(objective_to_delete.owner != src) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid objective reference.") + return + if(alert(usr, "Are you sure you want to delete this objective?", "Delete objective", "Yes", "No") != "Yes") + return + if(!check_rights(R_ADMIN)) + return + if(QDELETED(objective_to_delete)) + return + message_admins("[key_name_admin(usr)] removed an objective from [current]: [objective_to_delete.explanation_text]") + log_admin("[key_name(usr)] removed an objective from [current]: [objective_to_delete.explanation_text]") + qdel(objective_to_delete) + do_edit_objectives_ambitions() + return + + else if (href_list["obj_panel_edit"]) + var/datum/antagonist/antag_datum = locate(href_list["target_antag"]) in antag_datums + if(QDELETED(antag_datum)) + do_edit_objectives_ambitions() + to_chat(usr, "No antag found.") + return + if(antag_datum.owner != src) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid antag reference.") + return + var/datum/objective/objective_to_edit = locate(href_list["obj_panel_edit"]) in antag_datum.objectives + if(QDELETED(objective_to_edit)) + to_chat(usr, "No objective found. Perhaps it was already deleted?") + do_edit_objectives_ambitions() + return + if(objective_to_edit.owner != src) + do_edit_objectives_ambitions() + to_chat(usr, "Invalid objective reference.") + return + var/explanation_before = objective_to_edit.explanation_text + objective_to_edit.admin_edit(usr) + if(QDELETED(objective_to_edit)) + return + message_admins("[key_name_admin(usr)] edited an objective from [current]:\ + Before: [explanation_before]\ + After: [objective_to_edit.explanation_text]") + log_admin("[key_name(usr)] edited an objective from [current]:\ + Before: [explanation_before]\ + After: [objective_to_edit.explanation_text]") + do_edit_objectives_ambitions() + return +//ambition end if(href_list["add_antag"]) add_antag_wrapper(text2path(href_list["add_antag"]),usr) @@ -474,38 +1397,16 @@ else target_antag = target - var/static/list/choices - if(!choices) - choices = list() +//ambition start + if(!GLOB.objective_choices) + populate_objective_choices() - var/list/allowed_types = list( - /datum/objective/assassinate, - /datum/objective/assassinate/once, - /datum/objective/maroon, - /datum/objective/debrain, - /datum/objective/protect, - /datum/objective/destroy, - /datum/objective/hijack, - /datum/objective/escape, - /datum/objective/survive, - /datum/objective/martyr, - /datum/objective/steal, - /datum/objective/download, - /datum/objective/nuclear, - /datum/objective/absorb, - /datum/objective/custom - ) + if(old_objective && GLOB.objective_choices[old_objective.name]) + def_value = old_objective.name - for(var/T in allowed_types) - var/datum/objective/X = T - choices[initial(X.name)] = T - - if(old_objective) - if(old_objective.name in choices) - def_value = old_objective.name - - var/selected_type = input("Select objective type:", "Objective type", def_value) as null|anything in choices - selected_type = choices[selected_type] + var/selected_type = input("Select objective type:", "Objective type", def_value) as null|anything in GLOB.objective_choices + selected_type = GLOB.objective_choices[selected_type] +//ambition end if (!selected_type) return @@ -533,6 +1434,12 @@ message_admins("[key_name_admin(usr)] edited [current]'s objective to [new_objective.explanation_text]") log_admin("[key_name(usr)] edited [current]'s objective to [new_objective.explanation_text]") +//ambition start + if(href_list["ambition_panel"]) + do_edit_objectives_ambitions() + return +//ambition end + else if(href_list["traitor_class"]) var/static/list/choices if(!choices) @@ -617,6 +1524,11 @@ else if (href_list["obj_announce"]) announce_objectives() +//ambition start + if(href_list["ambition_panel"]) + do_edit_objectives_ambitions() + return +//ambition end //Something in here might have changed your mob if(self_antagging && (!usr || !usr.client) && current.client) @@ -820,3 +1732,7 @@ ..() mind.assigned_role = ROLE_PAI mind.special_role = "" + +//ambition start +#undef AMBITION_COOLDOWN_TIME +//ambition end diff --git a/code/datums/mutations/cluwne.dm b/code/datums/mutations/cluwne.dm index 59b7752372..45a78be27b 100644 --- a/code/datums/mutations/cluwne.dm +++ b/code/datums/mutations/cluwne.dm @@ -17,18 +17,18 @@ if(!istype(H.wear_mask, /obj/item/clothing/mask/gas/cluwne)) if(!H.dropItemToGround(H.wear_mask)) qdel(H.wear_mask) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/cluwne(H), SLOT_WEAR_MASK) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/cluwne(H), ITEM_SLOT_MASK) if(!istype(H.w_uniform, /obj/item/clothing/under/cluwne)) if(!H.dropItemToGround(H.w_uniform)) qdel(H.w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/under/cluwne(H), SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new /obj/item/clothing/under/cluwne(H), ITEM_SLOT_ICLOTHING) if(!istype(H.shoes, /obj/item/clothing/shoes/clown_shoes/cluwne)) if(!H.dropItemToGround(H.shoes)) qdel(H.shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes/cluwne(H), SLOT_SHOES) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes/cluwne(H), ITEM_SLOT_FEET) - owner.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(owner), SLOT_GLOVES) // this is purely for cosmetic purposes incase they aren't wearing anything in that slot - owner.equip_to_slot_or_del(new /obj/item/storage/backpack/clown(owner), SLOT_BACK) // ditto + owner.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(owner), ITEM_SLOT_GLOVES) // this is purely for cosmetic purposes incase they aren't wearing anything in that slot + owner.equip_to_slot_or_del(new /obj/item/storage/backpack/clown(owner), ITEM_SLOT_BACK) // ditto /datum/mutation/human/cluwne/on_life(mob/living/carbon/human/owner) if((prob(15) && owner.IsUnconscious())) diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 082e4156c8..8f25ca8684 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -163,42 +163,42 @@ //Start with uniform,suit,backpack for additional slots if(uniform) - H.equip_to_slot_or_del(new uniform(H), SLOT_W_UNIFORM, TRUE) + H.equip_to_slot_or_del(new uniform(H), ITEM_SLOT_ICLOTHING, TRUE) if(suit) - H.equip_to_slot_or_del(new suit(H), SLOT_WEAR_SUIT, TRUE) + H.equip_to_slot_or_del(new suit(H), ITEM_SLOT_OCLOTHING, TRUE) if(back) - H.equip_to_slot_or_del(new back(H), SLOT_BACK, TRUE) + H.equip_to_slot_or_del(new back(H), ITEM_SLOT_BACK, TRUE) if(belt) - H.equip_to_slot_or_del(new belt(H), SLOT_BELT, TRUE) + H.equip_to_slot_or_del(new belt(H), ITEM_SLOT_BELT, TRUE) if(gloves) - H.equip_to_slot_or_del(new gloves(H), SLOT_GLOVES, TRUE) + H.equip_to_slot_or_del(new gloves(H), ITEM_SLOT_GLOVES, TRUE) if(shoes) - H.equip_to_slot_or_del(new shoes(H), SLOT_SHOES, TRUE) + H.equip_to_slot_or_del(new shoes(H), ITEM_SLOT_FEET, TRUE) if(head) - H.equip_to_slot_or_del(new head(H), SLOT_HEAD, TRUE) + H.equip_to_slot_or_del(new head(H), ITEM_SLOT_HEAD, TRUE) if(mask) - H.equip_to_slot_or_del(new mask(H), SLOT_WEAR_MASK, TRUE) + H.equip_to_slot_or_del(new mask(H), ITEM_SLOT_MASK, TRUE) if(neck) - H.equip_to_slot_or_del(new neck(H), SLOT_NECK, TRUE) + H.equip_to_slot_or_del(new neck(H), ITEM_SLOT_NECK, TRUE) if(ears) - H.equip_to_slot_or_del(new ears(H), SLOT_EARS_LEFT, TRUE) //sandstorm edit + H.equip_to_slot_or_del(new ears(H), ITEM_SLOT_EARS_LEFT, TRUE) // Sandstorm edit if(glasses) - H.equip_to_slot_or_del(new glasses(H), SLOT_GLASSES, TRUE) + H.equip_to_slot_or_del(new glasses(H), ITEM_SLOT_EYES, TRUE) if(id) - H.equip_to_slot_or_del(new id(H), SLOT_WEAR_ID, TRUE) + H.equip_to_slot_or_del(new id(H), ITEM_SLOT_ID, TRUE) if(suit_store) - H.equip_to_slot_or_del(new suit_store(H), SLOT_S_STORE, TRUE) - //skyrat edit + H.equip_to_slot_or_del(new suit_store(H), ITEM_SLOT_SUITSTORE, TRUE) + // Sandstorm edit if(ears_extra) - H.equip_to_slot_or_del(new ears_extra(H), SLOT_EARS_RIGHT, TRUE) + H.equip_to_slot_or_del(new ears_extra(H), ITEM_SLOT_EARS_RIGHT, TRUE) if(underwear) - H.equip_to_slot_or_del(new underwear(H), SLOT_W_UNDERWEAR, TRUE) + H.equip_to_slot_or_del(new underwear(H), ITEM_SLOT_UNDERWEAR, TRUE) if(socks) - H.equip_to_slot_or_del(new socks(H), SLOT_W_SOCKS, TRUE) + H.equip_to_slot_or_del(new socks(H), ITEM_SLOT_SOCKS, TRUE) if(shirt) - H.equip_to_slot_or_del(new shirt(H), SLOT_W_SHIRT, TRUE) + H.equip_to_slot_or_del(new shirt(H), ITEM_SLOT_SHIRT, TRUE) if(wrists) - H.equip_to_slot_or_del(new wrists(H), SLOT_WRISTS, TRUE) + H.equip_to_slot_or_del(new wrists(H), ITEM_SLOT_WRISTS, TRUE) // if(accessory) @@ -215,9 +215,9 @@ if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon. if(l_pocket) - H.equip_to_slot_or_del(new l_pocket(H), SLOT_L_STORE, TRUE) + H.equip_to_slot_or_del(new l_pocket(H), ITEM_SLOT_LPOCKET, TRUE) if(r_pocket) - H.equip_to_slot_or_del(new r_pocket(H), SLOT_R_STORE, TRUE) + H.equip_to_slot_or_del(new r_pocket(H), ITEM_SLOT_RPOCKET, TRUE) if(box) if(!backpack_contents) @@ -231,7 +231,7 @@ if(!isnum(number))//Default to 1 number = 1 for(var/i in 1 to number) - H.equip_to_slot_or_del(new path(H), SLOT_IN_BACKPACK, TRUE) + H.equip_to_slot_or_del(new path(H), ITEM_SLOT_BACKPACK, TRUE) if(!H.head && toggle_helmet && istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit)) var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index 22a851da1d..99fa6e73c5 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -129,7 +129,7 @@ Use this as a guideline var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) H.put_in_hands(glasses) - H.equip_to_slot(glasses, SLOT_GLASSES) + H.equip_to_slot(glasses, ITEM_SLOT_EYES) H.regenerate_icons() //This whole proc is called automatically diff --git a/code/datums/traits/good.dm b/code/datums/traits/good.dm index 23fd75f982..a0f62a32b8 100644 --- a/code/datums/traits/good.dm +++ b/code/datums/traits/good.dm @@ -108,10 +108,10 @@ var/mob/living/carbon/human/H = quirk_holder var/obj/item/choice_beacon/music/B = new(get_turf(H)) H.put_in_hands(B) - H.equip_to_slot_if_possible(B, SLOT_IN_BACKPACK) + H.equip_to_slot_if_possible(B, ITEM_SLOT_BACKPACK) var/obj/item/musicaltuner/musicaltuner = new(get_turf(H)) H.put_in_hands(musicaltuner) - H.equip_to_slot_if_possible(musicaltuner, SLOT_IN_BACKPACK) + H.equip_to_slot_if_possible(musicaltuner, ITEM_SLOT_BACKPACK) H.regenerate_icons() /datum/quirk/photographer @@ -127,7 +127,7 @@ var/mob/living/carbon/human/H = quirk_holder var/obj/item/camera/camera = new(get_turf(H)) H.put_in_hands(camera) - H.equip_to_slot(camera, SLOT_NECK) + H.equip_to_slot(camera, ITEM_SLOT_NECK) H.regenerate_icons() /datum/quirk/selfaware @@ -166,7 +166,7 @@ var/mob/living/carbon/human/H = quirk_holder var/obj/item/toy/crayon/spraycan/spraycan = new(get_turf(H)) H.put_in_hands(spraycan) - H.equip_to_slot(spraycan, SLOT_IN_BACKPACK) + H.equip_to_slot(spraycan, ITEM_SLOT_BACKPACK) H.regenerate_icons() /datum/quirk/voracious @@ -188,7 +188,7 @@ /datum/quirk/trandening/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/autosurgeon/gloweyes/gloweyes = new(get_turf(H)) - H.equip_to_slot(gloweyes, SLOT_IN_BACKPACK) + H.equip_to_slot(gloweyes, ITEM_SLOT_BACKPACK) H.regenerate_icons() /datum/quirk/bloodpressure diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 38007023b5..10f66fce0c 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -57,9 +57,9 @@ GLOBAL_LIST_EMPTY(family_heirlooms) heirloom = new heirloom_type(get_turf(quirk_holder)) GLOB.family_heirlooms += heirloom var/list/slots = list( - "in your left pocket" = SLOT_L_STORE, - "in your right pocket" = SLOT_R_STORE, - "in your backpack" = SLOT_IN_BACKPACK + "in your left pocket" = ITEM_SLOT_LPOCKET, + "in your right pocket" = ITEM_SLOT_RPOCKET, + "in your backpack" = ITEM_SLOT_BACKPACK ) where = H.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet" @@ -120,7 +120,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/nearsighted/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) - if(!H.equip_to_slot_if_possible(glasses, SLOT_GLASSES)) + if(!H.equip_to_slot_if_possible(glasses, ITEM_SLOT_EYES)) H.put_in_hands(glasses) /datum/quirk/nyctophobia @@ -383,7 +383,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/blindness/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/sunglasses/blindfold/white/glasses = new(get_turf(H)) - if(!H.equip_to_slot_if_possible(glasses, SLOT_GLASSES, bypass_equip_delay_self = TRUE)) //if you can't put it on the user's eyes, put it in their hands, otherwise put it on their eyes eyes + if(!H.equip_to_slot_if_possible(glasses, ITEM_SLOT_EYES, bypass_equip_delay_self = TRUE)) //if you can't put it on the user's eyes, put it in their hands, otherwise put it on their eyes eyes H.put_in_hands(glasses) H.regenerate_icons() diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 36712ea6bb..6b2cdbd455 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -172,7 +172,7 @@ /datum/quirk/colorist/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/dyespray/spraycan = new(get_turf(quirk_holder)) - H.equip_to_slot(spraycan, SLOT_IN_BACKPACK) + H.equip_to_slot(spraycan, ITEM_SLOT_BACKPACK) H.regenerate_icons() /datum/quirk/colorist/post_add() diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 0d6108baf1..74d2f7ebc3 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -1,7 +1,7 @@ GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")) -GLOBAL_LIST_INIT(slots, list("head", "wear_mask", "back", "wear_suit", "w_uniform", "w_underwear", "w_socks", "w_shirt", "shoes", "belt", "gloves", "glasses", "ears", "ears_extra", "wear_id", "s_store")) //skyrat edit -GLOBAL_LIST_INIT(slot2slot, list("head" = SLOT_HEAD, "wear_mask" = SLOT_WEAR_MASK, "neck" = SLOT_NECK, "back" = SLOT_BACK, "wear_suit" = SLOT_WEAR_SUIT, "w_uniform" = SLOT_W_UNIFORM, "w_underwear" = SLOT_W_UNDERWEAR, "w_socks" = SLOT_W_SOCKS, "w_shirt" = SLOT_W_SHIRT, "ears_extra" = SLOT_EARS_RIGHT, "shoes" = SLOT_SHOES, "belt" = SLOT_BELT, "gloves" = SLOT_GLOVES, "glasses" = SLOT_GLASSES, "ears" = SLOT_EARS_LEFT, "wear_id" = SLOT_WEAR_ID, "s_store" = SLOT_S_STORE, "wrists" = SLOT_WRISTS)) //skyrat edit -GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "wear_mask" = /obj/item/clothing/mask/changeling, "back" = /obj/item/changeling, "wear_suit" = /obj/item/clothing/suit/changeling, "w_uniform" = /obj/item/clothing/under/changeling, "shoes" = /obj/item/clothing/shoes/changeling, "belt" = /obj/item/changeling, "gloves" = /obj/item/clothing/gloves/changeling, "glasses" = /obj/item/clothing/glasses/changeling, "ears" = /obj/item/changeling, "wear_id" = /obj/item/changeling, "s_store" = /obj/item/changeling, "w_underwear" = /obj/item/changeling, "w_socks" = /obj/item/changeling, "w_shirt" = /obj/item/changeling, "ears_extra" = /obj/item/changeling, "wrists" = /obj/item/changeling)) //skyrat edit +GLOBAL_LIST_INIT(slots, list("head", "wear_mask", "back", "wear_suit", "w_uniform", "w_underwear", "w_socks", "w_shirt", "shoes", "belt", "gloves", "glasses", "ears", "ears_extra", "wear_id", "s_store")) // Sandstorm edit +GLOBAL_LIST_INIT(slot2slot, list("head" = ITEM_SLOT_HEAD, "wear_mask" = ITEM_SLOT_MASK, "neck" = ITEM_SLOT_NECK, "back" = ITEM_SLOT_BACK, "wear_suit" = ITEM_SLOT_OCLOTHING, "w_uniform" = ITEM_SLOT_ICLOTHING, "w_underwear" = ITEM_SLOT_UNDERWEAR, "w_socks" = ITEM_SLOT_SOCKS, "w_shirt" = ITEM_SLOT_SHIRT, "ears_extra" = ITEM_SLOT_EARS_RIGHT, "shoes" = ITEM_SLOT_FEET, "belt" = ITEM_SLOT_BELT, "gloves" = ITEM_SLOT_GLOVES, "glasses" = ITEM_SLOT_EYES, "ears" = ITEM_SLOT_EARS_LEFT, "wear_id" = ITEM_SLOT_ID, "s_store" = ITEM_SLOT_SUITSTORE, "wrists" = ITEM_SLOT_WRISTS)) // Sandstorm edit +GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "wear_mask" = /obj/item/clothing/mask/changeling, "back" = /obj/item/changeling, "wear_suit" = /obj/item/clothing/suit/changeling, "w_uniform" = /obj/item/clothing/under/changeling, "shoes" = /obj/item/clothing/shoes/changeling, "belt" = /obj/item/changeling, "gloves" = /obj/item/clothing/gloves/changeling, "glasses" = /obj/item/clothing/glasses/changeling, "ears" = /obj/item/changeling, "wear_id" = /obj/item/changeling, "s_store" = /obj/item/changeling)) GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our this objective to all lings diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 08a8d69575..77371ad7bc 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -205,11 +205,11 @@ Credit where due: var/mob/living/carbon/human/L = M var/obj/item/clockwork/slab/S = new var/slot = "At your feet" - var/list/slots = list("In your left pocket" = SLOT_L_STORE, "In your right pocket" = SLOT_R_STORE, "In your backpack" = SLOT_IN_BACKPACK) + var/list/slots = list("In your left pocket" = ITEM_SLOT_LPOCKET, "In your right pocket" = ITEM_SLOT_RPOCKET, "In your backpack" = ITEM_SLOT_BACKPACK) if(ishuman(L)) var/mob/living/carbon/human/H = L var/obj/item/clockwork/replica_fabricator/F = new - if(H.equip_to_slot_or_del(F, SLOT_IN_BACKPACK)) + if(H.equip_to_slot_or_del(F, ITEM_SLOT_BACKPACK)) to_chat(H, "You have been equipped with a replica fabricator, an advanced tool that can convert objects like doors, tables or even coats into clockwork equivalents.") slot = H.equip_in_one_of_slots(S, slots) if(slot == "In your backpack") diff --git a/code/game/gamemodes/clown_ops/bananium_bomb.dm b/code/game/gamemodes/clown_ops/bananium_bomb.dm index 9ce9bff6ac..b276aeeb48 100644 --- a/code/game/gamemodes/clown_ops/bananium_bomb.dm +++ b/code/game/gamemodes/clown_ops/bananium_bomb.dm @@ -37,24 +37,24 @@ if(!H.w_uniform || H.dropItemToGround(H.w_uniform)) C = new /obj/item/clothing/under/rank/civilian/clown(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_W_UNIFORM) + H.equip_to_slot_or_del(C, ITEM_SLOT_ICLOTHING) //skyrat edit if(!H.w_shirt || H.dropItemToGround(H.w_shirt)) C = new /obj/item/clothing/underwear/shirt/clown(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_W_SHIRT) + H.equip_to_slot_or_del(C, ITEM_SLOT_SHIRT) // if(!H.shoes || H.dropItemToGround(H.shoes)) C = new /obj/item/clothing/shoes/clown_shoes(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_SHOES) + H.equip_to_slot_or_del(C, ITEM_SLOT_FEET) if(!H.wear_mask || H.dropItemToGround(H.wear_mask)) C = new /obj/item/clothing/mask/gas/clown_hat(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) - H.equip_to_slot_or_del(C, SLOT_WEAR_MASK) + H.equip_to_slot_or_del(C, ITEM_SLOT_MASK) H.dna.add_mutation(CLOWNMUT) H.dna.add_mutation(SMILE) diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index a27cb02ea8..081ffbbdc4 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -214,7 +214,7 @@ if(!istype(C.wear_mask, /obj/item/clothing/mask/gas/clown_hat) && !istype(C.wear_mask, /obj/item/clothing/mask/gas/mime)) if(!C.wear_mask || C.dropItemToGround(C.wear_mask)) var/obj/item/clothing/mask/fakemoustache/sticky/the_stash = new /obj/item/clothing/mask/fakemoustache/sticky() - C.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE) + C.equip_to_slot_or_del(the_stash, ITEM_SLOT_MASK, TRUE, TRUE, TRUE, TRUE) /obj/item/clothing/mask/fakemoustache/sticky var/unstick_time = 2 MINUTES @@ -226,7 +226,7 @@ /obj/item/clothing/mask/fakemoustache/sticky/equipped(mob/user, slot) . = ..() - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) ADD_TRAIT(user, TRAIT_NO_INTERNALS, STICKY_MOUSTACHE_TRAIT) /obj/item/clothing/mask/fakemoustache/sticky/dropped(mob/user) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index a82abe9b3d..f7ccae24e4 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -154,7 +154,7 @@ if(tc) var/obj/item/U = new uplink_type(H, H.key, tc) - H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(U, ITEM_SLOT_BACKPACK) var/obj/item/implant/weapons_auth/W = new W.implant(H) @@ -170,7 +170,7 @@ mask = /obj/item/clothing/mask/gas/syndicate suit = /obj/item/clothing/suit/space/hardsuit/syndi r_pocket = /obj/item/tank/internals/emergency_oxygen/engi - internals_slot = SLOT_R_STORE + internals_slot = ITEM_SLOT_RPOCKET belt = /obj/item/storage/belt/military r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ @@ -186,7 +186,7 @@ suit = /obj/item/clothing/suit/space/syndicate/black/red head = /obj/item/clothing/head/helmet/space/syndicate/black/red r_pocket = /obj/item/tank/internals/emergency_oxygen/engi - internals_slot = SLOT_R_STORE + internals_slot = ITEM_SLOT_RPOCKET belt = /obj/item/storage/belt/military backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ /obj/item/tank/jetpack/oxygen/harness=1,\ diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 0358c3af2c..fd43b994e8 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -165,7 +165,7 @@ If not set, defaults to check_completion instead. Set it. It's used by cryo. if(receiver && receiver.current) if(ishuman(receiver.current)) var/mob/living/carbon/human/H = receiver.current - var/list/slots = list("backpack" = SLOT_IN_BACKPACK) + var/list/slots = list("backpack" = ITEM_SLOT_BACKPACK) for(var/eq_path in special_equipment) var/obj/O = new eq_path . += O @@ -1197,7 +1197,7 @@ GLOBAL_LIST_EMPTY(cult_contraband) I.forceMove(get_turf(owner)) if(ishuman(owner)) var/mob/living/carbon/human/H = owner - H.equip_in_one_of_slots(I, list("backpack" = SLOT_IN_BACKPACK), critical = TRUE) + H.equip_in_one_of_slots(I, list("backpack" = ITEM_SLOT_BACKPACK), critical = TRUE) hoarded_item = I diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index dc87322b57..ad286a52a7 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -52,23 +52,30 @@ /obj/machinery/limbgrower/ui_data(mob/user) var/list/data = list() - - for(var/datum/reagent/reagent_id in reagents.reagent_list) - var/list/reagent_data = list( - reagent_name = reagent_id.name, - reagent_amount = reagent_id.volume, - reagent_type = reagent_id.type - ) - data["reagents"] += list(reagent_data) - + if(reagents.reagent_list.len) + for(var/datum/reagent/reagent_id in reagents.reagent_list) + var/list/reagent_data = list( + reagent_name = reagent_id.name, + reagent_amount = reagent_id.volume, + reagent_type = reagent_id.type + ) + data["reagents"] += list(reagent_data) + else + data["reagents"] = list() data["total_reagents"] = reagents.total_volume data["max_reagents"] = reagents.maximum_volume data["busy"] = busy var/list/disk_data = list() disk_data["disk"] = dna_disk //Do i, the machine, have a disk? - disk_data["name"] = dna_disk?.fields["name"] //Name for the human saved if there is one + if(dna_disk) + if(dna_disk.fields["name"]) + disk_data["name"] = dna_disk.fields["name"] + else if(dna_disk.genetic_makeup_buffer["name"]) + disk_data["name"] = dna_disk.genetic_makeup_buffer["name"] + else + disk_data["name"] = "No name" + //Name for the human saved if there is one data["disk"] = disk_data - return data /obj/machinery/limbgrower/ui_static_data(mob/user) @@ -119,6 +126,18 @@ if (busy) to_chat(user, "\The [src] is busy. Please wait for completion of previous operation.") return + if(ispath(user_item.type, /obj/item/reagent_containers/blood) && user.a_intent != INTENT_HARM) + var/obj/item/reagent_containers/blood/B = user_item + if(!B.reagents.get_reagents()) + to_chat(user, "You can't fill [src] with an empty [B.name]!") + return + if(reagents.total_volume == reagents.maximum_volume) + to_chat(user, "\The [src] can't hold more blood!") + return + user.visible_message("[user] drains the [user_item] into [src] using the blood bag port on [src].", + "You drain the [user_item] into [src] using the blood bag port.") + B.reagents.trans_to(src, B.amount_per_transfer_from_this) + return if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", user_item)) ui_close(user) @@ -180,7 +199,7 @@ for(var/reagent_id in consumed_reagents_list) consumed_reagents_list[reagent_id] *= production_coefficient if(!reagents.has_reagent(reagent_id, consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes.") + audible_message("\The [src] buzzes and states \"INSUFFICENT REAGENTS\"") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) return @@ -206,17 +225,13 @@ * modified_consumed_reagents_list - the list of reagents we will consume on build, modified by the production coefficient. */ /obj/machinery/limbgrower/proc/build_item(list/modified_consumed_reagents_list) - for(var/reagent_id in modified_consumed_reagents_list) - if(!reagents.has_reagent(reagent_id, modified_consumed_reagents_list[reagent_id])) - audible_message("\The [src] buzzes.") - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - break - - reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) - + reagent_usage(modified_consumed_reagents_list) var/built_typepath = being_built.build_path // If we have a bodypart, we need to initialize the limb on its own. Otherwise we can build it here. - if(ispath(built_typepath, /obj/item/bodypart)) + if(ispath(built_typepath, /mob/living/carbon/human/chestonly)) + if(!build_mob_chest(built_typepath, FALSE)) + reagent_usage(modified_consumed_reagents_list, FALSE) + else if(ispath(built_typepath, /obj/item/bodypart)) build_limb(built_typepath) else if(ispath(built_typepath, /obj/item/organ/genital)) //genitals are uhh... customizable build_genital(built_typepath) @@ -227,6 +242,25 @@ flick("limbgrower_unfill", src) icon_state = "limbgrower_idleoff" +/obj/machinery/limbgrower/proc/reagent_usage(modified_consumed_reagents_list, remove = TRUE) + // Apparently, having a boolean in a loop is worse than doing it twice + if(remove) + for(var/reagent_id in modified_consumed_reagents_list) + if(reagent_sanity_check(reagent_id, modified_consumed_reagents_list[reagent_id])) + reagents.remove_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + else + for(var/reagent_id in modified_consumed_reagents_list) + if(reagent_sanity_check(reagent_id, modified_consumed_reagents_list[reagent_id])) + reagents.add_reagent(reagent_id, modified_consumed_reagents_list[reagent_id]) + + +/obj/machinery/limbgrower/proc/reagent_sanity_check(reagent_id, amount) + if(reagents.has_reagent(reagent_id, amount)) + return TRUE + audible_message("\The [src] buzzes, with a screen showing: INSUFFICENT REAGENTS") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + return FALSE + /* * The process of putting together a limb. * This is called from after we remove the reagents, so this proc is just initializing the limb type. @@ -306,6 +340,53 @@ else new built_typepath(loc) +/obj/machinery/limbgrower/proc/build_mob_chest(built_typepath) + // Create a mob with a chest, but nothing else + if(!ispath(built_typepath, /mob/living/carbon/human/chestonly)) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) + visible_message(src, "Buzzes, an error screen appearing on its display.") + return FALSE + // Fields is from cloning, a much fuller scan, genetic_makeup_buffer is less so + var/dna_genetics = dna_disk?.genetic_makeup_buffer + var/dna_cloning = dna_disk?.fields + var/datum/species/selected = GLOB.species_datums[selected_category] + var/mob/living/carbon/human/chestonly/C = new(loc) + C.real_name = length(dna_genetics) ? dna_genetics["name"] : "Synthetic Humanoid #[rand(10000, 99999)]" + if(length(dna_cloning)) + C.hardset_dna(dna_cloning["UI"], dna_cloning["SE"], dna_cloning["name"], dna_cloning["blood_type"], dna_cloning["mrace"], dna_cloning["features"]) + else if(length(dna_genetics)) + C.hardset_dna(dna_genetics["UI"], null, dna_genetics["name"], dna_genetics["blood_type"]) + else + C.real_name = "Synthetic Humanoid #[rand(10000, 99999)]" + C.hair_style = "bald" + C.skin_tone = "albino" + C.set_species(selected) + C.set_resting(TRUE, TRUE) + // Don't want to cause it to deathgasp.. + C.stat = DEAD + C.adjustOxyLoss(200) + // Limb replacement causes toxloss, which can cause too much suffering for the doctor that I don't want + C.adjustCloneLoss(45) + C.med_hud_set_status() + C.med_hud_set_health() + C.underwear = "Nude" + C.undershirt = "Nude" + C.saved_underwear = "" + C.saved_undershirt = "" + + // Just enough to start reviving them, I hope + C.blood_volume = BLOOD_VOLUME_SURVIVE + // At some point, make a way to deal with species regenerate_organs + // Remove all the organs + for(var/organ in C.internal_organs) + var/obj/item/organ/O = organ + O.Remove(organ) + C.update_body(TRUE) + C.update_hair() + C.update_body_parts() + C.update_appearance() + return TRUE + /obj/machinery/limbgrower/RefreshParts() reagents.maximum_volume = 0 for(var/obj/item/reagent_containers/glass/our_beaker in component_parts) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 61f638fc69..529e01f2f5 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -351,7 +351,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb return if(anchored) return - if(loc == user && current_equipped_slot && current_equipped_slot != SLOT_HANDS) + if(loc == user && current_equipped_slot && current_equipped_slot != ITEM_SLOT_HANDS) if(current_equipped_slot in user.check_obscured_slots()) to_chat(user, "You are unable to unequip that while wearing other garments over it!") return FALSE @@ -416,7 +416,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb return if(anchored) return - if(loc == user && current_equipped_slot && current_equipped_slot != SLOT_HANDS) + if(loc == user && current_equipped_slot && current_equipped_slot != ITEM_SLOT_HANDS) if(current_equipped_slot in user.check_obscured_slots()) to_chat(user, "You are unable to unequip that while wearing other garments over it!") return FALSE @@ -568,7 +568,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb //sometimes we only want to grant the item's action if it's equipped in a specific slot. /obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_IN_BACKPACK || slot == SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there + if(slot == ITEM_SLOT_BACKPACK || slot == ITEM_SLOT_LEGCUFFED) //these aren't true slots, so avoid granting actions there return FALSE return TRUE @@ -829,7 +829,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(ismob(location)) var/mob/M = location var/success = FALSE - if(src == M.get_item_by_slot(SLOT_WEAR_MASK)) + if(src == M.get_item_by_slot(ITEM_SLOT_MASK)) success = TRUE if(success) location = get_turf(M) diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 04838103f9..682ce18215 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -34,7 +34,7 @@ user.put_in_hands(PA) /obj/item/chrono_eraser/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_BACK) + if(slot == ITEM_SLOT_BACK) return 1 /obj/item/gun/energy/chrono_gun diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 702cbd8d56..8227097d8f 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -89,7 +89,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM ..() /obj/item/proc/help_light_cig(mob/living/M) - var/mask_item = M.get_item_by_slot(SLOT_WEAR_MASK) + var/mask_item = M.get_item_by_slot(ITEM_SLOT_MASK) if(istype(mask_item, /obj/item/clothing/mask/cigarette)) return mask_item @@ -130,7 +130,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM reagents.add_reagent_list(list_reagents) if(starts_lit) light() - AddComponent(/datum/component/knockoff,90,list(BODY_ZONE_PRECISE_MOUTH),list(SLOT_WEAR_MASK))//90% to knock off when wearing a mask + AddComponent(/datum/component/knockoff,90,list(BODY_ZONE_PRECISE_MOUTH),list(ITEM_SLOT_MASK))//90% to knock off when wearing a mask /obj/item/clothing/mask/cigarette/Destroy() STOP_PROCESSING(SSobj, src) @@ -819,7 +819,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/vape/equipped(mob/user, slot) . = ..() - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) if(!screw) to_chat(user, "You start puffing on the vape.") reagents.reagents_holder_flags &= ~(NO_REACT) @@ -830,7 +830,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/vape/dropped(mob/user) . = ..() var/mob/living/carbon/C = user - if(C.get_item_by_slot(SLOT_WEAR_MASK) == src) + if(C.get_item_by_slot(ITEM_SLOT_MASK) == src) reagents.reagents_holder_flags |= NO_REACT STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 0570de6bcf..476758efee 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -80,13 +80,13 @@ /obj/item/defibrillator/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) if(loc == user) if(slot_flags == ITEM_SLOT_BACK) - if(user.get_item_by_slot(SLOT_BACK) == src) + if(user.get_item_by_slot(ITEM_SLOT_BACK) == src) ui_action_click() else to_chat(user, "Put the defibrillator on your back first!") else if(slot_flags == ITEM_SLOT_BELT) - if(user.get_item_by_slot(SLOT_BELT) == src) + if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) ui_action_click() else to_chat(user, "Strap the defibrillator's belt on first!") @@ -182,7 +182,7 @@ /obj/item/defibrillator/equipped(mob/user, slot) ..() - if((slot_flags == ITEM_SLOT_BACK && slot != SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != SLOT_BELT)) + if((slot_flags == ITEM_SLOT_BACK && slot != ITEM_SLOT_BACK) || (slot_flags == ITEM_SLOT_BELT && slot != ITEM_SLOT_BELT)) remove_paddles(user) update_power() diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 2339e88a76..1a130998b6 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -369,6 +369,10 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "
  • [PDAIMG(rdoor)]Toggle Remote Door
  • " if (cartridge.access & CART_DRONEPHONE) dat += "
  • [PDAIMG(dronephone)]Drone Phone
  • " + if (cartridge.access & CART_BARTENDER) + dat += "
  • [PDAIMG(bucket)]Drink Recipe Browser
  • " + if (cartridge.access & CART_CHEMISTRY) + dat += "
  • [PDAIMG(bucket)]Chemistry Recipe Browser
  • " dat += "
  • [PDAIMG(atmos)]Atmospheric Scan
  • " dat += "
  • [PDAIMG(flashlight)][fon ? "Disable" : "Enable"] Flashlight
  • " if (pai) @@ -705,6 +709,16 @@ GLOBAL_LIST_EMPTY(PDAs) if(T) pai.forceMove(T) +//DRINK RECIPE BROWSER============================= + if("Drink Recipe Browser") + if(cartridge && cartridge.access & CART_BARTENDER) + recipe_search(U, GLOB.drink_reactions_list) + +//CHEMISTRY RECIPE BROWSER + if("Chemistry Recipe Browser") + if(cartridge && cartridge.access & CART_CHEMISTRY) + recipe_search(U, GLOB.normalized_chemical_reactions_list) + //LINK FUNCTIONS=================================== else//Cartridge menu linking diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 23ebaec3c2..8fcd97c261 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -222,6 +222,7 @@ /obj/item/pda/bar name = "bartender PDA" icon_state = "pda-bartender" + default_cartridge = /obj/item/cartridge/bartender inserted_item = /obj/item/pen/fountain /obj/item/pda/atmos diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 4ca0b86bc0..ca72e3371b 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -13,6 +13,8 @@ #define CART_QUARTERMASTER (1<<12) #define CART_HYDROPONICS (1<<13) #define CART_DRONEPHONE (1<<14) +#define CART_BARTENDER (1<<15) +#define CART_CHEMISTRY (1<<16) /obj/item/cartridge @@ -77,7 +79,7 @@ /obj/item/cartridge/chemistry name = "\improper ChemWhiz cartridge" icon_state = "cart-chem" - access = CART_REAGENT_SCANNER + access = CART_REAGENT_SCANNER | CART_CHEMISTRY bot_access_flags = MED_BOT /obj/item/cartridge/security @@ -190,6 +192,12 @@ bot_access_flags = SEC_BOT | MULE_BOT | FLOOR_BOT | CLEAN_BOT | MED_BOT | FIRE_BOT spam_enabled = 1 +/obj/item/cartridge/bartender + name = "\improper B.O.O.Z.E cartridge" + desc = "Now with 12% alcohol!" + icon_state = "cart-bar" + access = CART_BARTENDER + /obj/item/cartridge/captain/New() ..() radio = new(src) diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 365446bad9..a3de2d822f 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -19,7 +19,7 @@ /obj/item/megaphone/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HANDS) + if (slot == ITEM_SLOT_HANDS) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index c51edc8106..2c55bbf8e4 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -156,7 +156,7 @@ category = list("hacked", "Misc") /obj/item/electropack/shockcollar/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - if(loc == user && user.get_item_by_slot(SLOT_NECK)) + if(loc == user && user.get_item_by_slot(ITEM_SLOT_NECK)) to_chat(user, "The collar is fastened tight! You'll need help taking this off!") return return ..() @@ -167,7 +167,7 @@ if(isliving(loc) && on) //the "on" arg is currently useless var/mob/living/L = loc - if(!L.get_item_by_slot(SLOT_NECK)) //**properly** stops pocket shockers + if(!L.get_item_by_slot(ITEM_SLOT_NECK)) //**properly** stops pocket shockers return if(shock_cooldown == TRUE) return diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index dad6adb3c4..d3f932eddc 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/ComponentInitialize() . = ..() if (bowman) - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS_LEFT, SLOT_EARS_RIGHT)) //skyrat edit + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS_LEFT, ITEM_SLOT_EARS_RIGHT)) /obj/item/radio/headset/Initialize() . = ..() @@ -377,4 +377,4 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = replacetext(name,"headset", "bowman headset") desc = "[desc] Protects ears from flashbangs." bowman = TRUE - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS_LEFT, SLOT_EARS_RIGHT)) //skyrat edit + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS_LEFT, ITEM_SLOT_EARS_RIGHT)) diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm index de7e3d2812..810f2150e6 100644 --- a/code/game/objects/items/devices/reverse_bear_trap.dm +++ b/code/game/objects/items/devices/reverse_bear_trap.dm @@ -48,7 +48,7 @@ /obj/item/reverse_bear_trap/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) if(iscarbon(user)) var/mob/living/carbon/C = user - if(C.get_item_by_slot(SLOT_HEAD) == src) + if(C.get_item_by_slot(ITEM_SLOT_HEAD) == src) if(HAS_TRAIT_FROM(src, TRAIT_NODROP, REVERSE_BEAR_TRAP_TRAIT) && !struggling) struggling = TRUE var/fear_string @@ -82,26 +82,26 @@ ..() /obj/item/reverse_bear_trap/attack(mob/living/target, mob/living/user) - if(target.get_item_by_slot(SLOT_HEAD)) + if(target.get_item_by_slot(ITEM_SLOT_HEAD)) to_chat(user, "Remove [target.p_their()] headgear first!") return target.visible_message("[user] starts forcing [src] onto [target]'s head!", \ "[target] starts forcing [src] onto your head!", "You hear clanking.") to_chat(user, "You start forcing [src] onto [target]'s head...") - if(!do_after(user, 30, target = target) || target.get_item_by_slot(SLOT_HEAD)) + if(!do_after(user, 30, target = target) || target.get_item_by_slot(ITEM_SLOT_HEAD)) return target.visible_message("[user] forces and locks [src] onto [target]'s head!", \ "[target] locks [src] onto your head!", "You hear a click, and then a timer ticking down.") to_chat(user, "You force [src] onto [target]'s head and click the padlock shut.") user.dropItemToGround(src) - target.equip_to_slot_if_possible(src, SLOT_HEAD) + target.equip_to_slot_if_possible(src, ITEM_SLOT_HEAD) arm() notify_ghosts("[user] put a reverse bear trap on [target]!", source = src, action = NOTIFY_ORBIT, ghost_sound = 'sound/machines/beep.ogg') /obj/item/reverse_bear_trap/proc/snap() reset() var/mob/living/carbon/human/H = loc - if(!istype(H) || H.get_item_by_slot(SLOT_HEAD) != src) + if(!istype(H) || H.get_item_by_slot(ITEM_SLOT_HEAD) != src) visible_message("[src]'s jaws snap open with an ear-piercing crack!") playsound(src, 'sound/effects/snap.ogg', 75, TRUE) else diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 0f7e75c882..f1e6da5747 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -434,7 +434,7 @@ GENETICS SCANNER if(R) blood_type = R.name - + if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_SAFE * C.blood_ratio) && (C.scan_blood_volume() + C.integrating_blood) > (BLOOD_VOLUME_OKAY*C.blood_ratio)) msg += "LOW [HAS_TRAIT(C, TRAIT_ROBOTIC_ORGANISM) ? "coolant" : "blood"] level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]\n" else if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_OKAY * C.blood_ratio)) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index ac79b3b887..11900d8e42 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -208,7 +208,7 @@ effective or pretty fucking useless. actions_types = list(/datum/action/item_action/toggle) /obj/item/shadowcloak/ui_action_click(mob/user) - if(user.get_item_by_slot(SLOT_BELT) == src) + if(user.get_item_by_slot(ITEM_SLOT_BELT) == src) if(!on) Activate(usr) else @@ -216,7 +216,7 @@ effective or pretty fucking useless. return /obj/item/shadowcloak/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_BELT) + if(slot == ITEM_SLOT_BELT) return 1 /obj/item/shadowcloak/proc/Activate(mob/living/carbon/human/user) @@ -238,11 +238,11 @@ effective or pretty fucking useless. /obj/item/shadowcloak/dropped(mob/user) ..() - if(user && user.get_item_by_slot(SLOT_BELT) != src) + if(user && user.get_item_by_slot(ITEM_SLOT_BELT) != src) Deactivate() /obj/item/shadowcloak/process() - if(user.get_item_by_slot(SLOT_BELT) != src) + if(user.get_item_by_slot(ITEM_SLOT_BELT) != src) Deactivate() return var/turf/T = get_turf(src) diff --git a/code/game/objects/items/fluff.dm b/code/game/objects/items/fluff.dm index 7105e57c30..0df8d5b447 100644 --- a/code/game/objects/items/fluff.dm +++ b/code/game/objects/items/fluff.dm @@ -6,7 +6,7 @@ // 1) Tennis balls, lines 39 - 99 // 2) Chew bones, lines 101 - 138 // 3) Frisbee, lines 140 - 166 -*/ +*/ /obj/item/toy/fluff name = "Fluff Item" diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index d1450c2685..c084b90d6f 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -336,7 +336,7 @@ var/obj/item/clothing/magichead = new /obj/item/clothing/mask/horsehead/cursed(user.drop_location()) if(!user.dropItemToGround(user.wear_mask)) qdel(user.wear_mask) - user.equip_to_slot_if_possible(magichead, SLOT_WEAR_MASK, TRUE, TRUE) + user.equip_to_slot_if_possible(magichead, ITEM_SLOT_MASK, TRUE, TRUE) qdel(src) else to_chat(user,"I say thee neigh") //It still lives here diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index ddcd35f834..a5913c308d 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -188,7 +188,7 @@ icon_state = "inducer-combat" item_state = "inducer-combat" w_class = WEIGHT_CLASS_BULKY - slot_flags = SLOT_BELT + slot_flags = ITEM_SLOT_BELT desc = "A tool for inductively charging internal power cells. This one has been modified and upgraded to be able to charge into guns as well as normal electronics." cell_type = /obj/item/stock_parts/cell/hyper powertransfer = 1300 diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 6bb501807d..56ad6c2534 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -108,7 +108,7 @@ desc = "This little bugger can be used to store and transport ores." icon = 'icons/obj/mining.dmi' icon_state = "satchel" - slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_NORMAL component_type = /datum/component/storage/concrete/stack var/spam_protection = FALSE //If this is TRUE, the holder won't receive any messages when they fail to pick up ore through crossing it @@ -400,7 +400,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bag" desc = "A bag for storing pills, patches, and bottles." - slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_POCKETS resistance_flags = FLAMMABLE /obj/item/storage/bag/chemistry/ComponentInitialize() @@ -420,7 +420,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "biobag" desc = "A bag for the safe transportation and disposal of biowaste and other biological materials." - slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_BELT|ITEM_SLOT_POCKETS resistance_flags = FLAMMABLE /obj/item/storage/bag/bio/ComponentInitialize() @@ -451,7 +451,7 @@ desc = "A pouch for your ammo that goes in your pocket." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "ammopouch" - slot_flags = ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_BULKY resistance_flags = FLAMMABLE @@ -472,7 +472,7 @@ Bag for holding materials desc = "A pouch for sheets and RCD ammunition that manages to hang where you would normally put things in your pocket." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "materialpouch" - slot_flags = ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_BULKY resistance_flags = FLAMMABLE diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 476f35fe4c..1a3b40d1da 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -73,7 +73,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", var/mob/living/carbon/human/H = usr H.dna.add_mutation(CLOWNMUT) H.dna.add_mutation(SMILE) - H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), SLOT_WEAR_MASK) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), ITEM_SLOT_MASK) GLOB.bible_icon_state = icon_state GLOB.bibleitemstates = item_state diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 9d48351852..48db846a43 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -248,10 +248,10 @@ return ..() var/obj/item/clothing/mask/cigarette/cig = locate(/obj/item/clothing/mask/cigarette) in contents if(cig) - if(!user.wear_mask && !(SLOT_WEAR_MASK in M.check_obscured_slots())) + if(!user.wear_mask && !(ITEM_SLOT_MASK in M.check_obscured_slots())) var/obj/item/clothing/mask/cigarette/W = cig SEND_SIGNAL(src, COMSIG_TRY_STORAGE_TAKE, W, M) - M.equip_to_slot_if_possible(W, SLOT_WEAR_MASK) + M.equip_to_slot_if_possible(W, ITEM_SLOT_MASK) contents -= W to_chat(user, "You take \a [W] out of the pack.") else diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index fffcd6dada..88131fb197 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -58,7 +58,7 @@ /obj/item/watertank/equipped(mob/user, slot) ..() - if(slot != SLOT_BACK) + if(slot != ITEM_SLOT_BACK) remove_noz() /obj/item/watertank/proc/remove_noz() @@ -348,14 +348,14 @@ toggle_injection() /obj/item/reagent_containers/chemtank/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_BACK) + if(slot == ITEM_SLOT_BACK) return 1 /obj/item/reagent_containers/chemtank/proc/toggle_injection() var/mob/living/carbon/human/user = usr if(!istype(user)) return - if (user.get_item_by_slot(SLOT_BACK) != src) + if (user.get_item_by_slot(ITEM_SLOT_BACK) != src) to_chat(user, "The chemtank needs to be on your back before you can activate it!") return if(on) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 3fd31941f3..b00d736282 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -1229,7 +1229,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/slapper/on_offered(mob/living/carbon/offerer) . = TRUE - + if(!(locate(/mob/living/carbon) in orange(1, offerer))) visible_message(span_danger("[offerer] raises [offerer.p_their()] arm, looking around for a high-five, but there's no one around!"), \ span_warning("You post up, looking for a high-five, but finding no one within range!"), null, 2) diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 8d7da15761..5da3d079c2 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -153,8 +153,8 @@ continue if(iscarbon(L)) var/mob/living/carbon/C = L - var/obj/item/clothing/S = C.get_item_by_slot(SLOT_WEAR_SUIT) - var/obj/item/clothing/H = C.get_item_by_slot(SLOT_HEAD) + var/obj/item/clothing/S = C.get_item_by_slot(ITEM_SLOT_OCLOTHING) + var/obj/item/clothing/H = C.get_item_by_slot(ITEM_SLOT_HEAD) if(S && H && S.clothing_flags & LAVAPROTECT && H.clothing_flags & LAVAPROTECT) return diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 08b62ef2f3..42611d2832 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -25,10 +25,9 @@ to_chat(usr, "You seem to be selecting a mob that doesn't exist anymore.", confidential = TRUE) return -//SKYRAT CHANGES BEGIN +//ambition start var/list/body = list("Options for [M.key]") -//SKYRAT CHANGES END - +//ambition end body += "Options panel for [M]" if(M.client) body += " played by [M.client] " @@ -128,6 +127,10 @@ body += "Subtle message | " // body += "Play sound to | " body += "Language Menu" +//ambition start + if(M.mind) + body += " | Objective-Ambition Menu" +//ambition end if (M.client) if(!isnewplayer(M)) @@ -209,12 +212,11 @@ body += "
    " body += "" -//SKYRAT CHANGES BEGIN +//ambition start var/datum/browser/popup = new(usr, "adminplayeropts-[REF(M)]", "Player Panel", nwidth = 550, nheight = 515) popup.set_content(body.Join()) popup.open() -//SKYRAT CHANGES END - +//ambition end SSblackbox.record_feedback("tally", "admin_verb", 1, "Player Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/playtimes.dm b/code/modules/admin/playtimes.dm new file mode 100644 index 0000000000..7cf24d9746 --- /dev/null +++ b/code/modules/admin/playtimes.dm @@ -0,0 +1,68 @@ +/datum/player_playtime/New(mob/viewer) + ui_interact(viewer) + +/datum/player_playtime/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "PlayerPlaytimes", "Player Playtimes") + ui.open() + +/datum/player_playtime/ui_state(mob/user) + return GLOB.admin_state + +/datum/player_playtime/ui_data(mob/user) + var/list/data = list() + + var/list/clients = list() + for(var/client/C in GLOB.clients) + var/list/client = list() + + client["ckey"] = C.ckey + client["playtime"] = C.get_exp_living(TRUE) + client["playtime_hours"] = C.get_exp_living() + + var/mob/M = C.mob + client["observer"] = isobserver(M) + client["ingame"] = !isnewplayer(M) + client["name"] = M.real_name + var/nnpa = CONFIG_GET(number/notify_new_player_age) + if(nnpa >= 0) + if(C.account_age >= 0 && (C.account_age < CONFIG_GET(number/notify_new_player_age))) + client["new_account"] = "New BYOND account [C.account_age] day[(C.account_age==1?"":"s")] old, created on [C.account_join_date]" + + clients += list(client) + + clients = sortList(clients, /proc/cmp_playtime) + data["clients"] = clients + return data + +/datum/player_playtime/ui_act(action, params) + if(..()) + return + + switch(action) + if("view_playtime") + var/mob/target = get_mob_by_ckey(params["ckey"]) + usr.client.holder.cmd_show_exp_panel(target.client) + if("admin_pm") + usr.client.cmd_admin_pm(params["ckey"]) + if("player_panel") + var/mob/target = get_mob_by_ckey(params["ckey"]) + usr.client.holder.show_player_panel(target) + if("view_variables") + var/mob/target = get_mob_by_ckey(params["ckey"]) + usr.client.debug_variables(target) + if("observe") + if(!isobserver(usr) && !check_rights(R_ADMIN)) + return + + var/mob/target = get_mob_by_key(params["ckey"]) + if(!target) + to_chat(usr, "Player not found.") + return + + var/client/C = usr.client + if(!isobserver(usr) && !C.admin_ghost()) + return + var/mob/dead/observer/A = C.mob + A.ManualFollow(target) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 17bad60945..d134853494 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1686,8 +1686,8 @@ if(ishuman(L)) var/mob/living/carbon/human/observer = L - observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit/black(observer), SLOT_W_UNIFORM) - observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), SLOT_SHOES) + observer.equip_to_slot_or_del(new /obj/item/clothing/under/suit/black(observer), ITEM_SLOT_ICLOTHING) + observer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(observer), ITEM_SLOT_FEET) L.Unconscious(100) sleep(5) L.forceMove(pick(GLOB.tdomeobserve)) @@ -2022,6 +2022,18 @@ var/mob/M = locate(href_list["HeadsetMessage"]) usr.client.admin_headset_message(M) +//ambition start + else if(href_list["ObjectiveRequest"]) + if(!check_rights(R_ADMIN)) + return + var/datum/mind/requesting_mind = locate(href_list["ObjectiveRequest"]) + if(!istype(requesting_mind) || QDELETED(requesting_mind)) + to_chat(usr, "This mind reference is no longer valid. It has probably since been destroyed.") + return + requesting_mind.do_edit_objectives_ambitions() + return +//ambition end + else if(href_list["reject_custom_name"]) if(!check_rights(R_ADMIN)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index b0c553c0d9..602b5ce7a7 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -202,7 +202,7 @@ id.forceMove(W) W.update_icon() else - H.equip_to_slot(id,SLOT_WEAR_ID) + H.equip_to_slot(id,ITEM_SLOT_ID) else alert("Invalid mob") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 1ae683ad07..c623380e4d 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1578,6 +1578,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/cmd_admin_check_player_exp() //Allows admins to determine who the newer players are. set category = "Admin" set name = "Player Playtime" + if(!check_rights(R_ADMIN)) return @@ -1585,12 +1586,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, "Tracking is disabled in the server configuration file.") return - var/list/msg = list() - msg += "Playtime ReportPlaytime:
    " - src << browse(msg.Join(), "window=Player_playtime_check") + new /datum/player_playtime(usr) /obj/effect/temp_visual/fireball icon = 'icons/obj/wizard.dmi' diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 2f7e160e6e..a1b1a1288e 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -50,6 +50,10 @@ GLOBAL_LIST_EMPTY(antagonists) var/show_name_in_check_antagonists = FALSE /// Should this antagonist be shown as antag to ghosts? Shouldn't be used for stealthy antagonists like traitors var/show_to_ghosts = FALSE +//ambition start + /// Lazy list for antagonists to request the admins objectives. + var/list/requested_objective_changes +//ambition end /* CIT SPECIFIC */ /// Quirks that will be removed upon gaining this antag. Pacifist and mute are default. @@ -78,7 +82,9 @@ GLOBAL_LIST_EMPTY(antagonists) if(!owner) stack_trace("Destroy()ing antagonist datum when it has no owner.") else - LAZYREMOVE(owner.antag_datums, src) +//ambition start + owner?.do_remove_antag_datum(src) +//ambition end owner = null return ..() @@ -230,7 +236,7 @@ GLOBAL_LIST_EMPTY(antagonists) remove_innate_effects() clear_antag_moodies() - LAZYREMOVE(owner.antag_datums, src) + owner.do_remove_antag_datum(src) // cit skill for(var/A in skill_modifiers) owner.remove_skill_modifier(GET_SKILL_MOD_ID(A, type)) @@ -524,3 +530,33 @@ GLOBAL_LIST_EMPTY(antagonists) /datum/action/antag_info/IsAvailable() return TRUE + +///Clears change requests from deleted objectives to avoid broken references. +/datum/antagonist/proc/clean_request_from_del_objective(datum/objective/source, force) + var/objective_reference = REF(source) + for(var/uid in requested_objective_changes) + var/list/change_request = requested_objective_changes[uid] + if(change_request["target"] != objective_reference) + continue + LAZYREMOVE(requested_objective_changes, uid) + + +/datum/antagonist/proc/add_objective_change(uid, list/additions) + LAZYADD(requested_objective_changes, uid) + var/datum/objective/request_target = additions["target"] + if(!ispath(request_target)) + request_target = locate(request_target) in objectives + if(istype(request_target)) + RegisterSignal(request_target, COMSIG_PARENT_QDELETING, .proc/clean_request_from_del_objective) + requested_objective_changes[uid] = additions + + +/datum/antagonist/proc/remove_objective_change(uid) + if(!LAZYACCESS(requested_objective_changes, uid)) + return + var/datum/objective/request_target = requested_objective_changes[uid]["target"] + if(!ispath(request_target)) + request_target = locate(request_target) in objectives + if(istype(request_target)) + UnregisterSignal(request_target, COMSIG_PARENT_QDELETING) + LAZYREMOVE(requested_objective_changes, uid) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 8484732d8d..011d175cfa 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -62,7 +62,7 @@ A.UpdateButtonIcon() /obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to activate the vest if he's actually wearing it. + if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to activate the vest if he's actually wearing it. return TRUE /obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 29e64a4913..c5f1cfbb40 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -84,7 +84,7 @@ return FALSE if(owner.current.reagents.has_reagent(/datum/reagent/consumable/garlic)) return FALSE - if(istype(owner.current.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + if(istype(owner.current.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) return FALSE owner.current.adjustStaminaLoss(-1.5 + (actual_regen * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-0.1 * (actual_regen * 2) * mult, 0) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index 2fb7a2ccca..0a799021e9 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -94,7 +94,7 @@ if(display_error) to_chat(owner, "You have a stake in your chest! Your powers are useless.") return FALSE - if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + if(istype(owner.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) if(display_error) to_chat(owner, "") return FALSE diff --git a/code/modules/antagonists/bloodsucker/powers/brawn.dm b/code/modules/antagonists/bloodsucker/powers/brawn.dm index 5444cccd3f..db3ce92ec1 100644 --- a/code/modules/antagonists/bloodsucker/powers/brawn.dm +++ b/code/modules/antagonists/bloodsucker/powers/brawn.dm @@ -105,7 +105,7 @@ var/mob/living/carbon/user_C = owner //message_admins("DEBUG3: attempt_cast() [name] / [user_C.handcuffed] ") if(user_C.handcuffed) - var/obj/O = user_C.get_item_by_slot(SLOT_HANDCUFFED) + var/obj/O = user_C.get_item_by_slot(ITEM_SLOT_HANDCUFFED) if(istype(O)) user_C.clear_cuffs(O,TRUE) playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1) @@ -124,7 +124,7 @@ return TRUE */ // Destroy Leg Cuffs if(user_C.legcuffed) - var/obj/O = user_C.get_item_by_slot(SLOT_LEGCUFFED) + var/obj/O = user_C.get_item_by_slot(ITEM_SLOT_LEGCUFFED) if(istype(O)) user_C.clear_cuffs(O,TRUE) playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1) diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 5f4bec6581..a68b578f86 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -67,7 +67,9 @@ user.copy_languages(target, LANGUAGE_ABSORB) if(target.mind && user.mind)//if the victim and user have minds - target.mind.show_memory(user, 0) //I can read your mind, kekeke. Output all their notes. +//ambition start + to_chat(user, "[target.mind.show_memory()]") //I can read your mind, kekeke. Output all their notes. +//ambition end //Some of target's recent speech, so the changeling can attempt to imitate them better. //Recent as opposed to all because rounds tend to have a LOT of text. diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index 8b3b1659d1..b440228a4e 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -17,7 +17,7 @@ return FALSE if(user.handcuffed) - var/obj/O = user.get_item_by_slot(SLOT_HANDCUFFED) + var/obj/O = user.get_item_by_slot(ITEM_SLOT_HANDCUFFED) if(!istype(O)) return FALSE user.visible_message("[user] vomits a glob of acid on [user.p_their()] [O]!", \ @@ -27,7 +27,7 @@ used = TRUE if(user.legcuffed) - var/obj/O = user.get_item_by_slot(SLOT_LEGCUFFED) + var/obj/O = user.get_item_by_slot(ITEM_SLOT_LEGCUFFED) if(!istype(O)) return FALSE user.visible_message("[user] vomits a glob of acid on [user.p_their()] [O]!", \ @@ -37,7 +37,7 @@ used = TRUE if(user.wear_suit && user.wear_suit.breakouttime && !used) - var/obj/item/clothing/suit/S = user.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/clothing/suit/S = user.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(!istype(S)) return FALSE user.visible_message("[user] vomits a glob of acid across the front of [user.p_their()] [S]!", \ diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index f4b74c5567..ec95ee4ef6 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -130,8 +130,8 @@ user.dropItemToGround(user.head) user.dropItemToGround(user.wear_suit) - user.equip_to_slot_if_possible(new suit_type(user), SLOT_WEAR_SUIT, 1, 1, 1) - user.equip_to_slot_if_possible(new helmet_type(user), SLOT_HEAD, 1, 1, 1) + user.equip_to_slot_if_possible(new suit_type(user), ITEM_SLOT_OCLOTHING, 1, 1, 1) + user.equip_to_slot_if_possible(new helmet_type(user), ITEM_SLOT_HEAD, 1, 1, 1) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.chem_recharge_slowdown += recharge_slowdown @@ -637,7 +637,7 @@ user.dropItemToGround(user.gloves) - user.equip_to_slot_if_possible(new glove_type(user), SLOT_GLOVES, 1, 1, 1) + user.equip_to_slot_if_possible(new glove_type(user), ITEM_SLOT_GLOVES, 1, 1, 1) playsound(user, 'sound/effects/blobattack.ogg', 30, 1) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.chem_recharge_slowdown += recharge_slowdown @@ -733,7 +733,7 @@ /obj/item/clothing/gloves/fingerless/pugilist/cling/equipped(mob/user, slot) . = ..() - if(current_equipped_slot == SLOT_GLOVES) + if(current_equipped_slot == ITEM_SLOT_GLOVES) to_chat(user, "With [src] formed around our arms, we are ready to fight.") /obj/item/clothing/gloves/fingerless/pugilist/cling/dropped(mob/user) diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm index ad507adcec..b5f2a358e6 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_armor.dm @@ -38,7 +38,7 @@ /obj/item/clothing/head/helmet/clockwork/equipped(mob/living/user, slot) ..() - if(slot == SLOT_HEAD && !is_servant_of_ratvar(user)) + if(slot == ITEM_SLOT_HEAD && !is_servant_of_ratvar(user)) if(!iscultist(user)) to_chat(user, "\"Now now, this is for my servants, not you.\"") user.visible_message("As [user] puts [src] on, it flickers off [user.p_their()] head!", "The helmet flickers off your head, leaving only nausea!") @@ -105,7 +105,7 @@ /obj/item/clothing/suit/armor/clockwork/equipped(mob/living/user, slot) ..() - if(slot == SLOT_WEAR_SUIT && !is_servant_of_ratvar(user)) + if(slot == ITEM_SLOT_OCLOTHING && !is_servant_of_ratvar(user)) if(!iscultist(user)) to_chat(user, "\"Now now, this is for my servants, not you.\"") user.visible_message("As [user] puts [src] on, it flickers off [user.p_their()] body!", "The cuirass flickers off your body, leaving only nausea!") @@ -165,7 +165,7 @@ /obj/item/clothing/gloves/clockwork/equipped(mob/living/user, slot) ..() - if(slot == SLOT_GLOVES && !is_servant_of_ratvar(user)) + if(slot == ITEM_SLOT_GLOVES && !is_servant_of_ratvar(user)) if(!iscultist(user)) to_chat(user, "\"Now now, this is for my servants, not you.\"") user.visible_message("As [user] puts [src] on, it flickers off [user.p_their()] arms!", "The gauntlets flicker off your arms, leaving only nausea!") @@ -215,7 +215,7 @@ /obj/item/clothing/shoes/clockwork/equipped(mob/living/user, slot) ..() - if(slot == SLOT_SHOES && !is_servant_of_ratvar(user)) + if(slot == ITEM_SLOT_FEET && !is_servant_of_ratvar(user)) if(!iscultist(user)) to_chat(user, "\"Now now, this is for my servants, not you.\"") user.visible_message("As [user] puts [src] on, it flickers off [user.p_their()] feet!", "The treads flicker off your feet, leaving only nausea!") diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm index daee9f5c2c..9342cd8ea5 100644 --- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm +++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm @@ -117,4 +117,4 @@ S.no_cost = TRUE if(seasonal_hat && seasonal_hat != "none") var/obj/item/hat = new seasonal_hat(construct) - construct.equip_to_slot_or_del(hat, SLOT_HEAD) + construct.equip_to_slot_or_del(hat, ITEM_SLOT_HEAD) diff --git a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm index e748da8765..138f04feb3 100644 --- a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm +++ b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm @@ -28,13 +28,13 @@ return ..() /obj/item/clothing/glasses/judicial_visor/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot != SLOT_GLASSES) + if(slot != ITEM_SLOT_EYES) return 0 return ..() /obj/item/clothing/glasses/judicial_visor/equipped(mob/living/user, slot) ..() - if(slot != SLOT_GLASSES) + if(slot != ITEM_SLOT_EYES) update_status(FALSE) if(blaster.ranged_ability_user) blaster.remove_ranged_ability() @@ -55,13 +55,13 @@ addtimer(CALLBACK(src, .proc/check_on_mob, user), 1) //dropped is called before the item is out of the slot, so we need to check slightly later /obj/item/clothing/glasses/judicial_visor/proc/check_on_mob(mob/user) - if(user && src != user.get_item_by_slot(SLOT_GLASSES)) //if we happen to check and we AREN'T in the slot, we need to remove our shit from whoever we got dropped from + if(user && src != user.get_item_by_slot(ITEM_SLOT_EYES)) //if we happen to check and we AREN'T in the slot, we need to remove our shit from whoever we got dropped from update_status(FALSE) if(blaster.ranged_ability_user) blaster.remove_ranged_ability() /obj/item/clothing/glasses/judicial_visor/attack_self(mob/user) - if(is_servant_of_ratvar(user) && src == user.get_item_by_slot(SLOT_GLASSES)) + if(is_servant_of_ratvar(user) && src == user.get_item_by_slot(ITEM_SLOT_EYES)) blaster.toggle(user) /obj/item/clothing/glasses/judicial_visor/proc/update_status(change_to) @@ -89,7 +89,7 @@ if(!src) return 0 recharging = FALSE - if(user && src == user.get_item_by_slot(SLOT_GLASSES)) + if(user && src == user.get_item_by_slot(ITEM_SLOT_EYES)) to_chat(user, "Your [name] hums. It is ready.") else active = FALSE @@ -115,7 +115,7 @@ /obj/effect/proc_holder/judicial_visor/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) return - if(ranged_ability_user.incapacitated() || !visor || visor != ranged_ability_user.get_item_by_slot(SLOT_GLASSES)) + if(ranged_ability_user.incapacitated() || !visor || visor != ranged_ability_user.get_item_by_slot(ITEM_SLOT_EYES)) remove_ranged_ability() return diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm index 5e25b8de82..837844d0cb 100644 --- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm +++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm @@ -75,7 +75,7 @@ /obj/item/clothing/glasses/wraith_spectacles/equipped(mob/living/user, slot) ..() - if(slot != SLOT_GLASSES || up) + if(slot != ITEM_SLOT_EYES || up) return if(HAS_TRAIT(user, TRAIT_BLIND)) to_chat(user, "\"You're blind, idiot. Stop embarrassing yourself.\"" ) diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm index 7ba4ce0936..be4785f4a7 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm @@ -200,18 +200,18 @@ /datum/action/innate/clockwork_armaments/Activate() var/do_message = 0 - var/obj/item/I = owner.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/I = owner.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(remove_item_if_better(I, owner)) - do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), SLOT_WEAR_SUIT) - I = owner.get_item_by_slot(SLOT_HEAD) + do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), ITEM_SLOT_OCLOTHING) + I = owner.get_item_by_slot(ITEM_SLOT_HEAD) if(remove_item_if_better(I, owner)) - do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), SLOT_HEAD) - I = owner.get_item_by_slot(SLOT_GLOVES) + do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), ITEM_SLOT_HEAD) + I = owner.get_item_by_slot(ITEM_SLOT_GLOVES) if(remove_item_if_better(I, owner)) - do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/gloves/clockwork(null), SLOT_GLOVES) - I = owner.get_item_by_slot(SLOT_SHOES) + do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/gloves/clockwork(null), ITEM_SLOT_GLOVES) + I = owner.get_item_by_slot(ITEM_SLOT_FEET) if(remove_item_if_better(I, owner)) - do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), SLOT_SHOES) + do_message += owner.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), ITEM_SLOT_FEET) if(do_message) owner.visible_message("Strange armor appears on [owner]!", "A bright shimmer runs down your body, equipping you with Ratvarian armor.") playsound(owner, 'sound/magic/clockwork/fellowship_armory.ogg', 15 * do_message, TRUE) //get sound loudness based on how much we equipped @@ -309,16 +309,16 @@ continue T = get_turf(M) var/heal_ticks = 0 //one heal tick for each piece of ratvarian armor worn - var/obj/item/I = H.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/I = H.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(is_type_in_typecache(I, ratvarian_armor_typecache)) heal_ticks++ - I = H.get_item_by_slot(SLOT_HEAD) + I = H.get_item_by_slot(ITEM_SLOT_HEAD) if(is_type_in_typecache(I, ratvarian_armor_typecache)) heal_ticks++ - I = H.get_item_by_slot(SLOT_GLOVES) + I = H.get_item_by_slot(ITEM_SLOT_GLOVES) if(is_type_in_typecache(I, ratvarian_armor_typecache)) heal_ticks++ - I = H.get_item_by_slot(SLOT_SHOES) + I = H.get_item_by_slot(ITEM_SLOT_FEET) if(is_type_in_typecache(I, ratvarian_armor_typecache)) heal_ticks++ if(heal_ticks) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 8a51e4d17e..3373de9ff0 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -678,12 +678,12 @@ uses-- var/mob/living/carbon/C = target C.visible_message("Otherworldly armor suddenly appears on [C]!") - C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,SLOT_W_UNIFORM) - C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), SLOT_HEAD) - C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), SLOT_WEAR_SUIT) - C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), SLOT_SHOES) - C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), SLOT_BACK) - C.equip_to_slot_or_del(new /obj/item/clothing/gloves/fingerless/pugilist/hungryghost(user), SLOT_GLOVES) + C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,ITEM_SLOT_ICLOTHING) + C.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), ITEM_SLOT_HEAD) + C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), ITEM_SLOT_OCLOTHING) + C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), ITEM_SLOT_FEET) + C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), ITEM_SLOT_BACK) + C.equip_to_slot_or_del(new /obj/item/clothing/gloves/fingerless/pugilist/hungryghost(user), ITEM_SLOT_GLOVES) if(C == user) qdel(src) //Clears the hands C.put_in_hands(new /obj/item/melee/cultblade(user)) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index a18523069e..2850cb85cc 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -49,7 +49,10 @@ cult_team = new_team /datum/antagonist/cult/proc/add_objectives() - objectives |= cult_team?.objectives +//ambition start + if(cult_team) + objectives |= cult_team.objectives +//ambition end /datum/antagonist/cult/Destroy() QDEL_NULL(communion) @@ -95,9 +98,9 @@ /datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob) var/list/slots = list( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/T = new item_path(mob) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 7981a10701..3b73a998e7 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1090,7 +1090,7 @@ structure_check() searches for nearby cultist structures required for the invoca /proc/hudFix(mob/living/carbon/human/target) if(!target || !target.client) return - var/obj/O = target.get_item_by_slot(SLOT_GLASSES) + var/obj/O = target.get_item_by_slot(ITEM_SLOT_EYES) if(istype(O, /obj/item/clothing/glasses/hud/security)) var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] AH.add_hud_to(target) diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 65ce89d33f..9f69f10887 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -460,10 +460,10 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", return -1 currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1) var/mob/living/carbon/human/H = owner.current - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/civilian/lawyer/black(H), SLOT_W_UNIFORM) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), SLOT_SHOES) - H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), SLOT_HANDS) - H.equip_to_slot_or_del(new /obj/item/pen(H), SLOT_L_STORE) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/civilian/lawyer/black(H), ITEM_SLOT_ICLOTHING) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), ITEM_SLOT_FEET) + H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), ITEM_SLOT_HANDS) + H.equip_to_slot_or_del(new /obj/item/pen(H), ITEM_SLOT_LPOCKET) if(SOULVALUE >= BLOOD_THRESHOLD) H.set_species(/datum/species/lizard, 1) H.underwear = "Nude" diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm index fc0a5cdc6a..d7334d6c9c 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm @@ -72,9 +72,9 @@ /datum/antagonist/heretic/proc/ecult_give_item(obj/item/item_path, mob/living/carbon/human/H) var/list/slots = list( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/T = new item_path(H) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index 28228aedd6..c0f3e2be7c 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -145,7 +145,7 @@ /obj/item/clothing/neck/eldritch_amulet/equipped(mob/user, slot) . = ..() - if(ishuman(user) && user.mind && slot == SLOT_NECK && (IS_HERETIC(user) || IS_HERETIC_MONSTER(user))) + if(ishuman(user) && user.mind && slot == ITEM_SLOT_NECK && (IS_HERETIC(user) || IS_HERETIC_MONSTER(user))) ADD_TRAIT(user, trait, CLOTHING_TRAIT) user.update_sight() @@ -239,7 +239,7 @@ /obj/item/clothing/mask/void_mask/equipped(mob/user, slot) . = ..() - if(ishuman(user) && user.mind && slot == SLOT_WEAR_MASK) + if(ishuman(user) && user.mind && slot == ITEM_SLOT_MASK) local_user = user START_PROCESSING(SSobj, src) diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 43a7e561c0..a8e57ee08b 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -234,8 +234,8 @@ var/obj/O = new C(owner.current) var/list/slots = list ( "backpack" = ITEM_SLOT_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/mob/living/carbon/human/H = owner.current var/equipped = H.equip_in_one_of_slots(O, slots) diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index 70d7fdd3fe..513a8d63b6 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -45,11 +45,11 @@ qdel(I) for(var/obj/item/I in H.held_items) qdel(I) - H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/kilt/highlander(H), SLOT_W_UNIFORM) - H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), SLOT_EARS_LEFT) //skyrat edit - H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), SLOT_HEAD) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), SLOT_SHOES) - H.equip_to_slot_or_del(new /obj/item/pinpointer/nuke(H), SLOT_L_STORE) + H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/kilt/highlander(H), ITEM_SLOT_ICLOTHING) + H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), ITEM_SLOT_EARS_LEFT) // Sandstorm edit + H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), ITEM_SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), ITEM_SLOT_FEET) + H.equip_to_slot_or_del(new /obj/item/pinpointer/nuke(H), ITEM_SLOT_LPOCKET) for(var/obj/item/pinpointer/nuke/P in H) P.attack_self(H) var/obj/item/card/id/W = new(H) @@ -60,7 +60,7 @@ W.registered_name = H.real_name ADD_TRAIT(W, TRAIT_NODROP, HIGHLANDER) W.update_label(H.real_name) - H.equip_to_slot_or_del(W, SLOT_WEAR_ID) + H.equip_to_slot_or_del(W, ITEM_SLOT_ID) sword = new(H) if(!GLOB.highlander) diff --git a/code/modules/antagonists/overthrow/overthrow.dm b/code/modules/antagonists/overthrow/overthrow.dm index f086f5db97..fffd8f9237 100644 --- a/code/modules/antagonists/overthrow/overthrow.dm +++ b/code/modules/antagonists/overthrow/overthrow.dm @@ -127,9 +127,9 @@ // Give AI hacking board var/obj/item/aiModule/core/full/overthrow/O = new(H) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/where = H.equip_in_one_of_slots(O, slots, critical = TRUE) if (!where) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 925527f35e..e4625b4ef2 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -272,9 +272,9 @@ if(give_flash) var/obj/item/assembly/flash/T = new(H) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/where = H.equip_in_one_of_slots(T, slots, critical = TRUE) if (!where) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 78403d4e27..f184961004 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -240,9 +240,9 @@ folder = new/obj/item/folder/syndicate/blue(mob.loc) var/list/slots = list ( - "backpack" = SLOT_IN_BACKPACK, - "left pocket" = SLOT_L_STORE, - "right pocket" = SLOT_R_STORE + "backpack" = ITEM_SLOT_BACKPACK, + "left pocket" = ITEM_SLOT_LPOCKET, + "right pocket" = ITEM_SLOT_RPOCKET ) var/where = "At your feet" diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 44f267358a..6f7ba374f7 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -229,12 +229,12 @@ H.dropItemToGround(I) var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire) - H.equip_to_slot_or_del(new hat(H), SLOT_HEAD) - H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(H), SLOT_W_UNIFORM) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), SLOT_SHOES) + H.equip_to_slot_or_del(new hat(H), ITEM_SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(H), ITEM_SLOT_ICLOTHING) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), ITEM_SLOT_FEET) H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE) H.put_in_hands(new /obj/item/claymore(H), TRUE) - H.equip_to_slot_or_del(new /obj/item/spear(H), SLOT_BACK) + H.equip_to_slot_or_del(new /obj/item/spear(H), ITEM_SLOT_BACK) /obj/item/voodoo diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 88a2b82ab9..a99d83c1a3 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -208,17 +208,17 @@ if(!istype(master_mob) || !istype(H)) return if(master_mob.ears) - H.equip_to_slot_or_del(new master_mob.ears.type, SLOT_EARS_LEFT) //skyrat edit + H.equip_to_slot_or_del(new master_mob.ears.type, ITEM_SLOT_EARS_LEFT) // Sandstorm edit if(master_mob.w_uniform) - H.equip_to_slot_or_del(new master_mob.w_uniform.type, SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new master_mob.w_uniform.type, ITEM_SLOT_ICLOTHING) if(master_mob.shoes) - H.equip_to_slot_or_del(new master_mob.shoes.type, SLOT_SHOES) + H.equip_to_slot_or_del(new master_mob.shoes.type, ITEM_SLOT_FEET) if(master_mob.wear_suit) - H.equip_to_slot_or_del(new master_mob.wear_suit.type, SLOT_WEAR_SUIT) + H.equip_to_slot_or_del(new master_mob.wear_suit.type, ITEM_SLOT_OCLOTHING) if(master_mob.head) - H.equip_to_slot_or_del(new master_mob.head.type, SLOT_HEAD) + H.equip_to_slot_or_del(new master_mob.head.type, ITEM_SLOT_HEAD) if(master_mob.back) - H.equip_to_slot_or_del(new master_mob.back.type, SLOT_BACK) + H.equip_to_slot_or_del(new master_mob.back.type, ITEM_SLOT_BACK) //Operation: Fuck off and scare people owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index d32905e007..805f5b6e2e 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -534,7 +534,7 @@ no_drops += H.get_item_by_slot(ITEM_SLOT_GLOVES) no_drops += H.get_item_by_slot(ITEM_SLOT_FEET) no_drops += H.get_item_by_slot(ITEM_SLOT_ICLOTHING) - no_drops += H.get_item_by_slot(ITEM_SLOT_EARS) + no_drops += H.get_item_by_slot(ITEM_SLOT_EARS_LEFT) for(var/i in no_drops) var/obj/item/I = i ADD_TRAIT(I, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT) diff --git a/code/modules/awaymissions/mission_code/jungleresort.dm b/code/modules/awaymissions/mission_code/jungleresort.dm index 6c82b2c0c4..f520cfdbee 100644 --- a/code/modules/awaymissions/mission_code/jungleresort.dm +++ b/code/modules/awaymissions/mission_code/jungleresort.dm @@ -27,7 +27,7 @@ /obj/item/clothing/head/rice_hat/cursed/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 5d30ccd907..ba3f07bd7d 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -589,7 +589,7 @@ back = /obj/item/storage/backpack mask = /obj/item/clothing/mask/breath r_pocket = /obj/item/tank/internals/emergency_oxygen/engi - internals_slot = SLOT_R_STORE + internals_slot = ITEM_SLOT_RPOCKET /obj/effect/mob_spawn/human/syndicatesoldier/coldres/alive/female mob_gender = FEMALE diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index dad5441fa7..45fad55f1a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -3391,10 +3391,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/occupied_slots = L[initial(G.category)] ? L[initial(G.category)] + 1 : 1 LAZYSET(L, initial(G.category), occupied_slots) switch(slot) - if(SLOT_IN_BACKPACK) + if(ITEM_SLOT_BACKPACK) if(L[LOADOUT_CATEGORY_BACKPACK] < BACKPACK_SLOT_AMT) return TRUE - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) if(L[LOADOUT_CATEGORY_HANDS] < HANDS_SLOT_AMT) return TRUE else diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 008772663d..697afd4885 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -63,8 +63,8 @@ // it's TRAIT_NODROP D.dropItemToGround(target, TRUE) qdel(old_headgear) - // where is `SLOT_HEAD` defined? WHO KNOWS - D.equip_to_slot(new_headgear, SLOT_HEAD) + // where is `ITEM_SLOT_HEAD` defined? WHO KNOWS + D.equip_to_slot(new_headgear, ITEM_SLOT_HEAD) return 1 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 1a7c220550..572cce28b2 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -219,7 +219,7 @@ ..() if (!istype(user)) return - if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item? + if(slot_flags & slot) //Was equipped to a valid slot for this item? if(iscarbon(user) && LAZYLEN(zones_disabled)) RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/bristle) if(LAZYLEN(user_vars_to_edit)) @@ -450,7 +450,7 @@ BLIND // can't see anything return FALSE // Skip species restriction checks on non-equipment slots - if(slot in list(SLOT_IN_BACKPACK, SLOT_L_STORE, SLOT_R_STORE)) + if(slot in list(ITEM_SLOT_BACKPACK, ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET)) return TRUE if(species_restricted && ishuman(M)) diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index cc36d2b02e..2e9cd678c6 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -20,7 +20,7 @@ /obj/item/clothing/ears/earmuffs/ComponentInitialize() . = ..() AddElement(/datum/element/earhealing) - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS_LEFT, SLOT_EARS_RIGHT)) //skyrat edit + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS_LEFT, ITEM_SLOT_EARS_RIGHT)) /obj/item/clothing/ears/headphones name = "headphones" diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 737bbbb522..9726ab6b59 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -115,7 +115,7 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) /obj/item/clothing/glasses/science/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_GLASSES) + if(slot == ITEM_SLOT_EYES) return 1 /obj/item/clothing/glasses/night @@ -158,7 +158,7 @@ /obj/item/clothing/glasses/eyepatch/syndicate/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot == SLOT_GLASSES) + if(slot == ITEM_SLOT_EYES) user.visible_message("Circuitry from the eyepatch links itself to your brain as you put on the eyepatch.") if(HAS_TRAIT(user, TRAIT_POOR_AIM)) user.visible_message("You hear a fizzing noise from the circuit. That can't be good.") @@ -351,7 +351,7 @@ /obj/item/clothing/glasses/sunglasses/blindfold/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot == SLOT_GLASSES) + if(slot == ITEM_SLOT_EYES) user.become_blind("blindfold_[REF(src)]") /obj/item/clothing/glasses/sunglasses/blindfold/dropped(mob/living/carbon/human/user) @@ -372,7 +372,7 @@ var/colored_before = FALSE /obj/item/clothing/glasses/sunglasses/blindfold/white/equipped(mob/living/carbon/human/user, slot) - if(ishuman(user) && slot == SLOT_GLASSES) + if(ishuman(user) && slot == ITEM_SLOT_EYES) update_icon(user) user.update_inv_glasses() //Color might have been changed by update_icon. ..() diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index cad91315a3..c848dbdfa8 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -18,7 +18,7 @@ /obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot) ..() - if(hud_type && slot == SLOT_GLASSES) + if(hud_type && slot == ITEM_SLOT_EYES) var/datum/atom_hud/H = GLOB.huds[hud_type] H.add_hud_to(user) diff --git a/code/modules/clothing/glasses/phantomthief.dm b/code/modules/clothing/glasses/phantomthief.dm index ba3ea2830e..db77f17218 100644 --- a/code/modules/clothing/glasses/phantomthief.dm +++ b/code/modules/clothing/glasses/phantomthief.dm @@ -17,7 +17,7 @@ /obj/item/clothing/glasses/phantomthief/syndicate/examine(mob/user) . = ..() - if(user.get_item_by_slot(SLOT_GLASSES) == src) + if(user.get_item_by_slot(ITEM_SLOT_EYES) == src) if(world.time >= nextadrenalinepop) . += "The built-in adrenaline injector is ready for use." else @@ -33,7 +33,7 @@ . = ..() if(!istype(user)) return - if(slot != SLOT_GLASSES) + if(slot != ITEM_SLOT_EYES) return RegisterSignal(user, COMSIG_LIVING_COMBAT_ENABLED, .proc/injectadrenaline) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 836b845faa..1e3f2c08cf 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -31,7 +31,7 @@ C.visible_message("[U] sprays glittery rubber on the hands of [C]!") else user.visible_message("The rubber fails to stick to [C]'s hands!", - "The rubber fails to stick to [C]'s [(SLOT_GLOVES in C.check_obscured_slots()) ? "unexposed" : ""] hands!") + "The rubber fails to stick to [C]'s [(ITEM_SLOT_GLOVES in C.check_obscured_slots()) ? "unexposed" : ""] hands!") qdel(src) @@ -226,7 +226,7 @@ /obj/item/clothing/gloves/color/latex/equipped(mob/user, slot) ..() - if(slot == SLOT_GLOVES) + if(slot == ITEM_SLOT_GLOVES) ADD_TRAIT(user, carrytrait, GLOVE_TRAIT) /obj/item/clothing/gloves/color/latex/dropped(mob/user) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 225ef867b0..4eee7cef02 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -9,6 +9,8 @@ equip_delay_other = 20 cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT strip_mod = 0.9 custom_price = PRICE_ALMOST_CHEAP @@ -36,7 +38,7 @@ /obj/item/clothing/gloves/fingerless/pugilist/equipped(mob/user, slot) . = ..() - if(slot == SLOT_GLOVES) + if(slot == ITEM_SLOT_GLOVES) wornonce = TRUE if((HAS_TRAIT(user, TRAIT_NOPUGILIST))) to_chat(user, "What purpose is there to don the weapons of pugilism if you're already well-practiced in martial arts? Mixing arts is blasphemous!") @@ -195,7 +197,7 @@ /obj/item/clothing/gloves/fingerless/ablative/equipped(mob/user, slot) . = ..() - if(current_equipped_slot == SLOT_GLOVES) + if(current_equipped_slot == ITEM_SLOT_GLOVES) RegisterSignal(user, COMSIG_LIVING_ACTIVE_PARRY_START, .proc/get_component_parry_data) wornonce = TRUE @@ -262,7 +264,7 @@ /obj/item/clothing/gloves/fingerless/pugilist/mauler/equipped(mob/user, slot) . = ..() - if(slot == SLOT_GLOVES) + if(slot == ITEM_SLOT_GLOVES) wornonce = TRUE if((HAS_TRAIT(user, TRAIT_NOPUGILIST))) return @@ -352,6 +354,8 @@ transfer_prints = TRUE cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT strip_mod = 0.9 /obj/item/clothing/gloves/evening/black diff --git a/code/modules/clothing/gloves/mittens.dm b/code/modules/clothing/gloves/mittens.dm index 42250aae2f..b1b17c9afe 100644 --- a/code/modules/clothing/gloves/mittens.dm +++ b/code/modules/clothing/gloves/mittens.dm @@ -6,6 +6,8 @@ //item_color = "white" cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT resistance_flags = NONE /obj/item/clothing/gloves/mittens/random diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index 39d39ba58f..754a72ff0c 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -6,6 +6,8 @@ transfer_prints = TRUE cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + heat_protection = HANDS + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT resistance_flags = NONE //custom_premium_price = PRICE_EXPENSIVE /// For storing our tackler datum so we can remove it after @@ -28,7 +30,7 @@ if(!ishuman(user)) return switch(slot) // I didn't like how it looked - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) var/mob/living/carbon/human/H = user tackler = H.AddComponent(/datum/component/tackler, stamina_cost=tackle_stam_cost, base_knockdown = base_knockdown, range = tackle_range, speed = tackle_speed, skill_mod = skill_mod, min_distance = min_distance) else @@ -103,7 +105,7 @@ /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/equipped(mob/user, slot) . = ..() - if(slot == SLOT_GLOVES) + if(slot == ITEM_SLOT_GLOVES) ADD_TRAIT(user, carrytrait, GLOVE_TRAIT) /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/dropped(mob/user) diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 6ad3a19694..ea58d0bc88 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -34,7 +34,7 @@ var/obj/item/WH = H.head H.visible_message("[src] bounces off [H]'s [WH.name]!", "[src] bounces off your [WH.name], falling to the floor.") return - if(H.equip_to_slot_if_possible(src, SLOT_HEAD, FALSE, TRUE)) + if(H.equip_to_slot_if_possible(src, ITEM_SLOT_HEAD, FALSE, TRUE)) H.visible_message("[src] lands neatly on [H]'s head!", "[src] lands perfectly onto your head!") return if(iscyborg(hit_atom)) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 6b698f9619..126b1af40f 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -27,7 +27,7 @@ /obj/item/clothing/head/helmet/ComponentInitialize() . = ..() - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_HEAD)) + AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_HEAD)) /obj/item/clothing/head/helmet/examine(mob/user) . = ..() diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 5af694ea1b..592614af61 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -220,7 +220,7 @@ /obj/item/clothing/head/warden/drill/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 76e8ca53df..eb48048c00 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -264,7 +264,8 @@ item_state = "that" cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - + heat_protection = HEAD + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT dog_fashion = /datum/dog_fashion/head/santa beepsky_fashion = /datum/beepsky_fashion/santa @@ -354,7 +355,7 @@ /obj/item/clothing/head/frenchberet/equipped(mob/M, slot) . = ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 247062581d..21cec4f7d2 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -93,6 +93,8 @@ var/earflaps = TRUE cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + heat_protection = HEAD + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT ///Sprite visible when the ushanka flaps are folded up. var/upsprite = "ushankaup" ///Sprite visible when the ushanka flaps are folded down. @@ -147,7 +149,7 @@ beepsky_fashion = /datum/beepsky_fashion/cat /obj/item/clothing/head/kitty/equipped(mob/living/carbon/human/user, slot) - if(ishuman(user) && slot == SLOT_HEAD) + if(ishuman(user) && slot == ITEM_SLOT_HEAD) update_icon(user) user.update_inv_head() //Color might have been changed by update_icon. ..() @@ -186,7 +188,7 @@ /obj/item/clothing/head/cardborg/equipped(mob/living/user, slot) ..() - if(ishuman(user) && slot == SLOT_HEAD) + if(ishuman(user) && slot == ITEM_SLOT_HEAD) var/mob/living/carbon/human/H = user if(istype(H.wear_suit, /obj/item/clothing/suit/cardborg)) var/obj/item/clothing/suit/cardborg/CB = H.wear_suit @@ -265,7 +267,7 @@ /obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot != SLOT_HEAD || warped) + if(slot != ITEM_SLOT_HEAD || warped) return if(paranoia) QDEL_NULL(paranoia) @@ -295,7 +297,7 @@ if(!isliving(loc) || !paranoia) return var/mob/living/target = loc - if(target.get_item_by_slot(SLOT_HEAD) != src) + if(target.get_item_by_slot(ITEM_SLOT_HEAD) != src) return QDEL_NULL(paranoia) if(!target.IsUnconscious()) diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index ef7c6a1926..cca13ce1d8 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -18,7 +18,7 @@ /obj/item/clothing/mask/equipped(mob/M, slot) . = ..() - if (slot == SLOT_WEAR_MASK && modifies_speech) + if (slot == ITEM_SLOT_MASK && modifies_speech) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) else UnregisterSignal(M, COMSIG_MOB_SAY) diff --git a/code/modules/clothing/masks/cluwne.dm b/code/modules/clothing/masks/cluwne.dm index a1177e2b47..f39f5e73b8 100644 --- a/code/modules/clothing/masks/cluwne.dm +++ b/code/modules/clothing/masks/cluwne.dm @@ -55,7 +55,7 @@ . = ..() if(!ishuman(user)) return - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) var/mob/living/carbon/human/H = user H.dna.add_mutation(CLUWNEMUT) return @@ -88,7 +88,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) if(is_cursed && can_cluwne) //logic predetermined log_admin("[key_name(H)] was made into a cluwne by [src]") message_admins("[key_name(H)] got cluwned by [src]") diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index e6a0425920..45da6a9a75 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -290,7 +290,7 @@ . = ..() if(iscarbon(user)) var/mob/living/carbon/C = user - if((C.get_item_by_slot(SLOT_HEAD == src)) || (C.get_item_by_slot(SLOT_WEAR_MASK) == src)) + if((C.get_item_by_slot(ITEM_SLOT_HEAD == src)) || (C.get_item_by_slot(ITEM_SLOT_MASK) == src)) to_chat(user, "You can't tie [src] while wearing it!") return if(slot_flags & ITEM_SLOT_HEAD) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 28a3343ae6..1f40df0f57 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -226,7 +226,7 @@ return /obj/item/clothing/neck/petcollar/locked/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - if(loc == user && user.get_item_by_slot(SLOT_NECK) && lock != FALSE) + if(loc == user && user.get_item_by_slot(ITEM_SLOT_NECK) && lock != FALSE) to_chat(user, "The collar is locked! You'll need unlock the collar before you can take it off!") return ..() @@ -323,7 +323,7 @@ . = ..() if(iscarbon(user)) var/mob/living/carbon/C = user - if(C.get_item_by_slot(SLOT_NECK) == src) + if(C.get_item_by_slot(ITEM_SLOT_NECK) == src) to_chat(user, "You can't untie [src] while wearing it!") return if(user.is_holding(src)) diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index ac852a35a8..99fc5d1359 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -36,7 +36,7 @@ . = ..() var/key = H.key ? H.key : preference_source ? preference_source.key : null var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, key, 80) - H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(U, ITEM_SLOT_BACKPACK) var/obj/item/implant/weapons_auth/W = new W.implant(H) var/obj/item/implant/explosive/E = new diff --git a/code/modules/clothing/outfits/vv_outfit.dm b/code/modules/clothing/outfits/vv_outfit.dm index 0daf2b39aa..23cd6e8d2d 100644 --- a/code/modules/clothing/outfits/vv_outfit.dm +++ b/code/modules/clothing/outfits/vv_outfit.dm @@ -10,47 +10,47 @@ /datum/outfit/varedit/proc/set_equipement_by_slot(slot,item_path) switch(slot) - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) uniform = item_path - if(SLOT_BACK) + if(ITEM_SLOT_BACK) back = item_path - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) suit = item_path - if(SLOT_BELT) + if(ITEM_SLOT_BELT) belt = item_path - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) gloves = item_path - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) shoes = item_path - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) head = item_path - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) mask = item_path - if(SLOT_NECK) + if(ITEM_SLOT_NECK) neck = item_path - //skyrat edit - if(SLOT_EARS_LEFT) + // Sandstorm edit + if(ITEM_SLOT_EARS_LEFT) ears = item_path - if(SLOT_EARS_RIGHT) + if(ITEM_SLOT_EARS_RIGHT) ears_extra = item_path - if(SLOT_WRISTS) + if(ITEM_SLOT_WRISTS) wrists = item_path - if(SLOT_W_SHIRT) + if(ITEM_SLOT_SHIRT) shirt = item_path - if(SLOT_W_UNDERWEAR) + if(ITEM_SLOT_UNDERWEAR) underwear = item_path - if(SLOT_W_SOCKS) + if(ITEM_SLOT_SOCKS) socks = item_path // - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) glasses = item_path - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) id = item_path - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) suit_store = item_path - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) l_pocket = item_path - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) r_pocket = item_path @@ -80,7 +80,7 @@ //Copy equipment var/list/result = list() - var/list/slots_to_check = list(SLOT_W_UNIFORM,SLOT_W_UNDERWEAR,SLOT_W_SHIRT,SLOT_W_SOCKS,SLOT_BACK,SLOT_WEAR_SUIT,SLOT_BELT,SLOT_GLOVES,SLOT_WRISTS,SLOT_SHOES,SLOT_HEAD,SLOT_WEAR_MASK,SLOT_NECK,SLOT_EARS_LEFT,SLOT_EARS_RIGHT,SLOT_GLASSES,SLOT_WEAR_ID,SLOT_S_STORE,SLOT_L_STORE,SLOT_R_STORE) //skyrat edit + var/list/slots_to_check = list(ITEM_SLOT_ICLOTHING,ITEM_SLOT_UNDERWEAR,ITEM_SLOT_SHIRT,ITEM_SLOT_SOCKS,ITEM_SLOT_BACK,ITEM_SLOT_OCLOTHING,ITEM_SLOT_BELT,ITEM_SLOT_GLOVES,ITEM_SLOT_WRISTS,ITEM_SLOT_FEET,ITEM_SLOT_HEAD,ITEM_SLOT_MASK,ITEM_SLOT_NECK,ITEM_SLOT_EARS_LEFT,ITEM_SLOT_EARS_RIGHT,ITEM_SLOT_EYES,ITEM_SLOT_ID,ITEM_SLOT_SUITSTORE,ITEM_SLOT_LPOCKET,ITEM_SLOT_RPOCKET) // Sandstorm edit for(var/s in slots_to_check) var/obj/item/I = get_item_by_slot(s) var/vedits = collect_vv(I) @@ -91,7 +91,7 @@ //Copy access O.stored_access = list() - var/obj/item/id_slot = get_item_by_slot(SLOT_WEAR_ID) + var/obj/item/id_slot = get_item_by_slot(ITEM_SLOT_ID) if(id_slot) O.stored_access |= id_slot.GetAccess() //Copy hands @@ -110,7 +110,7 @@ result["RHAND"] = vedits O.vv_values = result //Copy backpack contents if exist. - var/obj/item/backpack = get_item_by_slot(SLOT_BACK) + var/obj/item/backpack = get_item_by_slot(ITEM_SLOT_BACK) if(istype(backpack) && SEND_SIGNAL(backpack, COMSIG_CONTAINS_STORAGE)) var/list/bp_stuff = list() var/list/typecounts = list() @@ -148,7 +148,7 @@ for(var/vname in edits) I.vv_edit_var(vname,edits[vname]) //Apply access - var/obj/item/id_slot = H.get_item_by_slot(SLOT_WEAR_ID) + var/obj/item/id_slot = H.get_item_by_slot(ITEM_SLOT_ID) if(id_slot) var/obj/item/card/id/card = id_slot.GetID() if(istype(card)) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index c98824fa7f..d8ac875df5 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -87,7 +87,7 @@ /obj/item/clothing/shoes/equipped(mob/user, slot) . = ..() - if(offset && slot_flags & slotdefine2slotbit(slot)) + if(offset && (slot_flags & slot)) user.pixel_y += offset worn_y_dimension -= (offset * 2) user.update_inv_shoes() diff --git a/code/modules/clothing/shoes/cluwne.dm b/code/modules/clothing/shoes/cluwne.dm index fbe1ba624b..aec57a2148 100644 --- a/code/modules/clothing/shoes/cluwne.dm +++ b/code/modules/clothing/shoes/cluwne.dm @@ -23,7 +23,7 @@ . = ..() if(!ishuman(user)) return - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) var/mob/living/carbon/human/H = user H.dna.add_mutation(CLUWNEMUT) return diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 773b1ac361..cd01d6f099 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -96,7 +96,7 @@ /obj/item/clothing/shoes/magboots/crushing/equipped(mob/user,slot) . = ..() - if (slot == SLOT_SHOES && magpulse) + if (slot == ITEM_SLOT_FEET && magpulse) RegisterSignal(user, COMSIG_MOVABLE_MOVED,.proc/crush) /obj/item/clothing/shoes/magboots/crushing/dropped(mob/user) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 669ffa1780..7a67308760 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -28,7 +28,7 @@ /obj/item/clothing/shoes/combat/sneakboots/equipped(mob/user, slot) . = ..() - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) ADD_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT) /obj/item/clothing/shoes/combat/sneakboots/dropped(mob/user) @@ -112,7 +112,7 @@ /obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot) . = ..() - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) if(enabled_waddle) waddle = user.AddComponent(/datum/component/waddling) if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY)) @@ -340,7 +340,7 @@ /obj/item/clothing/shoes/wheelys/ui_action_click(mob/user, action) if(!isliving(user)) return - if(!istype(user.get_item_by_slot(SLOT_SHOES), /obj/item/clothing/shoes/wheelys)) + if(!istype(user.get_item_by_slot(ITEM_SLOT_FEET), /obj/item/clothing/shoes/wheelys)) to_chat(user, "You must be wearing the wheely-heels to use them!") return if(!(W.is_occupant(user))) @@ -460,7 +460,7 @@ /obj/item/clothing/shoes/wallwalkers/equipped(mob/user,slot) . = ..() - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) RegisterSignal(user, COMSIG_MOB_CLIENT_MOVE,.proc/intercept_user_move) /obj/item/clothing/shoes/wallwalkers/dropped(mob/user) diff --git a/code/modules/clothing/shoes/taeclowndo.dm b/code/modules/clothing/shoes/taeclowndo.dm index c0f8a77543..82f467d8b1 100644 --- a/code/modules/clothing/shoes/taeclowndo.dm +++ b/code/modules/clothing/shoes/taeclowndo.dm @@ -15,7 +15,7 @@ var/mob/living/carbon/human/H = user if(!(HAS_TRAIT(H, TRAIT_CLUMSY)) && !(H.mind && HAS_TRAIT(H.mind, TRAIT_CLOWN_MENTALITY))) return - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) spells = new for(var/spell in spelltypes) var/obj/effect/proc_holder/spell/S = new spell @@ -29,7 +29,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(H.get_item_by_slot(SLOT_SHOES) == src) + if(H.get_item_by_slot(ITEM_SLOT_FEET) == src) for(var/spell in spells) var/obj/effect/proc_holder/spell/S = spell H.mind.spell_list.Remove(S) diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 6642731d8b..e30b0953c6 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -107,7 +107,7 @@ teleport_now.UpdateButtonIcon() - var/list/nonsafe_slots = list(SLOT_BELT, SLOT_BACK) + var/list/nonsafe_slots = list(ITEM_SLOT_BELT, ITEM_SLOT_BACK) var/list/exposed = list() for(var/slot in nonsafe_slots) var/obj/item/slot_item = user.get_item_by_slot(slot) diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 18138bf4b6..d8a6426295 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -50,12 +50,12 @@ soundloop.stop(user) /obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_HEAD) + if(slot == ITEM_SLOT_HEAD) return 1 /obj/item/clothing/head/helmet/space/hardsuit/equipped(mob/user, slot) ..() - if(slot != SLOT_HEAD) + if(slot != ITEM_SLOT_HEAD) if(suit) suit.RemoveHelmet() soundloop.stop(user) @@ -118,7 +118,7 @@ if(jetpack) to_chat(user, "[src] already has a jetpack installed.") return - if(src == user.get_item_by_slot(SLOT_WEAR_SUIT)) //Make sure the player is not wearing the suit before applying the upgrade. + if(src == user.get_item_by_slot(ITEM_SLOT_OCLOTHING)) //Make sure the player is not wearing the suit before applying the upgrade. to_chat(user, "You cannot install the upgrade to [src] while wearing it.") return @@ -130,7 +130,7 @@ if(!jetpack) to_chat(user, "[src] has no jetpack installed.") return - if(src == user.get_item_by_slot(SLOT_WEAR_SUIT)) + if(src == user.get_item_by_slot(ITEM_SLOT_OCLOTHING)) to_chat(user, "You cannot remove the jetpack from [src] while wearing it.") return @@ -145,7 +145,7 @@ /obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) ..() if(jetpack) - if(slot == SLOT_WEAR_SUIT) + if(slot == ITEM_SLOT_OCLOTHING) for(var/X in jetpack.actions) var/datum/action/A = X A.Grant(user) @@ -158,7 +158,7 @@ A.Remove(user) /obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. + if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. return 1 //Engineering @@ -488,7 +488,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/medical/equipped(mob/living/carbon/human/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] DHUD.add_hud_to(user) @@ -528,7 +528,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/rd/equipped(mob/living/carbon/human/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] DHUD.add_hud_to(user) @@ -702,7 +702,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/equipped(mob/living/carbon/human/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] DHUD.add_hud_to(user) ADD_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "mason_hardsuit") @@ -726,7 +726,7 @@ /obj/item/clothing/suit/space/hardsuit/ancient/equipped(mob/user, slot) . = ..() - if(slot != SLOT_WEAR_SUIT) + if(slot != ITEM_SLOT_OCLOTHING) if(listeningTo) UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) return diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 513ad94365..57d2ae5c69 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -206,7 +206,7 @@ /obj/item/clothing/suit/cardborg/equipped(mob/living/user, slot) ..() - if(slot == SLOT_WEAR_SUIT) + if(slot == ITEM_SLOT_OCLOTHING) disguise(user) /obj/item/clothing/suit/cardborg/dropped(mob/living/user) @@ -279,7 +279,9 @@ item_state = "labcoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS|FEET cold_protection = CHEST|GROIN|ARMS + heat_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Space carp like space, so you should too + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/gun/ballistic/automatic/speargun, /obj/item/staff/bostaff) hoodtype = /obj/item/clothing/head/hooded/carp_hood @@ -289,7 +291,9 @@ icon_state = "carp_casual" body_parts_covered = HEAD cold_protection = HEAD + heat_protection = HEAD min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS /obj/item/clothing/suit/hooded/ian_costume //It's Ian, rub his bell- oh god what happened to his inside parts? @@ -362,7 +366,10 @@ item_state = "ran_suit" body_parts_covered = CHEST|GROIN|LEGS flags_inv = HIDEJUMPSUIT|HIDETAUR - heat_protection = CHEST|GROIN|LEGS //fluffy tails! + cold_protection = CHEST|GROIN|LEGS //fluffy tails! + min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT //Bleh, same as winter coat + heat_protection = CHEST|GROIN|LEGS + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/head/ran @@ -419,7 +426,9 @@ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/radio) body_parts_covered = CHEST|ARMS cold_protection = CHEST|GROIN|ARMS + heat_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/suit/jacket/flannel @@ -520,6 +529,7 @@ icon_state = "leathercoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS cold_protection = CHEST|GROIN|ARMS|LEGS + heat_protection = CHEST|GROIN|ARMS|LEGS mutantrace_variation = STYLE_DIGITIGRADE /obj/item/clothing/suit/jacket/puffer @@ -537,6 +547,7 @@ item_state = "armor" body_parts_covered = CHEST|GROIN cold_protection = CHEST|GROIN + heat_protection = CHEST|GROIN armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0) /obj/item/clothing/suit/jacket/miljacket @@ -655,7 +666,9 @@ item_state = "coatwinter" body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS + heat_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON @@ -666,7 +679,9 @@ icon_state = "winterhood" body_parts_covered = HEAD cold_protection = HEAD + heat_protection = HEAD min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT + max_heat_protection_temperature = COAT_MAX_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS rad_flags = RAD_NO_CONTAMINATE @@ -1012,7 +1027,7 @@ /obj/item/clothing/suit/hooded/wintercoat/ratvar/equipped(mob/living/user,slot) ..() - if (slot != SLOT_WEAR_SUIT || !real) + if (slot != ITEM_SLOT_OCLOTHING || !real) return if (is_servant_of_ratvar(user)) return @@ -1034,7 +1049,7 @@ /obj/item/clothing/suit/hooded/wintercoat/narsie/equipped(mob/living/user,slot) ..() - if (slot != SLOT_WEAR_SUIT || !real) + if (slot != ITEM_SLOT_OCLOTHING || !real) return if (iscultist(user)) return diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 98fb836c38..608aca2aad 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -51,7 +51,7 @@ icon_state = "reactiveoff" item_state = "reactiveoff" add_fingerprint(user) - if(user.get_item_by_slot(SLOT_WEAR_SUIT) == src) + if(user.get_item_by_slot(ITEM_SLOT_OCLOTHING) == src) user.update_inv_wear_suit() /obj/item/clothing/suit/armor/reactive/emp_act(severity) @@ -177,7 +177,7 @@ /obj/item/clothing/suit/armor/reactive/tesla/equipped(mob/user, slot) ..() - if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item? + if(slot_flags & slot) //Was equipped to a valid slot for this item? ADD_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "reactive_tesla_armor") /obj/item/clothing/suit/armor/reactive/tesla/block_action(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 78708f54bb..5ee247e135 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -31,11 +31,11 @@ ToggleHood() /obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_WEAR_SUIT || slot == SLOT_NECK) + if(slot == ITEM_SLOT_OCLOTHING || slot == ITEM_SLOT_NECK) return 1 /obj/item/clothing/suit/hooded/equipped(mob/user, slot) - if(slot != SLOT_WEAR_SUIT && slot != SLOT_NECK) + if(slot != ITEM_SLOT_OCLOTHING && slot != ITEM_SLOT_NECK) RemoveHood() ..() @@ -80,7 +80,7 @@ if(H.head) to_chat(H, "You're already wearing something on your head!") return - else if(H.equip_to_slot_if_possible(hood,SLOT_HEAD,0,0,1)) + else if(H.equip_to_slot_if_possible(hood,ITEM_SLOT_HEAD,0,0,1)) suittoggled = TRUE update_icon() H.update_inv_wear_suit() @@ -102,7 +102,7 @@ /obj/item/clothing/head/hooded/equipped(mob/user, slot) ..() - if(slot != SLOT_HEAD) + if(slot != ITEM_SLOT_HEAD) if(suit) suit.RemoveHood() else @@ -177,7 +177,7 @@ /obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) if(!helmettype) return - if(slot != SLOT_WEAR_SUIT) + if(slot != ITEM_SLOT_OCLOTHING) RemoveHelmet() ..() @@ -222,7 +222,7 @@ if(message) to_chat(H, "You're already wearing something on your head!") return - else if(H.equip_to_slot_if_possible(helmet,SLOT_HEAD,0,0,1)) + else if(H.equip_to_slot_if_possible(helmet,ITEM_SLOT_HEAD,0,0,1)) if(message) to_chat(H, "You engage the helmet on the hardsuit.") suittoggled = TRUE diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 977e916f87..5b131749b8 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -167,7 +167,7 @@ actions_types = list(/datum/action/item_action/stickmen) /obj/item/clothing/suit/wizrobe/paper/item_action_slot_check(slot, mob/user, datum/action/A) - if(A.type == /datum/action/item_action/stickmen && slot != SLOT_WEAR_SUIT) + if(A.type == /datum/action/item_action/stickmen && slot != ITEM_SLOT_OCLOTHING) return FALSE return ..() diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 7cd12fddb7..681f474403 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -117,24 +117,24 @@ if(!alt_covers_chest) body_parts_covered |= CHEST - //SKYRAT EDIT + // Sandstorm edit for(var/obj/item/clothing/accessory/attached_accessory in attached_accessories) - if(attached_accessory && slot != SLOT_HANDS && ishuman(user)) + if(attached_accessory && slot != ITEM_SLOT_HANDS && ishuman(user)) var/mob/living/carbon/human/H = user attached_accessory.on_uniform_equip(src, user) if(attached_accessory.above_suit) H.update_inv_wear_suit() - //SKYRAT EDIT END + // /obj/item/clothing/under/dropped(mob/user) - //SKYRAT EDIT + // Sandstorm edit for(var/obj/item/clothing/accessory/attached_accessory in attached_accessories) attached_accessory.on_uniform_dropped(src, user) if(ishuman(user)) var/mob/living/carbon/human/H = user if(attached_accessory.above_suit) H.update_inv_wear_suit() - //SKYRAT EDIT END + // ..() /obj/item/clothing/under/proc/attach_accessory(obj/item/I, mob/user, notifyAttach = 1) diff --git a/code/modules/clothing/under/cluwne.dm b/code/modules/clothing/under/cluwne.dm index 5a908c5663..e1af4b5171 100644 --- a/code/modules/clothing/under/cluwne.dm +++ b/code/modules/clothing/under/cluwne.dm @@ -16,7 +16,7 @@ /obj/item/clothing/under/cluwne/equipped(mob/living/carbon/user, slot) if(!ishuman(user)) return - if(slot == SLOT_W_UNIFORM) + if(slot == ITEM_SLOT_ICLOTHING) var/mob/living/carbon/human/H = user H.dna.add_mutation(CLUWNEMUT) return ..() diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 824f026e8c..06d2771d88 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -17,7 +17,7 @@ if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.equip_to_slot_or_del(new C(H), SLOT_W_UNIFORM) //or else you end up with naked assistants running around everywhere... + H.equip_to_slot_or_del(new C(H), ITEM_SLOT_ICLOTHING) //or else you end up with naked assistants running around everywhere... else new C(loc) return INITIALIZE_HINT_QDEL @@ -30,7 +30,7 @@ var/obj/item/clothing/under/color/jumpskirt/C = pick(subtypesof(/obj/item/clothing/under/color/jumpskirt) - /obj/item/clothing/under/color/jumpskirt/random) if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.equip_to_slot_or_del(new C(H), SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new C(H), ITEM_SLOT_ICLOTHING) else new C(loc) return INITIALIZE_HINT_QDEL diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index 2f0b9c68f8..061de0ea7c 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -18,23 +18,23 @@ switch(item_set) if("wizardmimic") - loadout[SLOT_WEAR_SUIT] = /obj/item/clothing/suit/wizrobe - loadout[SLOT_SHOES] = /obj/item/clothing/shoes/sandal/magic - loadout[SLOT_HEAD] = /obj/item/clothing/head/wizard + loadout[ITEM_SLOT_OCLOTHING] = /obj/item/clothing/suit/wizrobe + loadout[ITEM_SLOT_FEET] = /obj/item/clothing/shoes/sandal/magic + loadout[ITEM_SLOT_HEAD] = /obj/item/clothing/head/wizard ruins_spaceworthiness = 1 if("swords") - loadout[SLOT_HANDS] = /obj/item/katana/cursed + loadout[ITEM_SLOT_HANDS] = /obj/item/katana/cursed if("bigfatdoobie") - loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/cigarette/rollie/trippy + loadout[ITEM_SLOT_MASK] = /obj/item/clothing/mask/cigarette/rollie/trippy ruins_spaceworthiness = 1 if("boxing") - loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/luchador - loadout[SLOT_GLOVES] = /obj/item/clothing/gloves/boxing + loadout[ITEM_SLOT_MASK] = /obj/item/clothing/mask/luchador + loadout[ITEM_SLOT_GLOVES] = /obj/item/clothing/gloves/boxing ruins_spaceworthiness = 1 if("voicemodulators") - loadout[SLOT_WEAR_MASK] = /obj/item/clothing/mask/chameleon + loadout[ITEM_SLOT_MASK] = /obj/item/clothing/mask/chameleon if("catgirls2015") - loadout[SLOT_HEAD] = /obj/item/clothing/head/kitty + loadout[ITEM_SLOT_HEAD] = /obj/item/clothing/head/kitty ruins_spaceworthiness = 1 ruins_wizard_loadout = 1 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 612df6cbaa..7354eb70d4 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -740,7 +740,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( if(close_other) //increase the odds for(var/i in 1 to 5) message_pool.Add("You feel a tiny prick!") - var/obj/item/storage/equipped_backpack = other.get_item_by_slot(SLOT_BACK) + var/obj/item/storage/equipped_backpack = other.get_item_by_slot(ITEM_SLOT_BACK) if(istype(equipped_backpack)) for(var/i in 1 to 5) //increase the odds message_pool.Add("[other] puts the [pick(\ diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index f650a935ea..1c151511af 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -35,7 +35,7 @@ //If they have a hat/helmet and the user is targeting their head. if(affecting == BODY_ZONE_HEAD) - var/obj/item/I = target.get_item_by_slot(SLOT_HEAD) + var/obj/item/I = target.get_item_by_slot(ITEM_SLOT_HEAD) if(I) headarmor = I.armor.melee diff --git a/code/modules/holiday/dynamic.dm b/code/modules/holiday/dynamic.dm new file mode 100644 index 0000000000..fb50ea72ca --- /dev/null +++ b/code/modules/holiday/dynamic.dm @@ -0,0 +1,10 @@ +/datum/holiday/dynamic + name = "Dynamic Day" + +/datum/holiday/dynamic/shouldCelebrate(dd, mm, yy, ww, ddd) + var/list/days = CONFIG_GET(keyed_list/dynamic_mode_days) + return ddd in days + +/datum/holiday/dynamic/celebrate() + GLOB.dynamic_forced_threat_level = rand(90, 100) + CONFIG_SET(string/force_gamemode, "dynamic") // prevents the round vote, which prevents extended diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index c20b99d684..33503e11a6 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -432,7 +432,7 @@ var/obj/item/W = C.head C.dropItemToGround(W, TRUE) var/jaqc_latern = new /obj/item/clothing/head/hardhat/pumpkinhead/jaqc - C.equip_to_slot(jaqc_latern, SLOT_HEAD, 1, 1) + C.equip_to_slot(jaqc_latern, ITEM_SLOT_HEAD, 1, 1) if(4) visible_message("[src] waves their arms around, \"In your body there's something amiss, you'll find it's a chem made by my sis!\"") jacqrunes("In your body there's something amiss, you'll find it's a chem made by my sis!", C) @@ -449,7 +449,7 @@ var/obj/item/W = H.wear_suit H.dropItemToGround(W, TRUE) var/ghost = new /obj/item/clothing/suit/ghost_sheet/sticky - H.equip_to_slot(ghost, SLOT_WEAR_SUIT, 1, 1) + H.equip_to_slot(ghost, ITEM_SLOT_OCLOTHING, 1, 1) poof() //Blame Fel diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index fb604bbf56..6fc744a497 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -241,7 +241,7 @@ var/satchel = /obj/item/storage/backpack/satchel var/duffelbag = /obj/item/storage/backpack/duffelbag - var/pda_slot = SLOT_BELT + var/pda_slot = ITEM_SLOT_BELT /datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) var/preference_backpack = preference_source?.prefs.backbag diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index de66c32138..82eae55bde 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -40,7 +40,7 @@ satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering box = /obj/item/storage/box/survival/engineer - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) /datum/outfit/job/atmos/rig @@ -49,4 +49,4 @@ mask = /obj/item/clothing/mask/gas suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index a9e891a303..7789e3c614 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -34,7 +34,7 @@ B.icon_state = GLOB.bible_icon_state B.item_state = GLOB.bible_item_state to_chat(H, "There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the Chaplain.") - H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(B, ITEM_SLOT_BACKPACK) var/nrt = GLOB.holy_weapon_type || /obj/item/nullrod var/obj/item/nullrod/N = new nrt(H) H.put_in_hands(N) @@ -108,7 +108,7 @@ GLOB.bible_name = B.name GLOB.deity = B.deity_name - H.equip_to_slot_or_del(B, SLOT_IN_BACKPACK) + H.equip_to_slot_or_del(B, ITEM_SLOT_BACKPACK) SSblackbox.record_feedback("text", "religion_name", 1, "[new_religion]", 1) SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1) diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 804952dbb2..6fbf546e95 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -55,7 +55,7 @@ satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering box = /obj/item/storage/box/survival/engineer - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET chameleon_extras = /obj/item/stamp/ce /datum/outfit/job/ce/rig @@ -68,4 +68,4 @@ glasses = /obj/item/clothing/glasses/meson/engine gloves = /obj/item/clothing/gloves/color/yellow head = null - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 331bad9bfe..b9fc5809e3 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -41,7 +41,7 @@ r_pocket = /obj/item/pinpointer/crew l_pocket = /obj/item/pda/medical backpack_contents = list(/obj/item/roller=1) - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 6c2cb94d13..e70e747ae6 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -63,4 +63,4 @@ mask = /obj/item/clothing/mask/breath suit = /obj/item/clothing/suit/space/hardsuit/rd suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index b44d536cd2..90dacc0482 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -37,4 +37,4 @@ backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/tox - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 0037236202..bc9f9f1a20 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S if(ears) if(H.ears) qdel(H.ears) - H.equip_to_slot_or_del(new ears(H),SLOT_EARS_LEFT) //skyrat edit + H.equip_to_slot_or_del(new ears(H),ITEM_SLOT_EARS_LEFT) // Sandstorm edit var/obj/item/card/id/W = H.wear_id W.access |= dep_access diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 0c04380afe..273f74defa 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -60,7 +60,7 @@ mask = /obj/item/clothing/mask/gas/explorer glasses = /obj/item/clothing/glasses/meson suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE backpack_contents = list( /obj/item/flashlight/seclite=1,\ /obj/item/kitchen/knife/combat/survival=1, diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 25bd2196a0..83b11b22f6 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -43,7 +43,7 @@ satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering box = /obj/item/storage/box/survival/engineer - pda_slot = SLOT_L_STORE + pda_slot = ITEM_SLOT_LPOCKET backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced=1) /datum/outfit/job/engineer/gloved @@ -56,6 +56,6 @@ suit = /obj/item/clothing/suit/space/hardsuit/engine suit_store = /obj/item/tank/internals/oxygen head = null - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 9c503279d4..9eed296851 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -20,7 +20,7 @@ /obj/item/wormhole_jaunter/equipped(mob/user, slot) . = ..() - if(slot == SLOT_BELT) + if(slot == ITEM_SLOT_BELT) RegisterSignal(user, COMSIG_MOVABLE_CHASM_DROP, .proc/chasm_react) /obj/item/wormhole_jaunter/dropped(mob/user) @@ -68,7 +68,7 @@ var/mob/M = loc if(istype(M)) - if(M.get_item_by_slot(SLOT_BELT) == src) + if(M.get_item_by_slot(ITEM_SLOT_BELT) == src) if(prob(severity)) M.visible_message("[src] overloads and activates!") SSblackbox.record_feedback("tally", "jaunter", 1, "EMP") // EMP accidental activation diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 0d46912a5a..0b394e0fc5 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -307,7 +307,7 @@ var/mob/living/carbon/human/active_owner /obj/item/clothing/neck/necklace/memento_mori/item_action_slot_check(slot, mob/user, datum/action/A) - return slot == SLOT_NECK + return slot == ITEM_SLOT_NECK /obj/item/clothing/neck/necklace/memento_mori/dropped(mob/user) ..() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 206f061e4d..9461847ecc 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -182,7 +182,7 @@ held_items[hand_index] = I I.layer = ABOVE_HUD_LAYER I.plane = ABOVE_HUD_PLANE - I.equipped(src, SLOT_HANDS) + I.equipped(src, ITEM_SLOT_HANDS) if(I.pulledby) I.pulledby.stop_pulling() update_inv_hands() @@ -374,21 +374,20 @@ var/slot_priority = W.slot_equipment_priority if(!slot_priority) - //skyrat edit + // Sandstorm edit slot_priority = list( \ - SLOT_BACK, SLOT_WEAR_ID,\ - SLOT_W_UNDERWEAR,\ - SLOT_W_SOCKS,\ - SLOT_W_SHIRT,\ - SLOT_W_UNIFORM,\ - SLOT_WEAR_SUIT,\ - SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\ - SLOT_SHOES, SLOT_WRISTS, SLOT_GLOVES,\ - SLOT_EARS_LEFT, SLOT_EARS_RIGHT,\ - SLOT_GLASSES,\ - SLOT_BELT, SLOT_S_STORE,\ - SLOT_L_STORE, SLOT_R_STORE,\ - SLOT_GENERC_DEXTROUS_STORAGE\ + ITEM_SLOT_BACK, ITEM_SLOT_ID,\ + ITEM_SLOT_UNDERWEAR,\ + ITEM_SLOT_SOCKS,\ + ITEM_SLOT_SHIRT,\ + ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\ + ITEM_SLOT_MASK, ITEM_SLOT_HEAD, ITEM_SLOT_NECK,\ + ITEM_SLOT_FEET, ITEM_SLOT_WRISTS, ITEM_SLOT_GLOVES,\ + ITEM_SLOT_EARS_LEFT, ITEM_SLOT_EARS_RIGHT,\ + ITEM_SLOT_EYES,\ + ITEM_SLOT_BELT, ITEM_SLOT_SUITSTORE,\ + ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET,\ + ITEM_SLOT_DEX_STORAGE\ ) // @@ -431,7 +430,7 @@ if(M.active_storage && M.active_storage.parent && SEND_SIGNAL(M.active_storage.parent, COMSIG_TRY_STORAGE_INSERT, src,M)) return TRUE - var/list/obj/item/possible = list(M.get_inactive_held_item(), M.get_item_by_slot(SLOT_BELT), M.get_item_by_slot(SLOT_GENERC_DEXTROUS_STORAGE), M.get_item_by_slot(SLOT_BACK)) + var/list/obj/item/possible = list(M.get_inactive_held_item(), M.get_item_by_slot(ITEM_SLOT_BELT), M.get_item_by_slot(ITEM_SLOT_DEX_STORAGE), M.get_item_by_slot(ITEM_SLOT_BACK)) for(var/i in possible) if(!i) continue @@ -453,10 +452,10 @@ //used in code for items usable by both carbon and drones, this gives the proper back slot for each mob.(defibrillator, backpack watertank, ...) /mob/proc/getBackSlot() - return SLOT_BACK + return ITEM_SLOT_BACK /mob/proc/getBeltSlot() - return SLOT_BELT + return ITEM_SLOT_BELT diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index ca2946fd8a..7dedf5a739 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -172,7 +172,7 @@ if(target.dropItemToGround(W)) target.visible_message("[src] tears [W] off of [target]'s face!", \ "[src] tears [W] off of [target]'s face!") - target.equip_to_slot_if_possible(src, SLOT_WEAR_MASK, 0, 1, 1) + target.equip_to_slot_if_possible(src, ITEM_SLOT_MASK, 0, 1, 1) return TRUE // time for a smoke /obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M) @@ -259,7 +259,7 @@ return 1 var/mob/living/carbon/C = M - if(ishuman(C) && !(SLOT_WEAR_MASK in C.dna.species.no_equip)) + if(ishuman(C) && !(ITEM_SLOT_MASK in C.dna.species.no_equip)) var/mob/living/carbon/human/H = C if(H.is_mouth_covered(head_only = 1)) return FALSE diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 06dd7ad7c3..80e7b959a8 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -262,7 +262,7 @@ // too soon. var/buckle_cd = 600 if(handcuffed) - var/obj/item/restraints/O = src.get_item_by_slot(SLOT_HANDCUFFED) + var/obj/item/restraints/O = src.get_item_by_slot(ITEM_SLOT_HANDCUFFED) buckle_cd = O.breakouttime MarkResistTime() visible_message("[src] attempts to unbuckle [p_them()]self!", \ @@ -1139,16 +1139,16 @@ /mob/living/carbon/check_obscured_slots() if(head) if(head.flags_inv & HIDEMASK) - LAZYOR(., SLOT_WEAR_MASK) + LAZYOR(., ITEM_SLOT_MASK) if(head.flags_inv & HIDEEYES) - LAZYOR(., SLOT_GLASSES) + LAZYOR(., ITEM_SLOT_EYES) if(head.flags_inv & HIDEEARS) - LAZYOR(., SLOT_EARS_LEFT) - LAZYOR(., SLOT_EARS_RIGHT) + LAZYOR(., ITEM_SLOT_EARS_LEFT) + LAZYOR(., ITEM_SLOT_EARS_RIGHT) if(wear_mask) if(wear_mask.flags_inv & HIDEEYES) - LAZYOR(., SLOT_GLASSES) + LAZYOR(., ITEM_SLOT_EYES) // if any of our bodyparts are bleeding /mob/living/carbon/proc/is_bleeding() diff --git a/code/modules/mob/living/carbon/carbon_stripping.dm b/code/modules/mob/living/carbon/carbon_stripping.dm index 45ff02f0d5..afbd6edaeb 100644 --- a/code/modules/mob/living/carbon/carbon_stripping.dm +++ b/code/modules/mob/living/carbon/carbon_stripping.dm @@ -1,10 +1,10 @@ /datum/strippable_item/mob_item_slot/head key = STRIPPABLE_ITEM_HEAD - item_slot = SLOT_HEAD + item_slot = ITEM_SLOT_HEAD /datum/strippable_item/mob_item_slot/back key = STRIPPABLE_ITEM_BACK - item_slot = SLOT_BACK + item_slot = ITEM_SLOT_BACK /datum/strippable_item/mob_item_slot/back/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -18,15 +18,15 @@ /datum/strippable_item/mob_item_slot/mask key = STRIPPABLE_ITEM_MASK - item_slot = SLOT_WEAR_MASK + item_slot = ITEM_SLOT_MASK /datum/strippable_item/mob_item_slot/neck key = STRIPPABLE_ITEM_NECK - item_slot = SLOT_NECK + item_slot = ITEM_SLOT_NECK /datum/strippable_item/mob_item_slot/handcuffs key = STRIPPABLE_ITEM_HANDCUFFS - item_slot = SLOT_HANDCUFFED + item_slot = ITEM_SLOT_HANDCUFFED /datum/strippable_item/mob_item_slot/handcuffs/should_show(atom/source, mob/user) if (!iscarbon(source)) @@ -41,7 +41,7 @@ /datum/strippable_item/mob_item_slot/legcuffs key = STRIPPABLE_ITEM_LEGCUFFS - item_slot = SLOT_LEGCUFFED + item_slot = ITEM_SLOT_LEGCUFFED /datum/strippable_item/mob_item_slot/legcuffs/should_show(atom/source, mob/user) if (!iscarbon(source)) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 006eda0a48..d1e083f550 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -41,12 +41,12 @@ if(w_shirt && !shirt_hidden) . += "[t_He] [t_is] wearing [w_shirt.get_examine_string(user)]." //Wrist slot because you're epic - if(wrists && !(SLOT_WRISTS in obscured)) + if(wrists && !(ITEM_SLOT_WRISTS in obscured)) . += "[t_He] [t_is] wearing [wrists.get_examine_string(user)]." //End of skyrat changes //uniform - if(w_uniform && !(SLOT_W_UNIFORM in obscured)) + if(w_uniform && !(ITEM_SLOT_ICLOTHING in obscured)) //accessory var/accessory_msg if(istype(w_uniform, /obj/item/clothing/under)) @@ -75,7 +75,7 @@ if(wear_suit && !(wear_suit.obj_flags & EXAMINE_SKIP)) . += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]." //suit/armor storage - if(s_store && !(SLOT_S_STORE in obscured)) + if(s_store && !(ITEM_SLOT_SUITSTORE in obscured)) . += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name]." //back if(back) @@ -87,7 +87,7 @@ . += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))]." //gloves - if(gloves && !(SLOT_GLOVES in obscured)) + if(gloves && !(ITEM_SLOT_GLOVES in obscured)) . += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands." else if(length(blood_DNA)) var/hand_number = get_num_arms(FALSE) @@ -106,18 +106,18 @@ . += "[t_He] [t_has] [belt.get_examine_string(user)] about [t_his] waist." //shoes - if(shoes && !(SLOT_SHOES in obscured)) + if(shoes && !(ITEM_SLOT_FEET in obscured)) . += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] on [t_his] feet." //mask - if(wear_mask && !(SLOT_WEAR_MASK in obscured)) + if(wear_mask && !(ITEM_SLOT_MASK in obscured)) . += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face." - if(wear_neck && !(SLOT_NECK in obscured)) + if(wear_neck && !(ITEM_SLOT_NECK in obscured)) . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck." //eyes - if(!(SLOT_GLASSES in obscured)) + if(!(ITEM_SLOT_EYES in obscured)) if(glasses) . += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes." else if((left_eye_color == BLOODCULT_EYE || right_eye_color == BLOODCULT_EYE) && iscultist(src) && HAS_TRAIT(src, TRAIT_CULT_EYES)) @@ -128,15 +128,15 @@ . += "[t_His] eyes are flickering a bright yellow!" //ears - if(ears && !(SLOT_EARS_LEFT in obscured)) //skyrat edit + if(ears && !(ITEM_SLOT_EARS_LEFT in obscured)) // Sandstorm edit . += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] left ear." - //skyrat edit - extra ear slot haha - if(ears_extra && !(SLOT_EARS_RIGHT in obscured)) + // Sandstorm edit + if(ears_extra && !(ITEM_SLOT_EARS_RIGHT in obscured)) . += "[t_He] [t_has] [ears_extra.get_examine_string(user)] on [t_his] right ear." //wearing two ear items makes you look like an idiot - if((istype(ears, /obj/item/radio/headset) && !(SLOT_EARS_LEFT in obscured)) && (istype(ears_extra, /obj/item/radio/headset) && !(SLOT_EARS_RIGHT in obscured))) + if((istype(ears, /obj/item/radio/headset) && !(ITEM_SLOT_EARS_LEFT in obscured)) && (istype(ears_extra, /obj/item/radio/headset) && !(ITEM_SLOT_EARS_RIGHT in obscured))) . += "[t_He] looks quite tacky wearing both \an [ears.name] and \an [ears_extra.name] on [t_his] head." // diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index abfbb04b0d..5c0d713ef5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -386,23 +386,23 @@ . = ..() if(wear_suit) if(wear_suit.flags_inv & HIDEGLOVES) - LAZYOR(., SLOT_GLOVES) - LAZYOR(., SLOT_WRISTS) + LAZYOR(., ITEM_SLOT_GLOVES) + LAZYOR(., ITEM_SLOT_WRISTS) if(wear_suit.flags_inv & HIDEJUMPSUIT) - LAZYOR(., SLOT_W_UNIFORM) - LAZYOR(., SLOT_W_SHIRT) - LAZYOR(., SLOT_W_UNDERWEAR) + LAZYOR(., ITEM_SLOT_ICLOTHING) + LAZYOR(., ITEM_SLOT_SHIRT) + LAZYOR(., ITEM_SLOT_UNDERWEAR) if(wear_suit.flags_inv & HIDESHOES) - LAZYOR(., SLOT_SHOES) - LAZYOR(., SLOT_W_SOCKS) + LAZYOR(., ITEM_SLOT_FEET) + LAZYOR(., ITEM_SLOT_SOCKS) if(w_uniform) if(underwear_hidden()) - LAZYOR(., SLOT_W_UNDERWEAR) + LAZYOR(., ITEM_SLOT_UNDERWEAR) if(undershirt_hidden()) - LAZYOR(., SLOT_W_SHIRT) + LAZYOR(., ITEM_SLOT_SHIRT) if(shoes) if(socks_hidden()) - LAZYOR(., SLOT_W_SOCKS) + LAZYOR(., ITEM_SLOT_SOCKS) /mob/living/carbon/human/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) if(judgement_criteria & JUDGE_EMAGGED) @@ -968,6 +968,9 @@ . += "[t_He] [t_is] a [spec_trait_examine_font()][dna.custom_species ? dna.custom_species : dna.species.name]" SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .) +/mob/living/carbon/human/chestonly + bodyparts = list(/obj/item/bodypart/chest) + /mob/living/carbon/human/species/abductor race = /datum/species/abductor diff --git a/code/modules/mob/living/carbon/human/human_stripping.dm b/code/modules/mob/living/carbon/human/human_stripping.dm index dc952620ca..b028db5cda 100644 --- a/code/modules/mob/living/carbon/human/human_stripping.dm +++ b/code/modules/mob/living/carbon/human/human_stripping.dm @@ -42,15 +42,15 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/eyes key = STRIPPABLE_ITEM_EYES - item_slot = SLOT_GLASSES + item_slot = ITEM_SLOT_EYES /datum/strippable_item/mob_item_slot/ears key = STRIPPABLE_ITEM_EARS - item_slot = SLOT_EARS_LEFT + item_slot = ITEM_SLOT_EARS_LEFT /datum/strippable_item/mob_item_slot/jumpsuit key = STRIPPABLE_ITEM_JUMPSUIT - item_slot = SLOT_W_UNIFORM + item_slot = ITEM_SLOT_ICLOTHING /datum/strippable_item/mob_item_slot/jumpsuit/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -82,7 +82,7 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/suit key = STRIPPABLE_ITEM_SUIT - item_slot = SLOT_WEAR_SUIT + item_slot = ITEM_SLOT_OCLOTHING /datum/strippable_item/mob_item_slot/suit/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -115,11 +115,11 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/gloves key = STRIPPABLE_ITEM_GLOVES - item_slot = SLOT_GLOVES + item_slot = ITEM_SLOT_GLOVES /datum/strippable_item/mob_item_slot/feet key = STRIPPABLE_ITEM_FEET - item_slot = SLOT_SHOES + item_slot = ITEM_SLOT_FEET /datum/strippable_item/mob_item_slot/feet/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -148,7 +148,7 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/suit_storage key = STRIPPABLE_ITEM_SUIT_STORAGE - item_slot = SLOT_S_STORE + item_slot = ITEM_SLOT_SUITSTORE /datum/strippable_item/mob_item_slot/suit_storage/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -162,11 +162,11 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/id key = STRIPPABLE_ITEM_ID - item_slot = SLOT_WEAR_ID + item_slot = ITEM_SLOT_ID /datum/strippable_item/mob_item_slot/belt key = STRIPPABLE_ITEM_BELT - item_slot = SLOT_BELT + item_slot = ITEM_SLOT_BELT /datum/strippable_item/mob_item_slot/belt/get_alternate_action(atom/source, mob/user) if(..() == FALSE) @@ -219,12 +219,12 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/pocket/left key = STRIPPABLE_ITEM_LPOCKET - item_slot = SLOT_L_STORE + item_slot = ITEM_SLOT_LPOCKET pocket_side = "left" /datum/strippable_item/mob_item_slot/pocket/right key = STRIPPABLE_ITEM_RPOCKET - item_slot = SLOT_R_STORE + item_slot = ITEM_SLOT_RPOCKET pocket_side = "right" /proc/get_strippable_alternate_action_internals(obj/item/item, atom/source) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 1a52097758..ca5f6b135b 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -17,55 +17,55 @@ // Return the item currently in the slot ID /mob/living/carbon/human/get_item_by_slot(slot_id) switch(slot_id) - if(SLOT_BACK) + if(ITEM_SLOT_BACK) return back - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) return wear_mask - if(SLOT_NECK) + if(ITEM_SLOT_NECK) return wear_neck - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) return handcuffed - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) return legcuffed - if(SLOT_BELT) + if(ITEM_SLOT_BELT) return belt - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) return wear_id - if(SLOT_EARS_LEFT) //skyrat edit + if(ITEM_SLOT_EARS_LEFT) // Sandstorm edit return ears - //skyrat edit - if(SLOT_EARS_RIGHT) + // Sandstorm edit + if(ITEM_SLOT_EARS_RIGHT) return ears_extra // - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) return glasses - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) return gloves - //skyrat edit - if(SLOT_WRISTS) + // Sandstorm edit + if(ITEM_SLOT_WRISTS) return wrists // - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) return head - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) return shoes - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) return wear_suit - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) return w_uniform - //skyrat edit - if(SLOT_W_UNDERWEAR) + // Sandstorm edit + if(ITEM_SLOT_UNDERWEAR) return w_underwear - if(SLOT_W_SOCKS) + if(ITEM_SLOT_SOCKS) return w_socks - if(SLOT_W_SHIRT) + if(ITEM_SLOT_SHIRT) return w_shirt // - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) return l_store - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) return r_store - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) return s_store return null @@ -119,22 +119,22 @@ var/not_handled = FALSE //Added in case we make this type path deeper one day switch(slot) - if(SLOT_BELT) + if(ITEM_SLOT_BELT) belt = I update_inv_belt() - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) wear_id = I sec_hud_set_ID() update_inv_wear_id() - //skyrat edit - if(SLOT_EARS_LEFT) + // Sandstorm edit + if(ITEM_SLOT_EARS_LEFT) ears = I update_inv_ears() - if(SLOT_EARS_RIGHT) + if(ITEM_SLOT_EARS_RIGHT) ears_extra = I update_inv_ears_extra() // - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) glasses = I var/obj/item/clothing/glasses/G = I if(G.glass_colour_type) @@ -147,18 +147,18 @@ if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() update_inv_glasses() - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) gloves = I update_inv_gloves() - //skyrat edit - if(SLOT_WRISTS) + // Sandstorm edit + if(ITEM_SLOT_WRISTS) wrists = I update_inv_wrists() // - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) shoes = I update_inv_shoes() - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) wear_suit = I if(I.flags_inv & HIDEJUMPSUIT) update_inv_w_uniform() @@ -166,28 +166,28 @@ stop_pulling() //can't pull if restrained update_action_buttons_icon() //certain action buttons will no longer be usable. update_inv_wear_suit() - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) w_uniform = I update_suit_sensors() update_inv_w_uniform() - //skyrat edit - if(SLOT_W_UNDERWEAR) + // Sandstorm edit + if(ITEM_SLOT_UNDERWEAR) w_underwear = I update_inv_w_underwear() - if(SLOT_W_SOCKS) + if(ITEM_SLOT_SOCKS) w_socks = I update_inv_w_socks() - if(SLOT_W_SHIRT) + if(ITEM_SLOT_SHIRT) w_shirt = I update_inv_w_shirt() // - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) l_store = I update_inv_pockets() - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) r_store = I update_inv_pockets() - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) s_store = I update_inv_s_store() else @@ -362,7 +362,7 @@ if(incapacitated()) return var/obj/item/thing = get_active_held_item() - var/obj/item/equipped_back = get_item_by_slot(SLOT_BACK) + var/obj/item/equipped_back = get_item_by_slot(ITEM_SLOT_BACK) if(!equipped_back) // We also let you equip a backpack like this if(!thing) to_chat(src, "You have no backpack to take something out of!") @@ -393,7 +393,7 @@ if(incapacitated()) return var/obj/item/thing = get_active_held_item() - var/obj/item/equipped_belt = get_item_by_slot(SLOT_BELT) + var/obj/item/equipped_belt = get_item_by_slot(ITEM_SLOT_BELT) if(!equipped_belt) // We also let you equip a belt like this if(!thing) to_chat(src, "You have no belt to take something out of!") diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 0e9d93e568..bad994b1fd 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1281,11 +1281,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/num_legs = H.get_num_legs(FALSE) switch(slot) - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) if(H.get_empty_held_indexes()) return TRUE return FALSE - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) if(H.wear_mask) return FALSE if(!(I.slot_flags & ITEM_SLOT_MASK)) @@ -1293,25 +1293,25 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_NECK) + if(ITEM_SLOT_NECK) if(H.wear_neck) return FALSE if( !(I.slot_flags & ITEM_SLOT_NECK) ) return FALSE return TRUE - if(SLOT_BACK) + if(ITEM_SLOT_BACK) if(H.back) return FALSE if( !(I.slot_flags & ITEM_SLOT_BACK) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) if(H.wear_suit) return FALSE if( !(I.slot_flags & ITEM_SLOT_OCLOTHING) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) if(H.gloves) return FALSE if( !(I.slot_flags & ITEM_SLOT_GLOVES) ) @@ -1319,8 +1319,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(num_arms < 2) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - //skyrat edit - if(SLOT_WRISTS) + // Sandstorm edit + if(ITEM_SLOT_WRISTS) if(H.wrists) return FALSE if( !(I.slot_flags & ITEM_SLOT_WRISTS) ) @@ -1329,7 +1329,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) // - if(SLOT_SHOES) + if(ITEM_SLOT_FEET) if(H.shoes) return FALSE if( !(I.slot_flags & ITEM_SLOT_FEET) ) @@ -1342,7 +1342,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_BELT) + if(ITEM_SLOT_BELT) if(H.belt) return FALSE if(!(I.item_flags & NO_UNIFORM_REQUIRED)) @@ -1354,7 +1354,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!(I.slot_flags & ITEM_SLOT_BELT)) return return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) if(H.glasses) return FALSE if(!(I.slot_flags & ITEM_SLOT_EYES)) @@ -1362,7 +1362,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) if(H.head) return FALSE if(!(I.slot_flags & ITEM_SLOT_HEAD)) @@ -1370,7 +1370,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_EARS_LEFT) //skyrat edit + if(ITEM_SLOT_EARS_LEFT) // Sandstorm edit if(H.ears) return FALSE if(!(I.slot_flags & ITEM_SLOT_EARS)) @@ -1378,8 +1378,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - //skyrat edit - if(SLOT_EARS_RIGHT) + // Sandstorm edit + if(ITEM_SLOT_EARS_RIGHT) if(H.ears_extra) return FALSE if(!(I.slot_flags & ITEM_SLOT_EARS)) @@ -1387,32 +1387,32 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_W_UNDERWEAR) + if(ITEM_SLOT_UNDERWEAR) if(H.w_underwear) return FALSE if( !(I.slot_flags & ITEM_SLOT_UNDERWEAR) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_W_SOCKS) + if(ITEM_SLOT_SOCKS) if(H.w_socks) return FALSE if( !(I.slot_flags & ITEM_SLOT_SOCKS) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_W_SHIRT) + if(ITEM_SLOT_SHIRT) if(H.w_shirt) return FALSE if( !(I.slot_flags & ITEM_SLOT_SHIRT) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) // - if(SLOT_W_UNIFORM) + if(ITEM_SLOT_ICLOTHING) if(H.w_uniform) return FALSE if( !(I.slot_flags & ITEM_SLOT_ICLOTHING) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_WEAR_ID) + if(ITEM_SLOT_ID) if(H.wear_id) return FALSE if(!(I.item_flags & NO_UNIFORM_REQUIRED)) @@ -1424,7 +1424,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if( !(I.slot_flags & ITEM_SLOT_ID) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_L_STORE) + if(ITEM_SLOT_LPOCKET) if(HAS_TRAIT(I, TRAIT_NODROP)) //Pockets aren't visible, so you can't move TRAIT_NODROP items into them. return FALSE if(H.l_store) @@ -1436,11 +1436,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(return_warning) return_warning[1] = "You need a jumpsuit before you can attach this [I.name]!" return FALSE - if(I.slot_flags & ITEM_SLOT_DENYPOCKET) - return FALSE - if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKET) ) + if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKETS) ) return TRUE - if(SLOT_R_STORE) + if(ITEM_SLOT_RPOCKET) if(HAS_TRAIT(I, TRAIT_NODROP)) return FALSE if(H.r_store) @@ -1452,12 +1450,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(return_warning) return_warning[1] = "You need a jumpsuit before you can attach this [I.name]!" return FALSE - if(I.slot_flags & ITEM_SLOT_DENYPOCKET) - return FALSE - if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKET) ) + if( I.w_class <= WEIGHT_CLASS_SMALL || (I.slot_flags & ITEM_SLOT_POCKETS) ) return TRUE return FALSE - if(SLOT_S_STORE) + if(ITEM_SLOT_SUITSTORE) if(HAS_TRAIT(I, TRAIT_NODROP)) return FALSE if(H.s_store) @@ -1477,7 +1473,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if( istype(I, /obj/item/pda) || istype(I, /obj/item/pen) || is_type_in_list(I, H.wear_suit.allowed) ) return TRUE return FALSE - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) if(H.handcuffed) return FALSE if(!istype(I, /obj/item/restraints/handcuffs)) @@ -1485,7 +1481,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(num_arms < 2) return FALSE return TRUE - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) if(H.legcuffed) return FALSE if(!istype(I, /obj/item/restraints/legcuffs)) @@ -1493,7 +1489,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(num_legs < 2) return FALSE return TRUE - if(SLOT_IN_BACKPACK) + if(ITEM_SLOT_BACKPACK) if(H.back) if(SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_CAN_INSERT, I, H, TRUE)) return TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 9f5e868038..3e24688ac4 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -12,7 +12,7 @@ punchdamagelow = 5 punchdamagehigh = 14 punchstunthreshold = 10 - no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE) + no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE) nojumpsuit = 1 sexes = 1 damage_overlay_type = "" diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 5e20b469ed..85ab2b44cd 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -16,7 +16,7 @@ punchdamagehigh = 12 //still better than humans punchstunthreshold = 10 - no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM) + no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING) burnmod = 1.25 heatmod = 1.5 diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index f538a5d5d7..23a0ea310f 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -38,7 +38,7 @@ limbs_id = SPECIES_SHADOW burnmod = 1.5 blacklisted = TRUE - no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE) + no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE) species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYES,NOGENITALS,NOAROUSAL) inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER,TRAIT_NOTHIRST) mutanteyes = /obj/item/organ/eyes/night_vision/nightmare diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index b6558ec72a..198e7df83e 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -82,7 +82,7 @@ There are several things that need to be remembered: update_body(TRUE) update_hair() update_inv_w_uniform() - //skyrat edit + // Sandstorm edit update_inv_w_underwear() update_inv_w_socks() update_inv_w_shirt() @@ -135,7 +135,7 @@ There are several things that need to be remembered: remove_overlay(UNIFORM_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_ICLOTHING) + 1] inv.update_icon() if(istype(w_uniform, /obj/item/clothing/under)) @@ -182,13 +182,13 @@ There are several things that need to be remembered: apply_overlay(UNIFORM_LAYER) update_mutant_bodyparts() -//skyrat edit +// Sandstorm edit /mob/living/carbon/human/update_inv_w_underwear() if(!HAS_TRAIT(src, TRAIT_HUMAN_NO_RENDER)) remove_overlay(UNDERWEAR_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNDERWEAR] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_UNDERWEAR) + 1] inv.update_icon() if(istype(w_underwear, /obj/item/clothing/underwear)) @@ -235,7 +235,7 @@ There are several things that need to be remembered: remove_overlay(SOCKS_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_W_SOCKS] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_SOCKS) + 1] inv.update_icon() if(istype(w_socks, /obj/item/clothing/underwear)) @@ -282,7 +282,7 @@ There are several things that need to be remembered: remove_overlay(SHIRT_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_W_SHIRT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_SHIRT) + 1] inv.update_icon() if(istype(w_shirt, /obj/item/clothing/underwear)) @@ -330,7 +330,7 @@ There are several things that need to be remembered: remove_overlay(ID_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_ID) + 1] inv.update_icon() var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER] @@ -354,8 +354,8 @@ There are several things that need to be remembered: if(!HAS_TRAIT(src, TRAIT_HUMAN_NO_RENDER)) remove_overlay(GLOVES_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES]) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES] + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1] inv.update_icon() if(!gloves && bloody_hands) @@ -383,13 +383,13 @@ There are several things that need to be remembered: overlays_standing[GLOVES_LAYER] = gloves_overlay apply_overlay(GLOVES_LAYER) -//skyrat edit +// Sandstorm edit /mob/living/carbon/human/update_inv_wrists() if(!HAS_TRAIT(src, TRAIT_HUMAN_NO_RENDER)) remove_overlay(WRISTS_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_WRISTS]) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WRISTS] + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_WRISTS) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_WRISTS) + 1] inv.update_icon() if(!wrists && bloody_hands) @@ -426,7 +426,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_EYES) + 1] inv.update_icon() if(glasses) @@ -453,7 +453,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS_LEFT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_EARS_LEFT) + 1] inv.update_icon() if(ears) @@ -479,7 +479,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS_RIGHT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_EARS_RIGHT) + 1] inv.update_icon() if(ears_extra) @@ -505,7 +505,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_FEET) + 1] inv.update_icon() if(dna.species.mutant_bodyparts["taur"]) @@ -540,7 +540,7 @@ There are several things that need to be remembered: remove_overlay(SUIT_STORE_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_SUITSTORE) + 1] inv.update_icon() if(s_store) @@ -567,7 +567,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1] inv.update_icon() if(head) @@ -604,7 +604,7 @@ There are several things that need to be remembered: remove_overlay(BELT_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BELT) + 1] inv.update_icon() if(belt) @@ -626,7 +626,7 @@ There are several things that need to be remembered: remove_overlay(SUIT_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_OCLOTHING) + 1] inv.update_icon() if(wear_suit) @@ -689,10 +689,10 @@ There are several things that need to be remembered: if(client && hud_used) var/atom/movable/screen/inventory/inv - inv = hud_used.inv_slots[SLOT_L_STORE] + inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_LPOCKET) + 1] inv.update_icon() - inv = hud_used.inv_slots[SLOT_R_STORE] + inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_RPOCKET) + 1] inv.update_icon() if(l_store) @@ -716,7 +716,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_MASK) + 1] inv.update_icon() if(wear_mask) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 13f811196e..2422528d21 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -1,16 +1,16 @@ /mob/living/carbon/get_item_by_slot(slot_id) switch(slot_id) - if(SLOT_BACK) + if(ITEM_SLOT_BACK) return back - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) return wear_mask - if(SLOT_NECK) + if(ITEM_SLOT_NECK) return wear_neck - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) return head - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) return handcuffed - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) return legcuffed return null @@ -20,17 +20,17 @@ return slot if(critical) //it is CRITICAL they get this item, no matter what //do they have a backpack? - var/obj/item/backpack = get_item_by_slot(SLOT_BACK) + var/obj/item/backpack = get_item_by_slot(ITEM_SLOT_BACK) if(!backpack) //nothing on their back backpack = new /obj/item/storage/backpack(get_turf(src)) - if(equip_to_slot(backpack, SLOT_BACK)) //worst-case-scenario, something that shouldnt wear a backpack gets one + if(equip_to_slot(backpack, ITEM_SLOT_BACK)) //worst-case-scenario, something that shouldnt wear a backpack gets one I.forceMove(backpack) - return SLOT_BACK + return ITEM_SLOT_BACK else if(istype(backpack) && SEND_SIGNAL(backpack, COMSIG_CONTAINS_STORAGE)) //place it in here, regardless of storage capacity I.forceMove(backpack) - return SLOT_BACK + return ITEM_SLOT_BACK else //this should NEVER happen, but if it does, report it with the appropriate information var/conclusion = qdel_on_fail ? "deleted" : "not moved, staying at current position [I.x], [I.y], [I.z]" @@ -69,28 +69,28 @@ I.appearance_flags |= NO_CLIENT_COLOR var/not_handled = FALSE switch(slot) - if(SLOT_BACK) + if(ITEM_SLOT_BACK) back = I update_inv_back() - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) wear_mask = I wear_mask_update(I, toggle_off = 0) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) head = I head_update(I) - if(SLOT_NECK) + if(ITEM_SLOT_NECK) wear_neck = I update_inv_neck(I) - if(SLOT_HANDCUFFED) + if(ITEM_SLOT_HANDCUFFED) handcuffed = I update_handcuffed() - if(SLOT_LEGCUFFED) + if(ITEM_SLOT_LEGCUFFED) legcuffed = I update_inv_legcuffed() - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) put_in_hands(I) update_inv_hands() - if(SLOT_IN_BACKPACK) + if(ITEM_SLOT_BACKPACK) if(!back || !SEND_SIGNAL(back, COMSIG_TRY_STORAGE_INSERT, I, src, TRUE)) not_handled = TRUE else @@ -170,7 +170,7 @@ if(!offered_item) to_chat(src, "You're not holding anything to give!") return - + if(IS_DEAD_OR_INCAP(src)) to_chat(src, span_warning("You're unable to offer anything in your current state!")) return @@ -184,7 +184,7 @@ visible_message(span_notice("[src] is offering [offered_item]."), \ span_notice("You offer [offered_item]."), null, 2) - + apply_status_effect(STATUS_EFFECT_OFFERING, offered_item) /** diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 182ae1afb8..27f795015e 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -676,7 +676,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put /mob/living/carbon/proc/get_cooling_efficiency() if(!HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM)) return 1 - + var/integration_bonus = min(blood_volume * SYNTH_INTEGRATION_COOLANT_CAP, integrating_blood * SYNTH_INTEGRATION_COOLANT_PENALTY) //Integration blood somewhat helps, though only at 40% impact and to a cap of 25% of current blood level. var/blood_effective_volume = blood_volume + integration_bonus var/coolant_efficiency = min(blood_effective_volume / BLOOD_VOLUME_SAFE, 1) //Low coolant is only a negative, adding more than needed will not help you. @@ -706,13 +706,13 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put return total_environment_efficiency /mob/living/carbon/proc/check_suitlinking() - var/suit_item = get_item_by_slot(SLOT_WEAR_SUIT) - var/head_item = get_item_by_slot(SLOT_HEAD) + var/suit_item = get_item_by_slot(ITEM_SLOT_OCLOTHING) + var/head_item = get_item_by_slot(ITEM_SLOT_HEAD) var/turf/T = get_turf(src) - + if(istype(head_item, /obj/item/clothing/head/helmet/space) && istype(suit_item, /obj/item/clothing/suit/space)) return 1 - + if(T && is_mining_level(T.z) && istype(head_item, /obj/item/clothing/head/hooded/explorer) && istype(suit_item, /obj/item/clothing/suit/hooded/explorer)) return 1 diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm index 34599028f7..156eef9b6b 100644 --- a/code/modules/mob/living/carbon/monkey/inventory.dm +++ b/code/modules/mob/living/carbon/monkey/inventory.dm @@ -5,29 +5,29 @@ return FALSE switch(slot) - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) if(get_empty_held_indexes()) return TRUE return FALSE - if(SLOT_WEAR_MASK) + if(ITEM_SLOT_MASK) if(wear_mask) return FALSE if( !(I.slot_flags & ITEM_SLOT_MASK) ) return FALSE return TRUE - if(SLOT_NECK) + if(ITEM_SLOT_NECK) if(wear_neck) return FALSE if( !(I.slot_flags & ITEM_SLOT_NECK) ) return FALSE return TRUE - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) if(head) return FALSE if( !(I.slot_flags & ITEM_SLOT_HEAD) ) return FALSE return TRUE - if(SLOT_BACK) + if(ITEM_SLOT_BACK) if(back) return FALSE if( !(I.slot_flags & ITEM_SLOT_BACK) ) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index f8ac8c6716..8a029613e2 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -184,5 +184,5 @@ GLOBAL_LIST_INIT(strippable_monkey_items, create_strippable_list(list( . = ..() if(prob(10)) var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src) - equip_to_slot_or_del(helmet,SLOT_HEAD) + equip_to_slot_or_del(helmet,ITEM_SLOT_HEAD) INVOKE_ASYNC(helmet, /obj/item.proc/attack_self, src) // todo encapsulate toggle diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index c59218a8a3..d71a989c1d 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -29,9 +29,9 @@ if(ancestor_chain > 1) generate_fake_scars(rand(ancestor_chain, ancestor_chain * 4)) if(relic_hat) - equip_to_slot_or_del(new relic_hat, SLOT_HEAD) + equip_to_slot_or_del(new relic_hat, ITEM_SLOT_HEAD) if(relic_mask) - equip_to_slot_or_del(new relic_mask, SLOT_WEAR_MASK) + equip_to_slot_or_del(new relic_mask, ITEM_SLOT_MASK) /mob/living/carbon/monkey/punpun/BiologicalLife(seconds, times_fired) if(!(. = ..())) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 43e0db1f08..cd9cd5db4c 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -91,7 +91,7 @@ return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_MASK) + 1] inv?.update_icon() if(wear_mask) @@ -104,8 +104,8 @@ /mob/living/carbon/update_inv_neck() remove_overlay(NECK_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_NECK]) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_NECK] + if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_NECK) + 1]) + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_NECK) + 1] inv.update_icon() if(wear_neck) @@ -119,7 +119,7 @@ remove_overlay(BACK_LAYER) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1] inv?.update_icon() if(back) @@ -135,7 +135,7 @@ return if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1] inv?.update_icon() if(head) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 730da0a73c..b0557991be 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -2,7 +2,10 @@ ..() //Mind updates sync_mind() - mind.show_memory(src, 0) +//ambition start + if(mind.memory || mind.antag_datums) + to_chat(src, "[mind.show_memory()]") +//ambition end //Round specific stuff if(SSticker.mode) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index bab02499fb..44386a3e69 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -88,10 +88,10 @@ if(default_storage) var/obj/item/I = new default_storage(src) - equip_to_slot_or_del(I, SLOT_GENERC_DEXTROUS_STORAGE) + equip_to_slot_or_del(I, ITEM_SLOT_DEX_STORAGE) if(default_hatmask) var/obj/item/I = new default_hatmask(src) - equip_to_slot_or_del(I, SLOT_HEAD) + equip_to_slot_or_del(I, ITEM_SLOT_HEAD) ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index 948be53abc..df4d1e0673 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -61,7 +61,7 @@ if(!D.default_hatmask && seasonal_hats && possible_seasonal_hats.len) var/hat_type = pick(possible_seasonal_hats) var/obj/item/new_hat = new hat_type(D) - D.equip_to_slot_or_del(new_hat, SLOT_HEAD) + D.equip_to_slot_or_del(new_hat, ITEM_SLOT_HEAD) D.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) user.transfer_ckey(D, FALSE) qdel(src) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index 00be08bb1d..4c112858da 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -21,13 +21,13 @@ /mob/living/simple_animal/drone/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, clothing_check = FALSE, list/return_warning) switch(slot) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) if(head) return 0 if(!((I.slot_flags & ITEM_SLOT_HEAD) || (I.slot_flags & ITEM_SLOT_MASK))) return 0 return 1 - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) if(internal_storage) return 0 return 1 @@ -36,9 +36,9 @@ /mob/living/simple_animal/drone/get_item_by_slot(slot_id) switch(slot_id) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) return head - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) return internal_storage return ..() @@ -63,10 +63,10 @@ I.plane = ABOVE_HUD_PLANE switch(slot) - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) head = I update_inv_head() - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) internal_storage = I update_inv_internal_storage() else @@ -77,7 +77,7 @@ I.equipped(src, slot) /mob/living/simple_animal/drone/getBackSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE /mob/living/simple_animal/drone/getBeltSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index 709e3b1a62..f60cefffd8 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -52,7 +52,7 @@ /mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, clothing_check = FALSE, list/return_warning) switch(slot) - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) if(internal_storage) return 0 return 1 @@ -63,17 +63,17 @@ return switch(slot) - if(SLOT_GENERC_DEXTROUS_STORAGE) + if(ITEM_SLOT_DEX_STORAGE) internal_storage = I update_inv_internal_storage() else to_chat(src, "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!") /mob/living/simple_animal/hostile/guardian/dextrous/getBackSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE /mob/living/simple_animal/hostile/guardian/dextrous/getBeltSlot() - return SLOT_GENERC_DEXTROUS_STORAGE + return ITEM_SLOT_DEX_STORAGE /mob/living/simple_animal/hostile/guardian/dextrous/proc/update_inv_internal_storage() if(internal_storage && client && hud_used && hud_used.hud_shown) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index fa67fd8e3b..6bd55d06ae 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -191,7 +191,7 @@ continue visible_message("[src] grabs hold of [L]!") var/mob/living/carbon/C = L - var/obj/item/clothing/S = C.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/clothing/S = C.get_item_by_slot(ITEM_SLOT_OCLOTHING) if(S && S.resistance_flags & GOLIATH_RESISTANCE) L.Stun(25) else if(S && S.resistance_flags & GOLIATH_WEAKNESS) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index b50c764a6b..60af6072ce 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -466,7 +466,11 @@ set category = "IC" set desc = "View your character's notes memory." if(mind) - mind.show_memory(src) +//ambition start + var/datum/browser/popup = new(src, "memory", "Memory and Notes") + popup.set_content(mind.show_memory()) + popup.open() +//ambition end else to_chat(src, "You don't have a mind datum for some reason, so you can't look at your notes, if you had any.") diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index cf895924b0..f59a06dc69 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -111,7 +111,7 @@ if(user.put_in_hands(src)) msg = "Your Energy Katana teleports into your hand!" - else if(user.equip_to_slot_if_possible(src, SLOT_BELT, 0, 1, 1)) + else if(user.equip_to_slot_if_possible(src, ITEM_SLOT_BELT, 0, 1, 1)) msg = "Your Energy Katana teleports back to you, sheathing itself as it does so!" else msg = "Your Energy Katana teleports to your location!" diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm index ca740d9ad7..f9ce438ed9 100644 --- a/code/modules/ninja/outfit.dm +++ b/code/modules/ninja/outfit.dm @@ -11,7 +11,7 @@ l_pocket = /obj/item/grenade/plastic/c4/ninja r_pocket = /obj/item/hypospray/mkii/CMO/combat suit_store = /obj/item/tank/internals/oxygen - internals_slot = SLOT_S_STORE + internals_slot = ITEM_SLOT_SUITSTORE belt = /obj/item/energy_katana implants = list(/obj/item/implant/explosive) diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index 6fba60a6ef..4f46a1bfc6 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -22,7 +22,7 @@ /obj/item/clothing/shoes/space_ninja/equipped(mob/user, slot) . = ..() - if(slot == SLOT_SHOES) + if(slot == ITEM_SLOT_FEET) ADD_TRAIT(user, TRAIT_SILENT_STEP, SHOES_TRAIT) /obj/item/clothing/shoes/space_ninja/dropped(mob/user) diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index f07ad0bc39..8c26f40d8b 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -163,7 +163,7 @@ icon = 'icons/obj/ammo.dmi' icon_state = "shotgunclip" caliber = "shotgun" // slapped in to allow shell mix n match - slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_NORMAL w_volume = ITEM_VOLUME_STRIPPER_CLIP ammo_type = /obj/item/ammo_casing/shotgun diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm index 8f8916585b..76d8f217ab 100644 --- a/code/modules/projectiles/boxes_magazines/external/rechargable.dm +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -54,7 +54,7 @@ desc = "A miniature battery for an energy weapon." icon = 'icons/obj/ammo.dmi' icon_state = "mws_batt" - slot_flags = SLOT_BELT | SLOT_EARS_LEFT | SLOT_EARS_RIGHT //skyrat edit + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_EARS throwforce = 1 caliber = "mws" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index bbd77ad665..a1c7c312ab 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -619,7 +619,7 @@ . += knife_overlay /obj/item/gun/item_action_slot_check(slot, mob/user, datum/action/A) - if(istype(A, /datum/action/item_action/toggle_scope_zoom) && slot != SLOT_HANDS) + if(istype(A, /datum/action/item_action/toggle_scope_zoom) && slot != ITEM_SLOT_HANDS) return FALSE return ..() diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index e7f26670d4..1f0601ac77 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -140,6 +140,6 @@ recoil = 0.1 inaccuracy_modifier = 0.25 dualwield_spread_mult = 1.4 - slot_flags = SLOT_BELT + slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_NORMAL weapon_weight = WEAPON_MEDIUM diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index a0274d76d7..2bb1ece906 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -32,7 +32,7 @@ /obj/item/minigunpack/on_attack_hand(var/mob/living/carbon/user) if(src.loc == user) if(!armed) - if(user.get_item_by_slot(SLOT_BACK) == src) + if(user.get_item_by_slot(ITEM_SLOT_BACK) == src) armed = 1 if(!user.put_in_hands(gun)) armed = 0 diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 2899f0ca11..cdad332def 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -14,6 +14,7 @@ GLOB.chemical_reagents_list[path] = D /proc/build_chemical_reactions_list() + message_admins("STARTY START START!") //Chemical Reactions - Initialises all /datum/chemical_reaction into a list // It is filtered into multiple lists within a list. // For example: @@ -26,11 +27,20 @@ //Randomized need to go last since they need to check against conflicts with normal recipes var/paths = subtypesof(/datum/chemical_reaction) - typesof(/datum/chemical_reaction/randomized) + subtypesof(/datum/chemical_reaction/randomized) GLOB.chemical_reactions_list = list() + GLOB.normalized_chemical_reactions_list = list() // chemistry pda + GLOB.drink_reactions_list = list() // bartender pda for(var/path in paths) var/datum/chemical_reaction/D = new path() var/list/reaction_ids = list() + // store recipes separately for bartender/chemistry cartridges + if(D.id && !D.is_secret) // don't show things like secretcatchem or secret sauce + var/datum/reagent/r = D.id + if(ispath(D.id, /datum/reagent/consumable)) + GLOB.drink_reactions_list[initial(r.name)] = D + if(ispath(D.id, /datum/reagent)) + GLOB.normalized_chemical_reactions_list[initial(r.name)] = D if(D.required_reagents && D.required_reagents.len) for(var/reaction in D.required_reagents) @@ -43,6 +53,31 @@ GLOB.chemical_reactions_list[id] += D break // Don't bother adding ourselves to other reagent ids, it is redundant +/proc/recipe_search(mob/M, list/reaction_list) + var/option = input(M, "Enter keyword to return a recipe.") + if(option) + option = lowertext(option) + var/list/reagents_required + var/found_reagent_name + var/required_temp + for(var/reagent_name in reaction_list) + if(findtext(lowertext(reagent_name), option)) + var/datum/chemical_reaction/reaction = reaction_list[reagent_name] + found_reagent_name = reagent_name + reagents_required = reaction.required_reagents + required_temp = reaction.required_temp + break + if(length(reagents_required)) + to_chat(M, "Recipe found: [found_reagent_name][required_temp ? "
    Required Temperature: [required_temp]K" : ""]
    Required Reagents:") + var/reagents_required_string = "" + for(var/r in reagents_required) + var/datum/reagent/reagent = r + reagents_required_string += "
    [initial(reagent.name)]: [reagents_required[r]]" + to_chat(M, reagents_required_string) + return + else + to_chat(M, "Reagent with term: [option] could not be located!") + /////////////////////////////////////////////////////////////////////////////////// /datum/reagents diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 41c0ed717e..aab46bc3e4 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -38,6 +38,8 @@ var/clear_conversion //bitflags for clear conversions; REACTION_CLEAR_IMPURE or REACTION_CLEAR_INVERSE var/PurityMin = 0.15 //If purity is below 0.15, it explodes too. Set to 0 to disable this. + var/is_secret = FALSE // If it should show in recipe searchers such as the bartender/chemistry PDA functions + /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, multiplier, specialreact) set waitfor = FALSE diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index fddff17a9d..03b0e1b715 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -581,7 +581,7 @@ if(istype(extract)) if(extract.Uses > 0) var/mob/lastheld = get_mob_by_key(holder.my_atom.fingerprintslast) - if(lastheld && !lastheld.equip_to_slot_if_possible(extract, SLOT_HANDS, disable_warning = TRUE)) + if(lastheld && !lastheld.equip_to_slot_if_possible(extract, ITEM_SLOT_HANDS, disable_warning = TRUE)) extract.forceMove(get_turf(lastheld)) use_slime_core(holder) diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index ad277ef4ff..4aab8e4046 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -54,6 +54,8 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related var/max_result_reagents = 1 var/list/possible_results = list() + is_secret = TRUE + /datum/chemical_reaction/randomized/proc/GenerateRecipe() created = world.time if(randomize_container) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index bc91dc1ff5..0310e92a84 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -300,16 +300,19 @@ resistance_flags = NONE armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 50) //Weak melee protection, because you can wear it on your head slot_equipment_priority = list( \ - SLOT_BACK, SLOT_WEAR_ID,\ - SLOT_W_UNIFORM, SLOT_WEAR_SUIT,\ - SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\ - SLOT_SHOES, SLOT_GLOVES,\ - SLOT_EARS_LEFT, SLOT_EARS_RIGHT,\ - SLOT_GLASSES,\ - SLOT_BELT, SLOT_S_STORE,\ - SLOT_L_STORE, SLOT_R_STORE,\ - SLOT_GENERC_DEXTROUS_STORAGE - ) //skyrat edit + ITEM_SLOT_BACK, ITEM_SLOT_ID,\ + ITEM_SLOT_UNDERWEAR,\ + ITEM_SLOT_SOCKS,\ + ITEM_SLOT_SHIRT,\ + ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\ + ITEM_SLOT_MASK, ITEM_SLOT_HEAD, ITEM_SLOT_NECK,\ + ITEM_SLOT_FEET, ITEM_SLOT_WRISTS, ITEM_SLOT_GLOVES,\ + ITEM_SLOT_EARS_LEFT, ITEM_SLOT_EARS_RIGHT,\ + ITEM_SLOT_EYES,\ + ITEM_SLOT_BELT, ITEM_SLOT_SUITSTORE,\ + ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET,\ + ITEM_SLOT_DEX_STORAGE\ + ) container_flags = APTFT_ALTCLICK|APTFT_VERB container_HP = 1 @@ -331,11 +334,11 @@ /obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) if(reagents.total_volume) to_chat(user, "[src]'s contents spill all over you!") var/R = reagents.log_list() - log_reagent("SPLASH: [user] splashed [src] on their head via bucket/equipped(self, SLOT_HEAD) - [R]") + log_reagent("SPLASH: [user] splashed [src] on their head via bucket/equipped(self, ITEM_SLOT_HEAD) - [R]") reagents.reaction(user, TOUCH) reagents.clear_reagents() reagent_flags = NONE @@ -346,10 +349,10 @@ /obj/item/reagent_containers/glass/bucket/equip_to_best_slot(var/mob/M) if(reagents.total_volume) //If there is water in a bucket, don't quick equip it to the head - var/index = slot_equipment_priority.Find(SLOT_HEAD) - slot_equipment_priority.Remove(SLOT_HEAD) + var/index = slot_equipment_priority.Find(ITEM_SLOT_HEAD) + slot_equipment_priority.Remove(ITEM_SLOT_HEAD) . = ..() - slot_equipment_priority.Insert(index, SLOT_HEAD) + slot_equipment_priority.Insert(index, ITEM_SLOT_HEAD) return return ..() diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm index c26ed4db31..78cb9d43ea 100644 --- a/code/modules/reagents/reagent_containers/rags.dm +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -150,11 +150,11 @@ /obj/item/reagent_containers/rag/towel/equipped(mob/living/user, slot) . = ..() switch(slot) - if(SLOT_BELT) + if(ITEM_SLOT_BELT) body_parts_covered = GROIN|LEGS - if(SLOT_WEAR_SUIT) + if(ITEM_SLOT_OCLOTHING) body_parts_covered = CHEST|GROIN|LEGS - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) body_parts_covered = HEAD flags_inv = HIDEHAIR diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 8da18c453c..e30cdfb5ef 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -2,6 +2,18 @@ //////////Limb Grower Designs /////// ///////////////////////////////////// + +/datum/design/chestmob + name = "Synthetic Humanoid Framework Chest" + id = "chestmob" + // Mobs don't make very good roundstart icons + research_icon = 'icons/mob/human_parts.dmi' + research_icon_state = "default_human_chest" + build_type = LIMBGROWER + reagents_list = list(/datum/reagent/medicine/synthflesh = 100, /datum/reagent/blood = BLOOD_VOLUME_SURVIVE) + build_path = /mob/living/carbon/human/chestonly + category = list("initial","human","lizard","fly","insect","plasmaman","mammal","xeno") + /datum/design/leftarm name = "Left Arm" id = "leftarm" diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index 1ac09652b5..b30a53c27d 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -19,7 +19,7 @@ Slimecrossing Armor /obj/item/clothing/mask/nobreath/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot == SLOT_WEAR_MASK) + if(slot == ITEM_SLOT_MASK) ADD_TRAIT(user, TRAIT_NOBREATH, "breathmask_[REF(src)]") user.failed_last_breath = FALSE user.clear_alert("not_enough_oxy") @@ -39,7 +39,7 @@ Slimecrossing Armor var/glasses_color = "#FFFFFF" /obj/item/clothing/glasses/prism_glasses/item_action_slot_check(slot) - if(slot == SLOT_GLASSES) + if(slot == ITEM_SLOT_EYES) return TRUE /obj/structure/light_prism @@ -111,7 +111,7 @@ Slimecrossing Armor /obj/item/clothing/head/peaceflower/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot == SLOT_HEAD) + if(slot == ITEM_SLOT_HEAD) ADD_TRAIT(user, TRAIT_PACIFISM, "peaceflower_[REF(src)]") /obj/item/clothing/head/peaceflower/dropped(mob/living/carbon/human/user) diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 87b90c7c97..2b5977d384 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -127,10 +127,10 @@ Regenerative extracts: /obj/item/slimecross/regenerative/darkpurple/core_effect(mob/living/target, mob/user) var/equipped = 0 - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/purple(null), SLOT_SHOES) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(null), SLOT_W_UNIFORM) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(null), SLOT_GLOVES) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/head/soft/purple(null), SLOT_HEAD) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/purple(null), ITEM_SLOT_FEET) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(null), ITEM_SLOT_ICLOTHING) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(null), ITEM_SLOT_GLOVES) + equipped += target.equip_to_slot_or_del(new /obj/item/clothing/head/soft/purple(null), ITEM_SLOT_HEAD) if(equipped > 0) target.visible_message("The milky goo congeals into clothing!") @@ -142,13 +142,13 @@ Regenerative extracts: return var/mob/living/carbon/human/H = target var/fireproofed = FALSE - if(H.get_item_by_slot(SLOT_WEAR_SUIT)) + if(H.get_item_by_slot(ITEM_SLOT_OCLOTHING)) fireproofed = TRUE - var/obj/item/clothing/C = H.get_item_by_slot(SLOT_WEAR_SUIT) + var/obj/item/clothing/C = H.get_item_by_slot(ITEM_SLOT_OCLOTHING) fireproof(C) - if(H.get_item_by_slot(SLOT_HEAD)) + if(H.get_item_by_slot(ITEM_SLOT_HEAD)) fireproofed = TRUE - var/obj/item/clothing/C = H.get_item_by_slot(SLOT_HEAD) + var/obj/item/clothing/C = H.get_item_by_slot(ITEM_SLOT_HEAD) fireproof(C) if(fireproofed) target.visible_message("Some of [target]'s clothing gets coated in the goo, and turns blue!") diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index fbe7a0ea40..bf6051c87c 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -63,9 +63,9 @@ H.dropItemToGround(H.w_uniform) H.dropItemToGround(H.wear_suit) H.dropItemToGround(H.head) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), SLOT_WEAR_SUIT) - H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), SLOT_HEAD) - H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), SLOT_W_UNIFORM) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), ITEM_SLOT_OCLOTHING) + H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), ITEM_SLOT_HEAD) + H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), ITEM_SLOT_ICLOTHING) // you only get one phylactery. M.mind.RemoveSpell(src) @@ -132,10 +132,10 @@ var/mob/old_body = mind.current var/mob/living/carbon/human/lich = new(item_turf) - lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(lich), SLOT_SHOES) - lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), SLOT_W_UNIFORM) - lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), SLOT_WEAR_SUIT) - lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), SLOT_HEAD) + lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(lich), ITEM_SLOT_FEET) + lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), ITEM_SLOT_ICLOTHING) + lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), ITEM_SLOT_OCLOTHING) + lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), ITEM_SLOT_HEAD) lich.real_name = mind.name mind.transfer_to(lich) diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm index 57ce22434e..e084069cf7 100644 --- a/code/modules/unit_tests/outfit_sanity.dm +++ b/code/modules/unit_tests/outfit_sanity.dm @@ -26,13 +26,19 @@ CHECK_OUTFIT_SLOT(head, ITEM_SLOT_HEAD) CHECK_OUTFIT_SLOT(mask, ITEM_SLOT_MASK) CHECK_OUTFIT_SLOT(neck, ITEM_SLOT_NECK) - CHECK_OUTFIT_SLOT(ears, ITEM_SLOT_EARS) + CHECK_OUTFIT_SLOT(ears, ITEM_SLOT_EARS_LEFT) CHECK_OUTFIT_SLOT(glasses, ITEM_SLOT_EYES) CHECK_OUTFIT_SLOT(id, ITEM_SLOT_ID) CHECK_OUTFIT_SLOT(suit_store, ITEM_SLOT_SUITSTORE) CHECK_OUTFIT_SLOT(l_pocket, ITEM_SLOT_LPOCKET) CHECK_OUTFIT_SLOT(r_pocket, ITEM_SLOT_RPOCKET) + CHECK_OUTFIT_SLOT(underwear, ITEM_SLOT_UNDERWEAR) + CHECK_OUTFIT_SLOT(shirt, ITEM_SLOT_SHIRT) + CHECK_OUTFIT_SLOT(socks, ITEM_SLOT_SOCKS) + CHECK_OUTFIT_SLOT(wrists, ITEM_SLOT_WRISTS) + CHECK_OUTFIT_SLOT(ears_extra, ITEM_SLOT_EARS_RIGHT) + if (outfit.backpack_contents || outfit.box) var/list/backpack_contents = outfit.backpack_contents?.Copy() if (outfit.box) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 3e0e71446d..d4a87a0f1e 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -102,7 +102,7 @@ var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals)) unbuckle_mob(H) H.throw_at(throw_target, 3, 2) - var/head_slot = H.get_item_by_slot(SLOT_HEAD) + var/head_slot = H.get_item_by_slot(ITEM_SLOT_HEAD) if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat))) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) H.updatehealth() @@ -281,7 +281,7 @@ H.throw_at(throw_target, 4, 3) H.DefaultCombatKnockdown(30) H.adjustStaminaLoss(30) - var/head_slot = H.get_item_by_slot(SLOT_HEAD) + var/head_slot = H.get_item_by_slot(ITEM_SLOT_HEAD) if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat))) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1) H.updatehealth() diff --git a/html/changelogs/AutoChangeLog-pr-15495.yml b/html/changelogs/AutoChangeLog-pr-15495.yml new file mode 100644 index 0000000000..f9a025c584 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15495.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - rscadd: "Configurable weekly high-chaos days" diff --git a/html/changelogs/AutoChangeLog-pr-15503.yml b/html/changelogs/AutoChangeLog-pr-15503.yml new file mode 100644 index 0000000000..96dc78ff65 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15503.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - rscadd: "The limbgrower can make human chest parts that you can build onto into a person." diff --git a/html/changelogs/AutoChangeLog-pr-15505.yml b/html/changelogs/AutoChangeLog-pr-15505.yml new file mode 100644 index 0000000000..2c5f1ae47c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15505.yml @@ -0,0 +1,4 @@ +author: "SandPoot and Crowbar764" +delete-after: True +changes: + - rscadd: "TGUI for the player playtimes menu." diff --git a/html/changelogs/AutoChangeLog-pr-15522.yml b/html/changelogs/AutoChangeLog-pr-15522.yml new file mode 100644 index 0000000000..40705aba5f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15522.yml @@ -0,0 +1,4 @@ +author: "bunny232" +delete-after: True +changes: + - rscadd: "Cold weather gear can now provide insulation against temperatures of up to 57C (330K)" diff --git a/html/changelogs/AutoChangeLog-pr-15526.yml b/html/changelogs/AutoChangeLog-pr-15526.yml new file mode 100644 index 0000000000..60d49802c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15526.yml @@ -0,0 +1,5 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "adds a cartridge for the bartender's PDA that lets them search drink recipes" + - rscadd: "updates chemist cartridge to be able to search all chemical recipes" diff --git a/html/changelogs/AutoChangeLog-pr-15528.yml b/html/changelogs/AutoChangeLog-pr-15528.yml new file mode 100644 index 0000000000..5b22ff00dc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-15528.yml @@ -0,0 +1,4 @@ +author: "SandPoot" +delete-after: True +changes: + - refactor: "Kills off SLOT_ in favor of ITEM_SLOT_" diff --git a/html/changelogs/archive/2022-02.yml b/html/changelogs/archive/2022-02.yml index 1eb25fe86d..5cf9a38054 100644 --- a/html/changelogs/archive/2022-02.yml +++ b/html/changelogs/archive/2022-02.yml @@ -169,3 +169,6 @@ 2022-02-26: BongaTheProto: - bugfix: Lewd verbs will actually count for the target's feet when needed + Putnam3145: + - balance: Now slightly easier to get 50,000 points with toxins (50,000 point baseline + changed from 200 light range to 175) diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index 8992f4a4a104de0e727b17623492a60598ea59f3..f968d158601eab3e41261e216f8f6877f43f00ad 100644 GIT binary patch literal 16140 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 literal 16000 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[partner]'s face.", "presses [u_His] footwear down hard on [partner]'s face.", "rubs off the dirt from [u_His] [get_shoes()] onto [partner]'s face."))]
    " @@ -1413,7 +1413,7 @@ "runs the soles of [u_His] bare feet against [partner]'s lips."))]
    " else if(is_fucking(partner, GRINDING_MOUTH_WITH_FEET)) - if(get_item_by_slot(SLOT_SHOES) != null) + if(get_item_by_slot(ITEM_SLOT_FEET) != null) message = "[pick(list("pulls [u_His] [get_shoes()] out of [partner]'s mouth and puts them on [t_His] face.", "slowly retracts [u_His] [get_shoes()] from [partner]'s mouth, putting them on [t_His] face instead."))]
    " else @@ -1423,7 +1423,7 @@ set_is_fucking(partner , GRINDING_FACE_WITH_FEET, null) else - if(get_item_by_slot(SLOT_SHOES) != null) + if(get_item_by_slot(ITEM_SLOT_FEET) != null) message = "[pick(list("plants [u_His] [get_shoes()] ontop of [partner]'s face.", "rests [u_His] [get_shoes()] on [partner]'s face and presses down hard.", "harshly places [u_His] [get_shoes()] atop [partner]'s face."))]
    " @@ -1452,7 +1452,7 @@ var/t_S = partner.p_s() if(is_fucking(partner, GRINDING_MOUTH_WITH_FEET)) - if(get_item_by_slot(SLOT_SHOES) != null) + if(get_item_by_slot(ITEM_SLOT_FEET) != null) message = "[pick(list("roughly shoves [u_His] [get_shoes()] deeper into [partner]'s mouth.", "harshly forces another inch of [u_His] [get_shoes()] into [partner]'s mouth.", "presses [u_His] weight down, [u_His] [get_shoes()] prying deeper into [partner]'s mouth."))]
    " @@ -1462,7 +1462,7 @@ "roughly grinds [u_His] feet on [partner]'s tongue."))]" else if(is_fucking(partner, GRINDING_FACE_WITH_FEET)) - if(get_item_by_slot(SLOT_SHOES) != null) + if(get_item_by_slot(ITEM_SLOT_FEET) != null) message = "[pick(list("decides to force [u_His] [get_shoes()] deep into [partner]'s mouth.", "pressed the tip of [u_His] [get_shoes()] against [partner]'s lips and shoves inwards."))]" else @@ -1472,7 +1472,7 @@ set_is_fucking(partner , GRINDING_MOUTH_WITH_FEET, null) else - if(get_item_by_slot(SLOT_SHOES) != null) + if(get_item_by_slot(ITEM_SLOT_FEET) != null) message = "[pick(list("readies themselves and in one swift motion, shoves [u_His] [get_shoes()] into [partner]'s mouth.", "grinds the tip of [u_His] [get_shoes()] against [partner]'s mouth before pushing themselves in."))]" else @@ -1619,7 +1619,7 @@ partner.handle_post_sex(NORMAL_LUST, CUM_TARGET_FEET, src) /mob/living/proc/get_shoes(var/singular = FALSE) - var/obj/A = get_item_by_slot(SLOT_SHOES) + var/obj/A = get_item_by_slot(ITEM_SLOT_FEET) if(A) var/txt = A.name if(findtext (A.name,"the")) diff --git a/modular_sand/code/datums/interactions/lewd/lewd_interactions.dm b/modular_sand/code/datums/interactions/lewd/lewd_interactions.dm index 8efa94397b..c9924f9489 100644 --- a/modular_sand/code/datums/interactions/lewd/lewd_interactions.dm +++ b/modular_sand/code/datums/interactions/lewd/lewd_interactions.dm @@ -533,7 +533,7 @@ var/client/ucli = LM.client if(cli.prefs.extremepref != "No") if(!ucli || (ucli.prefs.extremepref != "No")) - if(!get_item_by_slot(ITEM_SLOT_EARS)) + if(!get_item_by_slot(ITEM_SLOT_EARS_LEFT) && !get_item_by_slot(ITEM_SLOT_EARS_RIGHT)) if(has_ears()) dat += "...have unprotected ears." else diff --git a/modular_sand/code/game/objects/items/chrono_eraser.dm b/modular_sand/code/game/objects/items/chrono_eraser.dm index 6581f7b702..ccf784bc70 100644 --- a/modular_sand/code/game/objects/items/chrono_eraser.dm +++ b/modular_sand/code/game/objects/items/chrono_eraser.dm @@ -38,7 +38,7 @@ user.put_in_hands(PA) /obj/item/chrono_eraser/item_action_slot_check(slot, mob/user, datum/action/A) - if(slot == SLOT_BACK) + if(slot == ITEM_SLOT_BACK) return 1 /obj/item/gun/energy/chrono_gun diff --git a/modular_sand/code/game/objects/items/devices/radio/headset.dm b/modular_sand/code/game/objects/items/devices/radio/headset.dm index be43380c55..8e537a4037 100644 --- a/modular_sand/code/game/objects/items/devices/radio/headset.dm +++ b/modular_sand/code/game/objects/items/devices/radio/headset.dm @@ -10,6 +10,6 @@ /obj/item/radio/headset/talk_into(mob/living/M, message, channel, list/spans, datum/language/language, list/message_mods, direct = TRUE) if(!listening) return ITALICS | REDUCE_RANGE - if(radiosound) + if(on || (M || message) || !wires.is_cut(WIRE_TX) || M.IsVocal() || (language != /datum/language/signlanguage) || radiosound) playsound(M, radiosound, rand(20, 30), 0, 0, 1) . = ..() diff --git a/modular_sand/code/game/objects/items/devices/radio/radio.dm b/modular_sand/code/game/objects/items/devices/radio/radio.dm deleted file mode 100644 index c9d96d786b..0000000000 --- a/modular_sand/code/game/objects/items/devices/radio/radio.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/radio/headset - slot_flags = ITEM_SLOT_EARS diff --git a/modular_sand/code/game/objects/items/fleshlight.dm b/modular_sand/code/game/objects/items/fleshlight.dm index 968b6b91b8..738c87230a 100644 --- a/modular_sand/code/game/objects/items/fleshlight.dm +++ b/modular_sand/code/game/objects/items/fleshlight.dm @@ -144,7 +144,7 @@ if(!useable) to_chat(user, "It seems the device has failed or your partner is not wearing their device.") if(message) - var/mob/living/carbon/human/portal_target = ishuman(portalunderwear.loc) && portalunderwear.current_equipped_slot == SLOT_W_UNDERWEAR ? portalunderwear.loc : null + var/mob/living/carbon/human/portal_target = ishuman(portalunderwear.loc) && portalunderwear.current_equipped_slot == ITEM_SLOT_UNDERWEAR ? portalunderwear.loc : null if(portalunderwear.targetting == "vagina") V = portal_target.getorganslot(ORGAN_SLOT_VAGINA) if(portal_target && (portal_target?.client?.prefs.toggles & VERB_CONSENT || !portal_target.ckey)) @@ -197,7 +197,7 @@ useable = FALSE return if(H) //if the portal panties are on someone. - if(portalunderwear.current_equipped_slot != SLOT_W_UNDERWEAR) + if(portalunderwear.current_equipped_slot != ITEM_SLOT_UNDERWEAR) useable = FALSE return @@ -296,7 +296,7 @@ /obj/item/clothing/underwear/briefs/panties/portalpanties/equipped(mob/user, slot) . = ..() switch(slot) - if(SLOT_W_UNDERWEAR) + if(ITEM_SLOT_UNDERWEAR) if(!portallight) audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*") playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE) diff --git a/modular_sand/code/modules/client/loadout/accessories.dm b/modular_sand/code/modules/client/loadout/accessories.dm index ca35c063ad..a317069bf4 100644 --- a/modular_sand/code/modules/client/loadout/accessories.dm +++ b/modular_sand/code/modules/client/loadout/accessories.dm @@ -1,6 +1,6 @@ /datum/gear/accessories/ring category = LOADOUT_CATEGORY_GLOVES - slot = SLOT_GLOVES + slot = ITEM_SLOT_HANDS /datum/gear/accessories/ring/goldring name = "A gold ring" diff --git a/modular_sand/code/modules/client/loadout/boxers.dm b/modular_sand/code/modules/client/loadout/boxers.dm index 02aed40102..c55b799581 100644 --- a/modular_sand/code/modules/client/loadout/boxers.dm +++ b/modular_sand/code/modules/client/loadout/boxers.dm @@ -2,7 +2,7 @@ name = "Briefs" category = LOADOUT_CATEGORY_GENERAL_UNDER subcategory = LOADOUT_SUBCATEGORY_UNDERWEAR - slot = SLOT_W_UNDERWEAR + slot = ITEM_SLOT_UNDERWEAR has_colors = TRUE path = /obj/item/clothing/underwear/briefs cost = 0 diff --git a/modular_sand/code/modules/client/loadout/shirts.dm b/modular_sand/code/modules/client/loadout/shirts.dm index 13b71795d7..8583f71696 100644 --- a/modular_sand/code/modules/client/loadout/shirts.dm +++ b/modular_sand/code/modules/client/loadout/shirts.dm @@ -2,7 +2,7 @@ name = "Shirt" category = LOADOUT_CATEGORY_GENERAL_UNDER subcategory = LOADOUT_SUBCATEGORY_SHIRT - slot = SLOT_W_SHIRT + slot = ITEM_SLOT_SHIRT has_colors = TRUE path = /obj/item/clothing/underwear/shirt cost = 0 diff --git a/modular_sand/code/modules/client/loadout/socks.dm b/modular_sand/code/modules/client/loadout/socks.dm index c53dad5e34..56cbca574d 100644 --- a/modular_sand/code/modules/client/loadout/socks.dm +++ b/modular_sand/code/modules/client/loadout/socks.dm @@ -2,7 +2,7 @@ name = "Socks" category = LOADOUT_CATEGORY_GENERAL_UNDER subcategory = LOADOUT_SUBCATEGORY_SOCKS - slot = SLOT_W_SOCKS + slot = ITEM_SLOT_SOCKS has_colors = TRUE path = /obj/item/clothing/underwear/socks cost = 0 diff --git a/modular_sand/code/modules/client/loadout/wrists.dm b/modular_sand/code/modules/client/loadout/wrists.dm index 866472c6da..1120ef8df3 100644 --- a/modular_sand/code/modules/client/loadout/wrists.dm +++ b/modular_sand/code/modules/client/loadout/wrists.dm @@ -2,6 +2,6 @@ name = "steampunk watch" category = LOADOUT_CATEGORY_WRISTS subcategory = LOADOUT_SUBCATEGORY_WATCHES - slot = SLOT_WRISTS + slot = ITEM_SLOT_WRISTS path = /obj/item/clothing/wrists/clockwork_watch cost = 0 diff --git a/modular_sand/code/modules/clothing/gloves/_gloves.dm b/modular_sand/code/modules/clothing/gloves/_gloves.dm index 51044d77fb..b1984e9770 100644 --- a/modular_sand/code/modules/clothing/gloves/_gloves.dm +++ b/modular_sand/code/modules/clothing/gloves/_gloves.dm @@ -1,9 +1,9 @@ /obj/item/clothing/gloves var/dummy_thick = FALSE // is able to hold accessories on its item - //SKYRAT EDIT - Removed the old attached accessory system. We use a list of accessories instead. + // Sandstorm edit - Removed the old attached accessory system. We use a list of accessories instead. var/list/obj/item/clothing/accessory/ring/attached_accessories = list() var/max_accessories = 1 - //SKYRAT EDIT END + // Sandstorm edit END var/mutable_appearance/accessory_overlay /obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) @@ -20,30 +20,30 @@ . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return - if(length(attached_accessories)) //SKYRAT EDIT + if(length(attached_accessories)) // Sandstorm edit remove_accessory(user) /obj/item/clothing/gloves/equipped(mob/user, slot) ..() - //SKYRAT EDIT + // Sandstorm edit for(var/obj/item/clothing/accessory/ring/attached_accessory in attached_accessories) - if(attached_accessory && slot != SLOT_HANDS && ishuman(user)) + if(attached_accessory && slot != ITEM_SLOT_HANDS && ishuman(user)) var/mob/living/carbon/human/H = user attached_accessory.on_uniform_equip(src, user) if(attached_accessory.above_suit) H.update_inv_wear_suit() - //SKYRAT EDIT END + // Sandstorm edit END /obj/item/clothing/gloves/dropped(mob/user) - //SKYRAT EDIT + // Sandstorm edit for(var/obj/item/clothing/accessory/ring/attached_accessory in attached_accessories) attached_accessory.on_uniform_dropped(src, user) if(ishuman(user)) var/mob/living/carbon/human/H = user if(attached_accessory.above_suit) H.update_inv_wear_suit() - //SKYRAT EDIT END + // Sandstorm edit END ..() /obj/item/clothing/gloves/proc/attach_accessory(obj/item/I, mob/user, notifyAttach = 1) @@ -70,14 +70,14 @@ if((flags_inv & HIDEACCESSORY) || (A.flags_inv & HIDEACCESSORY)) return TRUE - //SKYRAT EDIT + // Sandstorm edit accessory_overlay = mutable_appearance(I.mob_overlay_icon, I.item_state) for(var/obj/item/clothing/accessory/ring/attached_accessory in attached_accessories) var/mutable_appearance/Y = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.icon_state, ABOVE_HUD_LAYER) Y.alpha = attached_accessory.alpha Y.color = attached_accessory.color accessory_overlay.add_overlay(Y) - //SKYRAT EDIT END + // Sandstorm edit END if(ishuman(loc)) var/mob/living/carbon/human/H = loc @@ -91,10 +91,10 @@ if(!can_use(user)) return - //SKYRAT EDIT + // Sandstorm edit if(length(attached_accessories)) var/obj/item/clothing/accessory/ring/A = attached_accessories[length(attached_accessories)] - //SKYRAT EDIT END + // Sandstorm edit END A.detach(src, user) if(user.put_in_hands(A)) to_chat(user, "You detach [A] from [src].") diff --git a/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm b/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm index 2faa39fc7f..921472d05d 100644 --- a/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm +++ b/modular_sand/code/modules/clothing/spacesuits/hardsuit.dm @@ -43,7 +43,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/powerarmor/equipped(mob/living/carbon/human/user, slot) ..() - if (slot == SLOT_HEAD) + if (slot == ITEM_SLOT_HEAD) var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] DHUD.add_hud_to(user) diff --git a/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm b/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm index c0853ca76c..300142a316 100644 --- a/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm +++ b/modular_sand/code/modules/mining/lavaland/necropolis_chests.dm @@ -964,7 +964,7 @@ var/numUses = 1 /obj/item/clothing/neck/necklace/necklace_of_the_forsaken/item_action_slot_check(slot) - return (..() && (slot == SLOT_NECK)) + return (..() && (slot == ITEM_SLOT_NECK)) /obj/item/clothing/neck/necklace/necklace_of_the_forsaken/dropped(mob/user) ..() diff --git a/modular_sand/code/modules/mob/living/carbon/human/human_stripping.dm b/modular_sand/code/modules/mob/living/carbon/human/human_stripping.dm index 9110c6a432..762e4be58b 100644 --- a/modular_sand/code/modules/mob/living/carbon/human/human_stripping.dm +++ b/modular_sand/code/modules/mob/living/carbon/human/human_stripping.dm @@ -1,19 +1,19 @@ /datum/strippable_item/mob_item_slot/ears_extra key = STRIPPABLE_ITEM_EARS_EXTRA - item_slot = SLOT_EARS_RIGHT + item_slot = ITEM_SLOT_EARS_RIGHT /datum/strippable_item/mob_item_slot/wrists key = STRIPPABLE_ITEM_WRISTS - item_slot = SLOT_WRISTS + item_slot = ITEM_SLOT_WRISTS /datum/strippable_item/mob_item_slot/socks key = STRIPPABLE_ITEM_SOCKS - item_slot = SLOT_W_SOCKS + item_slot = ITEM_SLOT_SOCKS /datum/strippable_item/mob_item_slot/underwear key = STRIPPABLE_ITEM_UNDERWEAR - item_slot = SLOT_W_UNDERWEAR + item_slot = ITEM_SLOT_UNDERWEAR /datum/strippable_item/mob_item_slot/undershirt key = STRIPPABLE_ITEM_UNDERSHIRT - item_slot = SLOT_W_SHIRT + item_slot = ITEM_SLOT_SHIRT diff --git a/tgstation.dme b/tgstation.dme index bf27c2ed7f..9c0246dd74 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1485,6 +1485,7 @@ #include "code\modules\admin\outfits.dm" #include "code\modules\admin\permissionedit.dm" #include "code\modules\admin\player_panel.dm" +#include "code\modules\admin\playtimes.dm" #include "code\modules\admin\sound_emitter.dm" #include "code\modules\admin\sql_message_system.dm" #include "code\modules\admin\stickyban.dm" @@ -2275,6 +2276,7 @@ #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm" #include "code\modules\games\cas.dm" #include "code\modules\games\unum.dm" +#include "code\modules\holiday\dynamic.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\holidays.dm" #include "code\modules\holiday\halloween\bartholomew.dm" @@ -3920,7 +3922,6 @@ #include "modular_sand\code\game\objects\items\devices\extra_arm.dm" #include "modular_sand\code\game\objects\items\devices\PDA\PDA.dm" #include "modular_sand\code\game\objects\items\devices\radio\headset.dm" -#include "modular_sand\code\game\objects\items\devices\radio\radio.dm" #include "modular_sand\code\game\objects\items\plushes\goat_boss.dm" #include "modular_sand\code\game\objects\items\plushes\plushes.dm" #include "modular_sand\code\game\objects\items\robot\robot_upgrades.dm" diff --git a/tgui/packages/tgui/interfaces/Limbgrower.js b/tgui/packages/tgui/interfaces/Limbgrower.js index b91c7e4b45..e7e04d4f51 100644 --- a/tgui/packages/tgui/interfaces/Limbgrower.js +++ b/tgui/packages/tgui/interfaces/Limbgrower.js @@ -1,5 +1,5 @@ import { useBackend, useSharedState } from '../backend'; -import { Box, Button, Dimmer, Icon, LabeledList, Section, Tabs } from '../components'; +import { Box, Button, Dimmer, Icon, LabeledList, Section, Tabs, ProgressBar } from '../components'; import { Window } from '../layouts'; export const Limbgrower = (props, context) => { @@ -22,7 +22,7 @@ export const Limbgrower = (props, context) => { + height={760}> {!!busy && ( @@ -42,12 +42,19 @@ export const Limbgrower = (props, context) => {
    Containing data for {disk['name']},
    Attempting to create genitalia will use the disk's data. + Any Synthetic Frameworks created will + overwrite the race category selected.
    ) : disk['disk'] ? "No data." : "No disk."}
    - {total_reagents} / {max_reagents} reagent capacity used. + {/* Total_reagents could be null or undefined, so let's be safe */ + `Total Reagents/Maximum Reagents: + ${total_reagents ? total_reagents : 0}/${max_reagents}` + } + {reagents.map(reagent => ( @@ -56,13 +63,15 @@ export const Limbgrower = (props, context) => { label={reagent.reagent_name} buttons={( act('empty_reagent', { - reagent_type: reagent.reagent_type, - })} /> + onClick={() => { + act('empty_reagent', { reagent_type: reagent.reagent_type }); + + }} /> )}> {reagent.reagent_amount}u diff --git a/tgui/packages/tgui/interfaces/PlayerPlaytimes.js b/tgui/packages/tgui/interfaces/PlayerPlaytimes.js new file mode 100644 index 0000000000..0996b0ba04 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PlayerPlaytimes.js @@ -0,0 +1,119 @@ +import { useBackend } from '../backend'; +import { Button, Icon, Section, Table, Tooltip } from '../components'; +import { Window } from '../layouts'; + +export const PlayerPlaytimes = (props, context) => { + const { act, data } = useBackend(context); + const { + clients, + } = data; + return ( + + +
    + + + +
    + +
    +
    + +
    + Ckey +
    +
    + +
    + Real Name +
    +
    + +
    + Actions +
    +
    +
    + {clients.map(client => ( + + +
    +
    +
    + +
    + {!!client.new_account + && ( + + + + )} {client.ckey} +
    +
    + +
    + {!client.ingame ? (At lobby) + : (!!client.observer + && ( + + + ))} {client.name} +
    +
    + +
    +
    +
    +
    +
    + ))} +
    +
    +
    +
    + ); +}; From ddd36b40cf7b2c842f1422d010121c2cd123d005 Mon Sep 17 00:00:00 2001 From: BongaTheProto <93835010+BongaTheProto@users.noreply.github.com> Date: Sun, 27 Feb 2022 14:39:07 -0500 Subject: [PATCH 55/56] Merge part 2 Yeah this should fix everything with the update --- .../game/machinery/computer/communications.dm | 2 +- code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/playtimes.dm | 1 + .../game/objects/items/lewd_items/leash.dm | 6 ++-- .../game/objects/items/lewd_items/vibrator.dm | 2 +- .../game/objects/items/milking_machine.dm | 2 +- modular_splurt/code/__HELPERS/cmp.dm | 2 -- .../code/game/machinery/computer/slavery.dm | 2 +- .../object/items/devices/radio/electropack.dm | 2 +- .../code/modules/admin/playtimes.dm | 6 +++- .../antagonists/wendigo/mob/mob_equip.dm | 28 +++++++++---------- .../antagonists/wendigo/mob/update_icons.dm | 6 ++-- .../lewd_clothing/collar/kink_collars.dm | 2 +- .../clothing/lewd_clothing/foot/lewd_shoes.dm | 2 +- .../lewd_clothing/gloves/lewd_gloves.dm | 2 +- .../lewd_clothing/head/deprivation_helmet.dm | 16 +++++------ .../hostile/deathclaw/funclaw.dm | 12 ++++---- 17 files changed, 49 insertions(+), 46 deletions(-) delete mode 100644 modular_splurt/code/__HELPERS/cmp.dm diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 1b9141ab01..a93a7cfc3b 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -433,7 +433,7 @@ var/mob/living/L = C.loc var/turf/pos = get_turf(L) - if(!pos || C != L.get_item_by_slot(SLOT_NECK)) + if(!pos || C != L.get_item_by_slot(ITEM_SLOT_NECK)) continue var/list/slave = list() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9d92d08385..b6948eadab 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -72,7 +72,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/cmd_admin_man_up_global, //CIT CHANGE - ditto /client/proc/cmd_admin_create_centcom_report, /client/proc/cmd_change_command_name, - /client/proc/cmd_player_playtimes, /* shows players by playtime */ + /client/proc/cmd_admin_check_player_exp, /* shows players by playtime */ /client/proc/toggle_combo_hud, // toggle display of the combination pizza antag and taco sci/med/eng hud /client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/ /datum/admins/proc/open_shuttlepanel, /* Opens shuttle manipulator UI */ diff --git a/code/modules/admin/playtimes.dm b/code/modules/admin/playtimes.dm index 7cf24d9746..c9c908629b 100644 --- a/code/modules/admin/playtimes.dm +++ b/code/modules/admin/playtimes.dm @@ -20,6 +20,7 @@ client["ckey"] = C.ckey client["playtime"] = C.get_exp_living(TRUE) client["playtime_hours"] = C.get_exp_living() + client["flags"] = check_flags(C) var/mob/M = C.mob client["observer"] = isobserver(M) diff --git a/modular_sand/code/game/objects/items/lewd_items/leash.dm b/modular_sand/code/game/objects/items/lewd_items/leash.dm index 8aa8864b2b..6e788a5593 100644 --- a/modular_sand/code/game/objects/items/lewd_items/leash.dm +++ b/modular_sand/code/game/objects/items/lewd_items/leash.dm @@ -92,7 +92,7 @@ Icons, maybe? if(C.has_status_effect(/datum/status_effect/leash_pet)) //If the pet is already leashed, do not leash them. For the love of god. to_chat(user, "[C] has already been leashed.") return - if(istype(C.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/petcollar) || istype(C.get_item_by_slot(SLOT_NECK), /obj/item/electropack/shockcollar)) + if(istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/clothing/neck/petcollar) || istype(C.get_item_by_slot(ITEM_SLOT_NECK), /obj/item/electropack/shockcollar)) var/leashtime = 50 if(C.handcuffed) leashtime = 5 @@ -124,7 +124,7 @@ Icons, maybe? sleep(2) //Check every other tick if(leash_pet == "null") //No pet, break loop return - if(!(leash_pet.get_item_by_slot(SLOT_NECK))) //The pet has slipped their collar and is not the pet anymore. + if(!(leash_pet.get_item_by_slot(ITEM_SLOT_NECK))) //The pet has slipped their collar and is not the pet anymore. for(var/mob/viewing in viewers(user, null)) viewing.show_message("[leash_pet] has slipped out of their collar!!", 1) to_chat(leash_pet, "You have slipped out of your collar!") @@ -388,7 +388,7 @@ Icons, maybe? addtimer(CALLBACK(src, .proc/drop_effects, user, silent), 1) /obj/item/leash/proc/drop_effects(mob/user, silent) - if(leash_master.is_holding_item_of_type(/obj/item/leash) || istype(leash_master.get_item_by_slot(SLOT_BELT), /obj/item/leash)) + if(leash_master.is_holding_item_of_type(/obj/item/leash) || istype(leash_master.get_item_by_slot(ITEM_SLOT_BELT), /obj/item/leash)) return //Dom still has the leash as it turns out. Cancel the proc. for(var/mob/viewing in viewers(leash_master, null)) viewing.show_message("[leash_master] has dropped the leash.", 1) diff --git a/modular_sand/code/game/objects/items/lewd_items/vibrator.dm b/modular_sand/code/game/objects/items/lewd_items/vibrator.dm index bd91c5a5e0..9f18b726c6 100644 --- a/modular_sand/code/game/objects/items/lewd_items/vibrator.dm +++ b/modular_sand/code/game/objects/items/lewd_items/vibrator.dm @@ -8,7 +8,7 @@ icon_state = "vibe" item_state = "vibe" w_class = WEIGHT_CLASS_SMALL - slot_flags = ITEM_SLOT_DENYPOCKET //no more pocket shockers + //slot_flags = ITEM_SLOT_DENYPOCKET //no more pocket shockers var/equipment_slot = GENITAL_EQUIPMENT_VIBRATOR var/mode = 1 var/style = "long" diff --git a/modular_sand/code/game/objects/items/milking_machine.dm b/modular_sand/code/game/objects/items/milking_machine.dm index 5f1c8ad865..b485641ddc 100644 --- a/modular_sand/code/game/objects/items/milking_machine.dm +++ b/modular_sand/code/game/objects/items/milking_machine.dm @@ -5,7 +5,7 @@ item_state = "Off" desc = "A pocket sized pump and tubing assembly designed to collect and store products from mammary glands." - slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKETS var/on = FALSE var/obj/item/reagent_containers/inserted_item = null diff --git a/modular_splurt/code/__HELPERS/cmp.dm b/modular_splurt/code/__HELPERS/cmp.dm deleted file mode 100644 index b2ce9eb938..0000000000 --- a/modular_splurt/code/__HELPERS/cmp.dm +++ /dev/null @@ -1,2 +0,0 @@ -/proc/cmp_playtime(list/A, list/B) - return A["playtime"] - B["playtime"] diff --git a/modular_splurt/code/game/machinery/computer/slavery.dm b/modular_splurt/code/game/machinery/computer/slavery.dm index 8276f62302..28c800beba 100644 --- a/modular_splurt/code/game/machinery/computer/slavery.dm +++ b/modular_splurt/code/game/machinery/computer/slavery.dm @@ -87,7 +87,7 @@ var/mob/living/L = C.loc var/turf/pos = get_turf(L) - if(!pos || C != L.get_item_by_slot(SLOT_NECK)) + if(!pos || C != L.get_item_by_slot(ITEM_SLOT_NECK)) continue var/list/slave = list() diff --git a/modular_splurt/code/game/object/items/devices/radio/electropack.dm b/modular_splurt/code/game/object/items/devices/radio/electropack.dm index 85821e5bd3..95b0a4e7b8 100644 --- a/modular_splurt/code/game/object/items/devices/radio/electropack.dm +++ b/modular_splurt/code/game/object/items/devices/radio/electropack.dm @@ -36,7 +36,7 @@ if(isliving(user)) var/mob/living/M = user - if(slot == SLOT_NECK) + if(slot == ITEM_SLOT_NECK) playsound(get_turf(M), 'sound/machines/triple_beep.ogg', 50, 1) ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) diff --git a/modular_splurt/code/modules/admin/playtimes.dm b/modular_splurt/code/modules/admin/playtimes.dm index 126631699c..8dbdf7b22e 100644 --- a/modular_splurt/code/modules/admin/playtimes.dm +++ b/modular_splurt/code/modules/admin/playtimes.dm @@ -12,6 +12,8 @@ var/touched_circuit = FALSE var/uses_vpn = FALSE +//Most of this data is now unused except for the flags +/* /client/proc/cmd_player_playtimes() set category = "Admin" set name = "Player Playtimes" @@ -64,6 +66,7 @@ clients = sortList(clients, /proc/cmp_playtime) data["clients"] = clients return data +*/ /datum/player_playtime/proc/check_flags(client/C) var/list/flags = list() @@ -105,7 +108,7 @@ flags += list(flag) return flags - +/* /datum/player_playtime/ui_act(action, params) if(..()) return @@ -125,3 +128,4 @@ return var/mob/dead/observer/A = C.mob A.ManualFollow(target) +*/ diff --git a/modular_splurt/code/modules/antagonists/wendigo/mob/mob_equip.dm b/modular_splurt/code/modules/antagonists/wendigo/mob/mob_equip.dm index 404f43b70f..88854925f3 100644 --- a/modular_splurt/code/modules/antagonists/wendigo/mob/mob_equip.dm +++ b/modular_splurt/code/modules/antagonists/wendigo/mob/mob_equip.dm @@ -1,57 +1,57 @@ /mob/living/carbon/wendigo/can_equip(obj/item/I, slot, disable_warning, bypass_equip_delay_self, clothing_check, list/return_warning) switch(slot) - if(SLOT_HANDS) + if(ITEM_SLOT_HANDS) if(get_empty_held_indexes()) return TRUE return FALSE - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) if(glasses) return FALSE if(!(I.slot_flags & ITEM_SLOT_EYES)) return FALSE return TRUE - if(SLOT_NECK) + if(ITEM_SLOT_NECK) if(wear_neck) return FALSE if(!(I.slot_flags & ITEM_SLOT_NECK)) return FALSE return TRUE - if(SLOT_EARS_LEFT) + if(ITEM_SLOT_EARS_LEFT) if(ears) return FALSE if(!(I.slot_flags & ITEM_SLOT_EARS)) return FALSE return TRUE - if(SLOT_EARS_RIGHT) + if(ITEM_SLOT_EARS_RIGHT) if(ears_extra) return FALSE if(!(I.slot_flags & ITEM_SLOT_EARS)) return FALSE return TRUE - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) if(gloves) return FALSE if(!(I.slot_flags & ITEM_SLOT_GLOVES)) return FALSE return TRUE - if(SLOT_BACK) + if(ITEM_SLOT_BACK) if(back) return FALSE if(!(I.slot_flags & ITEM_SLOT_BACK)) return FALSE return TRUE - if(SLOT_IN_BACKPACK) + if(ITEM_SLOT_BACKPACK) if(back) if(SEND_SIGNAL(back, COMSIG_TRY_STORAGE_CAN_INSERT, I, src, TRUE)) return TRUE return FALSE - if(SLOT_HEAD) + if(ITEM_SLOT_HEAD) if(head) return FALSE if(!(I.slot_flags & ITEM_SLOT_HEAD)) return FALSE return TRUE - if(SLOT_BELT) + if(ITEM_SLOT_BELT) if(belt) return FALSE if(!(I.slot_flags & ITEM_SLOT_BELT)) @@ -63,16 +63,16 @@ if(!..()) return switch(slot) - if(SLOT_GLASSES) + if(ITEM_SLOT_EYES) glasses = I update_inv_glasses() - if(SLOT_EARS_LEFT) + if(ITEM_SLOT_EARS_LEFT) ears = I update_inv_ears() - if(SLOT_EARS_RIGHT) + if(ITEM_SLOT_EARS_RIGHT) ears_extra = I update_inv_ears_extra() - if(SLOT_GLOVES) + if(ITEM_SLOT_GLOVES) gloves = I update_inv_gloves() return TRUE diff --git a/modular_splurt/code/modules/antagonists/wendigo/mob/update_icons.dm b/modular_splurt/code/modules/antagonists/wendigo/mob/update_icons.dm index ca27e1a0eb..c390cf0d67 100644 --- a/modular_splurt/code/modules/antagonists/wendigo/mob/update_icons.dm +++ b/modular_splurt/code/modules/antagonists/wendigo/mob/update_icons.dm @@ -107,7 +107,7 @@ remove_overlay(EAR_LEFT_LAYER) if(ears) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS_LEFT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[ITEM_SLOT_EARS_LEFT] inv.update_icon() ears.screen_loc = ui_ears //move the item to the appropriate screen loc if(client && hud_used && hud_used.hud_shown) @@ -136,7 +136,7 @@ remove_overlay(EAR_RIGHT_LAYER) if(ears_extra) if(client && hud_used) - var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS_RIGHT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[ITEM_SLOT_EARS_RIGHT] inv.update_icon() ears_extra.screen_loc = ui_ears //move the item to the appropriate screen loc if(client && hud_used && hud_used.hud_shown) @@ -336,7 +336,7 @@ if(WEST) head_icon.pixel_x += HEAD_X_OFFSET_WEST head_icon.pixel_y += HEAD_Y_OFFSET_WEST - overlays_standing[SLOT_HEAD] = head_icon + overlays_standing[ITEM_SLOT_HEAD] = head_icon update_hud_head(head) apply_overlay(HEAD_LAYER) diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm b/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm index 390bccf445..d170e12dba 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/collar/kink_collars.dm @@ -55,7 +55,7 @@ return ..() /obj/item/clothing/neck/mind_collar/attack_hand(mob/living/carbon/human/user) var/mob/living/carbon/human/C = user - if(iscarbon(user) && seamless && (user.get_item_by_slot(SLOT_NECK))) + if(iscarbon(user) && seamless && (user.get_item_by_slot(ITEM_SLOT_NECK))) to_chat(C, span_purple(pick("You can't seem to find the release latch for the collar!", "The collar refuses to budge while you tug at it.", "Your hands uselessly roam along the strange device."))) diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm b/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm index 5dbb0afb3c..b03e727554 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/foot/lewd_shoes.dm @@ -17,7 +17,7 @@ //it takes time to put them off, do not touch /obj/item/clothing/shoes/latexheels/attack_hand(mob/user) var/mob/living/carbon/C = user - if(iscarbon(user) && (user.get_item_by_slot(SLOT_SHOES) == src)) + if(iscarbon(user) && (user.get_item_by_slot(ITEM_SLOT_FEET) == src)) if(seamless) to_chat(C, span_purple(pick("You slide your heels against eachother in a failed attempt at kicking them off.", "The heels refuse to budge no matter how much you tug.", diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/gloves/lewd_gloves.dm b/modular_splurt/code/modules/clothing/lewd_clothing/gloves/lewd_gloves.dm index b7df45ddee..0f1318d94f 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/gloves/lewd_gloves.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/gloves/lewd_gloves.dm @@ -12,7 +12,7 @@ /obj/item/clothing/gloves/latex_gloves/attack_hand(mob/living/carbon/human/user) var/mob/living/carbon/human/C = user - if(iscarbon(user) && seamless && (user.get_item_by_slot(SLOT_GLOVES) == src)) + if(iscarbon(user) && seamless && (user.get_item_by_slot(ITEM_SLOT_GLOVES) == src)) to_chat(C, span_purple(pick("You rub your gloved fingers together as you search for some sort of escape.", "You can't find any leverage to remove these gloves!", "Your pointless clawing seems to only make things more skin tight"))) diff --git a/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm b/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm index 2bf43a7f80..c397bcb6e8 100644 --- a/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm +++ b/modular_splurt/code/modules/clothing/lewd_clothing/head/deprivation_helmet.dm @@ -77,14 +77,14 @@ muzzle = FALSE //playsound(usr, 'sound/weapons/magout.ogg', 40, TRUE, ignore_walls = FALSE) to_chat(usr, span_notice("Speech switch off")) - if(usr.get_item_by_slot(SLOT_HEAD) == src) + if(usr.get_item_by_slot(ITEM_SLOT_HEAD) == src) REMOVE_TRAIT(usr, TRAIT_MUTE, CLOTHING_TRAIT) to_chat(usr, span_purple("Your mouth is free. you breathe out with relief.")) else muzzle = TRUE //playsound(usr, 'sound/weapons/magin.ogg', 40, TRUE, ignore_walls = FALSE) to_chat(usr, span_notice("Speech switch on")) - if(usr.get_item_by_slot(SLOT_HEAD) == src) + if(usr.get_item_by_slot(ITEM_SLOT_HEAD) == src) ADD_TRAIT(usr, TRAIT_MUTE, CLOTHING_TRAIT) to_chat(usr, span_purple("Something is gagging your mouth! You can't even make a sound...")) if(C == "hearing") @@ -92,7 +92,7 @@ earmuffs = FALSE //playsound(usr, 'sound/weapons/magout.ogg', 40, TRUE, ignore_walls = FALSE) to_chat(usr, span_notice("Hearing switch off")) - if(usr.get_item_by_slot(SLOT_HEAD) == src) + if(usr.get_item_by_slot(ITEM_SLOT_HEAD) == src) REMOVE_TRAIT(usr, TRAIT_DEAF, CLOTHING_TRAIT) //Toggle_Sounds() to_chat(usr, span_purple("Finally you can hear the world around again.")) @@ -100,7 +100,7 @@ earmuffs = TRUE //playsound(usr, 'sound/weapons/magin.ogg', 40, TRUE, ignore_walls = FALSE) to_chat(usr, span_notice("Hearing switch on")) - if(usr.get_item_by_slot(SLOT_HEAD) == src) + if(usr.get_item_by_slot(ITEM_SLOT_HEAD) == src) ADD_TRAIT(usr, TRAIT_DEAF, CLOTHING_TRAIT) //Toggle_Sounds() //stop_client_sounds() @@ -111,14 +111,14 @@ prevent_vision = FALSE //playsound(usr, 'sound/weapons/magout.ogg', 40, TRUE, ignore_walls = FALSE) to_chat(usr, span_notice("Vision switch off")) - if(usr.get_item_by_slot(SLOT_HEAD) == src) + if(usr.get_item_by_slot(ITEM_SLOT_HEAD) == src) user.become_blind("deprivation_helmet_[REF(src)]") to_chat(usr, span_purple("Helmet no longer restricts your vision.")) else prevent_vision = TRUE //playsound(usr, 'sound/weapons/magin.ogg', 40, TRUE, ignore_walls = FALSE) to_chat(usr, span_notice("Vision switch on")) - if(usr.get_item_by_slot(SLOT_HEAD) == src) + if(usr.get_item_by_slot(ITEM_SLOT_HEAD) == src) user.become_blind("deprivation_helmet_[REF(src)]") to_chat(usr, span_purple("The helmet is blocking your vision! You can't make out anything on the other side...")) @@ -185,7 +185,7 @@ /obj/item/clothing/head/helmet/space/deprivation_helmet/equipped(mob/living/carbon/human/user, slot) . = ..() - if(slot != SLOT_HEAD) + if(slot != ITEM_SLOT_HEAD) return if(muzzle == TRUE) ADD_TRAIT(user, TRAIT_MUTE, CLOTHING_TRAIT) @@ -222,7 +222,7 @@ to_chat(user, span_purple("The helmet no longer restricts your vision.")) /obj/item/clothing/head/helmet/space/deprivation_helmet/attack_hand(mob/living/carbon/human/user) - if(iscarbon(user) && seamless && (user.get_item_by_slot(SLOT_HEAD) == src)) + if(iscarbon(user) && seamless && (user.get_item_by_slot(ITEM_SLOT_HEAD) == src)) to_chat(user, span_purple(pick("You roam your hands around the helmet for some sort of release!", "You find it impossible to leverage your fingers underneath the helmet", "The durable material seems to reflect your pointless force."))) diff --git a/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm b/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm index ff08f4ec2e..3c213c9217 100644 --- a/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm +++ b/modular_splurt/code/modules/mob/living/carbon/human/simple_animal/hostile/deathclaw/funclaw.dm @@ -92,9 +92,9 @@ switch(chosen_hole) if(CUM_TARGET_ANUS) - if(tearSlot(M, SLOT_WEAR_SUIT)) + if(tearSlot(M, ITEM_SLOT_OCLOTHING)) return - if(tearSlot(M, SLOT_W_UNIFORM)) + if(tearSlot(M, ITEM_SLOT_ICLOTHING)) return // Abomination deathclaws do other stuff instead @@ -108,9 +108,9 @@ do_anal(M) if(CUM_TARGET_VAGINA) - if(tearSlot(M, SLOT_WEAR_SUIT)) + if(tearSlot(M, ITEM_SLOT_OCLOTHING)) return - if(tearSlot(M, SLOT_W_UNIFORM)) + if(tearSlot(M, ITEM_SLOT_ICLOTHING)) return // Abomination deathclaws do other stuff instead @@ -121,9 +121,9 @@ do_vaginal(M) if(CUM_TARGET_THROAT) - if(tearSlot(M, SLOT_HEAD)) + if(tearSlot(M, ITEM_SLOT_HEAD)) return - if(tearSlot(M, SLOT_WEAR_MASK)) + if(tearSlot(M, ITEM_SLOT_MASK)) return // Abomination deathclaws do other stuff instead From 951a7907a1c80153ba47f59de33f1e8e77c4ae35 Mon Sep 17 00:00:00 2001 From: SPLURT Bot <97993072+SPLURT-Station-Bot@users.noreply.github.com> Date: Sun, 27 Feb 2022 19:51:40 +0000 Subject: [PATCH 56/56] Automatic changelog generation for PR #213 [ci skip] --- html/changelogs/AutoChangeLog-pr-213.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-213.yml diff --git a/html/changelogs/AutoChangeLog-pr-213.yml b/html/changelogs/AutoChangeLog-pr-213.yml new file mode 100644 index 0000000000..8c1b71aec3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-213.yml @@ -0,0 +1,22 @@ +author: radar651 +delete-after: true +changes: + - rscadd: Added several .22 caliber weapons, .22 Revolver, .22 Pistol and Varmint + Rifle + - rscadd: Added a unique 9mm pistol with a skin (MARIA) + - rscadd: Added a hunting rifle that uses 7.62 ammo and stripper clips. This can + be sawn off like the double barrel + - rscadd: a dedicated swan off shotgun + - rscadd: butterfly knife + - rscadd: switchblade to the goodies pack + - rscadd: M2A1 .50 Caliber Heavy Machine gun (ADMIN SPAWNABLE ONLY) + - rscadd: Civilian energy gun, which can be upgraded to shoot lethal with the right + parts + - rscadd: The double barrel shotgun to the goodies pack + - rscadd: M1911s to be ordered from cargo + - rscadd: Enforcer pistols to be ordered from cargo + - rscadd: a lot of weapon recipes as most guns bought through goodies have to be + assembled. + - bugfix: the improvised shotgun sprite disappearing + - imageadd: updated several old sprites including the brush gun and M1911 sprites + with the desert rose variant. The original sprites still exist just remain unused.