From 2c111329ca210063094dae70d8906fb7c8f67cff Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 13 Nov 2024 20:59:56 -0500 Subject: [PATCH 001/554] Fix reagent overlay colours --- code/game/objects/items/__item.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 3575c49f2f4..d2fd23ce7b1 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -1219,6 +1219,6 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. for(var/reagent_type in reagents.reagent_volumes) var/decl/material/reagent = GET_DECL(reagent_type) var/modified_reagent_overlay = state_prefix ? "[state_prefix]_[reagent.reagent_overlay]" : reagent.reagent_overlay - if(modified_reagent_overlay && check_state_in_icon(modified_reagent_overlay, icon)) - reagent_overlay.overlays += overlay_image(icon, modified_reagent_overlay, reagent.get_reagent_color(), RESET_COLOR | RESET_ALPHA) + if(reagent.reagent_overlay && check_state_in_icon(modified_reagent_overlay, icon)) + reagent_overlay.overlays += overlay_image(icon, modified_reagent_overlay, reagent.get_reagent_color(reagents), RESET_COLOR | RESET_ALPHA) return reagent_overlay From 3084439126fc68e68c4b520d27e2b5b249af0369 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 13 Nov 2024 21:00:32 -0500 Subject: [PATCH 002/554] Fix object edibility checks --- code/game/objects/obj_edibility.dm | 2 +- code/modules/mob/mob_eating.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/obj_edibility.dm b/code/game/objects/obj_edibility.dm index f58e6721d98..9fa4ec70827 100644 --- a/code/game/objects/obj_edibility.dm +++ b/code/game/objects/obj_edibility.dm @@ -133,7 +133,7 @@ show_food_no_mouth_message(user, target) return EATEN_UNABLE - if(!target.can_eat_food_currently(src, user)) + if(!target.can_eat_food_currently(src, user, consumption_method)) return EATEN_UNABLE var/blocked = target.check_mouth_coverage() diff --git a/code/modules/mob/mob_eating.dm b/code/modules/mob/mob_eating.dm index f5e692facfd..2d9170878b8 100644 --- a/code/modules/mob/mob_eating.dm +++ b/code/modules/mob/mob_eating.dm @@ -8,7 +8,7 @@ if(issmall(src)) . = ceil(.*0.5) -/mob/proc/can_eat_food_currently(obj/eating, mob/user) +/mob/proc/can_eat_food_currently(obj/eating, mob/user, consumption_method) return TRUE #define EATING_NO_ISSUE 0 From 75cddd63028d12d863e0da4dfbb666b679c06fa0 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 13 Nov 2024 21:00:45 -0500 Subject: [PATCH 003/554] Fix chopped meat filling colour --- code/modules/butchery/butchery_products_chopped.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/butchery/butchery_products_chopped.dm b/code/modules/butchery/butchery_products_chopped.dm index 400418476ee..b750d2e46b9 100644 --- a/code/modules/butchery/butchery_products_chopped.dm +++ b/code/modules/butchery/butchery_products_chopped.dm @@ -5,6 +5,7 @@ bitesize = 2 nutriment_amt = 1 w_class = ITEM_SIZE_TINY + filling_color = "#ff1c1c" /obj/item/food/butchery/chopped/Initialize(mapload, material_key, skip_plate = FALSE) . = ..() From 179bef33049385cc014dba428f69797f56bd8f80 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 13 Nov 2024 21:02:27 -0500 Subject: [PATCH 004/554] Give butchery items flavours other than 'umami' --- code/modules/butchery/butchery_products.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/butchery/butchery_products.dm b/code/modules/butchery/butchery_products.dm index 7d2f0d8a6bb..d275e42576c 100644 --- a/code/modules/butchery/butchery_products.dm +++ b/code/modules/butchery/butchery_products.dm @@ -25,6 +25,10 @@ slice_path = butchery_decl.meat_type if(isnull(slice_num)) slice_num = butchery_decl.meat_amount + if(butchery_decl.meat_name) + nutriment_desc = list((butchery_decl.meat_name) = 10) + else if(meat_name) // premapped + nutriment_desc = list((meat_name) = 10) . = ..() if(butchery_decl) add_allergen_flags(butchery_decl.meat_flags) From b6f8126dbb5409114d6106b75b45b91658effa99 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 15 Nov 2024 11:32:56 +1100 Subject: [PATCH 005/554] Moves solar daycycle onto base level data type. --- code/modules/multiz/level_data.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/multiz/level_data.dm b/code/modules/multiz/level_data.dm index 96254e43b06..69ee279edba 100644 --- a/code/modules/multiz/level_data.dm +++ b/code/modules/multiz/level_data.dm @@ -162,9 +162,9 @@ ///Determines if edge turfs should be centered on the map dimensions. var/origin_is_world_center = TRUE /// If not null, this level will register with a daycycle id/type on New(). - var/daycycle_id + var/daycycle_id = "general_solars" /// Type provided to the above. - var/daycycle_type = /datum/daycycle/exoplanet + var/daycycle_type = /datum/daycycle/solars /// Extra spacing needed between any random level templates and the transition edge of a level. /// Note that this is more or less unnecessary if you are using a mapped area that doesn't stretch to the edge of the level. @@ -701,8 +701,6 @@ INITIALIZE_IMMEDIATE(/obj/abstract/level_data_spawner) // Level Data Implementations //////////////////////////////////////////// /datum/level_data/space - daycycle_id = "space_solars" - daycycle_type = /datum/daycycle/solars /datum/level_data/debug name = "Debug Level" From 84ac35586055b9d3b45552facfdf51ea6e56e938 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 13 Nov 2024 21:49:56 -0500 Subject: [PATCH 006/554] Fix stack and prayer bead gender Improve stack names --- code/game/objects/items/stacks/stack.dm | 11 +++++++++++ code/modules/clothing/neck/jewelry.dm | 1 + code/modules/materials/_material_stack.dm | 11 +++-------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index e5ba8af2d3f..2a38b4f01c3 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -50,6 +50,16 @@ singular_name = "sheet" if(!plural_name) plural_name = text_make_plural(singular_name) + update_name() + +/obj/item/stack/update_name() + . = ..() + if(amount == 1) + gender = NEUTER + SetName(singular_name) + else + gender = PLURAL + SetName(plural_name) /obj/item/stack/Destroy() if (src && usr && usr.machine == src) @@ -291,6 +301,7 @@ for(var/i = 1 to charge_costs.len) var/datum/matter_synth/S = synths[i] S.use_charge(charge_costs[i] * used) // Doesn't need to be deleted + update_name() update_icon() return TRUE diff --git a/code/modules/clothing/neck/jewelry.dm b/code/modules/clothing/neck/jewelry.dm index 9f30ace8ac8..f52d21361d5 100644 --- a/code/modules/clothing/neck/jewelry.dm +++ b/code/modules/clothing/neck/jewelry.dm @@ -9,6 +9,7 @@ name = "prayer beads" desc = "A string of smooth, polished beads." icon = 'icons/clothing/accessories/jewelry/prayer_beads.dmi' + gender = PLURAL material = /decl/material/solid/organic/wood/ebony /obj/item/clothing/neck/necklace/prayer_beads/gold diff --git a/code/modules/materials/_material_stack.dm b/code/modules/materials/_material_stack.dm index 776f0da2ffb..0d6f7161dea 100644 --- a/code/modules/materials/_material_stack.dm +++ b/code/modules/materials/_material_stack.dm @@ -64,6 +64,9 @@ /obj/item/stack/material/proc/special_crafting_check() return TRUE +/obj/item/stack/material/update_name() + update_strings() + /obj/item/stack/material/proc/update_strings() var/prefix_name = name_modifier ? "[name_modifier] " : "" if(amount>1) @@ -85,10 +88,6 @@ else origin_tech = initial(origin_tech) -/obj/item/stack/material/use(var/used) - . = ..() - update_strings() - /obj/item/stack/material/clear_matter() ..() reinf_material = null @@ -109,10 +108,6 @@ if(!is_same(M)) return 0 . = ..(M,tamount,1) - if(!QDELETED(src)) - update_strings() - if(!QDELETED(M)) - M.update_strings() /obj/item/stack/material/copy_from(var/obj/item/stack/material/other) ..() From 0a60b0f2caebb8affc4ae46fe67a1d0179dc1eef Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 13 Nov 2024 21:50:38 -0500 Subject: [PATCH 007/554] Fix loot piles being re-looted --- mods/content/dungeon_loot/_dungeon_loot.dm | 2 +- mods/content/dungeon_loot/loot_pile.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/content/dungeon_loot/_dungeon_loot.dm b/mods/content/dungeon_loot/_dungeon_loot.dm index 176ce11422b..0591781ed1c 100644 --- a/mods/content/dungeon_loot/_dungeon_loot.dm +++ b/mods/content/dungeon_loot/_dungeon_loot.dm @@ -17,4 +17,4 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /decl/modpack/dungeon_loot name = "Dungeon Loot" - dreams = list("Packrats") + dreams = list("packrats") diff --git a/mods/content/dungeon_loot/loot_pile.dm b/mods/content/dungeon_loot/loot_pile.dm index b488fd95abf..5289e4ea5aa 100644 --- a/mods/content/dungeon_loot/loot_pile.dm +++ b/mods/content/dungeon_loot/loot_pile.dm @@ -62,7 +62,7 @@ return TRUE //You already searched this one - if(!allow_multiple_looting && LAZYISIN(user.ckey, searched_by)) + if(!allow_multiple_looting && LAZYISIN(searched_by, user.ckey)) to_chat(L, SPAN_WARNING("You can't find anything else vaguely useful in \the [src]. Another set of eyes might, however.")) return TRUE From 6632b572e9c808b2ca6e24d214c56023306b4bec Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 13 Nov 2024 21:51:49 -0500 Subject: [PATCH 008/554] Rename champagne bottle in fantasy modpack --- mods/content/fantasy/items/material_overrides.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/content/fantasy/items/material_overrides.dm b/mods/content/fantasy/items/material_overrides.dm index d761bae31b7..7e1f3dd0b44 100644 --- a/mods/content/fantasy/items/material_overrides.dm +++ b/mods/content/fantasy/items/material_overrides.dm @@ -7,6 +7,9 @@ color = /decl/material/solid/organic/wood/walnut::color // FRANCE ISN'T REAL +/obj/item/chems/drinks/bottle/champagne + name = "sparkling wine bottle" + /decl/material/liquid/ethanol/champagne name = "sparkling wine" glass_name = "sparkling wine" From 632d439bad2c29938a25a4d2bfb17801a7faf116 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 13 Nov 2024 21:52:21 -0500 Subject: [PATCH 009/554] Rename white wine in fantasy modpack --- .../reagents/reagent_containers/drinks/bottle.dm | 11 ++++++++--- mods/content/fantasy/items/material_overrides.dm | 10 ++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index 1bca3f9d3a0..6d5bebfe3ef 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -518,11 +518,16 @@ desc = "You feel pretentious just looking at it." icon_state = "premiumwine" center_of_mass = @'{"x":16,"y":4}' + var/aged_min = 0 + var/aged_max = 150 -/obj/item/chems/drinks/bottle/premiumwine/populate_reagents() +/obj/item/chems/drinks/bottle/premiumwine/proc/make_random_name() var/namepick = pick("Calumont","Sciacchemont","Recioto","Torcalota") - var/agedyear = rand(global.using_map.game_year - 150, global.using_map.game_year) - name = "Chateau [namepick] De Blanc" + return "bottle of Chateau [namepick] De Blanc" + +/obj/item/chems/drinks/bottle/premiumwine/populate_reagents() + var/agedyear = rand(global.using_map.game_year - aged_max, global.using_map.game_year - aged_min) + set_custom_name(make_random_name()) desc += " This bottle is marked as [agedyear] Vintage." add_to_reagents(/decl/material/liquid/ethanol/wine/premium, reagents.maximum_volume) diff --git a/mods/content/fantasy/items/material_overrides.dm b/mods/content/fantasy/items/material_overrides.dm index 7e1f3dd0b44..9b44d28f029 100644 --- a/mods/content/fantasy/items/material_overrides.dm +++ b/mods/content/fantasy/items/material_overrides.dm @@ -15,3 +15,13 @@ glass_name = "sparkling wine" glass_desc = "Sparkling white wine, a favourite at noble and merchant parties." lore_text = "Sparkling white wine, a favourite at noble and merchant parties." + +/obj/item/chems/drinks/bottle/premiumwine + name = "vintage Imperial white wine" + desc = "An expensive-looking bottle of white wine, no doubt predating the fall of the Aegis, with the name of the city or settlement that produced it written on it." + aged_min = 98 + aged_max = 420 + +/obj/item/chems/drinks/bottle/premiumwine/make_random_name() + var/decl/language/hnoll/hnoll_language = GET_DECL(/decl/language/hnoll) + return "bottle of vintage [hnoll_language.get_random_name(FEMALE, name_count = prob(20) ? 2 : 1)]" \ No newline at end of file From 5e29e2a748f67d053be28a321f3fdcdbe4ccde56 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 13 Nov 2024 21:55:24 -0500 Subject: [PATCH 010/554] Add noodle soup Fix soup codex strings --- code/__defines/mobs.dm | 1 + code/__defines/reagent_data_fields.dm | 4 ++++ code/_helpers/game.dm | 5 +++++ code/game/objects/items/__item.dm | 2 +- code/modules/food/cooking/_recipe.dm | 5 +---- code/modules/food/cooking/recipes/recipe_soup.dm | 11 +++++++++++ .../food/cooking/recipes/recipe_soup_noodle.dm | 7 +++++++ .../food/cooking/recipes/recipe_soup_stock.dm | 2 ++ code/modules/materials/_materials.dm | 9 +++++++++ .../definitions/liquids/materials_liquid_soup.dm | 13 +++++++++++++ code/modules/reagents/reagent_containers/bowl.dm | 11 +++++++++++ nebula.dme | 1 + 12 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 code/modules/food/cooking/recipes/recipe_soup_noodle.dm diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index ca00ffc65a7..9d48c45354b 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -233,6 +233,7 @@ #define DATA_INGREDIENT_FLAGS /decl/reagent_data_field/ingredient_flags #define DATA_MASK_COLOR /decl/reagent_data_field/mask_color #define DATA_MASK_NAME /decl/reagent_data_field/mask_name +#define DATA_EXTRA_COLOR /decl/reagent_data_field/extra_color // Milk and chees data flags #define DATA_MILK_DONOR /decl/reagent_data_field/milk_donor diff --git a/code/__defines/reagent_data_fields.dm b/code/__defines/reagent_data_fields.dm index 5199292ab35..0caef07d225 100644 --- a/code/__defines/reagent_data_fields.dm +++ b/code/__defines/reagent_data_fields.dm @@ -17,6 +17,10 @@ /decl/reagent_data_field/mask_color uid = "rdf_mask_color" +/// An extra colour used for things like additional reagent overlays on soups, so that you can have noodle soup with veggie bits a different colour than the main soup. +/decl/reagent_data_field/extra_color + uid = "rdf_extra_color" + /decl/reagent_data_field/mask_name uid = "rdf_mask_name" diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 2f5d2eb8e35..57710a15858 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -288,6 +288,11 @@ src.dest_y = dest_y /proc/MixColors(const/list/colors) + switch(length(colors)) + if(1) + return colors[1] + if(2) + return BlendRGBasHSV(colors[1], colors[2], 0.5) var/list/reds = list() var/list/blues = list() var/list/greens = list() diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index d2fd23ce7b1..824c679dd92 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -1220,5 +1220,5 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. var/decl/material/reagent = GET_DECL(reagent_type) var/modified_reagent_overlay = state_prefix ? "[state_prefix]_[reagent.reagent_overlay]" : reagent.reagent_overlay if(reagent.reagent_overlay && check_state_in_icon(modified_reagent_overlay, icon)) - reagent_overlay.overlays += overlay_image(icon, modified_reagent_overlay, reagent.get_reagent_color(reagents), RESET_COLOR | RESET_ALPHA) + reagent_overlay.overlays += overlay_image(icon, modified_reagent_overlay, reagent.get_reagent_overlay_color(reagents), RESET_COLOR | RESET_ALPHA) return reagent_overlay diff --git a/code/modules/food/cooking/_recipe.dm b/code/modules/food/cooking/_recipe.dm index 3e52c0702b7..03d19d7afc8 100644 --- a/code/modules/food/cooking/_recipe.dm +++ b/code/modules/food/cooking/_recipe.dm @@ -202,10 +202,7 @@ var/global/list/_cooking_recipe_cache = list() if(ispath(result, /decl/material)) var/created_volume = result_quantity for(var/obj/item/ingredient in (used_ingredients[RECIPE_COMPONENT_ITEMS]|used_ingredients[RECIPE_COMPONENT_FRUIT])) - if(!ingredient.reagents?.total_volume) - continue - for(var/reagent_type in ingredient.reagents.reagent_volumes) - created_volume += ingredient.reagents.reagent_volumes[reagent_type] + created_volume += ingredient.reagents?.total_volume container.reagents?.add_reagent(result, created_volume, get_result_data(container, used_ingredients)) return null diff --git a/code/modules/food/cooking/recipes/recipe_soup.dm b/code/modules/food/cooking/recipes/recipe_soup.dm index ec53b7ac085..38dc8a8e1b3 100644 --- a/code/modules/food/cooking/recipes/recipe_soup.dm +++ b/code/modules/food/cooking/recipes/recipe_soup.dm @@ -18,6 +18,8 @@ result_quantity = 10 can_bulk_cook = TRUE var/precursor_type + /// Whether the ingredients' colours are mixed into our DATA_EXTRA_COLOR, useful for veggie soup adding vegetable bits. + var/has_extra_color = TRUE /decl/recipe/soup/get_result_data(atom/container, list/used_ingredients) @@ -26,6 +28,7 @@ var/list/taste_strings = list() var/list/ingredients = list() var/list/used_items = used_ingredients[RECIPE_COMPONENT_ITEMS] + var/list/filling_colors = list() if(length(used_items)) @@ -36,6 +39,8 @@ for(var/taste in food_tastes) taste_strings[taste] = max(taste_strings[taste], food_tastes[taste]) allergen_flags |= food.allergen_flags + if(has_extra_color) + filling_colors += food.get_food_filling_color() // may want more specific behaviour at some point if(locate(/obj/item/food/grown) in used_items) for(var/obj/item/food/grown/veg in used_items) @@ -65,6 +70,10 @@ var/precursor_allergen_flags = LAZYACCESS(precursor_data, DATA_INGREDIENT_FLAGS) if(precursor_allergen_flags) allergen_flags |= precursor_allergen_flags + // extra_color is blended in mix_data, we just add it here + var/precursor_extra_color = LAZYACCESS(precursor_data, DATA_EXTRA_COLOR) + if(precursor_extra_color) + filling_colors += precursor_extra_color if(length(taste_strings)) .[DATA_TASTE] = taste_strings @@ -72,3 +81,5 @@ .[DATA_INGREDIENT_LIST] = ingredients if(allergen_flags) .[DATA_INGREDIENT_FLAGS] = allergen_flags + if(length(filling_colors)) + .[DATA_EXTRA_COLOR] = MixColors(filling_colors) diff --git a/code/modules/food/cooking/recipes/recipe_soup_noodle.dm b/code/modules/food/cooking/recipes/recipe_soup_noodle.dm new file mode 100644 index 00000000000..08e1aa77439 --- /dev/null +++ b/code/modules/food/cooking/recipes/recipe_soup_noodle.dm @@ -0,0 +1,7 @@ +/decl/recipe/soup/noodle + result = /decl/material/liquid/nutriment/soup/noodle + precursor_type = /decl/material/liquid/nutriment/soup/simple + completion_message = "The noodles soften as they cook in the soup." + reagents = list(/decl/material/liquid/nutriment/soup/simple = 10) + items = list(/obj/item/food/spagetti = 1) + has_extra_color = FALSE // Don't give us noodle coloured bits \ No newline at end of file diff --git a/code/modules/food/cooking/recipes/recipe_soup_stock.dm b/code/modules/food/cooking/recipes/recipe_soup_stock.dm index 7bea5399d89..56897d424ee 100644 --- a/code/modules/food/cooking/recipes/recipe_soup_stock.dm +++ b/code/modules/food/cooking/recipes/recipe_soup_stock.dm @@ -7,6 +7,8 @@ /decl/material/solid/sodiumchloride = 1, /decl/material/liquid/water = 10 ) + // Broth shouldn't have bits + has_extra_color = FALSE /decl/recipe/soup/stock/meat display_name = "meat stock" diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index e615eefe25a..9c61692cab7 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -1048,6 +1048,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(length(tastes)) LAZYSET(., DATA_TASTE, tastes) + // Blend our extra_colour... + var/new_extra_color = newdata?[DATA_EXTRA_COLOR] + if(new_extra_color) + .[DATA_EXTRA_COLOR] = BlendRGBasHSV(new_extra_color, .[DATA_EXTRA_COLOR], new_fraction) + /decl/material/proc/explosion_act(obj/item/chems/holder, severity) SHOULD_CALL_PARENT(TRUE) . = TRUE @@ -1166,6 +1171,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) return data_color return color +/decl/material/proc/get_reagent_overlay_color(datum/reagents/holder) + var/list/rdata = REAGENT_DATA(holder, type) + return LAZYACCESS(rdata, DATA_EXTRA_COLOR) || get_reagent_color(holder) + num2hex(opacity * 255) + /decl/material/proc/can_hold_sharpness() return hardness > MAT_VALUE_FLEXIBLE diff --git a/code/modules/materials/definitions/liquids/materials_liquid_soup.dm b/code/modules/materials/definitions/liquids/materials_liquid_soup.dm index 364ccab4bfe..e959c9aac4b 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_soup.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_soup.dm @@ -84,6 +84,7 @@ /decl/material/liquid/nutriment/soup/simple name = "soup" liquid_name = "soup" + codex_name = "simple soup" solid_name = "powdered soup" uid = "liquid_soup_simple" mask_name_suffix = "soup" @@ -128,3 +129,15 @@ glass_name = "curry" nutriment_factor = 10 opacity = 1 + +/decl/material/liquid/nutriment/soup/noodle + name = "noodle soup" + liquid_name = "noodle soup" + solid_name = "noodles" + uid = "liquid_soup_noodles" + mask_name_suffix = "noodle soup" + reagent_overlay = "soup_chunks" // todo: maybe differentiate meat vs veggie noodle soup + glass_name = "noodle soup" + nutriment_factor = 10 + color = COLOR_POLISHED_BRASS + opacity = 0.7 diff --git a/code/modules/reagents/reagent_containers/bowl.dm b/code/modules/reagents/reagent_containers/bowl.dm index 6b50d060cf0..62e34795c23 100644 --- a/code/modules/reagents/reagent_containers/bowl.dm +++ b/code/modules/reagents/reagent_containers/bowl.dm @@ -181,6 +181,17 @@ DATA_MASK_COLOR = "#faa005" ) +/obj/item/chems/glass/bowl/mapped/noodlesoup + abstract_type = /obj/item/chems/glass/bowl/mapped/noodlesoup + initial_reagent_type = /decl/material/liquid/nutriment/soup/noodle + +/obj/item/chems/glass/bowl/mapped/noodlesoup/chicken/get_initial_reagent_data() + return list( + DATA_TASTE = list("chicken" = 1, "carrot" = 1), + DATA_INGREDIENT_LIST = list("chicken" = 1, "carrot" = 1), + DATA_INGREDIENT_FLAGS = (ALLERGEN_VEGETABLE | ALLERGEN_MEAT), + ) + // Mystery soup is special/stupid. /obj/item/chems/glass/bowl/mystery var/drained = FALSE diff --git a/nebula.dme b/nebula.dme index 8298d371b91..01a252d86a8 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2413,6 +2413,7 @@ #include "code\modules\food\cooking\recipes\recipe_soup.dm" #include "code\modules\food\cooking\recipes\recipe_soup_chili.dm" #include "code\modules\food\cooking\recipes\recipe_soup_curry.dm" +#include "code\modules\food\cooking\recipes\recipe_soup_noodle.dm" #include "code\modules\food\cooking\recipes\recipe_soup_simple.dm" #include "code\modules\food\cooking\recipes\recipe_soup_stew.dm" #include "code\modules\food\cooking\recipes\recipe_soup_stock.dm" From c14440917a6fcadbc7dde9b423d5c10da93fd376 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 13 Nov 2024 21:55:49 -0500 Subject: [PATCH 011/554] Improve contrast on pottery container sprites --- icons/obj/pottery/bowl.dmi | Bin 835 -> 835 bytes icons/obj/pottery/cup.dmi | Bin 779 -> 781 bytes icons/obj/pottery/mug.dmi | Bin 769 -> 774 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/pottery/bowl.dmi b/icons/obj/pottery/bowl.dmi index 46550a0a3866c83b818e9329730ed83f23cec1b5..29cb47bf9bea11f73e22218fc56642fba147954d 100644 GIT binary patch delta 495 zcmVe?xJkKwyu?@g5$Aqx$ZuQP|+RQ;w=?*ijT+6!* zDA%#Fh=*7{%%;oxeBkmt!!Os$#9(lqtDB4vIhqW>dSKQ#vi^Vm?ddtgZ|48t%Cb7*?2@^>oU{*!+HT$~fxL!u=S+eRvJ z_dI!fDbzdH=rrBez8b?ErQ2q}E1bT*lX|f>L%hHY#8}`xg?0)%mJb?0X94IQqz`1z zBgcyN^8&6J)$9*y5NoG?62mY@Mw;=NKc;MO7z4kffh1>Lu2ljOp@G5fu3VBcXOjfG z0JtRvQE*X@n(F`n002ovPDHLkV1guP@h$)W delta 495 zcmVXrcUL>h$ph$T?O362w_sy5pn;8IxIV6PRbgOscxSfNd(i;}orIxn^ zP_I*E6Av-FpTx7fa^T{$AgI^Mq+oEKv#SD)98CdW-8TyyS$}{1e(3qr+3d!{mKwhY zuw0jDP&QV*)#`DzdVt-DeBXD*9Sn*HodN(%e6LG@wL`~xhG7_{3$!)0Mw-B?j%7^+ zV$jEO>FLENtxR!HCIPff$WUwKAfxN$C|u$hDkYy}dyoQJLF+7Yf>MW35}(g;#jh<= z01@^NoecMTk%WI!1C1y_rS4OmjGF5ihG7_H-}L77?^L?}C;k4ZIwx_4L`x#pja1_9 zdGz{Rsdq2YY1-0(8p9N&TW7#49KXDgda*D=yubv+Sl~T{b}KuUcN#z!0q7pY0<_je7Vh>*48t54dBI2dn6trt41$gZl5}Ueof41;Eetky<&vB^+a%Z= zpKW}O-o-%RyZ<(y@Uw85?qZ-0Q*vxbOnpMcI`1Pm@aNLM888@j7q5`Jp7!0U;RXl#p6C6Lhk)U2B5! z0z^?XpcfX4#Y0uCyyaw?rek^`3`1zS3B!ce&I${H<#PE54bFc-gLZ33V1$4L)a_`L z!v$j?V$j9fe-H95%baLH>uNslG!Y2B+0?s@J_D`$jRa!Ya6ZE@4D+ibKete12Aj8N znRTfJccwm$=ElI1_fHdype)Ys;Px-fY(^W@AdY&_Px^9E^t0%S!?SH9Nli!KEj~_rQz=H wBNWpvs|7)ZK1{HSux;{HCa{17EcmN}FH-EKA>I8=-v9sr07*qoM6N<$f?uiBWdHyG delta 452 zcmV;#0XzPU28#x;QUQOYNkliHXsK4jpj`jA6Dz8N;?ElgQG9 z6UYg`8*mJ7;a(RWz=ap!F6w6J+et=-E>!Y8E57O1r!PNArvqaIaY}G0!vyhEcUw&m zUVt=Bhwg>ta(UlW3vW5DwVt>ak|cqa+a$@|+8Sm+uv)DipuvAyXpnXT2^3?nfVdiu z6DgW*xPu zwcu_!z|le}Sn}?1h7p9p`7v()OqHeEAck4mhlbiMQjQr42?CZCb6lZ@;8-gB3`90- zo=*@2K@fqo+^&D?%)MHemID9aTJ)fN^7}h*gK(zuHAE;`G;r(l*JppehI+(!=9Jv# zC5&IZyrH14FyU8-wOeU1F);j&-P~#%uah;7@*6(@K@g|U?wgP5)s6)JMF9Kk5rQZ> zQedhCZiE(s>Z}^Mr`BTxtm~YUTL|{g#<}zF!QleyENeVWdx3SgTd|LDs6a^g_V*F0 uX_w7{Xo@~e@Eu_n@>6yo0SQR(R|TIjHKe`Nkd}b}0000fFDZ*Bkpc$}S+!D_=W42I9~Q<(NX)~(lG zMoYT!b63X*J%0|VyMo{wNM~FgZjY6u z#5{HZAzi_Hsex<`qo<*-g67%Q5=;hbwjkia)&o^DEl9}XIL1)ty`&UsteecdHb;vl zGNf{o#SeLU2aBU5GOJe+KyI&ExB7HB&Y$uRi*o<4^BW0U0004>NklvA4mNXEEIcr4lJ0uz$uA1|A6Ja3W#vFtq%0eC7=dja8#Vwr7B8J^I?!{IS9wdJ$J2p6Gb^ve8mC zK@fk;=9_A9TCYf;1E#J(s{ZE>a-dom^c|#1=j|+@KI?L2IOy&`?e~rx;6N3yc7D1F zST1O{vbNAwpzxtyZQ&>FW4kygfZvfI2b-;dp&>uz9V9>kBtQa(1U>=m_NZ$*Mj|u- O0000zR9JLGWpiV4X>fFDZ*Bkpc$}4z!Kwl=3`N(|uPC|~^|^H; zin!2U7-Acz!FD<%?UVQSuQ=dNrnAe1bK%}3OMN(UeqtLQ0(!$1#T5c4h0KuAIrt(-*O5B10;_ zRC1H2d4@PhB2!T|fIPoJOMSW>-(UR?(@fk>u8oX60004=Nklyq&01NhF!C-s|^ReL|nSvq?CKKo|moQdH;AA%Q z^&)s#f_+Ek&;iP4<^7$q^a~Ps%u$SM2))p?m;v!^8Go4xJXW!9B5)Rleq`jJs*LiP zy3f2KjkeXKpX-jKmz*&J^>YTs3mq Date: Thu, 14 Nov 2024 13:03:08 -0500 Subject: [PATCH 012/554] Fix book cart icon --- code/game/objects/structures/bookcase.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index 7f9f04171fe..d4ccc3f1d0f 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -191,11 +191,24 @@ var/global/list/station_bookcases = list() name = "book cart" anchored = FALSE opacity = FALSE + icon_state = "book-0" desc = "A mobile cart for carrying books around." movable_flags = MOVABLE_FLAG_WHEELED icon = 'icons/obj/structures/book_cart.dmi' tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT obj_flags = 0 + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/structure/bookcase/cart/on_update_icon() + // We don't (can't) call parent, so we have to do this here + if(material_alteration & MAT_FLAG_ALTERATION_COLOR) + update_material_colour() + cut_overlays() + if(istype(lock)) + update_lock_overlay() + // End boilerplate + var/used_space_ratio = storage.storage_space_used() / storage.max_storage_space + icon_state = "book-[round(used_space_ratio * 5)]" /obj/structure/bookcase/ebony material = /decl/material/solid/organic/wood/ebony From 33741cb6d1e2f66e1e274d4297ecb08aff29619f Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 14 Nov 2024 13:03:35 -0500 Subject: [PATCH 013/554] Add fancy and damaged bookcases --- code/game/objects/structures/bookcase.dm | 20 +++++++++++++++++++- icons/obj/structures/bookcase.dmi | Bin 410 -> 3777 bytes 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index d4ccc3f1d0f..0c65b53c9c6 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -72,6 +72,7 @@ var/global/list/station_bookcases = list() for(var/obj/item/thing in holder.get_stored_inventory()) var/positioned = FALSE + // Avoid moving us if we're already positioned for(var/bX = 0 to (book_slots_x-1)) for(var/bY = 0 to (book_slots_y-1)) if(book_positions[GET_BOOK_POS(src, bX, bY)] == thing) @@ -83,6 +84,7 @@ var/global/list/station_bookcases = list() if(positioned) continue + // Otherwise, find a new position for(var/bX = 0 to (book_slots_x-1)) for(var/bY = 0 to (book_slots_y-1)) var/bK = GET_BOOK_POS(src, bX, bY) @@ -92,11 +94,14 @@ var/global/list/station_bookcases = list() break if(positioned) break + // No position, fall on the ground! + if(!positioned) + thing.dropInto(holder.loc) /obj/structure/bookcase name = "bookcase" icon = 'icons/obj/structures/bookcase.dmi' - icon_state = ICON_STATE_WORLD + icon_state = "bookcase" anchored = TRUE density = TRUE opacity = TRUE @@ -133,6 +138,12 @@ var/global/list/station_bookcases = list() . = ..() + // TODO: Handle repair, drop book contents when too damaged? + // At the very least, should probably add an update_icon() call on take_damage()... + if(get_health_ratio() < 0.5) + icon_state = "[initial(icon_state)]-damaged" + return // No storage contents while damaged. + var/datum/storage/bookcase/book_storage = storage if(!istype(book_storage) || !length(contents)) return @@ -214,4 +225,11 @@ var/global/list/station_bookcases = list() material = /decl/material/solid/organic/wood/ebony color = /decl/material/solid/organic/wood/ebony::color +/obj/structure/bookcase/fancy + icon_state = "fancy" + +/obj/structure/bookcase/fancy/ebony + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + #undef GET_BOOK_POS diff --git a/icons/obj/structures/bookcase.dmi b/icons/obj/structures/bookcase.dmi index 586f88954273e1a9a3b718b6c5859bf72c45298e..081549bd032648e852c5c6e332df4fe0bbf53ec0 100644 GIT binary patch literal 3777 zcmZ8kcRbYpAO9S3jWe@lOOla{L&h1G6;6aQIwN~k#u=THO~_2&}d{gFmmQmyE zT%g6o>L|7|kyxT9Qz)eF>YG+7_Q6#pwDbc;)P`o{-nZ3)3Qss8T_3J~(?EXtrfm7B zLZcw;#+&hT@9(6&Lq+1T&6DZ(dqVKNbERFy-JrP_bH_95Gw>TmxioPqN$XzN*AtTs z9!YbDuKmPLea-H%=JUm2iMZD`qn*bAH%|Q`KtM76^<_S*cF(%smb%|A^=o%w6k%axlsUCYMav>(rnpF z1@a!sUnsLU3i0w{;0ePWR{z#V$X-DR!;#qpZy8 z0GLd9rs-*Q_pfWXwJrS6S+EBbqk_)tQ@6l-u(m=gz>mjDY zS96o`OB+eHR++63;G+9hPf$YoOQ!=K;5n`G^}NAbQRZqDAe4QP@oEfmjqKV-q<4B; zG%9d&Z|9P4MeL7+HBRB0yRkhx+0ylX{-wOt6e)>n^)i*g6`+Ln08{@N)mI?dO^g9P#O6b)4@ zHT$ss&1u$q4*s9{8JG;e5~iklyTqLp9SgV$?By%bre;VJ?cV+VS+piE%;~4yUcLNt zWWRI)!LH9P?Q2}Zc%@}|LNA5iL`^`M09n>i%IS2HhF)|D^o^?&*Hy+peI@=?u{f@| zs+Z~894^YBccr&d>onrs?KkuMZ26o|eDcN^A8h|=&At9WY1*y4k8IyVO5Y@o_zDV;h@kDT8I2p`c#~di0rw_OLQ`=IkUQL7Cz9*TiCE%!kKl<-4A) zn-j1>QSr;l*pYviRMe)KeCzC;^VXh$W1{X#7^n8^OV zs3<}q=X>jmt5>gHq@k+5!Y&zZR{oeZu6x-Wh1W~g0+8AYuRELxWSN6!k(trX>d}Qv$D0`UUz9{DALLE zL6r;7^<^_IZ(lv3S@V>pc!sY_-y5~;n!TO?`R|A|Zvnks&zl*;M zl~*;KAj6GWG%AN}iz_PV4U4Z*{P<@}{ytq0>^hk&zSF!d=}_C=HC|`Aa5_i}z+ReM z<>cmz>RjaiVo*d4yUiio@j+yuaCBv&+I~y1Z2zP9_=0$eIpkgeg5|mv>vyra<-Pxw z_7oa|XN#g;_YZOmZ$!=ouu=qp^G@Od=SIgPSH8uqpxgPvhG(v6rhU(E`}lDon-%e` zc2547PpIZT?e$A-M}8+$(@Avq^-SVlPk#Izae;+?EyW-}22(GWp07)4iOLk%6JaMM;X| z2q^WDSS>I`tKzy}L$9Go7v5CdSg7#&QY7UFN;O}6On}NIQ3Cb4aI|!3J1Y~?e@saO zxUoiUZEcUkotgD;eJ0r6;)UDa@$7qczYyl;QTk5?O8cO3@6U~rwetcKECNyV_RGtK zxiYDT$H!Lz4h{}}fWN;+OgmZlKf5MONe0;a0N|>PTLW&$+Q zE3?jg;3}$QAKI5mLg{^s>gi9Hj!$F6`?ZpVX~NWf{MOh+^0pw0<)a~#NZT~i0SkUD z(n?Bw<(k89_s5pjL(UJ0>1j_c{W?BQX__-C*)J|Gz68A5Gy(x3e@Fts3Nntt^h0Z) z)rEELLF$QtXF(-VpUYdh0cUf)Ir?yFXd#5)E

eKu? zNzFWb@qf7cv#ck0w*OP5x*6~~GI?54W#uiy85MBb z_wYp{w-*?2s2t2cO^VX}VI(QuQozXvG(Hbt=22@It@&g(BoY#m*e(6`<<*A%3sIdQ zN-dg5wWpQsT5UjJ{-R@p)WGQp+3^4Xe$J*?>YePDZD(Y*xd6ol^oH6zY?YkC=5zDv z^5vrFkwB@tkV;xNUW%3%9weX%WvHT>%eQv$C;0HfIxOQ0Ig(ae2U5G% z*-AaQWJmH-g2U`%t{c_*hG1sT&ffWC4&2PBTHkzr`|jF+$$Z!83ehu__JuyB}vjrlq%RI?M&;F^Oy2&A$tAjpT!+Q8U&{k#_-FX@g zSHz?jmg4YR+Xh@mdy!bPO7?%bKem0n+(wGFz_`XiS8}AnQGN*3eg;RDA-iPS%RVQlF2D`UuZlx)a)U;ZZBu9K~ZfiVtuCO7v`ks$sg9iNfyqP}KU+g@tN5f_cWPIow&6T8(s zU0eiWwDL`iSss#M307(MMecf(?n;11X`K%P56o_Slz#BhbS^8z6_SUCS|N1k#2^gn zsjLIu!cEG$dWLi~R5~IlIkEYKz;^mrF3jvsXB(CKVPJ2xxcyGirD0We${V>E85z>kiH+wn%nE3Bbc<& z>bwL}cE3UWLl`@J~u@?|*$(w$}H&YSdPsh$@W{cURxvkF>HwD8lGNl@ky zTUc|du$BrEYU^j@f~7yLQ6XriOIp9;ld{fdju#~sQ3@_5`m<@+GjF<~`FW!=wAwS- z71cJan0qXg!byj=P%!&b5W4#9L77#rrGe|u4%n%}d50)1gqD_8XVhpXbl>)mQyCoQ2myHY_=}SrnZHgl2*_7T%E&^))uM&0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`l@(n5T)@Tx06PL2GXQEU zElESq{!Q)1&6C80z-`4UXn}KggmS9 z>{t)f&0^%5x)6dVpC)n&-m&K!F$yah#5g+9J^ck+Fjufu`Gq6 Date: Thu, 14 Nov 2024 13:05:54 -0500 Subject: [PATCH 014/554] Add bookcase loot spawners --- code/modules/clothing/neck/jewelry.dm | 13 ++++ maps/shaded_hills/shaded_hills.dm | 1 + mods/content/dungeon_loot/_dungeon_loot.dme | 1 + .../content/dungeon_loot/subtypes/bookcase.dm | 65 +++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 mods/content/dungeon_loot/subtypes/bookcase.dm diff --git a/code/modules/clothing/neck/jewelry.dm b/code/modules/clothing/neck/jewelry.dm index f52d21361d5..77290be1f70 100644 --- a/code/modules/clothing/neck/jewelry.dm +++ b/code/modules/clothing/neck/jewelry.dm @@ -18,6 +18,19 @@ /obj/item/clothing/neck/necklace/prayer_beads/basalt material = /decl/material/solid/stone/basalt +/obj/item/clothing/neck/necklace/prayer_beads/random + var/list/random_materials = list( + /decl/material/solid/organic/bone, + /decl/material/solid/stone/marble, + /decl/material/solid/stone/basalt, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/ebony + ) + +/obj/item/clothing/neck/necklace/prayer_beads/random/Initialize() + material = pick(random_materials) + return ..() + /obj/item/clothing/neck/necklace/locket name = "locket" desc = "A locket that seems to have space for a photo within." diff --git a/maps/shaded_hills/shaded_hills.dm b/maps/shaded_hills/shaded_hills.dm index 139e602c13b..1931b81ef34 100644 --- a/maps/shaded_hills/shaded_hills.dm +++ b/maps/shaded_hills/shaded_hills.dm @@ -1,6 +1,7 @@ #if !defined(USING_MAP_DATUM) #include "../../mods/content/matchmaking/_matchmaking.dme" + #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" #include "../../mods/content/scaling_descriptors.dm" #include "../../mods/species/drakes/_drakes.dme" // include before _fantasy.dme so overrides work diff --git a/mods/content/dungeon_loot/_dungeon_loot.dme b/mods/content/dungeon_loot/_dungeon_loot.dme index 18e66276b2f..ae3880c4164 100644 --- a/mods/content/dungeon_loot/_dungeon_loot.dme +++ b/mods/content/dungeon_loot/_dungeon_loot.dme @@ -3,6 +3,7 @@ // BEGIN_INCLUDE #include "_dungeon_loot.dm" #include "loot_pile.dm" +#include "subtypes\bookcase.dm" #include "subtypes\exosuit.dm" #include "subtypes\maint.dm" #include "subtypes\surface.dm" diff --git a/mods/content/dungeon_loot/subtypes/bookcase.dm b/mods/content/dungeon_loot/subtypes/bookcase.dm new file mode 100644 index 00000000000..664e4fa6476 --- /dev/null +++ b/mods/content/dungeon_loot/subtypes/bookcase.dm @@ -0,0 +1,65 @@ +// Contains generic mundane/fantasy loot. +/obj/structure/loot_pile/bookcase + name = "bookcase" + desc = "A bookcase that has long since fallen into disrepair. It may still have some useful things left on its shelves..." + icon = 'icons/obj/structures/bookcase.dmi' + icon_state = "bookcase-damaged" // preview + material = /decl/material/solid/organic/wood/walnut + color = /decl/material/solid/organic/wood/walnut::color + material_alteration = MAT_FLAG_ALTERATION_ALL + /// 1-indexed, pick a random overlay to add corresponding to "loot[rand(1, loot_states)]". + var/loot_states = 3 + /// A text string corresponding to the icon_state of the loot overlay we're using. + var/loot_state + +/obj/structure/loot_pile/bookcase/update_material_name(override_name) + . = ..() + SetName("[pick("ruined", "destroyed", "dilapidated")] [name]") + +/obj/structure/loot_pile/bookcase/ebony + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + +/obj/structure/loot_pile/bookcase/get_icon_states_to_use() + var/static/list/icon_states_to_use = list("bookcase-damaged", "fancy-damaged") + return icon_states_to_use + +/obj/structure/loot_pile/bookcase/Initialize(ml, _mat, _reinf_mat) + if(isnum(loot_states) && loot_states > 0) + loot_state = "loot[rand(1, loot_states)]" + . = ..() + +/obj/structure/loot_pile/bookcase/on_update_icon() + . = ..() + if(loot_state) + add_overlay(overlay_image(icon, loot_state, null, RESET_COLOR|RESET_ALPHA)) + +/obj/structure/loot_pile/bookcase/get_common_loot() + var/static/list/common_loot = list( + /obj/item/paper/scroll, + /obj/item/paper/scroll, + /obj/item/paper/scroll, + /obj/item/pen/fancy/quill, + /obj/item/clothing/neck/necklace/prayer_beads/random, + ) + return common_loot + +/obj/structure/loot_pile/bookcase/get_uncommon_loot() + var/static/list/uncommon_loot = list( + /obj/item/bone/skull, + /obj/item/chems/glass/inkwell, + /obj/item/clothing/glasses/prescription/pincenez, + /obj/item/chems/drinks/bottle/wine, + /obj/item/stack/medical/ointment/crafted, + /obj/item/stack/medical/bandage/crafted, + ) + return uncommon_loot + +/obj/structure/loot_pile/bookcase/get_rare_loot() + var/static/list/rare_loot = list( + /obj/item/pen/fancy/quill/goose, + /obj/item/clothing/gloves/ring/seal/signet, + /obj/item/chems/drinks/bottle/champagne, + /obj/item/chems/drinks/bottle/premiumwine, + ) + return rare_loot From 28f37c5131f0c06645fe53ed72e1d56e680d77f9 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 14 Nov 2024 13:08:33 -0500 Subject: [PATCH 015/554] Add footsteps to rock, seafloor, and shrouded floors --- code/game/turfs/flooring/flooring_natural.dm | 6 ++++-- code/game/turfs/flooring/flooring_rock.dm | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/game/turfs/flooring/flooring_natural.dm b/code/game/turfs/flooring/flooring_natural.dm index 55742476ec3..9ca61af786e 100644 --- a/code/game/turfs/flooring/flooring_natural.dm +++ b/code/game/turfs/flooring/flooring_natural.dm @@ -7,16 +7,18 @@ turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/sand gender = NEUTER + footstep_type = /decl/footsteps/sand /decl/flooring/shrouded name = "packed sand" desc = "Packed-down sand forming a solid layer." - icon = 'icons/turf/flooring/shrouded.dmi' + icon = 'icons/turf/flooring/shrouded.dmi' // Note: this icon is not greyscaled icon_base = "shrouded" - dirt_color = "#3e3960" + dirt_color = "#3e3960" // Does this mean we're double-applying the colour? Or is that just an issue with the 'color' variable? has_base_range = 8 turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/sand + footstep_type = /decl/footsteps/asteroid /decl/flooring/meat name = "fleshy ground" diff --git a/code/game/turfs/flooring/flooring_rock.dm b/code/game/turfs/flooring/flooring_rock.dm index 89b3fd45535..57063ec8bd0 100644 --- a/code/game/turfs/flooring/flooring_rock.dm +++ b/code/game/turfs/flooring/flooring_rock.dm @@ -7,6 +7,7 @@ color = null icon_edge_layer = FLOOR_EDGE_VOLCANIC gender = NEUTER + footstep_type = /decl/footsteps/plating /decl/flooring/rock/update_turf_strings(turf/floor/target) var/decl/material/material = target?.get_material() From 0107c001ed4dd49bec795f4b635d1a181800100f Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 14 Nov 2024 18:33:06 -0500 Subject: [PATCH 016/554] Add an hourglass prop --- code/game/objects/items/hourglass.dm | 135 ++++++++++++++++++ icons/obj/items/hourglass.dmi | Bin 0 -> 2937 bytes .../content/dungeon_loot/subtypes/bookcase.dm | 2 + nebula.dme | 1 + 4 files changed, 138 insertions(+) create mode 100644 code/game/objects/items/hourglass.dm create mode 100644 icons/obj/items/hourglass.dmi diff --git a/code/game/objects/items/hourglass.dm b/code/game/objects/items/hourglass.dm new file mode 100644 index 00000000000..f12a51077f5 --- /dev/null +++ b/code/game/objects/items/hourglass.dm @@ -0,0 +1,135 @@ +// I considered just putting this in the fantasy modpack, +// but it's probably better in core code, since at the very least +// the Wizard gamemode might want to use the item or icon for something. +// Also, I think it could just be a neat prop. +/obj/item/hourglass + name = "hourglass" + icon = 'icons/obj/items/hourglass.dmi' + icon_state = "world-preview" + desc = "Sand trickles from one fused dome to another, tracking the inevitable passage of time. What are you doing with your life?" + w_class = ITEM_SIZE_SMALL + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR + material = /decl/material/solid/organic/wood/mahogany + max_health = null // autoset from material, let it be destroyed! + // These two variables cannot be null, currently. If you want to allow that, you need to change a lot of the code. + var/decl/material/glass_material = /decl/material/solid/glass + var/decl/material/sand_material = /decl/material/solid/sand + /// The world.time at which the hourglass was last flipped. Used to determine if sand is currently falling. + var/last_flipped = null + /// How long in deciseconds does it take for the sand to finish falling? + var/sand_duration = 1 MINUTE // TODO: Make this based off of matter somehow, instead of vice versa? This means damaging it and leaking sand would make it run fast... + /// The number of falling sand states to use, [0, X) (including 0 but excluding X). + var/sand_falling_states = 4 + /// This is an internal variable used to prevent unnecessary update_icon calls. + var/tmp/last_sand_state = null + +/obj/item/hourglass/Initialize(ml, material_key, glass_material_key, sand_material_key) + if(!isnull(glass_material_key)) + glass_material = glass_material_key + if(ispath(glass_material)) + glass_material = GET_DECL(glass_material) + if(!isnull(sand_material_key)) + sand_material = sand_material_key + if(ispath(sand_material)) + sand_material = GET_DECL(sand_material) + last_flipped = -sand_duration + . = ..() // Materials should be set when going into create_matter + update_icon() + +/obj/item/hourglass/create_matter() + var/sand_matter = sand_duration / (1 MINUTE) * MATTER_AMOUNT_TRACE // Shorter duration, less sand; higher duration, more sand. + LAZYSET(matter, sand_material.type, sand_matter) + LAZYSET(matter, glass_material.type, MATTER_AMOUNT_REINFORCEMENT) + return ..() // Parent call has to go last so we apply size modifiers properly. + +/obj/item/hourglass/proc/sand_is_falling() + return (world.time - last_flipped) < sand_duration + +/obj/item/hourglass/examine(mob/user, distance, infix, suffix) + . = ..() + if(distance <= 2) + var/sand_string = "not falling" + switch(clamp(world.time - last_flipped, 0, sand_duration) / sand_duration) + if(0) + sand_string = "not falling" + if(0 to 0.25) + sand_string = "almost done falling" + if(0.25 to 0.4) + sand_string = "over halfway done falling" + if(0.4 to 0.6) + sand_string = "about halfway done falling" + if(0.6 to 0.75) + sand_string = "almost halfway done falling" + if(0.75 to 1) + sand_string = "just starting to fall" + to_chat(user, SPAN_NOTICE("The [sand_material.solid_name] in \the [src] is [sand_string].")) + +/obj/item/hourglass/proc/get_sand_state(world_inventory_state) + /// This is a fraction of the sand_duration. + var/sand_progress = (world.time - last_flipped) / sand_duration + switch(sand_progress) + if(0 to 1) + return "sand-falling[floor(sand_progress * sand_falling_states)]-[world_inventory_state]" // 0 to sand_falling_states exclusive. + else + return "sand-[world_inventory_state]" + +/obj/item/hourglass/on_update_icon() + . = ..() + icon_state = get_world_inventory_state() + last_sand_state = get_sand_state(icon_state) + // Sand goes before glass + add_overlay(overlay_image(icon, last_sand_state, sand_material.color, RESET_ALPHA|RESET_COLOR)) + // Glass goes over the sand + add_overlay(overlay_image(icon, "glass-[icon_state]", glass_material.color, RESET_ALPHA|RESET_COLOR)) + compile_overlays() // Don't wait for SSoverlays, this is pretty time-sensitive. + +/obj/item/hourglass/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + // TODO: held item falling sand states? + overlay.add_overlay(overlay_image(overlay.icon, "sand-[overlay.icon_state]", sand_material.color, RESET_ALPHA | RESET_COLOR)) + overlay.add_overlay(overlay_image(overlay.icon, "glass-[overlay.icon_state]", glass_material.color, RESET_ALPHA | RESET_COLOR)) + return ..() + +/obj/item/hourglass/attack_self(mob/user) + . = ..() + if(.) // Already did something like squash it or empty storage. + return + return flip_hourglass(user) + +/obj/item/hourglass/proc/flip_hourglass(mob/user) + if(user) + // You can't see or hear this from very far. + user.visible_message("\The [user] flips \the [src].", SPAN_NOTICE("You flip \the [src]."), SPAN_NOTICE("You hear falling sand."), range = 2) + // Invert the time elapsed so that it becomes the time remaining. + var/time_elapsed = sand_duration - clamp(world.time - last_flipped, 0, sand_duration) + last_flipped = world.time - time_elapsed + update_icon() + if(!is_processing) + START_PROCESSING(SSobj, src) + return TRUE + +/obj/item/hourglass/Process() + if(!sand_is_falling()) + return PROCESS_KILL + if(get_sand_state(get_world_inventory_state()) == last_sand_state) // No need to do an update yet. + return + update_icon() + +/obj/item/hourglass/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/hourglass/physically_destroyed(skip_qdel) + // This code is adapted from compost bins. + // TODO: Make a helper for 'create or add to scraps'. + var/obj/item/debris/scraps/remains = (locate() in loc) || new(loc) + LAZYINITLIST(remains.matter) + if(matter[sand_material.type]) // Make sure we haven't already lost our sand... somehow? + remains.matter[sand_material.type] += matter[sand_material.type] + UNSETEMPTY(remains.matter) + remains.update_primary_material() + // Now create shards of our glass material. + // At some point in the future this should probably respect matter conservation. + // Right now we just make sure we have any glass left at all. + if(matter[glass_material.type]) + glass_material.place_shards(loc) + return ..() \ No newline at end of file diff --git a/icons/obj/items/hourglass.dmi b/icons/obj/items/hourglass.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a3930025333a83c76699c12e227495d5fa508495 GIT binary patch literal 2937 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 literal 0 HcmV?d00001 diff --git a/mods/content/dungeon_loot/subtypes/bookcase.dm b/mods/content/dungeon_loot/subtypes/bookcase.dm index 664e4fa6476..f10a38bf1d0 100644 --- a/mods/content/dungeon_loot/subtypes/bookcase.dm +++ b/mods/content/dungeon_loot/subtypes/bookcase.dm @@ -40,7 +40,9 @@ /obj/item/paper/scroll, /obj/item/paper/scroll, /obj/item/pen/fancy/quill, + /obj/item/pen/fancy/quill, /obj/item/clothing/neck/necklace/prayer_beads/random, + /obj/item/hourglass, ) return common_loot diff --git a/nebula.dme b/nebula.dme index 01a252d86a8..9c639d5db84 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1083,6 +1083,7 @@ #include "code\game\objects\items\fleece.dm" #include "code\game\objects\items\glassjar.dm" #include "code\game\objects\items\holosign_creator.dm" +#include "code\game\objects\items\hourglass.dm" #include "code\game\objects\items\instruments.dm" #include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\lockpicks.dm" From 5adaf4278176e4afdf812a98be59be0727769737 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 14 Nov 2024 18:33:58 -0500 Subject: [PATCH 017/554] Rewrite SpinAnimation to use ANIMATION_RELATIVE --- code/_helpers/animations.dm | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/code/_helpers/animations.dm b/code/_helpers/animations.dm index b6fcccda02d..be0d2188f5a 100644 --- a/code/_helpers/animations.dm +++ b/code/_helpers/animations.dm @@ -81,22 +81,11 @@ var/segment = 360/segments if(!clockwise) segment = -segment - var/list/matrices = list() - for(var/i in 1 to segments-1) - var/matrix/M = matrix(transform) - M.Turn(segment*i) - matrices += M - var/matrix/last = matrix(transform) - matrices += last - speed /= segments - if(parallel) - animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL) - else - animate(src, transform = matrices[1], time = speed, loops) + animate(src, transform = matrix().Turn(segment), time = speed, loops, flags = parallel ? (ANIMATION_PARALLEL | ANIMATION_RELATIVE) : ANIMATION_RELATIVE) for(var/i in 2 to segments) //2 because 1 is covered above - animate(transform = matrices[i], time = speed) + animate(transform = matrix().Turn(segment), time = speed, loops, flags = ANIMATION_RELATIVE) //doesn't have an object argument because this is "Stacking" with the animate call above //3 billion% intentional From d6c4cc1caba824ee1b12a0a89f8ed37f923031e2 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 14 Nov 2024 18:35:29 -0500 Subject: [PATCH 018/554] Remove defunct recycler scraps code --- code/modules/fabrication/recycler.dm | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/code/modules/fabrication/recycler.dm b/code/modules/fabrication/recycler.dm index 61bca11527d..47056aba3e7 100644 --- a/code/modules/fabrication/recycler.dm +++ b/code/modules/fabrication/recycler.dm @@ -165,23 +165,6 @@ return TRUE return ..() -/obj/item/scrap_material/attackby(obj/item/W, mob/user) - - if(W.type == type && user.try_unequip(W)) - - LAZYINITLIST(matter) - for(var/mat in W.matter) - matter[mat] += W.matter[mat] - UNSETEMPTY(matter) - W.matter = null - - to_chat(user, SPAN_NOTICE("You combine \the [src] and \the [W].")) - qdel(W) - - return TRUE - - return ..() - /obj/machinery/recycler/proc/dump_trace_material(atom/forced_loc = loc) if(!length(trace_matter)) From 93268bc9a5d244c9625c560a7f34f5771e4b1062 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 14 Nov 2024 18:35:40 -0500 Subject: [PATCH 019/554] Allow bashing items with other items --- code/game/objects/items/_item_damage.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/game/objects/items/_item_damage.dm b/code/game/objects/items/_item_damage.dm index aa598d7ebf0..6d8803c33d3 100644 --- a/code/game/objects/items/_item_damage.dm +++ b/code/game/objects/items/_item_damage.dm @@ -48,6 +48,13 @@ . = ..() take_damage(explosion_severity_damage(severity), BURN, DAM_EXPLODE | DAM_DISPERSED, "explosion") +/obj/item/bash(obj/item/weapon, mob/user) + . = ..() + var/force = weapon.get_attack_force(user) + if(force >= 3 && .) + user.setClickCooldown(weapon.attack_cooldown + weapon.w_class) + take_damage(force, weapon.atom_damage_type) + /obj/item/proc/explosion_severity_damage(var/severity) var/mult = explosion_severity_damage_multiplier() return (mult * (4 - severity)) + (severity != 1? rand(-(mult / severity), (mult / severity)) : 0 ) From 907415848b9b4832db103dc88491764bbba69ef3 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 14 Nov 2024 19:32:33 -0500 Subject: [PATCH 020/554] Add random dungeon bookcase spawner --- icons/obj/structures/bookcase.dmi | Bin 3777 -> 4108 bytes .../content/dungeon_loot/subtypes/bookcase.dm | 25 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/icons/obj/structures/bookcase.dmi b/icons/obj/structures/bookcase.dmi index 081549bd032648e852c5c6e332df4fe0bbf53ec0..e232f90cb32b99607d4fd9729e72d819e49128bf 100644 GIT binary patch literal 4108 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

eKu? zNzFWb@qf7cv#ck0w*OP5x*6~~GI?54W#uiy85MBb z_wYp{w-*?2s2t2cO^VX}VI(QuQozXvG(Hbt=22@It@&g(BoY#m*e(6`<<*A%3sIdQ zN-dg5wWpQsT5UjJ{-R@p)WGQp+3^4Xe$J*?>YePDZD(Y*xd6ol^oH6zY?YkC=5zDv z^5vrFkwB@tkV;xNUW%3%9weX%WvHT>%eQv$C;0HfIxOQ0Ig(ae2U5G% z*-AaQWJmH-g2U`%t{c_*hG1sT&ffWC4&2PBTHkzr`|jF+$$Z!83ehu__JuyB}vjrlq%RI?M&;F^Oy2&A$tAjpT!+Q8U&{k#_-FX@g zSHz?jmg4YR+Xh@mdy!bPO7?%bKem0n+(wGFz_`XiS8}AnQGN*3eg;RDA-iPS%RVQlF2D`UuZlx)a)U;ZZBu9K~ZfiVtuCO7v`ks$sg9iNfyqP}KU+g@tN5f_cWPIow&6T8(s zU0eiWwDL`iSss#M307(MMecf(?n;11X`K%P56o_Slz#BhbS^8z6_SUCS|N1k#2^gn zsjLIu!cEG$dWLi~R5~IlIkEYKz;^mrF3jvsXB(CKVPJ2xxcyGirD0We${V>E85z>kiH+wn%nE3Bbc<& z>bwL}cE3UWLl`@J~u@?|*$(w$}H&YSdPsh$@W{cURxvkF>HwD8lGNl@ky zTUc|du$BrEYU^j@f~7yLQ6XriOIp9;ld{fdju#~sQ3@_5`m<@+GjF<~`FW!=wAwS- z71cJan0qXg!byj=P%!&b5W4#9L77#rrGe|u4%n%}d50)1gqD_8XVhpXbl>)mQyCoQ2myHY_=}SrnZHgl2*_7T%E Date: Thu, 14 Nov 2024 19:35:03 -0500 Subject: [PATCH 021/554] Add lootable bookcases to dungeon --- maps/shaded_hills/shaded_hills-dungeon.dmm | 24 +++++++++++++--------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/maps/shaded_hills/shaded_hills-dungeon.dmm b/maps/shaded_hills/shaded_hills-dungeon.dmm index e9cfce36153..2df9b3c6a97 100644 --- a/maps/shaded_hills/shaded_hills-dungeon.dmm +++ b/maps/shaded_hills/shaded_hills-dungeon.dmm @@ -61,6 +61,10 @@ /obj/item/ancient_surgery/bonesaw, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) +"fF" = ( +/obj/random/dungeon_bookcase, +/turf/floor/rock/basalt, +/area/shaded_hills/caves/dungeon/poi) "fW" = ( /obj/structure/bed/chair/bench/ebony{ dir = 8 @@ -532,7 +536,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "Ky" = ( -/obj/structure/bookcase/ebony, +/obj/random/dungeon_bookcase, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "Kz" = ( @@ -18051,7 +18055,7 @@ Ky Ky bD bD -Ua +fF Ky bD bD @@ -18200,11 +18204,11 @@ Ky bD Ua Ky +Ky bD bD -bD -Ua -Ua +fF +fF bD ok bD @@ -18351,12 +18355,12 @@ Ky Ky bD Ua -Ua -bD +fF +Ky bD Ua hU -Ua +fF bD bD bD @@ -18503,12 +18507,12 @@ Ky Ky Ua bD -bD +Ky hU Ua bD hU -Ua +fF Ua bD bD From 28b15ebbb0cbc53f703829e9a0768c2096e3e4f5 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 14 Nov 2024 19:35:20 -0500 Subject: [PATCH 022/554] Add hourglass to innkeeper office --- maps/shaded_hills/shaded_hills-inn.dmm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 0f8e896ad49..66c8f4c3af3 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -1357,6 +1357,9 @@ pixel_x = 12; pixel_y = 8 }, +/obj/item/hourglass{ + pixel_y = 12 + }, /turf/floor/carpet, /area/shaded_hills/inn) "MT" = ( From 66de9d1daafc8b0f739449e74c7022626a3a178f Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 14 Nov 2024 20:09:13 -0500 Subject: [PATCH 023/554] Fix glasses gender --- code/modules/clothing/glasses/_glasses.dm | 1 + code/modules/clothing/glasses/blindfolds.dm | 1 + code/modules/clothing/glasses/eyepatch.dm | 1 + 3 files changed, 3 insertions(+) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 8e0f44b9e18..78a5fedc480 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -8,6 +8,7 @@ body_parts_covered = SLOT_EYES slot_flags = SLOT_EYES fallback_slot = slot_glasses_str + gender = PLURAL var/vision_flags = 0 var/darkness_view = 0 diff --git a/code/modules/clothing/glasses/blindfolds.dm b/code/modules/clothing/glasses/blindfolds.dm index a23709ee6df..737a3e06978 100644 --- a/code/modules/clothing/glasses/blindfolds.dm +++ b/code/modules/clothing/glasses/blindfolds.dm @@ -8,6 +8,7 @@ darkness_view = -1 toggleable = TRUE activation_sound = null + gender = NEUTER toggle_off_message = "You flip $ITEM$ up." toggle_on_message = "You slide $ITEM$ down, blinding yourself." diff --git a/code/modules/clothing/glasses/eyepatch.dm b/code/modules/clothing/glasses/eyepatch.dm index 53be997ae1e..8a484b3b6bb 100644 --- a/code/modules/clothing/glasses/eyepatch.dm +++ b/code/modules/clothing/glasses/eyepatch.dm @@ -3,6 +3,7 @@ desc = "Yarr." body_parts_covered = 0 icon = 'icons/clothing/eyes/eyepatch.dmi' + gender = NEUTER var/flipped_icon = 'icons/clothing/eyes/eyepatch_right.dmi' /obj/item/clothing/glasses/eyepatch/verb/flip_patch() From a7715a37c412f160065caa8160958a4f53a66a06 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 14 Nov 2024 20:09:27 -0500 Subject: [PATCH 024/554] Adjust bookcase loot --- mods/content/dungeon_loot/subtypes/bookcase.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/content/dungeon_loot/subtypes/bookcase.dm b/mods/content/dungeon_loot/subtypes/bookcase.dm index 6c4f334487f..fbbad10735d 100644 --- a/mods/content/dungeon_loot/subtypes/bookcase.dm +++ b/mods/content/dungeon_loot/subtypes/bookcase.dm @@ -48,7 +48,6 @@ /obj/structure/loot_pile/bookcase/get_uncommon_loot() var/static/list/uncommon_loot = list( - /obj/item/bone/skull, /obj/item/chems/glass/inkwell, /obj/item/clothing/glasses/prescription/pincenez, /obj/item/chems/drinks/bottle/wine, @@ -59,6 +58,7 @@ /obj/structure/loot_pile/bookcase/get_rare_loot() var/static/list/rare_loot = list( + /obj/item/bone/skull, // unlucky! /obj/item/pen/fancy/quill/goose, /obj/item/clothing/gloves/ring/seal/signet, /obj/item/chems/drinks/bottle/champagne, From b47dc473459102c8954cfc8a1c6aee292933b057 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 15 Nov 2024 11:25:23 -0500 Subject: [PATCH 025/554] Fix rings being made of cloth --- code/modules/clothing/gloves/jewelry/rings/_ring.dm | 1 + code/modules/clothing/gloves/jewelry/rings/rings.dm | 6 ++++++ mods/gamemodes/deity/forms/starlight/items.dm | 2 ++ 3 files changed, 9 insertions(+) diff --git a/code/modules/clothing/gloves/jewelry/rings/_ring.dm b/code/modules/clothing/gloves/jewelry/rings/_ring.dm index 7789e812804..d5c85aed654 100644 --- a/code/modules/clothing/gloves/jewelry/rings/_ring.dm +++ b/code/modules/clothing/gloves/jewelry/rings/_ring.dm @@ -3,4 +3,5 @@ icon = 'icons/clothing/accessories/jewelry/rings/ring.dmi' w_class = ITEM_SIZE_TINY gender = NEUTER + material = /decl/material/solid/metal/silver var/can_fit_under_gloves = TRUE diff --git a/code/modules/clothing/gloves/jewelry/rings/rings.dm b/code/modules/clothing/gloves/jewelry/rings/rings.dm index 72567a828f5..b0d78e0d7fa 100644 --- a/code/modules/clothing/gloves/jewelry/rings/rings.dm +++ b/code/modules/clothing/gloves/jewelry/rings/rings.dm @@ -4,6 +4,7 @@ name = "engagement ring" desc = "An engagement ring. It certainly looks expensive." icon = 'icons/clothing/accessories/jewelry/rings/ring_diamond.dmi' + material = /decl/material/solid/metal/silver /obj/item/clothing/gloves/ring/engagement/attack_self(mob/user) user.visible_message(SPAN_WARNING("\The [user] gets down on one knee, presenting \the [src]."), SPAN_WARNING("You get down on one knee, presenting \the [src].")) @@ -12,10 +13,12 @@ name = "CTI ring" desc = "A ring commemorating graduation from CTI." icon = 'icons/clothing/accessories/jewelry/rings/ring_cti.dmi' + material = /decl/material/solid/metal/silver /obj/item/clothing/gloves/ring/mariner name = "Mariner University ring" desc = "A ring commemorating graduation from Mariner University." + material = /decl/material/solid/metal/gold icon = 'icons/clothing/accessories/jewelry/rings/ring_mariner.dmi' ///////////////////////////////////////// @@ -25,6 +28,7 @@ name = "magic ring" desc = "A strange ring with symbols carved on it in some arcane language." icon = 'icons/clothing/accessories/jewelry/rings/ring_magic.dmi' + material = /decl/material/solid/metal/gold /obj/item/clothing/gloves/ring/magic/equipped(var/mob/living/human/H, var/slot) ..() @@ -85,6 +89,7 @@ name = "Secretary-General's official seal" desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring." icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi' + material = /decl/material/solid/metal/silver /obj/item/clothing/gloves/ring/seal/Initialize() . = ..() @@ -94,6 +99,7 @@ name = "masonic ring" desc = "The Square and Compasses feature prominently on this Masonic ring." icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi' + material = /decl/material/solid/metal/brass /obj/item/clothing/gloves/ring/seal/signet name = "signet ring" diff --git a/mods/gamemodes/deity/forms/starlight/items.dm b/mods/gamemodes/deity/forms/starlight/items.dm index 4a46c300d2f..31645b2d3ac 100644 --- a/mods/gamemodes/deity/forms/starlight/items.dm +++ b/mods/gamemodes/deity/forms/starlight/items.dm @@ -19,6 +19,7 @@ name = "Talisman of the Starborn" desc = "This ring seems to shine with more light than is put on it." icon = 'icons/clothing/accessories/jewelry/rings/ring_star.dmi' + material = /decl/material/solid/metal/blackbronze /obj/item/clothing/gloves/ring/aura_ring/talisman_of_starborn/Initialize() . = ..() @@ -37,6 +38,7 @@ name = "Talisman of the Shadowling" desc = "If you weren't looking at this, you probably wouldn't have noticed it." icon = 'icons/clothing/accessories/jewelry/rings/ring_shadow.dmi' + material = /decl/material/solid/metal/blackbronze /obj/item/clothing/gloves/ring/aura_ring/talisman_of_shadowling/Initialize() . = ..() From dc60047c2573c54064e17febab2b2edeb97197e4 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 15 Nov 2024 11:46:11 -0500 Subject: [PATCH 026/554] Merge material ring behaviour into base ring --- .../clothing/gloves/jewelry/rings/_ring.dm | 51 +++++++++++++++++++ .../clothing/gloves/jewelry/rings/material.dm | 34 ++----------- 2 files changed, 54 insertions(+), 31 deletions(-) diff --git a/code/modules/clothing/gloves/jewelry/rings/_ring.dm b/code/modules/clothing/gloves/jewelry/rings/_ring.dm index d5c85aed654..7b39b259604 100644 --- a/code/modules/clothing/gloves/jewelry/rings/_ring.dm +++ b/code/modules/clothing/gloves/jewelry/rings/_ring.dm @@ -5,3 +5,54 @@ gender = NEUTER material = /decl/material/solid/metal/silver var/can_fit_under_gloves = TRUE + var/can_inscribe = FALSE + var/inscription + var/base_desc + +/obj/item/clothing/gloves/ring/Initialize() + if(desc) + base_desc = desc + . = ..() + +/obj/item/clothing/gloves/ring/set_material(var/new_material) + . = ..() + update_desc() + +// To avoid clobbering custom loadout descriptions. +/obj/item/clothing/gloves/ring/set_custom_desc(new_desc) + base_desc = new_desc + update_desc() + +/obj/item/clothing/gloves/ring/proc/update_desc() + if(istype(material) && (material_alteration & MAT_FLAG_ALTERATION_DESC)) + desc = "A ring made from [material.solid_name]." + if(inscription) + desc += "
Written on \the [src] is the inscription \"[inscription]\"" + if(base_desc) + desc = "[base_desc] [desc]" + +/obj/item/clothing/gloves/ring/attackby(var/obj/item/tool, var/mob/user) + if(can_inscribe && tool.sharp) + var/new_inscription = sanitize(input("Enter an inscription to engrave.", "Inscription") as null|text) + if(user.stat || !user.incapacitated() || !user.Adjacent(src) || tool.loc != user) + return TRUE + if(!new_inscription) + return TRUE + to_chat(user, SPAN_WARNING("You carve \"[new_inscription]\" into \the [src].")) + inscription = new_inscription + update_desc() + return TRUE + return ..() + +/obj/item/clothing/gloves/ring/OnTopic(var/mob/user, var/list/href_list) + if(href_list["examine"]) + if(istype(user)) + var/mob/living/human/H = get_recursive_loc_of_type(/mob/living/human) + if(H.Adjacent(user)) + user.examinate(src) + return TOPIC_HANDLED + return ..() + +/obj/item/clothing/gloves/ring/get_examine_line() + . = ..() + . += " \[View\]" \ No newline at end of file diff --git a/code/modules/clothing/gloves/jewelry/rings/material.dm b/code/modules/clothing/gloves/jewelry/rings/material.dm index f2ac541d18e..1f4492cffc2 100644 --- a/code/modules/clothing/gloves/jewelry/rings/material.dm +++ b/code/modules/clothing/gloves/jewelry/rings/material.dm @@ -1,38 +1,10 @@ ///////////////////////////////////////// //Material Rings -// TODO: Merge this into /obj/item/clothing/gloves/ring? +//TODO: Repath to /obj/item/clothing/gloves/ring/crafted? +//Also, maybe move can_inscribe = TRUE down to the base ring? /obj/item/clothing/gloves/ring/material material_alteration = MAT_FLAG_ALTERATION_ALL - -/obj/item/clothing/gloves/ring/material/set_material(var/new_material) - . = ..() - if(istype(material) && (material_alteration & MAT_FLAG_ALTERATION_DESC)) - desc = "A ring made from [material.solid_name]." - -/obj/item/clothing/gloves/ring/material/attackby(var/obj/item/S, var/mob/user) - if(S.sharp) - var/inscription = sanitize(input("Enter an inscription to engrave.", "Inscription") as null|text) - if(user.stat || !user.incapacitated() || !user.Adjacent(src) || S.loc != user) - return TRUE - if(!inscription) - return TRUE - desc = "A ring made from [material.solid_name]." - to_chat(user, "You carve \"[inscription]\" into \the [src].") - desc += "
Written on \the [src] is the inscription \"[inscription]\"" - return TRUE - return ..() - -/obj/item/clothing/gloves/ring/material/OnTopic(var/mob/user, var/list/href_list) - if(href_list["examine"]) - if(istype(user)) - var/mob/living/human/H = get_recursive_loc_of_type(/mob/living/human) - if(H.Adjacent(user)) - user.examinate(src) - return TOPIC_HANDLED - -/obj/item/clothing/gloves/ring/material/get_examine_line() - . = ..() - . += " \[View\]" + can_inscribe = TRUE /obj/item/clothing/gloves/ring/material/wood material = /decl/material/solid/organic/wood/walnut From ff5eeb56ea8064b6f0ef696af20f9f0bac6365db Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 15 Nov 2024 11:48:06 -0500 Subject: [PATCH 027/554] Add fantasy modpack override for red wine --- mods/content/fantasy/items/material_overrides.dm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/mods/content/fantasy/items/material_overrides.dm b/mods/content/fantasy/items/material_overrides.dm index 9b44d28f029..7b9b3a8b851 100644 --- a/mods/content/fantasy/items/material_overrides.dm +++ b/mods/content/fantasy/items/material_overrides.dm @@ -24,4 +24,15 @@ /obj/item/chems/drinks/bottle/premiumwine/make_random_name() var/decl/language/hnoll/hnoll_language = GET_DECL(/decl/language/hnoll) - return "bottle of vintage [hnoll_language.get_random_name(FEMALE, name_count = prob(20) ? 2 : 1)]" \ No newline at end of file + return "bottle of vintage [hnoll_language.get_random_name(FEMALE, name_count = prob(20) ? 2 : 1)]" + +/obj/item/chems/drinks/bottle/wine + name = "bottle of red wine" + desc = "A bottle of locally-produced red wine." + var/place_of_origin + +/obj/item/chems/drinks/bottle/wine/Initialize() + . = ..() + var/decl/language/hnoll/hnoll_language = GET_DECL(/decl/language/hnoll) + place_of_origin = hnoll_language.get_random_name(FEMALE, name_count = prob(20) ? 2 : 1) + desc += " It has a label that reads '[place_of_origin]'." \ No newline at end of file From fa7e86737644ad200ab61b13e0587a360bb8f1f3 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 15 Nov 2024 11:57:08 -0500 Subject: [PATCH 028/554] Improve magic number opacity set to exclude decimals --- .../materials/definitions/liquids/materials_liquid_soup.dm | 6 +++--- test/check-paths.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/materials/definitions/liquids/materials_liquid_soup.dm b/code/modules/materials/definitions/liquids/materials_liquid_soup.dm index e959c9aac4b..ff7723e0ae4 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_soup.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_soup.dm @@ -105,7 +105,7 @@ nutriment_factor = 10 glass_name = "stew" reagent_overlay_base = "reagent_base_chunky" - opacity = 1 + opacity = 1.0 /decl/material/liquid/nutriment/soup/chili name = "chili" @@ -117,7 +117,7 @@ glass_name = "chili" nutriment_factor = 10 reagent_overlay_base = "reagent_base_chunky" - opacity = 1 + opacity = 1.0 /decl/material/liquid/nutriment/soup/curry name = "curry" @@ -128,7 +128,7 @@ reagent_overlay = "soup_dumplings" glass_name = "curry" nutriment_factor = 10 - opacity = 1 + opacity = 1.0 /decl/material/liquid/nutriment/soup/noodle name = "noodle soup" diff --git a/test/check-paths.sh b/test/check-paths.sh index d34ee8c4458..16121645824 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -51,7 +51,7 @@ exactly 20 "direct loc set" '(\t|;|\.)loc\s*=(?!=)' -P exactly 0 "magic number mouse opacity set" 'mouse_opacity\s*=\s*[0-2]' -P exactly 1 "magic number density set" '\bdensity\s*=\s*[01]' -P exactly 0 "magic number anchored set" '\banchored\s*=\s*[01]' -P -exactly 11 "magic number opacity set" '\bopacity\s*=\s*[01]' -P +exactly 0 "magic number opacity set" '\bopacity\s*=\s*[01](?!\.)' -P # With the potential exception of << if you increase any of these numbers you're probably doing it wrong From d656bed0de3ce56db34180170f429bf1b615c79d Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 15 Nov 2024 17:43:14 -0500 Subject: [PATCH 029/554] Fix chicken cutlets tasting like meat instead of chicken --- code/modules/butchery/butchery_data.dm | 6 +- code/modules/butchery/butchery_data_fish.dm | 24 +++++ code/modules/butchery/butchery_data_misc.dm | 9 ++ code/modules/butchery/butchery_products.dm | 95 ++++++++++++------- .../butchery/butchery_products_chopped.dm | 9 +- .../butchery/butchery_products_cutlet.dm | 2 +- .../butchery/butchery_products_meat.dm | 16 ++-- .../butchery/butchery_products_meat_fish.dm | 18 ++-- maps/away/errant_pisces/errant_pisces.dm | 2 +- 9 files changed, 118 insertions(+), 63 deletions(-) diff --git a/code/modules/butchery/butchery_data.dm b/code/modules/butchery/butchery_data.dm index 065f8232ef0..1cd4c1850cf 100644 --- a/code/modules/butchery/butchery_data.dm +++ b/code/modules/butchery/butchery_data.dm @@ -35,13 +35,13 @@ if(donor && product_loc) blood_splatter(product_loc, donor, large = TRUE) if(ispath(product_type, /obj/item/stack)) - LAZYADD(., new product_type(product_loc, product_amount, product_material, donor)) + LAZYADD(., new product_type(product_loc, product_amount, product_material, donor?.butchery_data, donor?.get_butchery_product_name())) else if(ispath(product_type, /obj/item/food)) for(var/i = 1 to product_amount) - LAZYADD(., new product_type(product_loc, product_material, TRUE, donor)) + LAZYADD(., new product_type(product_loc, product_material, TRUE, donor?.butchery_data, donor?.get_butchery_product_name())) else for(var/i = 1 to product_amount) - LAZYADD(., new product_type(product_loc, product_material, donor)) + LAZYADD(., new product_type(product_loc, product_material, donor?.butchery_data, donor?.get_butchery_product_name())) /decl/butchery_data/proc/harvest_skin(mob/living/donor) . = place_products(donor, skin_material, skin_amount, skin_type) diff --git a/code/modules/butchery/butchery_data_fish.dm b/code/modules/butchery/butchery_data_fish.dm index 9932fc224e8..1facebe1a93 100644 --- a/code/modules/butchery/butchery_data_fish.dm +++ b/code/modules/butchery/butchery_data_fish.dm @@ -56,3 +56,27 @@ bone_amount = 30 skin_amount = 30 butchery_offset = list(-16, 0) + +/decl/butchery_data/animal/fish/mollusc + meat_name = "mollusc" + meat_type = /obj/item/food/butchery/meat/fish/mollusc + bone_material = /decl/material/solid/organic/bone/cartilage + skin_material = /decl/material/solid/organic/skin // i have no clue what mollusc skin is like aside from 'slimy' + +/decl/butchery_data/animal/fish/mollusc/clam + meat_type = /obj/item/food/butchery/meat/fish/mollusc/clam + bone_material = /decl/material/solid/organic/bone // no 'shell' material :( + +/decl/butchery_data/animal/fish/mollusc/barnacle + meat_type = /obj/item/food/butchery/meat/fish/mollusc/barnacle + bone_material = /decl/material/solid/organic/bone // maybe we just need calcium carbonate or something... limestone? + +/decl/butchery_data/animal/fish/mollusc/octopus + meat_name = "tako" + meat_type = /obj/item/food/butchery/meat/fish/octopus + stomach_type = /obj/item/food/butchery/stomach + gut_type = /obj/item/food/butchery/offal + meat_amount = 5 + bone_amount = 15 + skin_amount = 15 + must_use_hook = TRUE \ No newline at end of file diff --git a/code/modules/butchery/butchery_data_misc.dm b/code/modules/butchery/butchery_data_misc.dm index 2dc6f568ab4..60aa3f2e6ff 100644 --- a/code/modules/butchery/butchery_data_misc.dm +++ b/code/modules/butchery/butchery_data_misc.dm @@ -28,3 +28,12 @@ gut_amount = null gut_material = null gut_type = null + +/decl/butchery_data/xeno + meat_name = "xeno" + meat_type = /obj/item/food/butchery/meat/xeno + meat_amount = 10 + skin_material = /decl/material/solid/organic/skin/insect + skin_amount = 25 + bone_material = /decl/material/solid/organic/bone/cartilage + bone_amount = 15 \ No newline at end of file diff --git a/code/modules/butchery/butchery_products.dm b/code/modules/butchery/butchery_products.dm index d275e42576c..23f9dc4858c 100644 --- a/code/modules/butchery/butchery_products.dm +++ b/code/modules/butchery/butchery_products.dm @@ -14,29 +14,61 @@ cooked_food = FOOD_RAW var/fat_material = /decl/material/solid/organic/meat/gut var/meat_name = "meat" - -/obj/item/food/butchery/Initialize(mapload, material_key, skip_plate = FALSE, mob/living/donor) - var/decl/butchery_data/butchery_decl = GET_DECL(donor?.butchery_data) - if(butchery_decl) - if(butchery_decl.meat_material) - material = butchery_decl.meat_material - fat_material = butchery_decl.gut_material - if(isnull(slice_path)) - slice_path = butchery_decl.meat_type + /// The initial butchery data to use (if a typepath), otherwise the butchery data of our donor. + var/decl/butchery_data/butchery_data + /// A multiplier for the number of slices, when autosetting from butchery_data. + var/slices_multiplier = 1 + +// This contains, specifically, initialisation code that must run before the parent call in Initialize(). +/obj/item/food/butchery/proc/initialize_butchery_data(decl/butchery_data/new_data, new_meat_name) + if(new_data) + if(ispath(new_data)) + butchery_data = GET_DECL(new_data) + else if(istype(new_data)) + butchery_data = new_data + else + PRINT_STACK_TRACE("Invalid value passed to [type], expected /decl/butchery_data, got [new_data]") + else if(ispath(butchery_data)) + butchery_data = GET_DECL(butchery_data) + if(butchery_data) + if(butchery_data.meat_material) + material = butchery_data.meat_material + fat_material = butchery_data.gut_material if(isnull(slice_num)) - slice_num = butchery_decl.meat_amount - if(butchery_decl.meat_name) - nutriment_desc = list((butchery_decl.meat_name) = 10) - else if(meat_name) // premapped - nutriment_desc = list((meat_name) = 10) + if(slices_multiplier != 1) + slice_num = max(1, round(butchery_data.meat_amount * slices_multiplier)) + else + slice_num = butchery_data.meat_amount + if(slice_num > 0 && isnull(slice_path)) // Don't autoset a path if we're intentionally not sliceable. + slice_path = butchery_data.meat_type + // only butchery_data's meat_name, not src's meat_name, to avoid synthmeat that tastes like 'synthetic' + if(butchery_data.meat_name) + nutriment_desc = list((butchery_data.meat_name) = 10) + +/obj/item/food/butchery/Initialize(mapload, material_key, skip_plate = FALSE, decl/butchery_data/new_data, new_meat_name) + initialize_butchery_data(new_data, new_meat_name) . = ..() - if(butchery_decl) - add_allergen_flags(butchery_decl.meat_flags) - if(istype(donor)) - meat_name = donor.get_butchery_product_name() + if(butchery_data) + add_allergen_flags(butchery_data.meat_flags) + if(new_meat_name) + meat_name = new_meat_name + else if(butchery_data) + meat_name = butchery_data.meat_name || initial(meat_name) if(meat_name) set_meat_name(meat_name) +/obj/item/food/butchery/create_slice() + if(ispath(slice_path, /obj/item/food/butchery)) + return new slice_path(loc, material?.type, TRUE, butchery_data, meat_name) + else + return ..() + +/obj/item/food/butchery/get_dried_product() + . = ..() + if(meat_name && istype(., /obj/item/food/jerky)) + var/obj/item/food/jerky/jerk = . + jerk.set_meat_name(meat_name) + /obj/item/food/butchery/get_drying_state(var/obj/rack) return "meat" @@ -166,13 +198,13 @@ nutriment_amt = 5 w_class = ITEM_SIZE_SMALL slice_path = null - slice_num = null + slice_num = 0 // null means autoset, 0 means none /obj/item/food/butchery/offal/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow /obj/item/food/butchery/offal/small/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow /obj/item/food/butchery/haunch name = "haunch" @@ -183,13 +215,12 @@ w_class = ITEM_SIZE_LARGE var/bone_material = /decl/material/solid/organic/bone -/obj/item/food/butchery/haunch/Initialize(mapload, material_key, skip_plate = FALSE, mob/living/donor) - var/decl/butchery_data/butchery_decl = GET_DECL(donor?.butchery_data) - if(butchery_decl) - bone_material = butchery_decl.bone_material +/obj/item/food/butchery/haunch/initialize_butchery_data(decl/butchery_data/new_data, new_meat_name) + . = ..() // sets butchery_data for us + if(butchery_data) + bone_material = butchery_data.bone_material if(bone_material) LAZYSET(matter, bone_material, MATTER_AMOUNT_REINFORCEMENT) - . = ..() /obj/item/food/butchery/haunch/on_update_icon() ..() @@ -203,31 +234,27 @@ add_overlay(overlay_image(icon, "[icon_state]-fat", fat.color, RESET_COLOR)) /obj/item/food/butchery/haunch/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow /obj/item/food/butchery/haunch/shoulder name = "shoulder" /obj/item/food/butchery/haunch/shoulder/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow /obj/item/food/butchery/haunch/side name = "side of meat" desc = "Approximately half the torso and body of an unfortunate animal, split lengthways, cleaned, and ready for cooking." icon = 'icons/obj/food/butchery/side.dmi' w_class = ITEM_SIZE_HUGE - -/obj/item/food/butchery/haunch/side/Initialize(mapload, material_key, skip_plate = FALSE, mob/living/donor) - . = ..() - if(donor && !isnull(slice_num)) - slice_num = max(1, round(slice_num/2)) + slices_multiplier = 0.5 /obj/item/food/butchery/haunch/side/set_meat_name(new_meat_name) meat_name = new_meat_name SetName("side of [new_meat_name]") /obj/item/food/butchery/haunch/side/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow // TODO: unify with organ/internal/stomach? /obj/item/food/butchery/stomach diff --git a/code/modules/butchery/butchery_products_chopped.dm b/code/modules/butchery/butchery_products_chopped.dm index b750d2e46b9..64bf8d898d8 100644 --- a/code/modules/butchery/butchery_products_chopped.dm +++ b/code/modules/butchery/butchery_products_chopped.dm @@ -6,14 +6,11 @@ nutriment_amt = 1 w_class = ITEM_SIZE_TINY filling_color = "#ff1c1c" - -/obj/item/food/butchery/chopped/Initialize(mapload, material_key, skip_plate = FALSE) - . = ..() - slice_path = null - slice_num = null + slice_path = null + slice_num = 0 // null means autoset, 0 means none /obj/item/food/butchery/chopped/set_meat_name(new_meat_name) - . = ..() + meat_name = new_meat_name if(cooked_food == FOOD_RAW) SetName("chopped raw [new_meat_name]") else diff --git a/code/modules/butchery/butchery_products_cutlet.dm b/code/modules/butchery/butchery_products_cutlet.dm index 984c8a4d583..5e05b10fecd 100644 --- a/code/modules/butchery/butchery_products_cutlet.dm +++ b/code/modules/butchery/butchery_products_cutlet.dm @@ -24,5 +24,5 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR /obj/item/food/butchery/cutlet/raw/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow desc = "A thin piece of raw beef." \ No newline at end of file diff --git a/code/modules/butchery/butchery_products_meat.dm b/code/modules/butchery/butchery_products_meat.dm index 0c65f0f83eb..aa4cdbd9a51 100644 --- a/code/modules/butchery/butchery_products_meat.dm +++ b/code/modules/butchery/butchery_products_meat.dm @@ -43,44 +43,42 @@ /obj/item/food/butchery/meat/beef desc = "The classic red meat." - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow /obj/item/food/butchery/meat/goat desc = "Goat meat, to the uncultured." - meat_name = "chevon" + butchery_data = /decl/butchery_data/animal/ruminant/goat /obj/item/food/butchery/meat/chicken name = "piece" desc = "It tastes like you'd expect." material = /decl/material/solid/organic/meat/chicken - meat_name = "chicken" + butchery_data = /decl/butchery_data/animal/small/fowl/chicken /obj/item/food/butchery/meat/chicken/game desc = "Fresh game meat, harvested from some wild bird." - meat_name = "fowl" + butchery_data = /decl/butchery_data/animal/small/fowl /obj/item/food/butchery/meat/corgi desc = "Tastes like... well you know..." - meat_name = "dog" - + butchery_data = /decl/butchery_data/animal/corgi /obj/item/food/butchery/meat/xeno desc = "A slab of green meat. Smells like acid." icon_state = "xenomeat" - meat_name = "xeno" color = "#43de18" center_of_mass = @'{"x":16,"y":10}' bitesize = 6 + butchery_data = /decl/butchery_data/xeno /obj/item/food/butchery/meat/xeno/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/acid/polyacid, 6) - /obj/item/food/butchery/meat/bear - meat_name = "bear" desc = "A very manly slab of meat." icon_state = "bearmeat" + butchery_data = /decl/butchery_data/animal/space_bear /obj/item/food/butchery/meat/bear/populate_reagents() . = ..() diff --git a/code/modules/butchery/butchery_products_meat_fish.dm b/code/modules/butchery/butchery_products_meat_fish.dm index ae64e5d1c18..f1e06223d09 100644 --- a/code/modules/butchery/butchery_products_meat_fish.dm +++ b/code/modules/butchery/butchery_products_meat_fish.dm @@ -14,7 +14,7 @@ backyard_grilling_announcement = "steams gently." slice_path = /obj/item/food/sashimi slice_num = 3 - meat_name = "fish" + butchery_data = /decl/butchery_data/animal/fish allergen_flags = ALLERGEN_FISH /obj/item/food/butchery/meat/fish/get_meat_icons() @@ -44,7 +44,7 @@ backyard_grilling_product = null backyard_grilling_announcement = null slice_path = null - slice_num = null + slice_num = 0 // null means autoset, 0 means none material_alteration = MAT_FLAG_ALTERATION_NONE cooked_food = FOOD_COOKED @@ -59,29 +59,29 @@ return meat_icons /obj/item/food/butchery/meat/fish/poison - meat_name = "space carp" + butchery_data = /decl/butchery_data/animal/fish/space_carp /obj/item/food/butchery/meat/fish/poison/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/carpotoxin, 6) /obj/item/food/butchery/meat/fish/shark - meat_name = "shark" + butchery_data = /decl/butchery_data/animal/fish/shark /obj/item/food/butchery/meat/fish/carp - meat_name = "carp" + butchery_data = /decl/butchery_data/animal/fish/carp /obj/item/food/butchery/meat/fish/octopus - meat_name = "tako" + butchery_data = /decl/butchery_data/animal/fish/mollusc/octopus /obj/item/food/butchery/meat/fish/mollusc name = "meat" desc = "Some slimy meat from clams or molluscs." - meat_name = "mollusc" + butchery_data = /decl/butchery_data/animal/fish/mollusc nutriment_type = /decl/material/liquid/nutriment/slime_meat /obj/item/food/butchery/meat/fish/mollusc/clam - meat_name = "clam" + butchery_data = /decl/butchery_data/animal/fish/mollusc/clam /obj/item/food/butchery/meat/fish/mollusc/barnacle - meat_name = "barnacle" + butchery_data = /decl/butchery_data/animal/fish/mollusc/barnacle diff --git a/maps/away/errant_pisces/errant_pisces.dm b/maps/away/errant_pisces/errant_pisces.dm index 08d86395099..82cba1ab1eb 100644 --- a/maps/away/errant_pisces/errant_pisces.dm +++ b/maps/away/errant_pisces/errant_pisces.dm @@ -66,7 +66,7 @@ /obj/item/food/butchery/meat/fish/shark desc = "A fillet of cosmoshark meat." - meat_name = "cosmoshark" + butchery_data = /decl/butchery_data/animal/fish/space_carp/shark color = "#cecece" center_of_mass = @'{"x":17,"y":13}' bitesize = 8 From 94979a2d4797bc096b8e80068145af3ccc66e09e Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 15 Nov 2024 17:50:38 -0500 Subject: [PATCH 030/554] Use reagents_overlay for pot contents --- .../modules/food/cooking/cooking_vessels/pot.dm | 13 ++++++------- icons/obj/food/cooking_vessels/pot.dmi | Bin 564 -> 984 bytes 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/code/modules/food/cooking/cooking_vessels/pot.dm b/code/modules/food/cooking/cooking_vessels/pot.dm index f2b8d1d04f8..93c6a4585eb 100644 --- a/code/modules/food/cooking/cooking_vessels/pot.dm +++ b/code/modules/food/cooking/cooking_vessels/pot.dm @@ -13,13 +13,12 @@ material = /decl/material/solid/metal/iron color = /decl/material/solid/metal/iron::color -/obj/item/chems/cooking_vessel/pot/on_update_icon() - . = ..() - if(reagents?.total_volume) - if(last_boil_status) - add_overlay(overlay_image(icon, "[icon_state]-boiling", reagents.get_color(), RESET_COLOR | RESET_ALPHA)) - else - add_overlay(overlay_image(icon, "[icon_state]-still", reagents.get_color(), RESET_COLOR | RESET_ALPHA)) +/obj/item/chems/cooking_vessel/pot/get_reagents_overlay(state_prefix) + var/image/our_overlay = ..() + if(our_overlay && last_boil_status && check_state_in_icon("[our_overlay.icon_state]_boiling", icon)) + // change the base state but keep the overlays + our_overlay.icon_state = "[our_overlay.icon_state]_boiling" + return our_overlay /obj/item/chems/cooking_vessel/pot/ProcessAtomTemperature() . = ..() diff --git a/icons/obj/food/cooking_vessels/pot.dmi b/icons/obj/food/cooking_vessels/pot.dmi index f1816c557d0302f1b0165a715c04abf33e2f14c9..368ef60fd408f6167b93e2112997c71f130f18fb 100644 GIT binary patch literal 984 zcmV;}11J26P)005u_0{{R3dEt5<0000jP)t-sz`(#| zVs^s8$%=}e`1tt$|NluxT%w}6RZ?j3^z-=p^x);`+S}g%|1-eAzwVdenvNRiwYhj zqs4aq;ry&!RBcl~{&6*szs<#8&Apd)roCnw!RMfq8|kNqM60izgGo?tei}i|>#=i^ z1y0&_mtVBjj$MSn!dUS1V5t+D|42-OtG}hr_~D%NU*QSE-SHiYfi-ae00Lx5L_t(& zf$f<=Zqq;%hHYb+B7wxXMPlj9OqDD%GeKc#JUq2d4tscYoiz;FQW!4+7r?}iKH zE=Sbo{`$sMonKCp5N88p>}6CR=X?^;m~vxGIf>^hozJk6#S)fc zCuDrsw3M>KOM-Gb*$XHArombZ^{^f+jIsqU1780iRE(|u2y^L#R`%<2=?+Mot@QIY z_PNkvHz0ej_D8Z79BqHW)2WN^rhPtj{!Z_FuS|arms7`l*wVUf+x6!mpEzGAzV+R% z(26y_-Wit5InKw=7wVGp54U=iM50hk8S{om7G9sDFy7PQ(@uCD@A*|QW=zBZ-Tw-^ z)T^kE?7NR~KLQAXAc#GoeQ;bw#`!P(&(GlZ!Esp{=Uv~k2m9WmzUbSReUE>cdHs(!Vut%)Wo1@_KcB@$aihhk?`c3;xc-MT zWOahK?B>fdZ{*-V%4o-K=!75$f*^?hm^x%}W_0Brd0jnP6X1IyrEKtlv=e2R@Yy$< zw6)NnkUO+9 z{V)Rss=@CIw*wk%ujYw=PoDq8sRRvB4f#rZ73HYk2|uUDZ|Q`W70z6l(YI`-N(h1= z2+YRuYxr?PLK2dYg#S+XV0jTyxaobdgaafbAqh!%ro!LA7yLr>GPW8300000004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`QB~;{mt^MT5UDmPKQkvY zFCDvTGoWZ{PGTjHX`pAJgAE&UDJ!`8xq$ry0F@>@hJY>FDgXchE=fc|R9J=Wm%(ep zAQ;8dQQUQ3%I=H(O0F|9axEh4oR$6oW6<+3|3A#S&KOgw?ljoqJ~0DM{$B0hzdnO-%QK;svswAN}r`IT0I{tgI$ z;U}<08_?+eYqS^8Yu0Vu1n?#t-I(rAnsKfPpv zpZ$j+aE!tD`3`*_0)uyFS2~))@9hvJc|%WFIWXQ+==;CkTT0 zhot%-W^rCn^S+3=(g(Bi!-8}l#H9NmhWdaYe!~}c=uu}7tZoYc0000 Date: Fri, 15 Nov 2024 17:50:53 -0500 Subject: [PATCH 031/554] Add early continue to get_reagents_overlay loop --- code/game/objects/items/__item.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 824c679dd92..3865a0a4eab 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -1218,7 +1218,10 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. var/image/reagent_overlay = overlay_image(icon, reagents_state, reagents.get_color(), RESET_COLOR | RESET_ALPHA) for(var/reagent_type in reagents.reagent_volumes) var/decl/material/reagent = GET_DECL(reagent_type) + if(!reagent.reagent_overlay) + continue var/modified_reagent_overlay = state_prefix ? "[state_prefix]_[reagent.reagent_overlay]" : reagent.reagent_overlay - if(reagent.reagent_overlay && check_state_in_icon(modified_reagent_overlay, icon)) - reagent_overlay.overlays += overlay_image(icon, modified_reagent_overlay, reagent.get_reagent_overlay_color(reagents), RESET_COLOR | RESET_ALPHA) + if(!check_state_in_icon(modified_reagent_overlay, icon)) + continue + reagent_overlay.overlays += overlay_image(icon, modified_reagent_overlay, reagent.get_reagent_overlay_color(reagents), RESET_COLOR | RESET_ALPHA) return reagent_overlay From c38c97a68e2bfe7bf014aa11b5e9c930913227cd Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 15 Nov 2024 18:07:49 -0500 Subject: [PATCH 032/554] Fix pointless warning when bumping a lit stove --- code/modules/ZAS/Atom.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/ZAS/Atom.dm b/code/modules/ZAS/Atom.dm index d8575f1f9ce..c56c561fecd 100644 --- a/code/modules/ZAS/Atom.dm +++ b/code/modules/ZAS/Atom.dm @@ -42,4 +42,5 @@ // Make sure you know what you're doing if you call this // You probably want CanPass() /atom/movable/Cross(atom/movable/crossed_atom) - return CanPass(crossed_atom, crossed_atom.loc) \ No newline at end of file + // We only want to call CanPass() for multitiles, otherwise call parent. + return bounds != "32,32" ? CanPass(crossed_atom, crossed_atom.loc) : ..() \ No newline at end of file From 48332cafa19022990fdb2dc10b95610056c8b59a Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 15 Nov 2024 18:07:58 -0500 Subject: [PATCH 033/554] Add a second lantern to the shrine kitchen --- maps/shaded_hills/shaded_hills-inn.dmm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 66c8f4c3af3..065e23dcf99 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -1049,6 +1049,12 @@ "EV" = ( /turf/floor/path/basalt, /area/shaded_hills/outside/downlands) +"Ff" = ( +/obj/structure/wall_sconce/lantern{ + dir = 8 + }, +/turf/floor/wood/walnut, +/area/shaded_hills/shrine/kitchen) "FD" = ( /obj/structure/reagent_dispensers/barrel/ebony, /obj/item/seeds/extracted/rice, @@ -19625,7 +19631,7 @@ RG dx QW ge -ge +Ff ge QB CR From 7c5c4683098c93bc0ab995fc5eca8a2c101e3c19 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 15 Nov 2024 18:28:59 -0500 Subject: [PATCH 034/554] Fix ruminant butchery extra products --- code/modules/butchery/butchery_data_livestock.dm | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/code/modules/butchery/butchery_data_livestock.dm b/code/modules/butchery/butchery_data_livestock.dm index 00c18399232..5f5e65368fb 100644 --- a/code/modules/butchery/butchery_data_livestock.dm +++ b/code/modules/butchery/butchery_data_livestock.dm @@ -4,17 +4,13 @@ /decl/butchery_data/animal/ruminant/harvest_meat(mob/donor) var/static/list/extra_product = list( - /obj/item/food/butchery/haunch/shoulder, - /obj/item/food/butchery/haunch/shoulder, - /obj/item/food/butchery/haunch/side, - /obj/item/food/butchery/haunch/side, - /obj/item/food/butchery/haunch, - /obj/item/food/butchery/haunch + /obj/item/food/butchery/haunch/shoulder = 2, + /obj/item/food/butchery/haunch/side = 2, + /obj/item/food/butchery/haunch = 2 ) - var/create_turf = get_turf(donor) + . = list() for(var/product in extra_product) - var/food = new product(create_turf, meat_material, donor, bone_material) - LAZYADD(., food) + . += place_products(donor, meat_material, extra_product[product], product) /decl/butchery_data/animal/ruminant/goat meat_name = "chevon" From 25d3e0684d060193d6ec860ff6dbea94852ce63d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 14 Nov 2024 23:11:07 +1100 Subject: [PATCH 035/554] Adding Doe's new barrel icons and implementing stackable casks. --- code/__defines/inventory_sizes.dm | 19 ++- code/_onclick/adjacent.dm | 4 +- .../structures/{ => barrels}/barrel.dm | 31 +++- code/game/objects/structures/barrels/cask.dm | 42 +++++ .../objects/structures/barrels/cask_rack.dm | 156 ++++++++++++++++++ .../crafting/stack_recipes/recipes_planks.dm | 10 ++ icons/obj/structures/barrel.dmi | Bin 589 -> 0 bytes icons/obj/structures/barrels/barrel.dmi | Bin 0 -> 833 bytes icons/obj/structures/barrels/cask.dmi | Bin 0 -> 490 bytes icons/obj/structures/barrels/cask_rack.dmi | Bin 0 -> 304 bytes .../structures/barrels/cask_rack_large.dmi | Bin 0 -> 316 bytes maps/shaded_hills/shaded_hills-inn.dmm | 16 +- nebula.dme | 4 +- 13 files changed, 254 insertions(+), 28 deletions(-) rename code/game/objects/structures/{ => barrels}/barrel.dm (74%) create mode 100644 code/game/objects/structures/barrels/cask.dm create mode 100644 code/game/objects/structures/barrels/cask_rack.dm delete mode 100644 icons/obj/structures/barrel.dmi create mode 100644 icons/obj/structures/barrels/barrel.dmi create mode 100644 icons/obj/structures/barrels/cask.dmi create mode 100644 icons/obj/structures/barrels/cask_rack.dmi create mode 100644 icons/obj/structures/barrels/cask_rack_large.dmi diff --git a/code/__defines/inventory_sizes.dm b/code/__defines/inventory_sizes.dm index 39842fd9099..0432f304bd8 100644 --- a/code/__defines/inventory_sizes.dm +++ b/code/__defines/inventory_sizes.dm @@ -16,16 +16,17 @@ 20 - things that take up an entire turf, like wall girders or door assemblies */ -#define ITEM_SIZE_TINY 1 -#define ITEM_SIZE_SMALL 2 -#define ITEM_SIZE_NORMAL 3 -#define ITEM_SIZE_LARGE 4 -#define ITEM_SIZE_HUGE 5 -#define ITEM_SIZE_GARGANTUAN 6 -#define ITEM_SIZE_STRUCTURE 20 +#define ITEM_SIZE_TINY 1 +#define ITEM_SIZE_SMALL 2 +#define ITEM_SIZE_NORMAL 3 +#define ITEM_SIZE_LARGE 4 +#define ITEM_SIZE_HUGE 5 +#define ITEM_SIZE_GARGANTUAN 6 +#define ITEM_SIZE_STRUCTURE 20 +#define ITEM_SIZE_LARGE_STRUCTURE 30 -#define ITEM_SIZE_MIN ITEM_SIZE_TINY -#define ITEM_SIZE_MAX ITEM_SIZE_STRUCTURE +#define ITEM_SIZE_MIN ITEM_SIZE_TINY +#define ITEM_SIZE_MAX ITEM_SIZE_LARGE_STRUCTURE #define BASE_STORAGE_COST(w_class) (2**(w_class-1)) //1,2,4,8,16,... diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 70e40cb6eb3..328becddbbf 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -103,7 +103,7 @@ Quick adjacency (to turf): return TRUE if(istype(loc, /obj/item) || istype(loc, /obj/structure)) if(recurse > 0) - return loc.Adjacent(neighbor,recurse - 1) + return loc.Adjacent(neighbor, recurse - 1) return FALSE return ..() @@ -112,7 +112,7 @@ Quick adjacency (to turf): return TRUE if(istype(loc, /obj/item) || istype(loc, /obj/structure)) if(recurse > 0) - return loc.Adjacent(neighbor,recurse - 1) + return loc.Adjacent(neighbor, recurse - 1) return FALSE return ..() diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrels/barrel.dm similarity index 74% rename from code/game/objects/structures/barrel.dm rename to code/game/objects/structures/barrels/barrel.dm index 20d0c9d6eb2..c8668066624 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrels/barrel.dm @@ -1,7 +1,7 @@ /obj/structure/reagent_dispensers/barrel name = "barrel" desc = "A stout barrel for storing large amounts of liquids or substances." - icon = 'icons/obj/structures/barrel.dmi' + icon = 'icons/obj/structures/barrels/barrel.dmi' icon_state = ICON_STATE_WORLD anchored = TRUE atom_flags = ATOM_FLAG_CLIMBABLE @@ -16,10 +16,19 @@ volume = 7500 movable_flags = MOVABLE_FLAG_WHEELED throwpass = TRUE + // Should we draw our lid and liquid contents as overlays? + var/show_liquid_contents = TRUE + // Rivets, bands, etc. Currently just cosmetic. + var/decl/material/metal_material = /decl/material/solid/metal/iron /obj/structure/reagent_dispensers/barrel/Initialize() - ..() - return INITIALIZE_HINT_LATELOAD + if(ispath(metal_material)) + metal_material = GET_DECL(metal_material) + if(!istype(metal_material)) + metal_material = null + . = ..() + if(. == INITIALIZE_HINT_NORMAL && storage) + return INITIALIZE_HINT_LATELOAD // we want to grab our turf contents. /obj/structure/reagent_dispensers/barrel/attackby(obj/item/W, mob/user) . = ..() @@ -48,15 +57,29 @@ update_icon() /obj/structure/reagent_dispensers/barrel/on_update_icon() + . = ..() - if(ATOM_IS_OPEN_CONTAINER(src)) + + // Layer below lid/lid metal. + if(metal_material) + add_overlay(overlay_image(icon, "[icon_state]-metal", metal_material.color, RESET_COLOR)) + + // Add lid/reagents overlay/lid metal. + if(show_liquid_contents && ATOM_IS_OPEN_CONTAINER(src)) if(reagents) var/overlay_amount = NONUNIT_CEILING(reagents.total_liquid_volume / reagents.maximum_volume * 100, 10) var/image/filling_overlay = overlay_image(icon, "[icon_state]-[overlay_amount]", reagents.get_color(), RESET_COLOR | RESET_ALPHA) add_overlay(filling_overlay) add_overlay(overlay_image(icon, "[icon_state]-lidopen", material.color, RESET_COLOR)) + if(metal_material) + add_overlay(overlay_image(icon, "[icon_state]-lidopen-metal", metal_material.color, RESET_COLOR)) else add_overlay(overlay_image(icon, "[icon_state]-lidclosed", material.color, RESET_COLOR)) + if(metal_material) + add_overlay(overlay_image(icon, "[icon_state]-lidclosed-metal", metal_material.color, RESET_COLOR)) + + if(istype(loc, /obj/structure/cask_rack)) + loc.update_icon() /obj/structure/reagent_dispensers/barrel/ebony material = /decl/material/solid/organic/wood/ebony diff --git a/code/game/objects/structures/barrels/cask.dm b/code/game/objects/structures/barrels/cask.dm new file mode 100644 index 00000000000..04dbb4ca1ba --- /dev/null +++ b/code/game/objects/structures/barrels/cask.dm @@ -0,0 +1,42 @@ +/obj/structure/reagent_dispensers/barrel/cask + name = "cask" + desc = "A small barrel used to store moderate amounts of liquids or substances." + icon = 'icons/obj/structures/barrels/cask.dmi' + anchored = FALSE + show_liquid_contents = FALSE + storage = null // Intended for storing liquids. + +// Horrible workaround for physical interaction checks. +/obj/structure/reagent_dispensers/barrel/cask/nano_host() + return istype(loc, /obj/structure/cask_rack) ? loc : src + +/obj/structure/reagent_dispensers/barrel/cask/receive_mouse_drop(atom/dropping, mob/user, params) + if(istype(loc, /obj/structure/cask_rack)) + return loc.receive_mouse_drop(dropping, user, params) + return ..() + +/obj/structure/reagent_dispensers/barrel/cask/handle_mouse_drop(atom/over, mob/user, params) + var/obj/structure/cask_rack/rack = loc + if(istype(rack) && isturf(over) && user.Adjacent(over) && rack.Adjacent(over) && rack.try_unstack_barrel(src, over, user)) + return + return ..() + +/obj/structure/reagent_dispensers/barrel/cask/ebony + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + +/obj/structure/reagent_dispensers/barrel/cask/ebony/water/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/water, reagents.maximum_volume) + +/obj/structure/reagent_dispensers/barrel/cask/ebony/beer/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + +/obj/structure/reagent_dispensers/barrel/cask/ebony/wine/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) + +/obj/structure/reagent_dispensers/barrel/cask/ebony/oil/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/nutriment/plant_oil, reagents.maximum_volume) diff --git a/code/game/objects/structures/barrels/cask_rack.dm b/code/game/objects/structures/barrels/cask_rack.dm new file mode 100644 index 00000000000..f284886622f --- /dev/null +++ b/code/game/objects/structures/barrels/cask_rack.dm @@ -0,0 +1,156 @@ +/obj/structure/cask_rack + name = "cask rack" + desc = "A flat rack used to stop a cask from rolling around." + icon = 'icons/obj/structures/barrels/cask_rack.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + opacity = FALSE + density = FALSE // Recalculated when barrels added or removed + w_class = ITEM_SIZE_STRUCTURE + material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood::color + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + var/max_stack = 1 + +/obj/structure/cask_rack/Initialize(ml, _mat, _reinf_mat) + . = ..() + if(isturf(loc)) + for(var/atom/movable/stackable in loc) + if(try_stack_barrel(stackable) && length(contents) >= max_stack) + return + +/obj/structure/cask_rack/examine(mob/user, distance, infix, suffix) + . = ..() + if(length(contents)) + to_chat(user, SPAN_NOTICE("It contains [english_list(contents)].")) + +/obj/structure/cask_rack/handle_mouse_drop(atom/over, mob/user, params) + if(isturf(over) && user.Adjacent(over) && Adjacent(over) && try_unstack_barrel(target = over, user = user)) + return + return ..() + +/obj/structure/cask_rack/receive_mouse_drop(atom/dropping, mob/user, params) + . = ..() + if(!. && user.Adjacent(src) && dropping.Adjacent(src) && user.Adjacent(dropping)) + return try_stack_barrel(dropping, user) + +/obj/structure/cask_rack/on_update_icon() + . = ..() + if(length(contents)) + // Workaround for base color getting applied to vis_contents. + var/base_color = get_color() + color = null + var/image/I = image(icon, icon_state) + I.color = base_color + add_overlay(I) + // Reposition/update our contents. + var/i = 0 + var/list/stackable_types = get_stackable_barrel_types() + for(var/atom/movable/barrel in contents) + if(is_type_in_list(barrel, stackable_types)) + i++ + adjust_barrel_offsets(barrel, i) + else + color = get_color() + compile_overlays() // Avoid wonky flickering on contents changes + +/obj/structure/cask_rack/proc/adjust_barrel_offsets(atom/movable/barrel, barrel_position) + barrel.reset_offsets(anim_time = 0) + barrel.vis_flags |= (VIS_INHERIT_LAYER | VIS_INHERIT_PLANE) + +/obj/structure/cask_rack/Entered(atom/movable/AM, atom/old_loc) + . = ..() + if(istype(AM) && !QDELETED(AM) && is_type_in_list(AM, get_stackable_barrel_types())) + vis_contents |= AM + recalculate_barrel_values() + +/obj/structure/cask_rack/Exited(atom/movable/AM, atom/new_loc) + . = ..() + if(istype(AM) && is_type_in_list(AM, get_stackable_barrel_types())) + vis_contents -= AM + AM.vis_flags = initial(AM.vis_flags) + AM.reset_offsets(anim_time = 0) + recalculate_barrel_values() + +/obj/structure/cask_rack/proc/recalculate_barrel_values() + if(length(contents)) + density = TRUE + anchored = TRUE + obj_flags &= ~OBJ_FLAG_ANCHORABLE + atom_flags |= ATOM_FLAG_CLIMBABLE + else + density = FALSE + obj_flags |= OBJ_FLAG_ANCHORABLE + atom_flags &= ~ATOM_FLAG_CLIMBABLE + update_icon() + +/obj/structure/cask_rack/proc/try_unstack_barrel(atom/movable/barrel, turf/target, mob/user) + if(!loc) + return FALSE + if(!barrel) + if(!length(contents)) + to_chat(user, SPAN_WARNING("\The [src] has nothing stacked on it.")) + return FALSE + barrel = contents[length(contents)] + if(!istype(barrel) || !barrel.simulated) + return FALSE + if(target && (!isturf(target) || !loc.Adjacent(target))) // TODO: Enter() or CanPass() checks instead of relying on step_towards() below. + to_chat(user, SPAN_NOTICE("You cannot move \the [barrel] to \the [target].")) + return FALSE + to_chat(user, SPAN_NOTICE("You move \the [barrel] off \the [src].")) + barrel.dropInto(loc) + if(target) + step_towards(barrel, target) + return TRUE + +/obj/structure/cask_rack/proc/try_stack_barrel(atom/movable/barrel, mob/user) + if(!istype(barrel) || !barrel.simulated || barrel.anchored) + return FALSE + if(length(contents) >= max_stack) + to_chat(user, SPAN_WARNING("\The [src] is already stacked to capacity.")) + return FALSE + var/list/stackable_types = get_stackable_barrel_types() + if(!is_type_in_list(barrel, stackable_types)) + to_chat(user, SPAN_WARNING("\The [src] is cannot hold \the [barrel].")) + return FALSE + barrel.forceMove(src) + to_chat(user, SPAN_NOTICE("You stack \the [barrel] onto \the [src].")) + return TRUE + +/obj/structure/cask_rack/proc/get_stackable_barrel_types() + var/static/list/_stackable_barrel_types = list( + /obj/structure/reagent_dispensers/barrel/cask + ) + return _stackable_barrel_types + +// A larger stack, used to arrange up to three casks. +/obj/structure/cask_rack/large + desc = "A flat rack used to stop casks from rolling around." + max_stack = 3 + w_class = ITEM_SIZE_LARGE_STRUCTURE + icon = 'icons/obj/structures/barrels/cask_rack_large.dmi' + +// We want 'large wooden cask rack' not 'wooden large cask rack' +/obj/structure/cask_rack/large/update_material_name(override_name) + . = ..() + SetName("large [name]") + +/obj/structure/cask_rack/large/adjust_barrel_offsets(atom/movable/barrel, barrel_position) + ..() + switch(barrel_position) + if(1) + barrel.pixel_x -= 7 + if(2) + barrel.pixel_x += 7 + if(3) + barrel.pixel_y += 8 + +/obj/structure/cask_rack/large/mapped + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + +/obj/structure/cask_rack/large/mapped/Initialize(ml, _mat, _reinf_mat) + new /obj/structure/reagent_dispensers/barrel/cask/ebony/water(src) + new /obj/structure/reagent_dispensers/barrel/cask/ebony/beer(src) + new /obj/structure/reagent_dispensers/barrel/cask/ebony/wine(src) + . = ..() diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index c3dd35a7e40..f8a75075499 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -204,6 +204,16 @@ result_type = /obj/structure/reagent_dispensers/barrel difficulty = MAT_VALUE_HARD_DIY +/decl/stack_recipe/planks/furniture/barrel/cask + result_type = /obj/structure/reagent_dispensers/barrel/cask + +/decl/stack_recipe/planks/furniture/barrel/cask_rack + result_type = /obj/structure/cask_rack + +/decl/stack_recipe/planks/furniture/barrel/large_cask_rack + name = "cask rack, large" + result_type = /obj/structure/cask_rack/large + /decl/stack_recipe/planks/furniture/table_frame result_type = /obj/structure/table/frame category = "furniture" diff --git a/icons/obj/structures/barrel.dmi b/icons/obj/structures/barrel.dmi deleted file mode 100644 index 4adfb3e502e217a7a8f281384003369001913a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 589 zcmV-T0D@x2wg|Jao>E>jn2iT^P2zw0ZK_kK~z|U?Uhk(!ypWX zK~>+IR5?IEes6&tU`h_Kxbpq4GMuzcB;fKbDOfTjo_1Q@3Y>%+Ju zm<7Z+013e*ou>~%P8#TDXpndUVOaR@FaGoT$s3@ryQOg)F^h!2;d#3XjSn2bhgJy4 zZP%?%UCg9T2mnwK#MEax5y2qR_E|R0bA%vrFi47^zLiZz7!-l^A6%tNkO!x2$+|cq zYoZI#C(e1*8U%`fIP2hKYoJzE(~PY_qDc85G=ZJERa$j{@=xzkX$=+oM diff --git a/icons/obj/structures/barrels/barrel.dmi b/icons/obj/structures/barrels/barrel.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1fec40d535cbfcab80b2ee5d4199bf9c73e15acf GIT binary patch literal 833 zcmV-H1HSx;P)-_`txxI9)0A00001bW%=J06^y0W&i*Ho_bVRbVOxyV{&P5 zbZKvH004NLQ&wi?^C?`dUi!&v&s2IpMPfQ2(7=F5m6pURv>;ZYIk5`Oa4J+*aP@NmCky}y8=bGwk{mVw z00J#ZL_t(oh3%HhvZEjnhCx$jt>6Pl%j_ePeFQ4|nVPeo#i{fDk1(ha8>Tc?&1NqA z3(1$HyXod)6Oy%xL3PNl1X`>1fM3S947jNf6H=PK00LFfPM`Sww1ZySz8;*ou3ubc zPQz5YY-+HB5e$X2LmHn-Rqe65eFY}o)s-BGjY90Papv}}oJoU5Y80qFHrhC6oLU{E z<1E>1%QSPfu^c7`RtH{&3;sXt_}I0WD;n5XrJWi=3Wc4XrNI*@tQ|#w)gBX(`SFM$FH^Y2h}dW z7WMtX5ocv(Wo2dkZ948iPS_uJASd+ryhj|r|9^jmSy@?G|Al@6waZ@Lf9%n;00000 LNkvXXu0mjfXY_zv literal 0 HcmV?d00001 diff --git a/icons/obj/structures/barrels/cask.dmi b/icons/obj/structures/barrels/cask.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a2eba5fa0d9bce1911452b71973895bb77267f8a GIT binary patch literal 490 zcmVo=HbsWny;!|NjUmiwXb$00DGTPE!Ct=GbNc0047(R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq5uYmL%rjQmd@s>gNJ>0stRoCpjlI zL(u>L0S8G$K~y-6)sandgdh-w+mQoI)4ES92aulwh|C32x&K`P8lg>UCX1}nRyBOo z>xPKHw};DIYEZ<23~#P=%!+Y40eBP=#9rFfJi&p=MAnLB9!$IZe|v zrz+^v*}iIXh^Srl-1fiO7_7|>Y?sPQ>qjQS7^$U71aa*}N@b_Gad^rA5AS?fpL4Ew g#UBjaFZ_r41jdslL4u`Ex&QzG07*qoM6N<$f<_q9jsO4v literal 0 HcmV?d00001 diff --git a/icons/obj/structures/barrels/cask_rack.dmi b/icons/obj/structures/barrels/cask_rack.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2ee0ca5985bab0c3f5c921e0bea5939db0b7dbac GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*8>L*c)G`Qb>knv?>FNHaeCLNg+q7b~&X1|8IYiGBy z>gE*^C(NHb^3nD>L7%p=CqF|j&6Rv-etiEDpe+oZu6{1-oD!ML*c)G`Qb>knv?>FNHaeCLNg+q7b~&X1|8IYiGBy z>gE*^C(NHb^3nD>)L zE4URb7*iQMZ`PYduduE-bo_PeACU*=)i*OsORB{5&aB*WfLU;An7FZm_Flu8ybnIK z88dG^Db=lS%JF8gUXta;wM{LXFWWC>=XC8_HEq`fmTK#_`|j{B*rRxwoja!-Xd{EC LtDnm{r-UW|0NZ$a literal 0 HcmV?d00001 diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 0f8e896ad49..8b73c5e461e 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -61,10 +61,6 @@ unique_merge_identifier = "outer wall" }, /area/shaded_hills/outside/downlands) -"cy" = ( -/obj/structure/reagent_dispensers/barrel/ebony/water, -/turf/floor/wood/walnut, -/area/shaded_hills/shrine/kitchen) "cT" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 1 @@ -149,7 +145,7 @@ /turf/wall/brick/basalt/shutter, /area/shaded_hills/slaughterhouse) "fK" = ( -/obj/structure/reagent_dispensers/barrel/ebony/water, +/obj/structure/cask_rack/large/mapped, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) "fR" = ( @@ -939,10 +935,6 @@ "By" = ( /turf/floor/grass, /area/shaded_hills/outside/shrine) -"BD" = ( -/obj/structure/reagent_dispensers/barrel/ebony/wine, -/turf/floor/wood/walnut, -/area/shaded_hills/shrine/kitchen) "BG" = ( /obj/structure/bed/chair/bench/ebony{ dir = 1 @@ -1647,7 +1639,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine) "VE" = ( -/obj/structure/reagent_dispensers/barrel/ebony/beer, +/obj/structure/cask_rack/large/mapped, /turf/floor/wood/walnut, /area/shaded_hills/shrine/kitchen) "VM" = ( @@ -20379,9 +20371,9 @@ iK kv By px -cy +ge VE -BD +ge Sy Aq QB diff --git a/nebula.dme b/nebula.dme index 8298d371b91..dd67ff9ef8e 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1414,7 +1414,6 @@ #include "code\game\objects\structures\_structure_materials.dm" #include "code\game\objects\structures\ai_decoy.dm" #include "code\game\objects\structures\banners.dm" -#include "code\game\objects\structures\barrel.dm" #include "code\game\objects\structures\barricade.dm" #include "code\game\objects\structures\barsign.dm" #include "code\game\objects\structures\bedsheet_bin.dm" @@ -1488,6 +1487,9 @@ #include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\window.dm" #include "code\game\objects\structures\window_spawner.dm" +#include "code\game\objects\structures\barrels\barrel.dm" +#include "code\game\objects\structures\barrels\cask.dm" +#include "code\game\objects\structures\barrels\cask_rack.dm" #include "code\game\objects\structures\chemistry\_chemistry.dm" #include "code\game\objects\structures\crates_lockers\crates.dm" #include "code\game\objects\structures\crates_lockers\largecrate.dm" From 0b9bb490e6059fd06492dd83b5ba8d475b5eed1b Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 18 Nov 2024 01:48:47 +1100 Subject: [PATCH 036/554] Automatic changelog generation for PR #4562 [ci skip] --- html/changelogs/AutoChangeLog-pr-4562.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4562.yml diff --git a/html/changelogs/AutoChangeLog-pr-4562.yml b/html/changelogs/AutoChangeLog-pr-4562.yml new file mode 100644 index 00000000000..bbad92aba17 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4562.yml @@ -0,0 +1,4 @@ +author: MistakeNot4892 +changes: + - {tweak: Swapped barrel icons out for Doe's much nicer barrels.} +delete-after: true From 1b632c9f6cdb875c51ef30b30283e23aeb16f2e0 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 18 Nov 2024 00:54:15 +0000 Subject: [PATCH 037/554] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-4562.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4562.yml diff --git a/html/changelog.html b/html/changelog.html index 5316ba93c90..35c3254d620 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->

+

18 November 2024

+

MistakeNot4892 updated:

+
    +
  • Swapped barrel icons out for Doe's much nicer barrels.
  • +
+

13 November 2024

Penelope Haze updated:

- -

23 September 2024

-

MistakeNot4892 updated:

-
    -
  • You can now resist out of straightjackets.
  • -
From af8f42da675f768d78cc3cdc5679b1ab96e464ed Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Mon, 25 Nov 2024 14:25:55 -0500 Subject: [PATCH 074/554] Fix mapped large casks having invisible contents --- code/game/objects/structures/barrels/cask_rack.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/barrels/cask_rack.dm b/code/game/objects/structures/barrels/cask_rack.dm index f284886622f..20d6a1e61fe 100644 --- a/code/game/objects/structures/barrels/cask_rack.dm +++ b/code/game/objects/structures/barrels/cask_rack.dm @@ -150,7 +150,7 @@ color = /decl/material/solid/organic/wood/ebony::color /obj/structure/cask_rack/large/mapped/Initialize(ml, _mat, _reinf_mat) - new /obj/structure/reagent_dispensers/barrel/cask/ebony/water(src) - new /obj/structure/reagent_dispensers/barrel/cask/ebony/beer(src) - new /obj/structure/reagent_dispensers/barrel/cask/ebony/wine(src) . = ..() + try_stack_barrel(new /obj/structure/reagent_dispensers/barrel/cask/ebony/water) + try_stack_barrel(new /obj/structure/reagent_dispensers/barrel/cask/ebony/beer) + try_stack_barrel(new /obj/structure/reagent_dispensers/barrel/cask/ebony/wine) From 9f4738a7194a749e1b417ceaf51dffdd37dd7ef6 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Mon, 25 Nov 2024 14:44:20 -0500 Subject: [PATCH 075/554] Add athletics check to barrel stacking --- .../objects/structures/barrels/cask_rack.dm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/barrels/cask_rack.dm b/code/game/objects/structures/barrels/cask_rack.dm index 20d6a1e61fe..1fc406b86fb 100644 --- a/code/game/objects/structures/barrels/cask_rack.dm +++ b/code/game/objects/structures/barrels/cask_rack.dm @@ -32,7 +32,7 @@ /obj/structure/cask_rack/receive_mouse_drop(atom/dropping, mob/user, params) . = ..() if(!. && user.Adjacent(src) && dropping.Adjacent(src) && user.Adjacent(dropping)) - return try_stack_barrel(dropping, user) + return try_stack_barrel_timed(dropping, user) /obj/structure/cask_rack/on_update_icon() . = ..() @@ -97,13 +97,16 @@ if(target && (!isturf(target) || !loc.Adjacent(target))) // TODO: Enter() or CanPass() checks instead of relying on step_towards() below. to_chat(user, SPAN_NOTICE("You cannot move \the [barrel] to \the [target].")) return FALSE + if(user && !user.do_skilled(3 SECONDS, SKILL_HAULING, src)) + to_chat(user, SPAN_NOTICE("You stop moving \the [barrel] off of \the [src].")) + return FALSE to_chat(user, SPAN_NOTICE("You move \the [barrel] off \the [src].")) barrel.dropInto(loc) if(target) step_towards(barrel, target) return TRUE -/obj/structure/cask_rack/proc/try_stack_barrel(atom/movable/barrel, mob/user) +/obj/structure/cask_rack/proc/can_stack_barrel(atom/movable/barrel, mob/user) if(!istype(barrel) || !barrel.simulated || barrel.anchored) return FALSE if(length(contents) >= max_stack) @@ -111,12 +114,27 @@ return FALSE var/list/stackable_types = get_stackable_barrel_types() if(!is_type_in_list(barrel, stackable_types)) - to_chat(user, SPAN_WARNING("\The [src] is cannot hold \the [barrel].")) + to_chat(user, SPAN_WARNING("\The [src] cannot hold \the [barrel].")) + return FALSE + return TRUE + +/obj/structure/cask_rack/proc/try_stack_barrel(atom/movable/barrel, mob/user) + if(!can_stack_barrel(barrel, user)) return FALSE barrel.forceMove(src) - to_chat(user, SPAN_NOTICE("You stack \the [barrel] onto \the [src].")) return TRUE +/obj/structure/cask_rack/proc/try_stack_barrel_timed(atom/movable/barrel, mob/user) + if(!can_stack_barrel(barrel, user)) + return FALSE + if(user && !user.do_skilled(3 SECONDS, SKILL_HAULING, src)) + to_chat(user, SPAN_NOTICE("You stop stacking \the [barrel] onto \the [src].")) + return FALSE + if(try_stack_barrel(barrel, user)) + to_chat(user, SPAN_NOTICE("You stack \the [barrel] onto \the [src].")) + return TRUE + return FALSE + /obj/structure/cask_rack/proc/get_stackable_barrel_types() var/static/list/_stackable_barrel_types = list( /obj/structure/reagent_dispensers/barrel/cask From cb99092f7846537835baf6208f48865f17e5126e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 26 Nov 2024 11:25:05 +1100 Subject: [PATCH 076/554] Adding Doe's signs. --- code/game/objects/structures/banners.dm | 239 ++++++++++++------ .../recipes_hardness_integrity.dm | 9 + icons/obj/items/banners/sign.dmi | Bin 0 -> 682 bytes icons/obj/items/banners/sign_symbols.dmi | Bin 0 -> 2038 bytes icons/obj/structures/sign_post.dmi | Bin 0 -> 769 bytes 5 files changed, 176 insertions(+), 72 deletions(-) create mode 100644 icons/obj/items/banners/sign.dmi create mode 100644 icons/obj/items/banners/sign_symbols.dmi create mode 100644 icons/obj/structures/sign_post.dmi diff --git a/code/game/objects/structures/banners.dm b/code/game/objects/structures/banners.dm index 21f09be9f6e..fbf65eac37d 100644 --- a/code/game/objects/structures/banners.dm +++ b/code/game/objects/structures/banners.dm @@ -1,23 +1,28 @@ +// Assoc list of icon to icon_states to avoid constantly extracting them +var/global/list/_banner_decals = list() + /obj/structure/banner_frame - name = "banner frame" - desc = "A sturdy frame suitable for hanging a banner." - icon = 'icons/obj/structures/banner_frame.dmi' - icon_state = "banner_stand_preview" - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color - anchored = TRUE - density = FALSE - opacity = FALSE - atom_flags = ATOM_FLAG_CLIMBABLE - layer = ABOVE_WINDOW_LAYER - obj_flags = OBJ_FLAG_ANCHORABLE + name = "banner frame" + desc = "A sturdy frame suitable for hanging a banner." + icon = 'icons/obj/structures/banner_frame.dmi' + icon_state = "banner_stand_preview" + material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood::color + anchored = TRUE + opacity = FALSE + atom_flags = ATOM_FLAG_CLIMBABLE + layer = ABOVE_WINDOW_LAYER + obj_flags = OBJ_FLAG_ANCHORABLE tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) - material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR - max_health = 50 + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR + max_health = 50 + density = TRUE + var/force_south_facing = TRUE var/base_icon_state = "banner_stand" /// Reference to any banner currently hung on the frame. var/obj/item/banner/banner + var/accepts_banner_type = /obj/item/banner /obj/structure/banner_frame/set_dir(ndir) return ..(force_south_facing ? SOUTH : ndir) @@ -54,6 +59,12 @@ if(banner) to_chat(user, SPAN_WARNING("There is already a banner hung on \the [src].")) return TRUE + + var/obj/item/banner/other_banner = O + if(other_banner.banner_type != accepts_banner_type) + to_chat(user, SPAN_WARNING("\The [src] is not suitable for hanging \the [O].")) + return TRUE + if(user.try_unequip(O, src)) user.visible_message(SPAN_NOTICE("\The [user] hangs \the [O] from \the [src]."), SPAN_NOTICE("You hang \the [O] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) set_banner(O) @@ -87,7 +98,10 @@ for(var/decal in banner.decals) I = image(banner.decal_icon, decal) I.appearance_flags |= RESET_COLOR - I.color = banner.decals[decal] + if(banner.colourise_decal) + I.color = banner.decals[decal] + else + I.color = banner.color add_overlay(I) /obj/structure/banner_frame/Destroy() @@ -95,28 +109,45 @@ QDEL_NULL(banner) return ..() -var/global/list/_banner_decals = list() - /obj/item/banner - name = "banner" - desc = "A furled-up banner." - icon = 'icons/obj/items/banners/banner.dmi' - icon_state = "banner" - material = /decl/material/solid/organic/cloth - color = /decl/material/solid/organic/cloth::color - max_health = 20 - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME - w_class = ITEM_SIZE_NORMAL - var/hung_desc = "The banner is rather unremarkable." + name = "banner" + desc = "A furled-up banner." + icon = 'icons/obj/items/banners/banner.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/organic/cloth + color = /decl/material/solid/organic/cloth::color + max_health = 20 + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + w_class = ITEM_SIZE_NORMAL + var/colourise_decal = TRUE + var/hung_desc = "The banner is rather unremarkable." + var/decal_icon = 'icons/obj/items/banners/banner_symbols.dmi' + var/banner_type = /obj/item/banner + var/embroiderable = TRUE var/name_prefix - var/decal_icon = 'icons/obj/items/banners/banner_symbols.dmi' var/list/decals var/trim_color +/obj/item/banner/on_update_icon() + . = ..() + if(trim_color) + var/image/I = image(icon, "[icon_state]-trim") + I.appearance_flags |= RESET_COLOR + I.color = trim_color + add_overlay(I) + for(var/decal in decals) + var/image/I = image(decal_icon, decal) + if(colourise_decal) + I.appearance_flags |= RESET_COLOR + I.color = decals[decal] + add_overlay(I) + // TODO: PROPER EMBROIDERY AND ITEM DECORATION. /obj/item/banner/attackby(obj/item/used_item, mob/user) - if(istype(used_item, /obj/item/stack/material/thread)) + if(embroiderable && istype(used_item, /obj/item/stack/material/thread)) + + // TODO: check material crafting skill and do a do_after() if((!decal_icon || length(decals)) && trim_color) to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) @@ -150,95 +181,96 @@ var/global/list/_banner_decals = list() SetName("[name_prefix] [name]") /obj/item/banner/forked - name_prefix = "forked" - hung_desc = "The banner splits into two tails at the bottom." - icon = 'icons/obj/items/banners/banner_forked.dmi' - decal_icon = null // Current decals do not work nicely with the fork + name_prefix = "forked" + hung_desc = "The banner splits into two tails at the bottom." + icon = 'icons/obj/items/banners/banner_forked.dmi' + decal_icon = null // Current decals do not work nicely with the fork /obj/item/banner/pointed - name_prefix = "pointed" - hung_desc = "The banner narrows to a point at the bottom." - icon = 'icons/obj/items/banners/banner_pointed.dmi' + name_prefix = "pointed" + hung_desc = "The banner narrows to a point at the bottom." + icon = 'icons/obj/items/banners/banner_pointed.dmi' /obj/item/banner/rounded - name_prefix = "rounded" - hung_desc = "The banner has a rounded lower edge." - icon = 'icons/obj/items/banners/banner_rounded.dmi' + name_prefix = "rounded" + hung_desc = "The banner has a rounded lower edge." + icon = 'icons/obj/items/banners/banner_rounded.dmi' /obj/item/banner/square - name_prefix = "square" - hung_desc = "The banner has a squared-off lower edge." - icon = 'icons/obj/items/banners/banner_square.dmi' + name_prefix = "square" + hung_desc = "The banner has a squared-off lower edge." + icon = 'icons/obj/items/banners/banner_square.dmi' /obj/item/banner/tasselled - name_prefix = "tasselled" - hung_desc = "The banner has several dangling tassels at the bottom." - icon = 'icons/obj/items/banners/banner_tasselled.dmi' + name_prefix = "tasselled" + hung_desc = "The banner has several dangling tassels at the bottom." + icon = 'icons/obj/items/banners/banner_tasselled.dmi' /obj/item/banner/woven - name_prefix = "woven" - icon = 'icons/obj/items/banners/banner_woven.dmi' - material = /decl/material/solid/organic/plantmatter/grass/dry - color = /decl/material/solid/organic/plantmatter/grass/dry::color + name_prefix = "woven" + icon = 'icons/obj/items/banners/banner_woven.dmi' + material = /decl/material/solid/organic/plantmatter/grass/dry + color = /decl/material/solid/organic/plantmatter/grass/dry::color material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - hung_desc = "The woven banner is rustic and uneven." + hung_desc = "The woven banner is rustic and uneven." /obj/item/banner/green - name = "green banner" + name = "green banner" paint_color = COLOR_GREEN - color = COLOR_GREEN + color = COLOR_GREEN /obj/item/banner/red - name = "red banner" + name = "red banner" paint_color = COLOR_RED - color = COLOR_RED + color = COLOR_RED /obj/item/banner/blue - name = "blue banner" + name = "blue banner" paint_color = COLOR_BLUE - color = COLOR_BLUE + color = COLOR_BLUE // Mapping helpers below. /obj/structure/banner_frame/blue banner = /obj/item/banner/blue - color = /obj/item/banner/blue::color // Mapping preview colour. + color = /obj/item/banner/blue::color // Mapping preview colour. /obj/structure/banner_frame/red banner = /obj/item/banner/red - color = /obj/item/banner/red::color + color = /obj/item/banner/red::color /obj/structure/banner_frame/green banner = /obj/item/banner/green - color = /obj/item/banner/green::color + color = /obj/item/banner/green::color // A wall-mounted banner frame with no stand. /obj/structure/banner_frame/wall - name = "hanging banner frame" - desc = "A sturdy frame suitable for hanging a banner." - icon_state = "banner_hanging_preview" - base_icon_state = "banner_hanging" + name = "hanging banner frame" + desc = "A sturdy frame suitable for hanging a banner." + icon_state = "banner_hanging_preview" + base_icon_state = "banner_hanging" directional_offset = @'{"NORTH":{"y":-32},"SOUTH":{"y":-32},"EAST":{"x":-32},"WEST":{"x":-32}}' force_south_facing = FALSE + density = FALSE /obj/structure/banner_frame/wall/ebony material = /decl/material/solid/organic/wood/ebony - color = /decl/material/solid/organic/wood/ebony::color + color = /decl/material/solid/organic/wood/ebony::color /obj/structure/banner_frame/wall/ebony/red - banner = /obj/item/banner/red - color = /obj/item/banner/red::color // Mapping preview colour. + banner = /obj/item/banner/red + color = /obj/item/banner/red::color // Mapping preview colour. /obj/structure/banner_frame/wall/ebony/blue - banner = /obj/item/banner/blue - color = /obj/item/banner/blue::color + banner = /obj/item/banner/blue + color = /obj/item/banner/blue::color /obj/structure/banner_frame/wall/ebony/green - banner = /obj/item/banner/green - color = /obj/item/banner/green::color + banner = /obj/item/banner/green + color = /obj/item/banner/green::color /obj/structure/banner_frame/wall/ebony/woven - banner = /obj/item/banner/woven - color = /obj/item/banner/woven::color + banner = /obj/item/banner/woven + color = /obj/item/banner/woven::color // Debug item. /obj/structure/banner_frame/random/Initialize(ml, _mat, _reinf_mat) @@ -259,4 +291,67 @@ var/global/list/_banner_decals = list() var/decal = pick(global._banner_decals[banner.decal_icon]) var/decal_color = get_random_colour() LAZYSET(banner.decals, decal, decal_color) + banner.update_icon() update_icon() + +// what is a sign, if not a wooden banner +/obj/structure/banner_frame/sign + name = "sign post" + desc = "A post for hanging a sign." + icon = 'icons/obj/structures/sign_post.dmi' + desc = "A post for hanging a sign." + base_icon_state = "sign" + accepts_banner_type = /obj/item/banner/sign + icon_state = "sign_preview" + density = TRUE + +/obj/structure/banner_frame/sign/wall + base_icon_state = "sign_hanging" + icon_state = "sign_hanging_preview" + force_south_facing = FALSE + density = FALSE + +/obj/item/banner/sign + name = "sign" + banner_type = /obj/item/banner/sign + embroiderable = FALSE + icon = 'icons/obj/items/banners/sign.dmi' + material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood::color + hung_desc = "The sign is unadorned." + decal_icon = 'icons/obj/items/banners/sign_symbols.dmi' + colourise_decal = FALSE + +/obj/item/banner/sign/attackby(obj/item/used_item, mob/user) + if(IS_KNIFE(used_item) && user.a_intent == I_HELP) + if(!decal_icon || length(decals)) + to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) + return TRUE + if(!global._banner_decals[decal_icon]) + global._banner_decals[decal_icon] = icon_states(decal_icon) + var/decal_to_add = input(user, "Which symbol do you wish to add to \the [src]?", "Sign Symbol") as null|anything in global._banner_decals[decal_icon] + if(decal_to_add && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item) + decals[decal_to_add] = COLOR_WHITE + return TRUE + . = ..() + +/obj/item/banner/sign/random/Initialize(ml, material_key) + material = pick(typesof(/decl/material/solid/organic/wood)) + . = ..() + +/obj/structure/banner_frame/sign/random/Initialize(ml, _mat, _reinf_mat) + material = pick(typesof(/decl/material/solid/organic/wood)) + ..() + banner = new /obj/item/banner/sign/random(src) + return INITIALIZE_HINT_LATELOAD + +/obj/structure/banner_frame/sign/random/LateInitialize() + . = ..() + if(banner) + if(banner.decal_icon) + if(!global._banner_decals[banner.decal_icon]) + global._banner_decals[banner.decal_icon] = icon_states(banner.decal_icon) + var/decal = pick(global._banner_decals[banner.decal_icon]) + LAZYSET(banner.decals, decal, COLOR_WHITE) + banner.update_icon() + update_icon() diff --git a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm index 92e580a6d0e..6277f73b606 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm @@ -2,6 +2,9 @@ abstract_type = /decl/stack_recipe/hardness/integrity required_integrity = 50 +/decl/stack_recipe/hardness/integrity/sign + result_type = /obj/item/banner/sign + /decl/stack_recipe/hardness/integrity/furniture abstract_type = /decl/stack_recipe/hardness/integrity/furniture one_per_turf = TRUE @@ -19,6 +22,12 @@ /decl/stack_recipe/hardness/integrity/furniture/banner_frame result_type = /obj/structure/banner_frame +/decl/stack_recipe/hardness/integrity/furniture/sign_hook + result_type = /obj/structure/banner_frame/sign + +/decl/stack_recipe/hardness/integrity/furniture/sign_hook/wall + result_type = /obj/structure/banner_frame/sign/wall + /decl/stack_recipe/hardness/integrity/furniture/coatrack result_type = /obj/structure/coatrack diff --git a/icons/obj/items/banners/sign.dmi b/icons/obj/items/banners/sign.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a2fb9ec0361db2cb49207526d2bbd78c1186cdef GIT binary patch literal 682 zcmV;b0#*HqP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq19V=A~!mr6W|E;8R^vl$nc5sj`Br zp9|Q%0ESUCw;^cOQUCw}yh%hsR9J=Wmr;(wAP|N@yYJL+fL-+fMtcBC>-#?F{jahu z6wCZWTbk@9Cfj+K<_A7twEh!?*djCJsZ0B>e4x-F8` zovsGxmHr-(jhn;oA$E8Q_|4F2iDCPfwoutX@!97ynPcx|?C=P5b657}6Nk5P2|dBr zQ-^O)Vo!Qn@|P7m{BnPoqqo>%i^-7W5kgHryhR9fLYH?Yp`-`U{{0e_P^*E}S9(K0 z`Umz4znMxY8}Ai@8aP#}0jGGsAiEG%*o#Q@i`en0TJ9I@KhR>ocq{+^0rt9#&X%2^ QHUIzs07*qoM6N<$f}52=q5uE@ literal 0 HcmV?d00001 diff --git a/icons/obj/items/banners/sign_symbols.dmi b/icons/obj/items/banners/sign_symbols.dmi new file mode 100644 index 0000000000000000000000000000000000000000..16ce7891c0c98a6469bb14be61fb3c602c6581e4 GIT binary patch literal 2038 zcmVRtk3n73dAFBh_BOl4oQ_gB@SV#aLs@57WHG+FLJI4V)`%1>>Je6b_%dYl z0K{Tr#H>;2U{wOj1F(tYO~3Kv;sgWBx7zTf27wHO%z~5G{76bM@>J4ucw+1U`NBD( z{bPwp{Kbt&^ZU%Dx;54I6mPv!n!-$@hK>LL2FFQ6K~#90?OaWBqc{)+vD_mY?%1Gv z4Ay;d@ZA#T|NoT*&#dX!EjxD2)Yeq3o^!}U^cRSfo*N}eA|fIpA|fJQLaIYY^~bCB zn^vC6t%2(y;5!{i8fm@5LCUvdJ#q(W(LeTPcDhdl3cd07(`{=H)EszTeHv!0ye=RI z>MilU4_s4SnAMHX)P)WL&yvrK8Rw?KYYN^j<8(*_wv)~8WcK(;2Z0|xKMycE2h1&A zW%TCzS_W(jbI&{5X4#gEA>UV*eTBwZ-fSQT>Mb$d)XISM)ZMST+UIId#*pie3!jr} zv?Js|z0G&{L4|jdROj&MFurfW`K<_9Avq_T*ewtTRlSEn;A*UW!ePh9-d=!dZS|1v zwANMfTcKu`n}=N8ets{i+s|Vj5fKp)5fKsbr$H6{ZrJdn^P!@z-tj{f7Pm&en;~4Q z&5XC=QH8~=k*lC<$fBGSUFc>$pM=B&g~e+CZuTbwqqi)4vtPBwSk*mQN*}%|x%j3E z3#TgVgW&6fwkai)8JPKKhijz?pa)v!&|m+77!H{wU)d+ zh2&d9MC4o{4065z6c$(uerv~6h8)a%U8%gWG_IKQDH z3Ja_S_j78Z#C(>W_b)z_pMS_He&O8Wp>=?Ni#c^e0!~%bixCkK5fKp)e>~o8_odUt zh?Ol9!6v!`j26h^AG?EkB3~i(3QVj!yIkXT4d{4qrX4C8gsfyPmlLD6G`l z68nSHTiNYO8PIJyx7MUj>oPO9WnPMI7AUNAY_%hU=&jSn$y-u--QAfh$O(Dn9Jaa^ zfWpcSn+e)=;BD-7TCT+PrnC3+^@$E8rWEl|VdY(`K`T&iNjC?S70#!0>-l)goRBsN zDy(b{2o+Lqi8)xAv2x>f6*m|#FQv3Wg{8(VC`|B{WaAEdb2r$Hy_b!bbat&|iKwt_ zTf#-7-sTA=8<2@)O$e}eXX;jy^&_a=TiQ&_xf%=veq z4}L^ML_|bHL`1}IfwG-E*h&5I(Ei(HBYIP=*vp0SzNhQ?r_07>2;`;)vie4Ex&8`e zcq9@DtOY+vZL=)*LG)5@ha!;R?6hAkm^I^BIAO?wdUHiUOwEP&MDiS24Zw4urx#qo zEA{qDz$-ficoVurs)xHky}fWrnKg3NomAG$-M(Rur2?O6ulX!VD zKee<~g5Hw-G1MyhT7`9LrU_r3q})^&@dB)>&-iNJ7nSMVIn+J7t`|Z1T;U6_glArP z#V0{_WZknXTv8W!&(DW(z}pOJIxHa(iD?Ip9XiFwhSWhc_ z{~p?A2yM$H3hU`Te1DdH{~SJ_rEfon>HJ4U9tDN<^f~*pv=a}35`LwW!GH-v!DdYJtCIEi102aUkco_h6Br_t|kvsvJ1yn%*Vby^4+TapT z#oPLY6{`M0`GxHjMqg(qzhJk;(0+lb5p(hjCJ3tjS^0&UtC6sN!Bq699Aaf(y`8Lv z0UWGfXe)9o2l@k5eE|;G9}Lj(RRzF4hm!aC1_20k1~3M$N3a+H2y_O>YX;Gj_7V)x z8IY>=Sz#+cU@!pZ?w8OmD1Qxr^M3?jdO;os1E~Jn>h4iCz+eE*odLRL^%D#bu%hk& z2y_Pk0oHc_1M~nyy0dnEp#{3dv|sSh?Zq!F@h5TFr9YrM#ro7gyF!a_m<0&ImGtuA zLr2jf%zKoy5$clwlY_^ephY;(0+K|k?+20(0ca6ij9yjZp%)&C{!yuqFx7E*)wc!?PZWP8+Qnqn_)b=tQSxqucEv$WH@W)fmf$haA2DfK)nn{2X{Fx}4g}N06Te z=-j(h4@IYtTii7cA4R9~e!ZWf)5*s5Hp+Sf$hpbrp*C)V00000NkvXXu0mjf!@*f` literal 0 HcmV?d00001 From c960b102067f7742e07ccfd9ead9fb80c26c4043 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 29 Nov 2024 00:53:44 +0000 Subject: [PATCH 077/554] Automatic changelog generation [ci skip] --- html/changelog.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index b65c2e11537..11782eae61a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -112,13 +112,6 @@

Atermonera updated:

  • Fixed some grammatical issues in location event strings.
- -

27 September 2024

-

Penelope Haze updated:

-
    -
  • added overlays to show when a crafted or dried waterskin is closed
  • -
  • added a new sprite for waterskins made from dried ruminant stomachs
  • -
From 8c2dfd64f3c6aaec45ae629b51a359b4434714af Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 29 Nov 2024 14:29:46 -0500 Subject: [PATCH 078/554] Fix bots being treated as SSD on interact --- code/modules/mob/living/bot/bot.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 4a88a0fa035..66ab04d665a 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -84,6 +84,9 @@ if(. && !gibbed) gib() +/mob/living/bot/ssd_check() + return FALSE + /mob/living/bot/attackby(var/obj/item/O, var/mob/user) if(O.GetIdCard()) if(access_scanner.allowed(user) && !open) From f20e7e540e06e89b77e4aaa3d8011c45ceb70541 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 29 Nov 2024 14:29:54 -0500 Subject: [PATCH 079/554] Fix dirt being nameless when bots clean it --- code/game/objects/effects/dirty_floor.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/effects/dirty_floor.dm b/code/game/objects/effects/dirty_floor.dm index 798d07d738c..ef76cb06830 100644 --- a/code/game/objects/effects/dirty_floor.dm +++ b/code/game/objects/effects/dirty_floor.dm @@ -11,7 +11,6 @@ /obj/effect/decal/cleanable/dirt/Initialize() . = ..() - name = "" verbs.Cut() /obj/effect/decal/cleanable/dirt/on_update_icon() From 29c2d86f91416ade935e42ea1569593d8ed90052 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 29 Nov 2024 14:30:28 -0500 Subject: [PATCH 080/554] Fix AI unarmed attacks doing nothing --- code/modules/mob/living/bot/cleanbot.dm | 2 +- code/modules/mob/living/bot/farmbot.dm | 2 +- code/modules/mob/living/bot/floorbot.dm | 2 +- code/modules/mob/living/bot/medibot.dm | 2 +- code/modules/mob/living/bot/mulebot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 2 +- code/modules/mob/living/simple_animal/friendly/corgi.dm | 2 +- .../mob/living/simple_animal/hostile/retaliate/parrot.dm | 2 +- mods/content/xenobiology/slime/_slime.dm | 2 +- mods/content/xenobiology/slime/slime_AI.dm | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index c9442e2857f..e989ba53b32 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -51,7 +51,7 @@ /mob/living/bot/cleanbot/handleAdjacentTarget() if(get_turf(target) == src.loc) - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 4a487bb1a4c..86a8a941189 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -106,7 +106,7 @@ flick("farmbot_broke", src) /mob/living/bot/farmbot/handleAdjacentTarget() - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/farmbot/lookForTargets() if(emagged) diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index d3dc81be5c3..b772273fd66 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -95,7 +95,7 @@ /mob/living/bot/floorbot/handleAdjacentTarget() if(get_turf(target) == src.loc) - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/floorbot/lookForTargets() for(var/turf/floor/T in view(src)) diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index cf174faa8ce..8084e5eaaeb 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -73,7 +73,7 @@ /mob/living/bot/medbot/handleAdjacentTarget() if(is_tipped) // Don't handle targets if we're incapacitated! return - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/medbot/lookForTargets() if(is_tipped) // Don't look for targets if we're incapacitated! diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index 12d54b83759..bb9cf31e58e 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -172,7 +172,7 @@ if(target == src.loc) custom_emote(2, "makes a chiming sound.") playsound(loc, 'sound/machines/chime.ogg', 50, 0) - UnarmedAttack(target) + UnarmedAttack(target, TRUE) resetTarget() if(auto_return && home && (loc != home)) target = home diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 412d45498ac..2e47d627b53 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -182,7 +182,7 @@ begin_arrest(target, threat) ++awaiting_surrender else - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/secbot/proc/cuff_target(var/mob/living/target) if(istype(target) && !target.get_equipped_item(slot_handcuffed_str)) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index eef4666321c..c8ee4417ebf 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -96,7 +96,7 @@ else body.set_dir(SOUTH) if(isturf(movement_target.loc) && body.Adjacent(movement_target)) - body.UnarmedAttack(movement_target) + body.UnarmedAttack(movement_target, TRUE) else if(ishuman(movement_target.loc) && prob(20)) body.custom_emote(VISIBLE_MESSAGE, "stares at the [movement_target] that [movement_target.loc] has with sad puppy eyes.") diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index 5f8e5040ffb..aab2c3fca76 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -258,7 +258,7 @@ return //Time for the hurt to begin! - parrot.UnarmedAttack(L) + parrot.UnarmedAttack(L, parrot.Adjacent(L)) return //Otherwise, fly towards the mob! diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index fe74f041933..474a98545d1 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -127,7 +127,7 @@ if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille)) if(nutrition <= get_hunger_nutrition()) if (is_adult || prob(5)) - UnarmedAttack(AM) + UnarmedAttack(AM, Adjacent(AM)) if(ismob(AM)) var/mob/tmob = AM diff --git a/mods/content/xenobiology/slime/slime_AI.dm b/mods/content/xenobiology/slime/slime_AI.dm index 993f1debc4b..6577edb52ef 100644 --- a/mods/content/xenobiology/slime/slime_AI.dm +++ b/mods/content/xenobiology/slime/slime_AI.dm @@ -147,7 +147,7 @@ for(var/mob/living/slime/frenemy in range(1, body)) if(frenemy != body && body.Adjacent(frenemy)) body.a_intent_change((frenemy.slime_type == slime.slime_type) ? I_HELP : I_HURT) - body.UnarmedAttack(frenemy) + body.UnarmedAttack(frenemy, TRUE) added_delay = 10 else if(slime.Adjacent(current_target)) var/do_attack = FALSE @@ -161,7 +161,7 @@ body.a_intent_change(I_GRAB) do_attack = TRUE if(do_attack) - body.UnarmedAttack(current_target) + body.UnarmedAttack(current_target, TRUE) added_delay = 10 else current_target = null From 594a6dd788ed15842158b4bd7ee4d0b19933fba8 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Fri, 29 Nov 2024 14:39:59 -0500 Subject: [PATCH 081/554] Fix hugging bots instead of opening their menu --- code/modules/mob/living/bot/bot.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 66ab04d665a..fab8219c169 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -87,6 +87,9 @@ /mob/living/bot/ssd_check() return FALSE +/mob/living/bot/try_awaken(mob/user) + return FALSE + /mob/living/bot/attackby(var/obj/item/O, var/mob/user) if(O.GetIdCard()) if(access_scanner.allowed(user) && !open) From 0a99bb6d2923bbea00e0ec0a79619ba671841992 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 30 Nov 2024 08:49:35 +1100 Subject: [PATCH 082/554] Reworking banners to address feedback. --- code/game/objects/structures/banners.dm | 357 ------------------ code/modules/banners/__banner.dm | 133 +++++++ code/modules/banners/_banner_frame.dm | 126 +++++++ code/modules/banners/_banner_symbols.dm | 201 ++++++++++ .../banners/banner_frame_definitions.dm | 57 +++ code/modules/banners/sign.dm | 25 ++ code/modules/banners/sign_post.dm | 32 ++ nebula.dme | 7 +- 8 files changed, 580 insertions(+), 358 deletions(-) delete mode 100644 code/game/objects/structures/banners.dm create mode 100644 code/modules/banners/__banner.dm create mode 100644 code/modules/banners/_banner_frame.dm create mode 100644 code/modules/banners/_banner_symbols.dm create mode 100644 code/modules/banners/banner_frame_definitions.dm create mode 100644 code/modules/banners/sign.dm create mode 100644 code/modules/banners/sign_post.dm diff --git a/code/game/objects/structures/banners.dm b/code/game/objects/structures/banners.dm deleted file mode 100644 index fbf65eac37d..00000000000 --- a/code/game/objects/structures/banners.dm +++ /dev/null @@ -1,357 +0,0 @@ -// Assoc list of icon to icon_states to avoid constantly extracting them -var/global/list/_banner_decals = list() - -/obj/structure/banner_frame - name = "banner frame" - desc = "A sturdy frame suitable for hanging a banner." - icon = 'icons/obj/structures/banner_frame.dmi' - icon_state = "banner_stand_preview" - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color - anchored = TRUE - opacity = FALSE - atom_flags = ATOM_FLAG_CLIMBABLE - layer = ABOVE_WINDOW_LAYER - obj_flags = OBJ_FLAG_ANCHORABLE - tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) - material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR - max_health = 50 - density = TRUE - - var/force_south_facing = TRUE - var/base_icon_state = "banner_stand" - /// Reference to any banner currently hung on the frame. - var/obj/item/banner/banner - var/accepts_banner_type = /obj/item/banner - -/obj/structure/banner_frame/set_dir(ndir) - return ..(force_south_facing ? SOUTH : ndir) - -/obj/structure/banner_frame/Initialize(ml, _mat, _reinf_mat) - if(ispath(banner)) - set_banner(new banner(src)) - . = ..() - update_icon() - -/obj/structure/banner_frame/proc/set_banner(var/new_banner) - if(banner == new_banner) - return - banner = new_banner - if(banner) - name = banner.name - desc = "[initial(desc)] [banner.hung_desc]" - else - name = initial(name) - desc = initial(desc) - update_icon() - -/obj/structure/banner_frame/attack_hand(mob/user) - if(banner && user.check_dexterity(DEXTERITY_HOLD_ITEM)) - user.put_in_hands(banner) - var/old_banner = banner - set_banner(null) - user.visible_message(SPAN_NOTICE("\The [user] removes \the [old_banner] from \the [src]."), SPAN_NOTICE("You remove \the [old_banner] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) - return TRUE - return ..() - -/obj/structure/banner_frame/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/banner)) - if(banner) - to_chat(user, SPAN_WARNING("There is already a banner hung on \the [src].")) - return TRUE - - var/obj/item/banner/other_banner = O - if(other_banner.banner_type != accepts_banner_type) - to_chat(user, SPAN_WARNING("\The [src] is not suitable for hanging \the [O].")) - return TRUE - - if(user.try_unequip(O, src)) - user.visible_message(SPAN_NOTICE("\The [user] hangs \the [O] from \the [src]."), SPAN_NOTICE("You hang \the [O] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) - set_banner(O) - return TRUE - return ..() - -/obj/structure/banner_frame/dump_contents(atom/forced_loc = loc, mob/user) - if(istype(banner)) - banner.dropInto(forced_loc) - banner = null - . = ..() - -/obj/structure/banner_frame/on_update_icon() - . = ..() - - icon_state = base_icon_state - if(!istype(banner)) - return - - var/image/I = image(banner.icon, "[banner.icon_state]-hanging") - I.appearance_flags |= RESET_COLOR - I.color = banner.color - add_overlay(I) - - if(banner.trim_color) - I = image(banner.icon, "[banner.icon_state]-trim") - I.appearance_flags |= RESET_COLOR - I.color = banner.trim_color - add_overlay(I) - - for(var/decal in banner.decals) - I = image(banner.decal_icon, decal) - I.appearance_flags |= RESET_COLOR - if(banner.colourise_decal) - I.color = banner.decals[decal] - else - I.color = banner.color - add_overlay(I) - -/obj/structure/banner_frame/Destroy() - if(istype(banner)) - QDEL_NULL(banner) - return ..() - -/obj/item/banner - name = "banner" - desc = "A furled-up banner." - icon = 'icons/obj/items/banners/banner.dmi' - icon_state = ICON_STATE_WORLD - material = /decl/material/solid/organic/cloth - color = /decl/material/solid/organic/cloth::color - max_health = 20 - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME - w_class = ITEM_SIZE_NORMAL - var/colourise_decal = TRUE - var/hung_desc = "The banner is rather unremarkable." - var/decal_icon = 'icons/obj/items/banners/banner_symbols.dmi' - var/banner_type = /obj/item/banner - var/embroiderable = TRUE - var/name_prefix - var/list/decals - var/trim_color - -/obj/item/banner/on_update_icon() - . = ..() - if(trim_color) - var/image/I = image(icon, "[icon_state]-trim") - I.appearance_flags |= RESET_COLOR - I.color = trim_color - add_overlay(I) - for(var/decal in decals) - var/image/I = image(decal_icon, decal) - if(colourise_decal) - I.appearance_flags |= RESET_COLOR - I.color = decals[decal] - add_overlay(I) - -// TODO: PROPER EMBROIDERY AND ITEM DECORATION. -/obj/item/banner/attackby(obj/item/used_item, mob/user) - - if(embroiderable && istype(used_item, /obj/item/stack/material/thread)) - - // TODO: check material crafting skill and do a do_after() - - if((!decal_icon || length(decals)) && trim_color) - to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) - return TRUE - - var/obj/item/stack/material/thread/used_stack = used_item - if(used_stack.get_amount() < 5) - to_chat(user, SPAN_WARNING("You need at least five lengths of thread to embroider a banner.")) - return TRUE - - if(!trim_color) - user.visible_message("\The [user] sews a trim onto \the [src].") - trim_color = used_item.color - used_stack.use(5) - return TRUE - - if(decal_icon && !length(decals)) - if(!global._banner_decals[decal_icon]) - global._banner_decals[decal_icon] = icon_states(decal_icon) - var/decal_color = used_item.color - var/decal_to_sew = input(user, "Which symbol do you wish to add to \the [src]?", "Banner Symbol") as null|anything in global._banner_decals[decal_icon] - if(decal_to_sew && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item && used_stack.use(5)) - decals[decal_to_sew] = decal_color - return TRUE - - . = ..() - -// 'woven grass banner', 'forked linen banner' -/obj/item/banner/update_name() - . = ..() - SetName("[name_prefix] [name]") - -/obj/item/banner/forked - name_prefix = "forked" - hung_desc = "The banner splits into two tails at the bottom." - icon = 'icons/obj/items/banners/banner_forked.dmi' - decal_icon = null // Current decals do not work nicely with the fork - -/obj/item/banner/pointed - name_prefix = "pointed" - hung_desc = "The banner narrows to a point at the bottom." - icon = 'icons/obj/items/banners/banner_pointed.dmi' - -/obj/item/banner/rounded - name_prefix = "rounded" - hung_desc = "The banner has a rounded lower edge." - icon = 'icons/obj/items/banners/banner_rounded.dmi' - -/obj/item/banner/square - name_prefix = "square" - hung_desc = "The banner has a squared-off lower edge." - icon = 'icons/obj/items/banners/banner_square.dmi' - -/obj/item/banner/tasselled - name_prefix = "tasselled" - hung_desc = "The banner has several dangling tassels at the bottom." - icon = 'icons/obj/items/banners/banner_tasselled.dmi' - -/obj/item/banner/woven - name_prefix = "woven" - icon = 'icons/obj/items/banners/banner_woven.dmi' - material = /decl/material/solid/organic/plantmatter/grass/dry - color = /decl/material/solid/organic/plantmatter/grass/dry::color - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - hung_desc = "The woven banner is rustic and uneven." - -/obj/item/banner/green - name = "green banner" - paint_color = COLOR_GREEN - color = COLOR_GREEN - -/obj/item/banner/red - name = "red banner" - paint_color = COLOR_RED - color = COLOR_RED - -/obj/item/banner/blue - name = "blue banner" - paint_color = COLOR_BLUE - color = COLOR_BLUE - -// Mapping helpers below. -/obj/structure/banner_frame/blue - banner = /obj/item/banner/blue - color = /obj/item/banner/blue::color // Mapping preview colour. - -/obj/structure/banner_frame/red - banner = /obj/item/banner/red - color = /obj/item/banner/red::color - -/obj/structure/banner_frame/green - banner = /obj/item/banner/green - color = /obj/item/banner/green::color - -// A wall-mounted banner frame with no stand. -/obj/structure/banner_frame/wall - name = "hanging banner frame" - desc = "A sturdy frame suitable for hanging a banner." - icon_state = "banner_hanging_preview" - base_icon_state = "banner_hanging" - directional_offset = @'{"NORTH":{"y":-32},"SOUTH":{"y":-32},"EAST":{"x":-32},"WEST":{"x":-32}}' - force_south_facing = FALSE - density = FALSE - -/obj/structure/banner_frame/wall/ebony - material = /decl/material/solid/organic/wood/ebony - color = /decl/material/solid/organic/wood/ebony::color - -/obj/structure/banner_frame/wall/ebony/red - banner = /obj/item/banner/red - color = /obj/item/banner/red::color // Mapping preview colour. - -/obj/structure/banner_frame/wall/ebony/blue - banner = /obj/item/banner/blue - color = /obj/item/banner/blue::color - -/obj/structure/banner_frame/wall/ebony/green - banner = /obj/item/banner/green - color = /obj/item/banner/green::color - -/obj/structure/banner_frame/wall/ebony/woven - banner = /obj/item/banner/woven - color = /obj/item/banner/woven::color - -// Debug item. -/obj/structure/banner_frame/random/Initialize(ml, _mat, _reinf_mat) - . = ..() - var/banner_type = pick(list( - /obj/item/banner/pointed, - /obj/item/banner/rounded, - /obj/item/banner/square, - /obj/item/banner/tasselled, - /obj/item/banner/woven - )) - banner = new banner_type(src) - banner.set_color(get_random_colour()) - banner.trim_color = get_random_colour() - if(banner.decal_icon) - if(!global._banner_decals[banner.decal_icon]) - global._banner_decals[banner.decal_icon] = icon_states(banner.decal_icon) - var/decal = pick(global._banner_decals[banner.decal_icon]) - var/decal_color = get_random_colour() - LAZYSET(banner.decals, decal, decal_color) - banner.update_icon() - update_icon() - -// what is a sign, if not a wooden banner -/obj/structure/banner_frame/sign - name = "sign post" - desc = "A post for hanging a sign." - icon = 'icons/obj/structures/sign_post.dmi' - desc = "A post for hanging a sign." - base_icon_state = "sign" - accepts_banner_type = /obj/item/banner/sign - icon_state = "sign_preview" - density = TRUE - -/obj/structure/banner_frame/sign/wall - base_icon_state = "sign_hanging" - icon_state = "sign_hanging_preview" - force_south_facing = FALSE - density = FALSE - -/obj/item/banner/sign - name = "sign" - banner_type = /obj/item/banner/sign - embroiderable = FALSE - icon = 'icons/obj/items/banners/sign.dmi' - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color - hung_desc = "The sign is unadorned." - decal_icon = 'icons/obj/items/banners/sign_symbols.dmi' - colourise_decal = FALSE - -/obj/item/banner/sign/attackby(obj/item/used_item, mob/user) - if(IS_KNIFE(used_item) && user.a_intent == I_HELP) - if(!decal_icon || length(decals)) - to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) - return TRUE - if(!global._banner_decals[decal_icon]) - global._banner_decals[decal_icon] = icon_states(decal_icon) - var/decal_to_add = input(user, "Which symbol do you wish to add to \the [src]?", "Sign Symbol") as null|anything in global._banner_decals[decal_icon] - if(decal_to_add && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item) - decals[decal_to_add] = COLOR_WHITE - return TRUE - . = ..() - -/obj/item/banner/sign/random/Initialize(ml, material_key) - material = pick(typesof(/decl/material/solid/organic/wood)) - . = ..() - -/obj/structure/banner_frame/sign/random/Initialize(ml, _mat, _reinf_mat) - material = pick(typesof(/decl/material/solid/organic/wood)) - ..() - banner = new /obj/item/banner/sign/random(src) - return INITIALIZE_HINT_LATELOAD - -/obj/structure/banner_frame/sign/random/LateInitialize() - . = ..() - if(banner) - if(banner.decal_icon) - if(!global._banner_decals[banner.decal_icon]) - global._banner_decals[banner.decal_icon] = icon_states(banner.decal_icon) - var/decal = pick(global._banner_decals[banner.decal_icon]) - LAZYSET(banner.decals, decal, COLOR_WHITE) - banner.update_icon() - update_icon() diff --git a/code/modules/banners/__banner.dm b/code/modules/banners/__banner.dm new file mode 100644 index 00000000000..3301504725f --- /dev/null +++ b/code/modules/banners/__banner.dm @@ -0,0 +1,133 @@ +/obj/item/banner + name = "banner" + desc = "A furled-up banner." + icon = 'icons/obj/items/banners/banner.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/organic/cloth + color = /decl/material/solid/organic/cloth::color + max_health = 20 + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + w_class = ITEM_SIZE_NORMAL + var/colourise_decal = TRUE + var/hung_desc = "The banner is rather unremarkable." + var/banner_type = /obj/item/banner + var/embroiderable = TRUE + var/name_prefix + var/list/decals + var/trim_color + +var/global/list/banner_type_to_symbols = list() +/obj/item/banner/proc/get_available_decals() + . = global.banner_type_to_symbols[banner_type] + if(!.) + . = list() + for(var/decl/banner_symbol/symbol in decls_repository.get_decls_of_type_unassociated(/decl/banner_symbol)) + if(banner_type in symbol.usable_by_banner_type) + . += symbol + global.banner_type_to_symbols[banner_type] = . + +// TODO: PROPER EMBROIDERY AND ITEM DECORATION. +/obj/item/banner/attackby(obj/item/used_item, mob/user) + + if(embroiderable && istype(used_item, /obj/item/stack/material/thread)) + + // TODO: check material crafting skill and do a do_after() + + if((!length(get_available_decals()) || length(decals)) && trim_color) + to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) + return TRUE + + var/obj/item/stack/material/thread/used_stack = used_item + if(used_stack.get_amount() < 5) + to_chat(user, SPAN_WARNING("You need at least five lengths of thread to embroider a banner.")) + return TRUE + + if(!trim_color) + user.visible_message("\The [user] sews a trim onto \the [src].") + trim_color = used_item.color + used_stack.use(5) + return TRUE + + if(length(get_available_decals()) && !length(decals)) + var/list/available_decals = get_available_decals() + var/decal_color = used_item.color + var/decal_to_sew = input(user, "Which symbol do you wish to add to \the [src]?", "Banner Symbol") as null|anything in available_decals + if(decal_to_sew && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item && used_stack.use(5)) + decals[decal_to_sew] = decal_color + return TRUE + + . = ..() + +// 'woven grass banner', 'forked linen banner' +/obj/item/banner/update_name() + . = ..() + SetName("[name_prefix] [name]") + +/obj/item/banner/examine(mob/user, distance, infix, suffix) + . = ..() + var/decorations = get_decal_string() + if(decorations) + to_chat(user, "\The [src] is decorated with [decorations].") + +/obj/item/banner/proc/get_decal_string() + for(var/decl/banner_symbol/decal in decals) + if(colourise_decal) + LAZYADD(., "\a [decal.name]") + else + LAZYADD(., "\a [decal.name]") + if(trim_color) + // This is weak but I'm not sure how else to phrase it without a color-to-string system. + LAZYADD(., "a trim") + if(.) + return english_list(.) + +/obj/item/banner/forked + name_prefix = "forked" + hung_desc = "The banner splits into two tails at the bottom." + icon = 'icons/obj/items/banners/banner_forked.dmi' + +/obj/item/banner/forked/get_available_decals() + return null // Current decals do not work nicely with the fork + +/obj/item/banner/pointed + name_prefix = "pointed" + hung_desc = "The banner narrows to a point at the bottom." + icon = 'icons/obj/items/banners/banner_pointed.dmi' + +/obj/item/banner/rounded + name_prefix = "rounded" + hung_desc = "The banner has a rounded lower edge." + icon = 'icons/obj/items/banners/banner_rounded.dmi' + +/obj/item/banner/square + name_prefix = "square" + hung_desc = "The banner has a squared-off lower edge." + icon = 'icons/obj/items/banners/banner_square.dmi' + +/obj/item/banner/tasselled + name_prefix = "tasselled" + hung_desc = "The banner has several dangling tassels at the bottom." + icon = 'icons/obj/items/banners/banner_tasselled.dmi' + +/obj/item/banner/woven + name_prefix = "woven" + icon = 'icons/obj/items/banners/banner_woven.dmi' + material = /decl/material/solid/organic/plantmatter/grass/dry + color = /decl/material/solid/organic/plantmatter/grass/dry::color + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + hung_desc = "The woven banner is rustic and uneven." + +/obj/item/banner/green + name = "green banner" + paint_color = COLOR_GREEN + color = COLOR_GREEN + +/obj/item/banner/red + name = "red banner" + paint_color = COLOR_RED + color = COLOR_RED + +/obj/item/banner/blue + name = "blue banner" + paint_color = COLOR_BLUE + color = COLOR_BLUE diff --git a/code/modules/banners/_banner_frame.dm b/code/modules/banners/_banner_frame.dm new file mode 100644 index 00000000000..cda9521373e --- /dev/null +++ b/code/modules/banners/_banner_frame.dm @@ -0,0 +1,126 @@ +/obj/structure/banner_frame + name = "banner frame" + desc = "A sturdy frame suitable for hanging a banner." + icon = 'icons/obj/structures/banner_frame.dmi' + icon_state = "banner_stand_preview" + material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood::color + anchored = TRUE + opacity = FALSE + atom_flags = ATOM_FLAG_CLIMBABLE + layer = ABOVE_WINDOW_LAYER + obj_flags = OBJ_FLAG_ANCHORABLE + tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR + max_health = 50 + density = TRUE + + var/force_south_facing = TRUE + var/base_icon_state = "banner_stand" + /// Reference to any banner currently hung on the frame. + var/obj/item/banner/banner + var/accepts_banner_type = /obj/item/banner + +/obj/structure/banner_frame/set_dir(ndir) + return ..(force_south_facing ? SOUTH : ndir) + +/obj/structure/banner_frame/Initialize(ml, _mat, _reinf_mat) + if(ispath(banner)) + set_banner(new banner(src)) + . = ..() + update_icon() + +/obj/structure/banner_frame/proc/set_banner(var/new_banner) + if(banner == new_banner) + return + banner = new_banner + if(banner) + name = banner.name + var/list/desc_strings = list(initial(desc), banner.hung_desc) + var/decorations = banner.get_decal_string() + if(decorations) + desc_strings += "It is decorated with [decorations]." + desc = jointext(desc_strings, " ") + else + name = initial(name) + desc = initial(desc) + update_icon() + +/obj/structure/banner_frame/attack_hand(mob/user) + if(banner && user.check_dexterity(DEXTERITY_HOLD_ITEM)) + user.put_in_hands(banner) + var/old_banner = banner + set_banner(null) + user.visible_message( + SPAN_NOTICE("\The [user] removes \the [old_banner] from \the [src]."), + SPAN_NOTICE("You remove \the [old_banner] from \the [src]."), + SPAN_NOTICE("You hear the rustling of fabric.") + ) + return TRUE + return ..() + +/obj/structure/banner_frame/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/banner)) + if(banner) + to_chat(user, SPAN_WARNING("There is already a banner hung on \the [src].")) + return TRUE + + var/obj/item/banner/other_banner = O + if(other_banner.banner_type != accepts_banner_type) + to_chat(user, SPAN_WARNING("\The [src] is not suitable for hanging \the [O].")) + return TRUE + + if(user.try_unequip(O, src)) + user.visible_message(SPAN_NOTICE("\The [user] hangs \the [O] from \the [src]."), SPAN_NOTICE("You hang \the [O] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) + set_banner(O) + return TRUE + return ..() + +/obj/structure/banner_frame/dump_contents(atom/forced_loc = loc, mob/user) + if(istype(banner)) + banner.dropInto(forced_loc) + banner = null + . = ..() + +/obj/structure/banner_frame/on_update_icon() + . = ..() + + icon_state = base_icon_state + if(!istype(banner)) + return + + var/image/I = image(banner.icon, "[banner.icon_state]-hanging") + I.appearance_flags |= RESET_COLOR + I.color = banner.color + add_overlay(I) + + for(var/decl/banner_symbol/decal as anything in banner.decals) + I = image(decal.icon, decal.icon_state) + I.appearance_flags |= RESET_COLOR + I.blend_mode = BLEND_INSET_OVERLAY // Masks us to the banner icon. + if(banner.colourise_decal) + I.color = banner.decals[decal] + else + I.color = banner.color + add_overlay(I) + + if(banner.trim_color) + I = image(banner.icon, "[banner.icon_state]-trim") + I.appearance_flags |= RESET_COLOR + I.color = banner.trim_color + add_overlay(I) + +/obj/structure/banner_frame/Destroy() + if(istype(banner)) + QDEL_NULL(banner) + return ..() + +// A wall-mounted banner frame with no stand. +/obj/structure/banner_frame/wall + name = "hanging banner frame" + desc = "A sturdy frame suitable for hanging a banner." + icon_state = "banner_hanging_preview" + base_icon_state = "banner_hanging" + directional_offset = @'{"NORTH":{"y":-32},"SOUTH":{"y":-32},"EAST":{"x":-32},"WEST":{"x":-32}}' + force_south_facing = FALSE + density = FALSE diff --git a/code/modules/banners/_banner_symbols.dm b/code/modules/banners/_banner_symbols.dm new file mode 100644 index 00000000000..2de8b8a6521 --- /dev/null +++ b/code/modules/banners/_banner_symbols.dm @@ -0,0 +1,201 @@ +/decl/banner_symbol + abstract_type = /decl/banner_symbol + decl_flags = DECL_FLAG_MANDATORY_UID + /// Icon to draw from when rendering on a banner. + var/icon = 'icons/obj/items/banners/banner_symbols.dmi' + /// Icon state to draw from the icon. + var/icon_state + /// String used to select/describe a symbol + var/name + var/usable_by_banner_type = list( + /obj/item/banner + ) + +/decl/banner_symbol/validate() + . = ..() + if(!icon) + . += "null icon" + if(!istext(icon_state)) + . += "invalid/null icon_state" + if(!istext(name)) + . += "invalid/null name" + if(icon && icon_state && !check_state_in_icon(icon_state, icon)) + . += "missing icon_state '[icon_state]' from icon '[icon]'" + +// Default definitions below. +/decl/banner_symbol/starburst + name = "starburst" + icon_state = "starburst" + uid = "symbol_starburst" + +/decl/banner_symbol/fern + name = "fern" + icon_state = "fern" + uid = "symbol_fern" + +/decl/banner_symbol/snowflake + name = "snowflake" + icon_state = "snowflake" + uid = "symbol_snowflake" + +/decl/banner_symbol/sun + name = "sun" + icon_state = "sun" + uid = "symbol_sun" + +/decl/banner_symbol/scarab + name = "scarab" + icon_state = "scarab" + uid = "symbol_scarab" + +/decl/banner_symbol/triangle_chevron + name = "triangle with chevron" + icon_state = "triangle with chevron" + uid = "symbol_triangle_chevron" + +/decl/banner_symbol/triangle_down + name = "downward triangle" + icon_state = "downward triangle" + uid = "symbol_triangle_down" + +/decl/banner_symbol/triangle_up + name = "upward triangle" + icon_state = "upward triangle" + uid = "symbol_triangle_up" + +/decl/banner_symbol/hand + name = "hand" + icon_state = "hand" + uid = "symbol_hand" + +/decl/banner_symbol/sword + name = "sword" + icon_state = "sword" + uid = "symbol_sword" + +/decl/banner_symbol/knot + name = "knot" + icon_state = "knot" + uid = "symbol_knot" + +/decl/banner_symbol/circled_cup + name = "circled cup" + icon_state = "circled cup" + uid = "symbol_cup_circle" + +/decl/banner_symbol/aquila + name = "aquila" + icon_state = "aquila" + uid = "symbol_aquila" + +/decl/banner_symbol/orb + name = "orb" + icon_state = "orb" + uid = "symbol_orb" + +/decl/banner_symbol/bird_head + name = "bird head" + icon_state = "bird head" + uid = "symbol_bird_head" + +/decl/banner_symbol/deer + name = "deer" + icon_state = "deer" + uid = "symbol_deer" + +/decl/banner_symbol/deer_antler + name = "antlered deer" + icon_state = "antlered deer" + uid = "symbol_deer_antler" + +/decl/banner_symbol/duck + name = "duck head" + icon_state = "duck head" + uid = "symbol_duck_head" + +/decl/banner_symbol/frog + name = "frog" + icon_state = "frog" + uid = "symbol_frog" + +/decl/banner_symbol/fish + name = "fish" + icon_state = "fish" + uid = "symbol_fish" + +/decl/banner_symbol/bird + name = "bird" + icon_state = "bird" + uid = "symbol_bird" + +/decl/banner_symbol/cross + name = "cross" + icon_state = "cross" + uid = "symbol_cross" + +/decl/banner_symbol/sign + icon = 'icons/obj/items/banners/sign_symbols.dmi' + abstract_type = /decl/banner_symbol/sign + usable_by_banner_type = list( + /obj/item/banner/sign + ) + +/decl/banner_symbol/sign/mug + name = "mug" + icon_state = "mug" + uid = "symbol_sign_mug" + +/decl/banner_symbol/sign/scales + name = "scales" + icon_state = "scales" + uid = "symbol_sign_scales" + +/decl/banner_symbol/sign/mortar_pestle + name = "mortar and pestle" + icon_state = "mortar and pestle" + uid = "symbol_sign_mortar_pestle" + +/decl/banner_symbol/sign/pick_shovel + name = "pick and shovel" + icon_state = "pick and shovel" + uid = "symbol_sign_pick_shovel" + +/decl/banner_symbol/sign/face + name = "face" + icon_state = "face" + uid = "symbol_sign_face" + +/decl/banner_symbol/sign/crescent + name = "crescent" + icon_state = "crescent" + uid = "symbol_sign_crescent" + +/decl/banner_symbol/sign/vial + name = "vial" + icon_state = "vial" + uid = "symbol_sign_vial" + +/decl/banner_symbol/sign/spool + name = "spool" + icon_state = "spool" + uid = "symbol_sign_spool" + +/decl/banner_symbol/sign/pawnbroker + name = "pawnbroker" + icon_state = "pawnbroker" + uid = "symbol_sign_pawnbroker" + +/decl/banner_symbol/sign/sword + name = "sword" + icon_state = "sword" + uid = "symbol_sign_sword" + +/decl/banner_symbol/sign/cross + name = "cross" + icon_state = "cross" + uid = "symbol_sign_cross" + +/decl/banner_symbol/sign/circle + name = "circle" + icon_state = "circle" + uid = "symbol_sign_circle" diff --git a/code/modules/banners/banner_frame_definitions.dm b/code/modules/banners/banner_frame_definitions.dm new file mode 100644 index 00000000000..cf09eaf4652 --- /dev/null +++ b/code/modules/banners/banner_frame_definitions.dm @@ -0,0 +1,57 @@ +// Mapping helpers below. +/obj/structure/banner_frame/blue + banner = /obj/item/banner/blue + color = /obj/item/banner/blue::color // Mapping preview colour. + +/obj/structure/banner_frame/red + banner = /obj/item/banner/red + color = /obj/item/banner/red::color + +/obj/structure/banner_frame/green + banner = /obj/item/banner/green + color = /obj/item/banner/green::color + +/obj/structure/banner_frame/wall/ebony + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + +/obj/structure/banner_frame/wall/ebony/red + banner = /obj/item/banner/red + color = /obj/item/banner/red::color // Mapping preview colour. + +/obj/structure/banner_frame/wall/ebony/blue + banner = /obj/item/banner/blue + color = /obj/item/banner/blue::color + +/obj/structure/banner_frame/wall/ebony/green + banner = /obj/item/banner/green + color = /obj/item/banner/green::color + +/obj/structure/banner_frame/wall/ebony/woven + banner = /obj/item/banner/woven + color = /obj/item/banner/woven::color + +// Debug item. +/obj/structure/banner_frame/random/Initialize(ml, _mat, _reinf_mat) + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/structure/banner_frame/random/LateInitialize() + ..() + var/banner_type = pick(list( + /obj/item/banner/pointed, + /obj/item/banner/rounded, + /obj/item/banner/square, + /obj/item/banner/tasselled, + /obj/item/banner/woven + )) + var/obj/item/banner/new_banner = new banner_type(src) + new_banner.set_color(get_random_colour()) + new_banner.trim_color = get_random_colour() + var/list/available_decals = new_banner.get_available_decals() + if(length(available_decals)) + var/decal = pick(available_decals) + var/decal_color = get_random_colour() + LAZYSET(new_banner.decals, decal, decal_color) + new_banner.update_icon() + set_banner(new_banner) diff --git a/code/modules/banners/sign.dm b/code/modules/banners/sign.dm new file mode 100644 index 00000000000..cfc15e3310c --- /dev/null +++ b/code/modules/banners/sign.dm @@ -0,0 +1,25 @@ +/obj/item/banner/sign + name = "sign" + banner_type = /obj/item/banner/sign + embroiderable = FALSE + icon = 'icons/obj/items/banners/sign.dmi' + material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood::color + hung_desc = "The sign is unadorned." + colourise_decal = FALSE + +/obj/item/banner/sign/attackby(obj/item/used_item, mob/user) + if(IS_KNIFE(used_item) && user.a_intent == I_HELP) + var/available_decals = get_available_decals() + if(!length(available_decals) || length(decals)) + to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) + return TRUE + var/decal_to_add = input(user, "Which symbol do you wish to add to \the [src]?", "Sign Symbol") as null|anything in available_decals + if(decal_to_add && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item) + decals[decal_to_add] = COLOR_WHITE + return TRUE + . = ..() + +/obj/item/banner/sign/random/Initialize(ml, material_key) + material = pick(typesof(/decl/material/solid/organic/wood)) + . = ..() diff --git a/code/modules/banners/sign_post.dm b/code/modules/banners/sign_post.dm new file mode 100644 index 00000000000..d1d0f959023 --- /dev/null +++ b/code/modules/banners/sign_post.dm @@ -0,0 +1,32 @@ +// what is a sign, if not a wooden banner +/obj/structure/banner_frame/sign + name = "sign post" + desc = "A post for hanging a sign." + icon = 'icons/obj/structures/sign_post.dmi' + desc = "A post for hanging a sign." + base_icon_state = "sign" + accepts_banner_type = /obj/item/banner/sign + icon_state = "sign_preview" + density = TRUE + +/obj/structure/banner_frame/sign/wall + base_icon_state = "sign_hanging" + icon_state = "sign_hanging_preview" + force_south_facing = FALSE + density = FALSE + +/obj/structure/banner_frame/sign/random/Initialize(ml, _mat, _reinf_mat) + material = pick(typesof(/decl/material/solid/organic/wood)) + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/structure/banner_frame/sign/random/LateInitialize() + . = ..() + var/obj/item/banner/new_banner = new /obj/item/banner/sign/random(src) + if(new_banner) + var/list/available_decals = new_banner.get_available_decals() + if(length(available_decals)) + var/decal = pick(available_decals) + LAZYSET(new_banner.decals, decal, COLOR_WHITE) + new_banner.update_icon() + set_banner(new_banner) diff --git a/nebula.dme b/nebula.dme index 7c4b88297fe..c0d58745105 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1414,7 +1414,6 @@ #include "code\game\objects\structures\_structure_icon.dm" #include "code\game\objects\structures\_structure_materials.dm" #include "code\game\objects\structures\ai_decoy.dm" -#include "code\game\objects\structures\banners.dm" #include "code\game\objects\structures\barricade.dm" #include "code\game\objects\structures\barsign.dm" #include "code\game\objects\structures\bedsheet_bin.dm" @@ -1820,6 +1819,12 @@ #include "code\modules\backgrounds\location\locations_other.dm" #include "code\modules\backgrounds\religion\_religion.dm" #include "code\modules\backgrounds\religion\religions_human.dm" +#include "code\modules\banners\__banner.dm" +#include "code\modules\banners\_banner_frame.dm" +#include "code\modules\banners\_banner_symbols.dm" +#include "code\modules\banners\banner_frame_definitions.dm" +#include "code\modules\banners\sign.dm" +#include "code\modules\banners\sign_post.dm" #include "code\modules\blob\blob.dm" #include "code\modules\blood\blood.dm" #include "code\modules\blood\blood_types.dm" From d19df16ae3d25d455e283bf816df0037c79e9ef3 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 30 Nov 2024 12:57:07 +1100 Subject: [PATCH 083/554] Updating modpack banners. --- code/modules/banners/__banner.dm | 8 ++++++ mods/content/corporate/icons/banner.dmi | Bin 816 -> 0 bytes .../corporate/icons/banner_symbols.dmi | Bin 0 -> 318 bytes mods/content/corporate/items/clutter.dm | 11 +++++--- mods/content/government/icons/banner.dmi | Bin 913 -> 0 bytes .../government/icons/banner_symbols.dmi | Bin 0 -> 461 bytes mods/content/government/items/clutter.dm | 24 +++++++++++++----- 7 files changed, 34 insertions(+), 9 deletions(-) delete mode 100644 mods/content/corporate/icons/banner.dmi create mode 100644 mods/content/corporate/icons/banner_symbols.dmi delete mode 100644 mods/content/government/icons/banner.dmi create mode 100644 mods/content/government/icons/banner_symbols.dmi diff --git a/code/modules/banners/__banner.dm b/code/modules/banners/__banner.dm index 3301504725f..647f3adc73a 100644 --- a/code/modules/banners/__banner.dm +++ b/code/modules/banners/__banner.dm @@ -16,6 +16,14 @@ var/list/decals var/trim_color +/obj/item/banner/Initialize(ml, material_key) + for(var/decal in decals) + if(ispath(decal)) + var/decl/banner_symbol/decal_decl = GET_DECL(decal) + decals[decal_decl] = decals[decal] + decals -= decal + . = ..() + var/global/list/banner_type_to_symbols = list() /obj/item/banner/proc/get_available_decals() . = global.banner_type_to_symbols[banner_type] diff --git a/mods/content/corporate/icons/banner.dmi b/mods/content/corporate/icons/banner.dmi deleted file mode 100644 index cc4c3c95e9efe5a0757947e8cdd7f50eefeec807..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 816 zcmV-01JC@4P)gwvz(b1lsp1Zrd-rnBm=;*7ftH8j(?d|QMp`lz{T(GdPzP`Ssq@=^c!}$34 zK#A6s00001bW%=J06^y0W&i*Hg?dz2bVOxyV{&P5bZKvH004NLQ&wgNLXApo+4 zL~1A&{UQJW0pUqRK~z|U<&+C=f-n$(OJ9x~onuTGFx|ud{~vd40o#I$ZIdO7r-B&2 zkLz(gLjEoaCz4=Fy+fP@8R`o3MO+3m&)95;78I7Zh9X)}Ec|4METqfNhV6fHA^5g{ zE<76O6#l;tN;|ila%}YUI=j!upqVsT&fajZFsKhm%45mu?TL+ zfJ3R2(m22?RQT;6+iNMTdES+vru##!KT0*X3wS5NhUP1Mc5Dc*%V9?vBnp}G}_|FvhIXsG#8Qc%rm6( z7egvf!{?iN(g2DS)lnGgXNPAZ05BgT4CnI<xI0&B<+5M#&@7(RE^yL diff --git a/mods/content/corporate/icons/banner_symbols.dmi b/mods/content/corporate/icons/banner_symbols.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8d534a69a4839161b048e58b6f63ff7859d65205 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSoB=)|t_Kbr`2YX^p@S#ypJ>|v z6l5$3@(X5gcy=QV$jPq?i70VNElw`VEGWs$&tqVym=hdUP*nQ;OK`!*uTQkRb+yi& zIUl?s)Zn7=gGV~&eKb!p6!rA(urLlXzHIEJFz3;vBa=cDf;IIG_4hB)*l1zu-`Q=f zx_O1flF8l1Yc&kbMUR+02?{ItTFf|`m*G*ijC*;+@>rnN8J;eVAr`&K2@;nMG_p=T zZ_&u>o4~otL4B9QWa(KBhfPWtO-mT{Ov+6P1WI0MNC+I*($%PVh0(LYbWLOCRhAT0 zA%{@D3RWQr35$t8dw6+xv?^F{gqa%n@;ZbGo;t8$RbxgvzbMd;CH(A5?zDnJiow&> K&t;ucLK6VHb#jpa literal 0 HcmV?d00001 diff --git a/mods/content/corporate/items/clutter.dm b/mods/content/corporate/items/clutter.dm index 4de07358d1b..19ba76ee455 100644 --- a/mods/content/corporate/items/clutter.dm +++ b/mods/content/corporate/items/clutter.dm @@ -23,14 +23,19 @@ /obj/item/banner/nanotrasen name = "\improper NanoTrasen banner" hung_desc = "The banner is emblazoned with the NanoTrasen logo." - icon = 'mods/content/corporate/icons/banner.dmi' desc = "A banner emblazoned with the NanoTrasen logo." material_alteration = MAT_FLAG_ALTERATION_NONE color = COLOR_NAVY_BLUE + trim_color = COLOR_GOLD decals = list( - "banner_trim" = COLOR_GOLD, - "banner_nanotrasen" = COLOR_WHITE + /decl/banner_symbol/nanotrasen = COLOR_WHITE ) /obj/structure/banner_frame/nanotrasen banner = /obj/item/banner/nanotrasen + +/decl/banner_symbol/nanotrasen + icon = 'mods/content/corporate/icons/banner_symbols.dmi' + name = "NanoTrasen logo" + icon_state = "nanotrasen" + uid = "symbol_corporate_nanotrasen" diff --git a/mods/content/government/icons/banner.dmi b/mods/content/government/icons/banner.dmi deleted file mode 100644 index 88a40994837056f868696a063bba2b920b1aeb47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 913 zcmV;C18)3@P)gwvz(b1lsp1Zrd-rnBm=;*7ftH8j(?d|QMp`lz{T(GdPzP`Ssq@=^c!@$76 z|9L>)-{1edKmg4D!27VT00001bW%=J06^y0W&i*Hhk8_4bVOxyV{&P5bZKvH004NL zQ&wawp0006sNklvEeg5JmxAQnn~ArGWx<(sn3$ z|2M3JBoIi#Mv7-uVlKr%zvUpp;kw6R#BRE8GpvzZL)t;F;3PyufFPxaj*yN zfFNm#qOM8TJm7^}nxO{im*Jzuk_E?atcj?h{A{?*8^X#NO^^ zgM9W_|7;pOd@Uh1em1B_r|TYC410WkQvIkDN9Rqd4Pkt3@blH9G7IG|2LBX`Cb=JF zcN&CZe~4r7QgLjLICJLAna`PF|Ihz;!r>!-4a4-d!w)wI?8u`&dilWyP94Vg_iI#Mj9$DUh~e)n nAbJk&$fNnOo86f+XC9RQRqQFcdVEF&00000NkvXXu0mjfF{R0n diff --git a/mods/content/government/icons/banner_symbols.dmi b/mods/content/government/icons/banner_symbols.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ae958dd1f6d3cd8922d86cbc4a89b1246b995d86 GIT binary patch literal 461 zcmV;;0W$uHP)00DGTPE!Ct=GbNc003@!R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSI6p^;i!&v&s2HS$i!-e#F*g;&Hbkf?%PhjBMp?nt&joBT0BD{gPC*sySO5S3 z?@2^KR9J=Wl}!$WAPj}E;Q+u13Uh-wfs5Y%OjBn>j8c9!E++jFjnVgLOHDCGQJT0B zQNsKL-~qaNFpwQ+QgqnR<}~uExV)n28o(bK^qgKlLWol6r;#;Wap)J#X=D-X zR~uN$#;~=U5#!3LIG{iEVUW^kMN$48TIFw$?(Zy-tgnq>A~^&P;z~vh0~mjeU@6~f z#Bi&jZGiB;o``nKM=Tp5`Rh9tTd|1q)Gr}O-dC(_QqwTqhv`n&Y5hxzq9{AR`8zQ% zzVlQbs(1amg`m}rI(TW?JmSglykWYA>0O%dgQ65Zp Date: Mon, 2 Dec 2024 00:55:55 +0000 Subject: [PATCH 084/554] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 11782eae61a..af37f2ad836 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -106,12 +106,6 @@

MistakeNot4892 updated:

  • Sledgehammers can demolish non-reinforced walls.
- -

30 September 2024

-

Atermonera updated:

-
    -
  • Fixed some grammatical issues in location event strings.
  • -
From 7ac5722f031a3d8392ac99d80f20e2c0bffdf912 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 30 Nov 2024 12:13:57 +1100 Subject: [PATCH 085/554] Adding a priority list system for mouse cursor icons. --- code/_helpers/cmp.dm | 5 +- code/_helpers/visual_filters.dm | 5 +- .../client/mouse_pointer/_mouse_pointer.dm | 67 ++++++++++++++++++ .../mouse_pointer_definitions.dm | 31 ++++++++ code/modules/mob/login.dm | 1 + code/modules/mob/mob.dm | 9 ++- code/modules/mob/mob_defines.dm | 3 - .../mouse_pointers/examine_pointer.dmi | Bin 430 -> 609 bytes nebula.dme | 2 + 9 files changed, 110 insertions(+), 13 deletions(-) create mode 100644 code/modules/client/mouse_pointer/_mouse_pointer.dm create mode 100644 code/modules/client/mouse_pointer/mouse_pointer_definitions.dm diff --git a/code/_helpers/cmp.dm b/code/_helpers/cmp.dm index e84ecc341fc..32637fecad8 100644 --- a/code/_helpers/cmp.dm +++ b/code/_helpers/cmp.dm @@ -154,4 +154,7 @@ if(a == prerequisite) return -1 // goes after return cmp_skill_asc(a, GET_DECL(b.prerequisites[1])) - return cmp_name_or_type_asc(a, b) \ No newline at end of file + return cmp_name_or_type_asc(a, b) + +/proc/cmp_priority_list(list/A, list/B) + return A["priority"] - B["priority"] diff --git a/code/_helpers/visual_filters.dm b/code/_helpers/visual_filters.dm index deb7162f196..ad1fc910420 100644 --- a/code/_helpers/visual_filters.dm +++ b/code/_helpers/visual_filters.dm @@ -5,9 +5,6 @@ /atom/movable var/list/filter_data // For handling persistent filters -/proc/cmp_filter_data_priority(list/A, list/B) - return A["priority"] - B["priority"] - // Defining this for future proofing and ease of searching for erroneous usage. /image/proc/add_filter(filter_name, priority, list/params) filters += filter(arglist(params)) @@ -35,7 +32,7 @@ /atom/movable/proc/update_filters() filters = null - filter_data = sortTim(filter_data, /proc/cmp_filter_data_priority, TRUE) + filter_data = sortTim(filter_data, /proc/cmp_priority_list, TRUE) for(var/f in filter_data) var/list/data = filter_data[f] var/list/arguments = data.Copy() diff --git a/code/modules/client/mouse_pointer/_mouse_pointer.dm b/code/modules/client/mouse_pointer/_mouse_pointer.dm new file mode 100644 index 00000000000..3f42c8b3f4e --- /dev/null +++ b/code/modules/client/mouse_pointer/_mouse_pointer.dm @@ -0,0 +1,67 @@ +/* + * Adds pointer entries to clients to allow for multiple sources wanting to modify the cursor at once. + * - add_mouse_pointer(pointer_type, pointer_priority, icon_index) will add or replace a pointer of the specified /decl/mouse_pointer type. + * - remove_mouse_pointer(pointer_type) will clear that entry. + * - Updates are handled automatically by adding/removing, other procs should not be used without a good reason. + */ + +/client + VAR_PRIVATE/list/_mouse_pointers + +/client/proc/clear_mouse_pointers() + if(LAZYLEN(_mouse_pointers)) + LAZYCLEARLIST(_mouse_pointers) + update_mouse_pointer() + return TRUE + return FALSE + +/client/proc/set_mouse_pointer_icon(new_cursor) + if(isnull(new_cursor)) + new_cursor = initial(mouse_pointer_icon) + if(mouse_pointer_icon != new_cursor) + mouse_pointer_icon = new_cursor + return TRUE + return FALSE + +/client/proc/add_mouse_pointer(pointer_type, pointer_priority = 1, icon_index = 1) + + // Is an identical pointer already being tracked? + var/decl/mouse_pointer/pointer_decl = ispath(pointer_type) ? GET_DECL(pointer_type) : pointer_type + if(!isnum(icon_index) || icon_index < 1 || icon_index > length(pointer_decl.icons)) + CRASH("Invalid icon_index passed to add_mouse_pointer() for [pointer_type].") + + var/pointer_icon = pointer_decl.icons[icon_index] + var/list/comparing = _mouse_pointers?[pointer_type] + if(islist(comparing) && comparing["icon"] == pointer_icon && comparing["priority"] == pointer_priority) + return FALSE + + // Update our list entry. If we have multiple pointers, sort by priority. + var/need_update = !(pointer_type in _mouse_pointers) + LAZYSET(_mouse_pointers, pointer_type, list("icon" = pointer_icon, "priority" = pointer_priority)) + if(LAZYLEN(_mouse_pointers) > 1) + _mouse_pointers = sortTim(_mouse_pointers, /proc/cmp_priority_list, TRUE) + need_update = TRUE + + // Refresh if needed. + if(need_update) + update_mouse_pointer() + +/client/proc/remove_mouse_pointer(pointer_type) + if(!_mouse_pointers?[pointer_type]) + return FALSE + var/current_pointer = _mouse_pointers[1] + LAZYREMOVE(_mouse_pointers, pointer_type) + if(pointer_type == current_pointer) + update_mouse_pointer() + return TRUE + +/client/proc/update_mouse_pointer() + if(!LAZYLEN(_mouse_pointers)) + return set_mouse_pointer_icon() + var/list/pointer = _mouse_pointers[_mouse_pointers[1]] + if(!islist(pointer)) + return set_mouse_pointer_icon() + var/set_pointer = pointer["icon"] + if(isicon(set_pointer)) + return set_mouse_pointer_icon(set_pointer) + return set_mouse_pointer_icon() diff --git a/code/modules/client/mouse_pointer/mouse_pointer_definitions.dm b/code/modules/client/mouse_pointer/mouse_pointer_definitions.dm new file mode 100644 index 00000000000..f03d328975a --- /dev/null +++ b/code/modules/client/mouse_pointer/mouse_pointer_definitions.dm @@ -0,0 +1,31 @@ +/decl/mouse_pointer + abstract_type = /decl/mouse_pointer + /// Icon to set on the client for this cursor. + var/list/icons + +/decl/mouse_pointer/Initialize() + . = ..() + if(icons && !islist(icons)) + icons = list(icons) + +/decl/mouse_pointer/validate() + . = ..() + if(length(icons)) + var/static/list/check_states = list( + "", + "over", + "drag", + "drop", + "all" + ) + for(var/icon in icons) + for(var/check_state in check_states) + if(!check_state_in_icon(check_state, icon)) + . += "missing state '[check_state]' from icon '[icon]'" + else + . += "null or empty icon list" + +// Subtypes for use in add_mouse_pointer() below. +/decl/mouse_pointer/examine + uid = "pointer_examine" + icons = 'icons/effects/mouse_pointers/examine_pointer.dmi' diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index a2d7f65ab16..7903631bb68 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -59,6 +59,7 @@ /mob/Login() + client.clear_mouse_pointers() // in case we are transferring mobs. global.player_list |= src update_Login_details() world.update_status() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7554d0e91f5..edf74c14dd0 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1135,11 +1135,10 @@ /mob/proc/update_mouse_pointer() if(!client) return - - client.mouse_pointer_icon = initial(client.mouse_pointer_icon) - - if(examine_cursor_icon && client.keys_held["Shift"]) - client.mouse_pointer_icon = examine_cursor_icon + if(client.keys_held["Shift"]) + client.add_mouse_pointer(/decl/mouse_pointer/examine) + else + client.remove_mouse_pointer(/decl/mouse_pointer/examine) /mob/keybind_face_direction(direction) facedir(direction) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index c6b35aa2872..957cdba36a3 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -70,9 +70,6 @@ */ var/obj/screen/zone_selector/zone_sel = null - /// Cursor icon used when holding shift over things. - var/examine_cursor_icon = 'icons/effects/mouse_pointers/examine_pointer.dmi' - var/damageoverlaytemp = 0 var/obj/machinery/machine = null diff --git a/icons/effects/mouse_pointers/examine_pointer.dmi b/icons/effects/mouse_pointers/examine_pointer.dmi index 41a9cec13b07fc8954d21e7877b2b1f0ba7a1374..a565a554fa7dc443874466b4e8034248c13b3a32 100644 GIT binary patch delta 450 zcmV;z0X_b%1K|WEiBL{Q4GJ0x0000DNk~Le0001B0000$2m=5B0MhD$JOBUyMUf>& z7$GDwVtogp00001bW%=J06^y0W&i*Hh>?J3e-S$JfmV>NE2Stgog7{H1*Gdr%*i2I zld^)Vp9?tT07Y_FeahjX4FCWEHc3Q5R9J=WmceeqFcbt$TjIPF6Oz*Z|JC}rE#i=5 zElqp@mIH@bd81&Y3GWBbTUZO_;qZ~uke5PB?uDj27uxc$_519>!yP|*_U3oEi=J++ ze}Z|8y_xm7(~8@WKW57f%0n0J^ORCLd7}Y8#(r?_jeem)c`n$H(s?|mwD<^=d%;o~ zFXQ?Fi2oHfpAd0>hbG=J;^h{YxFv{}d;FUirv^NPc>5<#iv`L{qh!jN8}R>1{+{Nq z#RlcK%-8GpR)g}~n8gW@Kg_~rfpTxOc;&A=Qn3H4VE?ZfK>lAb!2DkiK>wEm)c;lX z^M4iU|MGn3{}tym|5u^@uY&zw4?zE~7-0TiHvs%!4^aPC!Tztp{a=Oqf5igz|Eh_w sga4~=|CbBcou6a@`oCUa{FNul4+@+uh`ls(cmMzZ07*qoM6N<$f^%-yT>t<8 delta 270 zcmaFJvW{7`Gr-TCmrII^fq{Y7)59eQNGpIa2Q!d#S<-b3NI6YZbrY4^>wXl-W-JNv z3ubV5b|VeQDVo@vQNMGFXw2W317QpdIS*u}2Ao~V2$Y%Q>Eak-(R=p7S)oG;JS+*T zoIG;7E`0kNf0f0$kA2fUnd!{!f7Sl9yiVE4Vt(0|`4?Y6KEpSz0{IJntL%Pdd`$I8 z@s#UynK^T_)cWU<;+vI)KGq6OJbI+SVcuHviSA0T7?rXkU5_b?Y;gCe6ybT$a^?fy zH!ipJFaCev3Y2Yhct3wlvcLvM~b%-r_=xcJ376@!4r-}_Gq{|Mxisabe* QJJ6vFp00i_>zopr0E!xE@c;k- diff --git a/nebula.dme b/nebula.dme index 7c4b88297fe..7de4fd80600 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1870,6 +1870,8 @@ #include "code\modules\client\preferences_spawnpoints.dm" #include "code\modules\client\preferences_storage.dm" #include "code\modules\client\preferences_toggle.dm" +#include "code\modules\client\mouse_pointer\_mouse_pointer.dm" +#include "code\modules\client\mouse_pointer\mouse_pointer_definitions.dm" #include "code\modules\client\preference_setup\_defines.dm" #include "code\modules\client\preference_setup\preference_setup.dm" #include "code\modules\client\preference_setup\antagonism\01_candidacy.dm" From 5d27cfcceeb86ca5a30f9d14cb34a89f74580227 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Sun, 1 Dec 2024 21:59:14 -0500 Subject: [PATCH 086/554] Add tech levels to slapcrafting recipes --- code/controllers/subsystems/initialization/fabrication.dm | 3 +++ code/modules/crafting/slapcrafting/_crafting_stage.dm | 7 ++++++- .../crafting_recipes/bot_crafting/crafting_floorbot.dm | 3 ++- .../crafting_recipes/bot_crafting/crafting_janibot.dm | 1 + .../crafting_recipes/bot_crafting/crafting_medibot.dm | 1 + .../crafting_recipes/bot_crafting/crafting_secbot.dm | 1 + .../improvised_crafting/crafting_buckler.dm | 1 + .../improvised_crafting/crafting_crossbow.dm | 1 + .../improvised_crafting/crafting_spear_prod.dm | 1 + 9 files changed, 17 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/initialization/fabrication.dm b/code/controllers/subsystems/initialization/fabrication.dm index e383f77a1c4..37a6d57dfae 100644 --- a/code/controllers/subsystems/initialization/fabrication.dm +++ b/code/controllers/subsystems/initialization/fabrication.dm @@ -33,6 +33,9 @@ SUBSYSTEM_DEF(fabrication) var/list/all_crafting_handlers = decls_repository.get_decls_of_subtype(/decl/crafting_stage) for(var/hid in all_crafting_handlers) var/decl/crafting_stage/handler = all_crafting_handlers[hid] + // TODO: revisit this if map tech level can be mutated at runtime + if(global.using_map.map_tech_level < handler.available_to_map_tech_level) + continue if(ispath(handler.begins_with_object_type)) LAZYDISTINCTADD(crafting_procedures_by_type[handler.begins_with_object_type], handler) diff --git a/code/modules/crafting/slapcrafting/_crafting_stage.dm b/code/modules/crafting/slapcrafting/_crafting_stage.dm index 6b1cc730cd7..23275abf92b 100644 --- a/code/modules/crafting/slapcrafting/_crafting_stage.dm +++ b/code/modules/crafting/slapcrafting/_crafting_stage.dm @@ -10,6 +10,8 @@ var/begins_with_object_type var/list/next_stages var/product + /// What is the minimum map tech level to have access to this recipe? + var/available_to_map_tech_level = MAP_TECH_LEVEL_ANY /decl/crafting_stage/Initialize() . = ..() @@ -18,12 +20,15 @@ stages += GET_DECL(nid) next_stages = stages +/decl/crafting_stage/proc/is_available() + return global.using_map.map_tech_level >= available_to_map_tech_level + /decl/crafting_stage/proc/can_begin_with(var/obj/item/thing) . = istype(thing, begins_with_object_type) /decl/crafting_stage/proc/get_next_stage(var/obj/item/trigger) for(var/decl/crafting_stage/next_stage in next_stages) - if(next_stage.is_appropriate_tool(trigger) && next_stage.is_sufficient_amount(null, trigger)) + if(next_stage.is_available() && next_stage.is_appropriate_tool(trigger) && next_stage.is_sufficient_amount(null, trigger)) return next_stage /decl/crafting_stage/proc/progress_to(var/obj/item/thing, var/mob/user, var/obj/item/target) diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm index 0c270b5d63e..38a9a9da507 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm @@ -6,6 +6,7 @@ progress_message = "You dump a bunch of floor tiles into the empty toolbox." item_icon_state = "floorbot_1" next_stages = list(/decl/crafting_stage/proximity/floorbot) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/proximity/floorbot progress_message = "You wedge the proximity sensor in amongst the floor tiles." @@ -22,4 +23,4 @@ var/mob/living/bot/floorbot/bot = . var/obj/item/toolbox/box = locate() in work bot.boxtype = box.icon_state - bot.update_icon() + bot.update_icon() diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm index 8b249c33ad3..90b6b3a8d18 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm @@ -4,6 +4,7 @@ progress_message = "You put the proximity sensor into the bucket." item_icon_state = "janibot_1" next_stages = list(/decl/crafting_stage/robot_arms/janibot) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/robot_arms/janibot progress_message = "You attach the arm to the assembly and finish off the Janibot. Beep boop." diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm index c376a5bffb2..5a44b023be7 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm @@ -5,6 +5,7 @@ completion_trigger_type = /obj/item/robot_parts item_icon_state = "medibot_1" next_stages = list(/decl/crafting_stage/scanner) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/scanner progress_message = "You add the health sensor to the assembly" diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm index 9e53c82645d..af756c222af 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm @@ -5,6 +5,7 @@ progress_message = "You add the signaler to the helmet." item_icon_state = "secbot_1" next_stages = list(/decl/crafting_stage/welding/secbot) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/secbot_signaller/can_begin_with(var/obj/item/thing) . = istype(thing, begins_with_object_type) diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm index 4270ffc3b33..d2c910fba7b 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm @@ -7,6 +7,7 @@ progress_message = "You crudely sever the legs off the stool and remove the seat." consume_completion_trigger = FALSE next_stages = list(/decl/crafting_stage/buckler_panels) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE // todo: modern tech level /decl/crafting_stage/buckler_panels item_desc = "It's the seat of a stool with the legs sawn off and wooden planks layered over the top, ready to secure in place." diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm index 0516f188c22..7335cb83aef 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm @@ -14,6 +14,7 @@ item_icon_state = "crossbowframe1" progress_message = "You assemble a backbone of rods around the wooden stock." next_stages = list(/decl/crafting_stage/welding/crossbow_rods) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/welding/crossbow_rods completion_trigger_type = /obj/item/weldingtool diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm index c79c047216b..1b8e062fbbc 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm @@ -11,6 +11,7 @@ /decl/crafting_stage/spear_blade_blade, /decl/crafting_stage/stunprod_wirecutters ) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/material/stunprod_rod/consume_crafting_resource(var/mob/user, var/obj/item/thing, var/obj/item/target) . = ..() From 2aa5e644906c3376786a296d4da7d6ff04fbfc8d Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Mon, 2 Dec 2024 19:54:14 -0500 Subject: [PATCH 087/554] Add on-examine and alt interaction functionality to stock parts --- .../machinery/_machines_base/machinery.dm | 2 + .../_machines_base/machinery_components.dm | 9 ++++ .../stock_parts/_stock_parts.dm | 10 ++++ .../_machines_base/stock_parts/card_reader.dm | 7 +++ .../_machines_base/stock_parts/disk_reader.dm | 5 ++ .../_machines_base/stock_parts/item_holder.dm | 48 ++++++++++++++++++- code/modules/paperwork/faxmachine.dm | 18 ------- 7 files changed, 79 insertions(+), 20 deletions(-) diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index 290540f78f5..6736ad221bb 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -433,6 +433,8 @@ Class Procs: var/obj/item/fake_thing = type parts += "[num2text(missing[type])] [initial(fake_thing.name)]" to_chat(user, "\The [src] is missing [english_list(parts)], rendering it inoperable.") + for(var/obj/item/stock_parts/part in component_parts) + part.on_machine_examined(user) // This is really pretty crap and should be overridden for specific machines. /obj/machinery/fluid_act(var/datum/reagents/fluids) diff --git a/code/game/machinery/_machines_base/machinery_components.dm b/code/game/machinery/_machines_base/machinery_components.dm index f6096358929..379a5dea947 100644 --- a/code/game/machinery/_machines_base/machinery_components.dm +++ b/code/game/machinery/_machines_base/machinery_components.dm @@ -352,3 +352,12 @@ Standard helpers for users interacting with machinery parts. var/present = number_of_components(required_type, only_functional) if(present < needed) LAZYSET(., required_type, needed - present) + +/obj/machinery/get_alt_interactions(mob/user) + . = ..() + for(var/obj/item/stock_parts/component in component_parts) + if(!components_are_accessible(component.type)) + continue + var/list/machine_alt_interactions = component.get_machine_alt_interactions(user) + if(LAZYLEN(machine_alt_interactions)) + LAZYADD(., machine_alt_interactions) diff --git a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm index f4aab2938f7..7ce4792bc9f 100644 --- a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm +++ b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm @@ -109,3 +109,13 @@ if(istype(M) && (src in M.component_parts)) return ..() + +/// Alt-click interactions provided to our parent machine. +/obj/item/stock_parts/proc/get_machine_alt_interactions(mob/user) + SHOULD_CALL_PARENT(TRUE) + SHOULD_BE_PURE(TRUE) + RETURN_TYPE(/list) + . = list() + +/// A stub for showing messages based on part status when a machine is examined. +/obj/item/stock_parts/proc/on_machine_examined(mob/user) \ No newline at end of file diff --git a/code/game/machinery/_machines_base/stock_parts/card_reader.dm b/code/game/machinery/_machines_base/stock_parts/card_reader.dm index f78430de17d..aecd5af4e4f 100644 --- a/code/game/machinery/_machines_base/stock_parts/card_reader.dm +++ b/code/game/machinery/_machines_base/stock_parts/card_reader.dm @@ -14,6 +14,7 @@ /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE, ) max_health = ITEM_HEALTH_NO_DAMAGE + eject_handler = /decl/interaction_handler/remove_held_item/card var/should_swipe = FALSE //Whether the card should only be swiped instead of being inserted var/obj/item/card/inserted_card //Card currently in the slot @@ -67,3 +68,9 @@ /obj/item/stock_parts/item_holder/card_reader/proc/get_emag_card() return istype(inserted_card, /obj/item/card/emag) ? inserted_card : null + +/decl/interaction_handler/remove_held_item/card + name = "Eject Card" + icon = 'icons/screen/radial.dmi' + icon_state = "radial_eject_id" + expected_component_type = /obj/item/stock_parts/item_holder/card_reader \ No newline at end of file diff --git a/code/game/machinery/_machines_base/stock_parts/disk_reader.dm b/code/game/machinery/_machines_base/stock_parts/disk_reader.dm index eb6a5b8fe72..e61cf6be322 100644 --- a/code/game/machinery/_machines_base/stock_parts/disk_reader.dm +++ b/code/game/machinery/_machines_base/stock_parts/disk_reader.dm @@ -14,6 +14,7 @@ /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, ) max_health = ITEM_HEALTH_NO_DAMAGE + eject_handler = /decl/interaction_handler/remove_held_item/disk var/obj/item/disk/disk //Disk currently inserted /obj/item/stock_parts/item_holder/disk_reader/buildable @@ -38,3 +39,7 @@ /obj/item/stock_parts/item_holder/disk_reader/get_description_insertable() return "disk" + +/decl/interaction_handler/remove_held_item/disk + name = "Eject Disk" + expected_component_type = /obj/item/stock_parts/item_holder/disk_reader \ No newline at end of file diff --git a/code/game/machinery/_machines_base/stock_parts/item_holder.dm b/code/game/machinery/_machines_base/stock_parts/item_holder.dm index 170d90d0f39..9f6d75f6e6c 100644 --- a/code/game/machinery/_machines_base/stock_parts/item_holder.dm +++ b/code/game/machinery/_machines_base/stock_parts/item_holder.dm @@ -5,8 +5,12 @@ name = null desc = null icon = 'icons/obj/items/stock_parts/modular_components.dmi' + var/decl/interaction_handler/eject_handler // The interaction handler type used for alt-interactions. var/datum/callback/on_insert_target //Callback to call when an item is inserted var/datum/callback/on_eject_target //Callback to call when an item is ejected + /// The verb used when a player inserts an item. + /// e.g. You [insert/place/attach] the cup in the cupholder. + var/place_verb = "insert" /obj/item/stock_parts/item_holder/Destroy() unregister_on_insert() @@ -38,6 +42,10 @@ /obj/item/stock_parts/item_holder/proc/get_inserted() return +/obj/item/stock_parts/item_holder/on_machine_examined(mob/user) + if(is_item_inserted()) + to_chat(user, SPAN_INFO("It has \a [get_inserted()] in \the [src].")) + ///Handle putting the object in the component's contents. Doesn't trigger any callbacks, or messages. /obj/item/stock_parts/item_holder/proc/set_inserted(var/obj/O) return @@ -55,7 +63,7 @@ if(user) if(user.try_unequip(O, src)) - to_chat(user, SPAN_NOTICE("You insert \the [O] into \the [src].")) + to_chat(user, SPAN_NOTICE("You [place_verb] \the [O] into \the [src].")) else return FALSE else @@ -111,4 +119,40 @@ QDEL_NULL(on_insert_target) /obj/item/stock_parts/item_holder/proc/unregister_on_eject() - QDEL_NULL(on_eject_target) \ No newline at end of file + QDEL_NULL(on_eject_target) + +// Alt interaction handling +/decl/interaction_handler/remove_held_item + abstract_type = /decl/interaction_handler/remove_held_item + expected_target_type = /obj/machinery + name = "Eject Item" + icon = 'icons/screen/radial.dmi' + icon_state = "radial_eject" + var/obj/item/stock_parts/item_holder/expected_component_type + +/decl/interaction_handler/remove_held_item/validate() + . = ..() + if(!ispath(expected_component_type)) + . += "Expected component type was [isnull(expected_component_type) ? "NULL" : expected_component_type], expected /obj/item/stock_parts/item_holder subtype" + +/decl/interaction_handler/remove_held_item/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() + if(.) + var/obj/machinery/target_machine = target + // Check all components, not just the first one. Maybe we have multiple! + for(var/obj/item/stock_parts/item_holder/holder in target_machine.get_all_components_of_type(expected_component_type)) + if(holder.is_item_inserted()) + return TRUE + +/decl/interaction_handler/remove_held_item/invoked(atom/target, mob/user, obj/item/prop) + var/obj/machinery/target_machine = target + // Check all components, not just the first one. Maybe we have multiple! + for(var/obj/item/stock_parts/item_holder/holder in target_machine.get_all_components_of_type(expected_component_type)) + if(holder.is_item_inserted()) + holder.eject_item(user) + return + +/obj/item/stock_parts/item_holder/get_machine_alt_interactions(mob/user) + . = ..() + if(ispath(eject_handler)) + LAZYADD(., eject_handler) diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 1a5bbeb9e74..7aad7aace23 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -716,21 +716,3 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to for(var/uri in global.using_map.map_admin_faxes) var/list/contact_info = global.using_map.map_admin_faxes[uri] add_quick_dial_contact(contact_info["name"], uri) - -/obj/machinery/faxmachine/get_alt_interactions(mob/user) - . = ..() - LAZYADD(., /decl/interaction_handler/fax_remove_card) - -/decl/interaction_handler/fax_remove_card - name = "Remove ID Card" - expected_target_type = /obj/machinery/faxmachine - -/decl/interaction_handler/fax_remove_card/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() - if(.) - var/obj/machinery/faxmachine/fax = target - return !!(fax.card_reader?.get_inserted()) - -/decl/interaction_handler/fax_remove_card/invoked(atom/target, mob/user, obj/item/prop) - var/obj/machinery/faxmachine/fax = target - fax.eject_card(user) From 4f559f25f502817d7827172cccfc16bae0bda6d4 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Mon, 2 Dec 2024 20:54:36 -0500 Subject: [PATCH 088/554] Make research machines use disk reader components --- .../_machines_base/stock_parts/item_holder.dm | 2 +- .../circuitboards/computer/computer.dm | 4 + .../circuitboards/machinery/research.dm | 1 + code/modules/research/design_console.dm | 73 +++++----- code/modules/research/design_database.dm | 125 +++++++++--------- nano/templates/design_database.tmpl | 14 +- 6 files changed, 109 insertions(+), 110 deletions(-) diff --git a/code/game/machinery/_machines_base/stock_parts/item_holder.dm b/code/game/machinery/_machines_base/stock_parts/item_holder.dm index 9f6d75f6e6c..3462f18f560 100644 --- a/code/game/machinery/_machines_base/stock_parts/item_holder.dm +++ b/code/game/machinery/_machines_base/stock_parts/item_holder.dm @@ -83,7 +83,7 @@ return var/obj/O = get_inserted() - if(user) + if(user && loc.Adjacent(user)) // Check adjacency in case this is called via UI stuff from a distance. user.put_in_hands(O) to_chat(user, SPAN_NOTICE("You remove \the [O] from \the [src].")) else diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm index 9c8b800d3c1..c013c88bdf5 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm @@ -91,6 +91,10 @@ /obj/item/stock_parts/circuitboard/design_console name = "circuitboard (design database console)" build_path = /obj/machinery/computer/design_console + additional_spawn_components = list( + /obj/item/stock_parts/power/apc/buildable = 1, + /obj/item/stock_parts/item_holder/disk_reader/buildable = 1, + ) /obj/item/stock_parts/circuitboard/central_atmos name = "circuitboard (central atmospherics computer)" diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index 5d31dd554da..efe256ceef4 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -265,6 +265,7 @@ req_components = list() additional_spawn_components = list( /obj/item/stock_parts/power/apc/buildable = 1, + /obj/item/stock_parts/item_holder/disk_reader/buildable = 1, /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/keyboard = 1 ) \ No newline at end of file diff --git a/code/modules/research/design_console.dm b/code/modules/research/design_console.dm index 73b6abc3255..5e2e43978ad 100644 --- a/code/modules/research/design_console.dm +++ b/code/modules/research/design_console.dm @@ -1,11 +1,16 @@ /obj/machinery/computer/design_console name = "design database console" desc = "A console for interfacing with a research and development design network." + maximum_component_parts = list( + /obj/item/stock_parts/item_holder/disk_reader = 1, + /obj/item/stock_parts = 15, + ) + /// A cached reference to our disk reader part, if present. + var/obj/item/stock_parts/item_holder/disk_reader/disk_reader var/initial_network_id var/initial_network_key var/list/local_cache - var/obj/item/disk/design_disk/disk var/obj/machinery/design_database/viewing_database var/showing_designs = FALSE @@ -13,36 +18,34 @@ . = ..() set_extension(src, /datum/extension/network_device, initial_network_id, initial_network_key, RECEIVER_STRONG_WIRELESS) +/obj/machinery/computer/design_console/Destroy() + viewing_database = null + disk_reader = null + return ..() + /obj/machinery/computer/design_console/modify_mapped_vars(map_hash) ..() ADJUST_TAG_VAR(initial_network_id, map_hash) +/obj/machinery/computer/design_console/RefreshParts() + . = ..() + disk_reader = get_component_of_type(/obj/item/stock_parts/item_holder/disk_reader) + if(disk_reader) + disk_reader.register_on_insert(CALLBACK(src, PROC_REF(update_ui))) + disk_reader.register_on_eject(CALLBACK(src, PROC_REF(update_ui))) + +/obj/machinery/computer/design_console/proc/try_get_disk() + return disk_reader?.get_inserted() + +/obj/machinery/computer/design_console/proc/update_ui() + SSnano.update_uis(src) + /obj/machinery/computer/design_console/handle_post_network_connection() ..() sync_network() -/obj/machinery/computer/design_console/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/design_disk)) - if(disk) - to_chat(user, SPAN_WARNING("\The [src] already has a disk inserted.")) - return TRUE - if(user.try_unequip(I, src)) - visible_message("\The [user] slots \the [I] into \the [src].") - disk = I - return TRUE - . = ..() - /obj/machinery/computer/design_console/proc/eject_disk(var/mob/user) - if(disk) - disk.dropInto(loc) - if(user) - if(!issilicon(user)) - user.put_in_hands(disk) - if(Adjacent(user, src)) - visible_message(SPAN_NOTICE("\The [user] removes \the [disk] from \the [src].")) - disk = null - return TRUE - return FALSE + return !!disk_reader.eject_item(user) /obj/machinery/computer/design_console/interface_interact(mob/user) ui_interact(user) @@ -55,9 +58,13 @@ var/datum/computer_network/network = device.get_network() data["network_id"] = device.network_tag + var/obj/item/disk/design_disk/disk = try_get_disk() if(disk) data["disk_name"] = disk.name - data["disk_tech"] = disk.blueprint ? disk.blueprint.name : "no design saved" + if(istype(disk)) + data["disk_tech"] = disk.blueprint ? disk.blueprint.name : "no design saved" + else + data["disk_tech"] = "invalid data format" else data["disk_name"] = "no disk loaded" @@ -159,7 +166,8 @@ if(href_list["save_design"]) var/datum/fabricator_recipe/design = locate(href_list["save_design"]) - if(istype(design) && disk) + var/obj/item/disk/design_disk/disk = try_get_disk() + if(istype(design) && istype(disk)) disk.blueprint = design disk.SetName("[initial(disk.name)] ([disk.blueprint.name])") return TOPIC_REFRESH @@ -219,20 +227,3 @@ var/list/techs = get_network_tech_levels() for(var/obj/machinery/fabricator/fab in network.get_devices_by_type(/obj/machinery/fabricator)) fab.refresh_design_cache(techs) - -/obj/machinery/computer/design_console/get_alt_interactions(var/mob/user) - . = ..() - LAZYADD(., /decl/interaction_handler/remove_disk/console) - -/decl/interaction_handler/remove_disk/console - expected_target_type = /obj/machinery/computer/design_console - -/decl/interaction_handler/remove_disk/console/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() - if(.) - var/obj/machinery/computer/design_console/D = target - . = !!D.disk - -/decl/interaction_handler/remove_disk/console/invoked(atom/target, mob/user, obj/item/prop) - var/obj/machinery/computer/design_console/D = target - D.eject_disk(user) diff --git a/code/modules/research/design_database.dm b/code/modules/research/design_database.dm index 11e53477ef5..5c5a6b3cc41 100644 --- a/code/modules/research/design_database.dm +++ b/code/modules/research/design_database.dm @@ -17,12 +17,17 @@ var/global/list/default_initial_tech_levels construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 + maximum_component_parts = list( + /obj/item/stock_parts/item_holder/disk_reader = 1, + /obj/item/stock_parts = 15, + ) + /// A cached reference to our disk reader part, if present. + var/obj/item/stock_parts/item_holder/disk_reader/disk_reader var/initial_network_id var/initial_network_key var/list/tech_levels var/need_disk_operation = FALSE - var/obj/item/disk/tech_disk/disk var/sync_policy = SYNC_PULL_NETWORK|SYNC_PUSH_NETWORK|SYNC_PULL_DISK /obj/machinery/design_database/proc/toggle_sync_policy_flag(var/sync_flag) @@ -36,13 +41,17 @@ var/global/list/default_initial_tech_levels var/list/data = list() var/datum/extension/network_device/device = get_extension(src, /datum/extension/network_device) data["network_id"] = device.network_tag + var/obj/item/disk/tech_disk/disk = try_get_disk() if(disk) data["disk_name"] = disk.name - var/list/tech_data = list() - for(var/tech in disk.stored_tech) - var/decl/research_field/field = SSfabrication.get_research_field_by_id(tech) - tech_data += list(list("field" = field.name, "desc" = field.desc, "level" = "[disk.stored_tech[tech]].0 GQ")) - data["disk_tech"] = tech_data + if(istype(disk)) + var/list/tech_data = list() + for(var/tech in disk.stored_tech) + var/decl/research_field/field = SSfabrication.get_research_field_by_id(tech) + tech_data += list(list("field" = field.name, "desc" = field.desc, "level" = "[disk.stored_tech[tech]].0 GQ")) + data["disk_tech"] = tech_data + else + data["disk_error"] = "invalid data format" else data["disk_name"] = "no disk loaded" @@ -116,26 +125,30 @@ var/global/list/default_initial_tech_levels return // Read or write from a loaded disk. + var/obj/item/disk/tech_disk/disk = try_get_disk() if(disk && need_disk_operation) - if(sync_policy & SYNC_PULL_DISK) - var/new_tech = FALSE - for(var/tech in disk.stored_tech) - if(tech_levels[tech] < disk.stored_tech[tech]) - tech_levels[tech] = disk.stored_tech[tech] - new_tech = TRUE - if(new_tech) - visible_message(SPAN_NOTICE("\The [src] clicks and chirps as it reads from \the [disk].")) - if((sync_policy & SYNC_PUSH_NETWORK) && !sync_design_consoles()) - visible_message(SPAN_WARNING("\The [src] flashes an error light from its network interface.")) - - if(sync_policy & SYNC_PUSH_DISK) - var/new_tech - for(var/tech in tech_levels) - if(tech_levels[tech] > LAZYACCESS(disk.stored_tech, tech)) - new_tech = TRUE - LAZYSET(disk.stored_tech, tech, tech_levels[tech]) - if(new_tech) - visible_message(SPAN_NOTICE("\The [src] whirrs and drones as it writes to \the [disk].")) + if(!istype(disk)) // wrong type of disk! + visible_message(SPAN_WARNING("\The [src] whirrs and drones, before emitting an ominous grinding sound.")) + else + if(sync_policy & SYNC_PULL_DISK) + var/new_tech = FALSE + for(var/tech in disk.stored_tech) + if(tech_levels[tech] < disk.stored_tech[tech]) + tech_levels[tech] = disk.stored_tech[tech] + new_tech = TRUE + if(new_tech) + visible_message(SPAN_NOTICE("\The [src] clicks and chirps as it reads from \the [disk].")) + if((sync_policy & SYNC_PUSH_NETWORK) && !sync_design_consoles()) + visible_message(SPAN_WARNING("\The [src] flashes an error light from its network interface.")) + + if(sync_policy & SYNC_PUSH_DISK) + var/new_tech + for(var/tech in tech_levels) + if(tech_levels[tech] > LAZYACCESS(disk.stored_tech, tech)) + new_tech = TRUE + LAZYSET(disk.stored_tech, tech, tech_levels[tech]) + if(new_tech) + visible_message(SPAN_NOTICE("\The [src] whirrs and drones as it writes to \the [disk].")) visible_message("The I/O light on \the [src] stops blinking.") need_disk_operation = FALSE @@ -148,49 +161,35 @@ var/global/list/default_initial_tech_levels /obj/machinery/design_database/Destroy() design_databases -= src - QDEL_NULL(disk) + disk_reader = null . = ..() -/obj/machinery/design_database/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/tech_disk)) - if(disk) - to_chat(user, SPAN_WARNING("\The [src] already has a disk inserted.")) - return TRUE - if(user.try_unequip(I, src)) - visible_message("\The [user] slots \the [I] into \the [src].") - visible_message(SPAN_NOTICE("\The [src]'s I/O light begins to blink.")) - disk = I - need_disk_operation = TRUE - return TRUE +/obj/machinery/design_database/proc/on_insert_disk(obj/item/disk/D, mob/user) + visible_message(SPAN_NOTICE("\The [src]'s I/O light begins to blink.")) + need_disk_operation = TRUE + update_ui() - . = ..() +/obj/machinery/design_database/proc/on_eject_disk(obj/item/disk/D, mob/user) + need_disk_operation = FALSE + update_ui() -/obj/machinery/design_database/proc/eject_disk(var/mob/user) - if(disk) - disk.dropInto(loc) - need_disk_operation = FALSE - if(user) - if(!issilicon(user)) - user.put_in_hands(disk) - if(Adjacent(user, src)) - visible_message(SPAN_NOTICE("\The [user] removes \the [disk] from \the [src].")) - disk = null - return TRUE - return FALSE - -/obj/machinery/design_database/get_alt_interactions(var/mob/user) +/obj/machinery/design_database/RefreshParts() . = ..() - LAZYADD(., /decl/interaction_handler/remove_disk/designs) + disk_reader = get_component_of_type(/obj/item/stock_parts/item_holder/disk_reader) + if(disk_reader) + disk_reader.register_on_insert(CALLBACK(src, PROC_REF(on_insert_disk))) + disk_reader.register_on_eject(CALLBACK(src, PROC_REF(on_eject_disk))) -/decl/interaction_handler/remove_disk/designs - expected_target_type = /obj/machinery/design_database +/obj/machinery/design_database/proc/try_get_disk() + return disk_reader?.get_inserted() -/decl/interaction_handler/remove_disk/designs/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() - if(.) - var/obj/machinery/design_database/D = target - . = !!D.disk +/obj/machinery/design_database/proc/update_ui() + SSnano.update_uis(src) -/decl/interaction_handler/remove_disk/designs/invoked(atom/target, mob/user, obj/item/prop) - var/obj/machinery/design_database/D = target - D.eject_disk(user) +// used for, specifically, removing a disk via the UI +/obj/machinery/design_database/proc/eject_disk(var/mob/user) + if(!disk_reader) + to_chat(user, SPAN_WARNING("\The [src] has no disk drive installed.")) + return FALSE + . = !isnull(disk_reader.eject_item(user)) + update_ui() diff --git a/nano/templates/design_database.tmpl b/nano/templates/design_database.tmpl index f09a5415a94..db1dd81ea57 100644 --- a/nano/templates/design_database.tmpl +++ b/nano/templates/design_database.tmpl @@ -6,12 +6,16 @@
External storage
- {{if data.disk_tech}} + {{if data.disk_tech || data.disk_error}} - - {{for data.disk_tech}} - - {{/for}} + {{if data.disk_error}} + invalid data format + {{else}} + + {{for data.disk_tech}} + + {{/for}} + {{/if}} {{else}} {{/if}} From 4cde3d4974eec510b4cb41e427c2e49a6d657e20 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Mon, 2 Dec 2024 20:59:43 -0500 Subject: [PATCH 089/554] Add cupholder stock part --- .../_machines_base/stock_parts/cupholder.dm | 50 ++++++++++++++++++ .../items/stock_parts/modular_components.dmi | Bin 2686 -> 2814 bytes nebula.dme | 1 + 3 files changed, 51 insertions(+) create mode 100644 code/game/machinery/_machines_base/stock_parts/cupholder.dm diff --git a/code/game/machinery/_machines_base/stock_parts/cupholder.dm b/code/game/machinery/_machines_base/stock_parts/cupholder.dm new file mode 100644 index 00000000000..23f56f7772c --- /dev/null +++ b/code/game/machinery/_machines_base/stock_parts/cupholder.dm @@ -0,0 +1,50 @@ +/obj/item/stock_parts/item_holder/cupholder + name = "cupholder" + desc = "A holder for cups." + icon = 'icons/obj/items/stock_parts/modular_components.dmi' + icon_state = "cupholder" + material = /decl/material/solid/organic/plastic + part_flags = PART_FLAG_HAND_REMOVE + place_verb = "place" + eject_handler = /decl/interaction_handler/remove_held_item/cup + var/image/cupholder_overlay + var/obj/item/cup + +/obj/item/stock_parts/item_holder/cupholder/Destroy() + QDEL_NULL(cup) + . = ..() + +/obj/item/stock_parts/item_holder/cupholder/is_item_inserted() + return !isnull(cup) + +/obj/item/stock_parts/item_holder/cupholder/is_accepted_type(obj/O) + var/static/allowed_cup_types + if(!allowed_cup_types) + allowed_cup_types = typecacheof(list( + /obj/item/chems/drinks/cans, + /obj/item/chems/drinks/bottle, + /obj/item/chems/glass/bottle, + /obj/item/chems/drinks/juicebox, + /obj/item/chems/drinks/glass2, + /obj/item/chems/drinks/h_chocolate, + /obj/item/chems/drinks/dry_ramen, + /obj/item/chems/drinks/tea, + /obj/item/chems/glass/handmade/cup, + /obj/item/chems/glass/handmade/mug, + /obj/item/chems/drinks/shaker, + /obj/item/chems/drinks/flask + )) + return is_type_in_typecache(O, allowed_cup_types) + +/obj/item/stock_parts/item_holder/cupholder/get_inserted() + return cup + +/obj/item/stock_parts/item_holder/cupholder/set_inserted(obj/O) + cup = O + +/obj/item/stock_parts/item_holder/cupholder/get_description_insertable() + return "cup" + +/decl/interaction_handler/remove_held_item/cup + name = "Remove Cup" + expected_component_type = /obj/item/stock_parts/item_holder/cupholder \ No newline at end of file diff --git a/icons/obj/items/stock_parts/modular_components.dmi b/icons/obj/items/stock_parts/modular_components.dmi index 570e13bbf6529630534e9b607d59071f52a44259..1a471de37faf2a0b2a2c827164ce61fc60ed43ae 100644 GIT binary patch delta 2315 zcmV+m3H0{<6#f;E7Y@J(0{{R3WdfWv0005qu_ey|C&0kKS65eme}9salBK1kZfLEG3X&d7>m8X}s zxiAcPkN*;YnZRo_k7&{uk*fj?Y#6}^(8$hb0p~H#RTXB7ToSQBX3I*8J<)Mge`x?B zIjN!zIe0-gv&083q6biUd25UsoaP`RWxt$BVaqcr_Ic?*G;}kmX-tx7>LC~Grabt% z2`enK?6YBQZA$^G$AlpZne3;bmr{C5)d(xAmDxa^~M}A07etWr3mbBx?kHf>W0tDqL zn!{03Q{!+zFClqtZ7q}+*tMF?&)>Hm;VPe2>(G4F49%OAvjIvAbfew&U zNc8-jor;_Y|JbYkEaRg)X=X>3Y2m=9ylFq|e{w&*w9~59s>IlP6(C zdI0JLhahvZdMC~WGW%NyK@bE%5ClOG1VNDhD@{#)6CgizN}QiQ-E0EnXU>T8OlfIt zJ=@lH?%etFE&Tk#1z{d&Z}0eq5#Z++FADRFX}NSMe;5p2zI+Z6xN=392d-Z2?Ck95 z00pjH6XpbQhZTR5ze(@{Q-D?|5`c44pi?3M=VXMlXK9at14QE1v#p|2#1sfh1i;)9 zAQcJ)z?_W0_TL8VpTw8QCOAcML?9>@5S$`ira-U_$gf`!=7Dxopc9;~3ax%gVYTyS2Zgd5^f`0G?E#G$0x5N2&*M)iD`*u=Yb7wOo@WVx# zf;kz1U1GZZkN~?1b%QTxVK*{C&TeFI9$+`JZn6OaIX}%rGZ`~5+&9`p{0)b|_@$)-(%oNC#e@yQKdH<&bf*=TjAP9mW2!iA$cTMiy zy+;6EqpE6;+SAhm?StgKYHx3^An#NA`ue~$J^*(JGrzCirzF?^z~teBhXlR>UEQSL z+27v}7|?vcIWRB)7|?vsIXF1THL%uBVFU1nu<}RFN0cOk6a+#NfsjNXlx=~qL?A2? ze+UZ&LK1He&kj_muDGukB*LxabuQ`yT`}JC*XY2Jvli!#R)^!`a$dn4GsMS1V-kboi

8^*UtdWCc9e_-Nd3ehdji(_L9E5xCY$+7<0U02B?6Re3S>qq zlQ_3|YVzXg3qrPwK@bE%5ClOG1VOeJ+3NV)wR?E~)6>&4(=#(O@J@asKfgl*e>kgr z9<@qy2y8J(>e|C0uZgy^NZU)>7chT|02vuzLp(>HU{QP`M>gpb-+Y0iPuPhYl8X(814@rXa_!ibwxB5h((jS-DyyOK0nj|;44yOK0n zH(L;m<*Ps>wn3-BMojeZMKza+#MUv=1n#5VpWY~<@4R;U3XkLy=rv;%o9fE~y- l|HNW>T|a^#2!iAr{{rp=s;_ZEmH7Yw002ovPDHLkV1kbAK(+t? delta 2186 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 Date: Tue, 3 Dec 2024 19:30:16 +1100 Subject: [PATCH 090/554] Cleaning up a lot of sprite_sheets setting. --- mods/content/fantasy/_fantasy.dme | 2 +- .../content/fantasy/datum/kobaloi/clothing.dm | 6 +- .../fantasy/items/clothing/_overrides.dm | 15 ++++ mods/content/fantasy/items/clothing/jerkin.dm | 2 +- .../fantasy/items/clothing/loincloth.dm | 2 +- .../fantasy/items/clothing/overrides.dm | 4 - .../fantasy/items/clothing/trousers.dm | 8 +- mods/species/ascent/_ascent.dme | 1 + mods/species/ascent/items/_overrides.dm | 10 +++ mods/species/ascent/items/clothing.dm | 12 +-- mods/species/ascent/items/guns.dm | 2 +- mods/species/ascent/items/rig.dm | 11 ++- .../bayliens/{bayliens.dm => _bayliens.dm} | 13 ++- mods/species/bayliens/_bayliens.dme | 3 +- mods/species/bayliens/_overrides.dm | 7 ++ mods/species/bayliens/adherent/_adherent.dm | 2 - mods/species/bayliens/tajaran/_tajaran.dm | 2 - .../bayliens/tajaran/machinery/suit_cycler.dm | 85 +++++++----------- mods/species/drakes/_drakes.dme | 1 + mods/species/drakes/_overrides.dm | 10 +++ mods/species/drakes/clothing.dm | 28 ++---- mods/species/neoavians/_neoavians.dme | 1 + mods/species/neoavians/_overrides.dm | 7 ++ mods/species/neoavians/clothing.dm | 45 +++++----- .../neoavians/machinery/suit_cycler.dm | 90 ++++++++----------- 25 files changed, 180 insertions(+), 189 deletions(-) create mode 100644 mods/content/fantasy/items/clothing/_overrides.dm delete mode 100644 mods/content/fantasy/items/clothing/overrides.dm create mode 100644 mods/species/ascent/items/_overrides.dm rename mods/species/bayliens/{bayliens.dm => _bayliens.dm} (77%) create mode 100644 mods/species/bayliens/_overrides.dm create mode 100644 mods/species/drakes/_overrides.dm create mode 100644 mods/species/neoavians/_overrides.dm diff --git a/mods/content/fantasy/_fantasy.dme b/mods/content/fantasy/_fantasy.dme index 3cd8559ddf0..1bf5230189d 100644 --- a/mods/content/fantasy/_fantasy.dme +++ b/mods/content/fantasy/_fantasy.dme @@ -28,12 +28,12 @@ #include "datum\kobaloi\species.dm" #include "items\material_overrides.dm" #include "items\clothing\_loadout.dm" +#include "items\clothing\_overrides.dm" #include "items\clothing\_recipes.dm" #include "items\clothing\armor.dm" #include "items\clothing\glasses.dm" #include "items\clothing\jerkin.dm" #include "items\clothing\loincloth.dm" -#include "items\clothing\overrides.dm" #include "items\clothing\trousers.dm" #include "props\signpost.dm" // END_INCLUDE diff --git a/mods/content/fantasy/datum/kobaloi/clothing.dm b/mods/content/fantasy/datum/kobaloi/clothing.dm index 1bd63942fbf..71346517d9c 100644 --- a/mods/content/fantasy/datum/kobaloi/clothing.dm +++ b/mods/content/fantasy/datum/kobaloi/clothing.dm @@ -1,4 +1,2 @@ -/obj/item/bag/sack/Initialize() - . = ..() - if(!(BODYTYPE_KOBALOI in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_KOBALOI, 'mods/content/fantasy/icons/clothing/sack_kobaloi.dmi') \ No newline at end of file +/obj/item/bag/sack + _kobaloi_onmob_icon = 'mods/content/fantasy/icons/clothing/sack_kobaloi.dmi' diff --git a/mods/content/fantasy/items/clothing/_overrides.dm b/mods/content/fantasy/items/clothing/_overrides.dm new file mode 100644 index 00000000000..0ecd3b43e1c --- /dev/null +++ b/mods/content/fantasy/items/clothing/_overrides.dm @@ -0,0 +1,15 @@ +/obj/item + var/_kobaloi_onmob_icon + var/_hnoll_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_kobaloi_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_KOBALOI, _kobaloi_onmob_icon) + if(_hnoll_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_HNOLL, _hnoll_onmob_icon) + +/obj/item/clothing/gloves/setup_equip_flags() + . = ..() + if(!isnull(bodytype_equip_flags) && !(bodytype_equip_flags & BODY_EQUIP_FLAG_EXCLUDE)) + bodytype_equip_flags |= BODY_EQUIP_FLAG_HNOLL \ No newline at end of file diff --git a/mods/content/fantasy/items/clothing/jerkin.dm b/mods/content/fantasy/items/clothing/jerkin.dm index 4944bae1976..dc437db931d 100644 --- a/mods/content/fantasy/items/clothing/jerkin.dm +++ b/mods/content/fantasy/items/clothing/jerkin.dm @@ -2,6 +2,6 @@ name = "jerkin" desc = "A sturdy jerkin, worn on the upper body." icon = 'mods/content/fantasy/icons/clothing/jerkin.dmi' - sprite_sheets = list(BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi') + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/leather diff --git a/mods/content/fantasy/items/clothing/loincloth.dm b/mods/content/fantasy/items/clothing/loincloth.dm index 168127ba6ad..5cb8288038e 100644 --- a/mods/content/fantasy/items/clothing/loincloth.dm +++ b/mods/content/fantasy/items/clothing/loincloth.dm @@ -3,7 +3,7 @@ gender = NEUTER desc = "A simple garment that is worn around the legs and lower body." icon = 'mods/content/fantasy/icons/clothing/loincloth.dmi' - sprite_sheets = list(BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/loincloth_hnoll.dmi') + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/loincloth_hnoll.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/skin/fur diff --git a/mods/content/fantasy/items/clothing/overrides.dm b/mods/content/fantasy/items/clothing/overrides.dm deleted file mode 100644 index 8ca8f71eea1..00000000000 --- a/mods/content/fantasy/items/clothing/overrides.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/clothing/gloves/setup_equip_flags() - . = ..() - if(!isnull(bodytype_equip_flags) && !(bodytype_equip_flags & BODY_EQUIP_FLAG_EXCLUDE)) - bodytype_equip_flags |= BODY_EQUIP_FLAG_HNOLL \ No newline at end of file diff --git a/mods/content/fantasy/items/clothing/trousers.dm b/mods/content/fantasy/items/clothing/trousers.dm index 37d757d3abe..cbe30375bff 100644 --- a/mods/content/fantasy/items/clothing/trousers.dm +++ b/mods/content/fantasy/items/clothing/trousers.dm @@ -5,9 +5,7 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/leather color = /decl/material/solid/organic/leather::color - sprite_sheets = list( - BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/trousers_hnoll.dmi' - ) + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/trousers_hnoll.dmi' /obj/item/clothing/pants/trousers/jerkin/Initialize() . = ..() @@ -20,6 +18,4 @@ name = "braies" desc = "Some short trousers. Comfortable and easy to wear." icon = 'mods/content/fantasy/icons/clothing/braies.dmi' - sprite_sheets = list( - BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/braies_hnoll.dmi' - ) + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/braies_hnoll.dmi' diff --git a/mods/species/ascent/_ascent.dme b/mods/species/ascent/_ascent.dme index 63d6f95300d..461ef828f3a 100644 --- a/mods/species/ascent/_ascent.dme +++ b/mods/species/ascent/_ascent.dme @@ -14,6 +14,7 @@ #include "datum\species_bodytypes.dm" #include "datum\traits.dm" #include "effects\razorweb.dm" +#include "items\_overrides.dm" #include "items\cell.dm" #include "items\clothing.dm" #include "items\clustertool.dm" diff --git a/mods/species/ascent/items/_overrides.dm b/mods/species/ascent/items/_overrides.dm new file mode 100644 index 00000000000..3cc8b68959b --- /dev/null +++ b/mods/species/ascent/items/_overrides.dm @@ -0,0 +1,10 @@ +/obj/item + var/_alate_onmob_icon + var/_gyne_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_alate_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_MANTID_SMALL, _alate_onmob_icon) + if(_gyne_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_MANTID_LARGE, _gyne_onmob_icon) diff --git a/mods/species/ascent/items/clothing.dm b/mods/species/ascent/items/clothing.dm index 9962664265a..64641d04adf 100644 --- a/mods/species/ascent/items/clothing.dm +++ b/mods/species/ascent/items/clothing.dm @@ -22,7 +22,7 @@ desc = "An alien facemask with chunky gas filters and a breathing valve." filter_water = TRUE icon = 'mods/species/ascent/icons/clothing/mask.dmi' - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/mask_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/clothing/mask_gyne.dmi' bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE filtered_gases = list( /decl/material/gas/nitrous_oxide, @@ -38,9 +38,7 @@ desc = "A set of powerful gripping claws." icon = 'mods/species/ascent/icons/magboots/boots.dmi' bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/magboots/boots_gyne.dmi' - ) + _gyne_onmob_icon = 'mods/species/ascent/icons/magboots/boots_gyne.dmi' /obj/item/clothing/jumpsuit/ascent name = "mantid undersuit" @@ -48,9 +46,7 @@ bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE icon = 'mods/species/ascent/icons/clothing/under.dmi' color = COLOR_DARK_GUNMETAL - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/under_gyne.dmi' - ) + _gyne_onmob_icon = 'mods/species/ascent/icons/clothing/under_gyne.dmi' /obj/item/clothing/suit/ascent name = "mantid gear harness" @@ -58,7 +54,7 @@ bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE icon_state = ICON_STATE_WORLD icon = 'mods/species/ascent/icons/clothing/under_harness.dmi' - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/under_harness_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/clothing/under_harness_gyne.dmi' body_parts_covered = 0 slot_flags = SLOT_OVER_BODY | SLOT_LOWER_BODY storage = /datum/storage/pockets/suit diff --git a/mods/species/ascent/items/guns.dm b/mods/species/ascent/items/guns.dm index 83fdda10ffc..99a76ce5351 100644 --- a/mods/species/ascent/items/guns.dm +++ b/mods/species/ascent/items/guns.dm @@ -20,7 +20,7 @@ list(mode_name="shock", projectile_type = /obj/item/projectile/beam/stun/shock), list(mode_name="lethal", projectile_type = /obj/item/projectile/beam/particle) ) - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/particle_rifle/inhands_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/particle_rifle/inhands_gyne.dmi' /obj/item/gun/energy/particle/small name = "particle projector" diff --git a/mods/species/ascent/items/rig.dm b/mods/species/ascent/items/rig.dm index 35697954e7b..214f60caa99 100644 --- a/mods/species/ascent/items/rig.dm +++ b/mods/species/ascent/items/rig.dm @@ -3,7 +3,6 @@ name = "alate support exosuit" desc = "A powerful support exosuit with integrated power supply, weapon and atmosphere. It's closer to a mech than a rig." icon = 'mods/species/ascent/icons/rig/rig.dmi' - suit_type = "support exosuit" armor = list( ARMOR_MELEE = ARMOR_MELEE_MAJOR, @@ -28,7 +27,7 @@ gloves = /obj/item/clothing/gloves/rig/mantid update_visible_name = TRUE - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_gyne.dmi' initial_modules = list( /obj/item/rig_module/vision/thermal, /obj/item/rig_module/ai_container, @@ -241,7 +240,7 @@ desc = "More like a torpedo casing than a helmet." bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE icon = 'mods/species/ascent/icons/rig/rig_helmet.dmi' - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_helmet_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_helmet_gyne.dmi' /obj/item/clothing/suit/space/rig/mantid desc = "It's closer to a mech than a suit." @@ -255,16 +254,16 @@ /obj/item/stack/medical/resin, /obj/item/chems/drinks/cans/waterbottle/ascent ) - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_chest_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_chest_gyne.dmi' /obj/item/clothing/shoes/magboots/rig/mantid icon = 'mods/species/ascent/icons/rig/rig_boots.dmi' desc = "It's like a highly advanced forklift." bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_boots_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_boots_gyne.dmi' /obj/item/clothing/gloves/rig/mantid icon = 'mods/species/ascent/icons/rig/rig_gloves.dmi' desc = "They look like a cross between a can opener and a Swiss army knife the size of a shoebox." bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_gloves_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_gloves_gyne.dmi' diff --git a/mods/species/bayliens/bayliens.dm b/mods/species/bayliens/_bayliens.dm similarity index 77% rename from mods/species/bayliens/bayliens.dm rename to mods/species/bayliens/_bayliens.dm index a1ddf384ed9..68d625b481f 100644 --- a/mods/species/bayliens/bayliens.dm +++ b/mods/species/bayliens/_bayliens.dm @@ -1,7 +1,12 @@ -#define SPECIES_SKRELL "Skrell" -#define SPECIES_TAJARA "Tajara" -#define SPECIES_LIZARD "Unathi" -#define SPECIES_ADHERENT "Adherent" +#define SPECIES_SKRELL "Skrell" +#define SPECIES_TAJARA "Tajara" +#define SPECIES_LIZARD "Unathi" +#define SPECIES_ADHERENT "Adherent" + +#define BODYTYPE_FELINE "feline body" +#define BODYTYPE_ADHERENT "adherent body" + +#define BODY_EQUIP_FLAG_FELINE BITFLAG(7) /decl/modpack/bayliens name = "Baystation 12 Aliens" diff --git a/mods/species/bayliens/_bayliens.dme b/mods/species/bayliens/_bayliens.dme index e8de7a35d0b..014aba6cf5d 100644 --- a/mods/species/bayliens/_bayliens.dme +++ b/mods/species/bayliens/_bayliens.dme @@ -1,7 +1,8 @@ #ifndef MODPACK_BAYLIENS #define MODPACK_BAYLIENS // BEGIN_INCLUDE -#include "bayliens.dm" +#include "_bayliens.dm" +#include "_overrides.dm" #include "adherent\_adherent.dm" #include "adherent\datum\culture.dm" #include "adherent\datum\emotes.dm" diff --git a/mods/species/bayliens/_overrides.dm b/mods/species/bayliens/_overrides.dm new file mode 100644 index 00000000000..5eb6f5a8558 --- /dev/null +++ b/mods/species/bayliens/_overrides.dm @@ -0,0 +1,7 @@ +/obj/item + var/_feline_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_feline_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_FELINE, _feline_onmob_icon) diff --git a/mods/species/bayliens/adherent/_adherent.dm b/mods/species/bayliens/adherent/_adherent.dm index 997107674c8..d70f337115d 100644 --- a/mods/species/bayliens/adherent/_adherent.dm +++ b/mods/species/bayliens/adherent/_adherent.dm @@ -1,6 +1,4 @@ -#define BODYTYPE_ADHERENT "adherent body" #define LANGUAGE_ADHERENT "Protocol" - #define BP_FLOAT "floatation disc" #define BP_JETS "maneuvering jets" #define BP_COOLING_FINS "cooling fins" diff --git a/mods/species/bayliens/tajaran/_tajaran.dm b/mods/species/bayliens/tajaran/_tajaran.dm index b4e664e999b..151b2b1c8a7 100644 --- a/mods/species/bayliens/tajaran/_tajaran.dm +++ b/mods/species/bayliens/tajaran/_tajaran.dm @@ -1,6 +1,4 @@ #define LANGUAGE_TAJARA "Siik'maas" -#define BODYTYPE_FELINE "feline body" -#define BODY_EQUIP_FLAG_FELINE BITFLAG(7) /obj/item/clothing/setup_equip_flags() . = ..() diff --git a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm index af8842c7b19..b6c5366944c 100644 --- a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm +++ b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm @@ -2,70 +2,53 @@ LAZYDISTINCTADD(available_bodytypes, BODYTYPE_FELINE) . = ..() -/obj/item/clothing/suit/space/void/merc/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/merc/suit.dmi') +/obj/item/clothing/suit/space/void/merc + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/merc/suit.dmi' -/obj/item/clothing/suit/space/void/swat/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/deathsquad/suit.dmi') +/obj/item/clothing/suit/space/void/swat + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/deathsquad/suit.dmi' -/obj/item/clothing/suit/space/void/engineering/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/engineering/suit.dmi') +/obj/item/clothing/suit/space/void/engineering + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/engineering/suit.dmi' -/obj/item/clothing/suit/space/void/mining/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/mining/suit.dmi') +/obj/item/clothing/suit/space/void/mining + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/mining/suit.dmi' -/obj/item/clothing/suit/space/void/medical/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/medical/suit.dmi') +/obj/item/clothing/suit/space/void/medical + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/medical/suit.dmi' -/obj/item/clothing/suit/space/void/security/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/sec/suit.dmi') +/obj/item/clothing/suit/space/void/security + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/sec/suit.dmi' -/obj/item/clothing/suit/space/void/atmos/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/atmos/suit.dmi') +/obj/item/clothing/suit/space/void/atmos + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/atmos/suit.dmi' -/obj/item/clothing/suit/space/void/engineering/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/engineering_alt/suit.dmi') +/obj/item/clothing/suit/space/void/engineering/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/engineering_alt/suit.dmi' -/obj/item/clothing/suit/space/void/mining/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/mining_alt/suit.dmi') +/obj/item/clothing/suit/space/void/mining/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/mining_alt/suit.dmi' -/obj/item/clothing/suit/space/void/medical/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/medical_alt/suit.dmi') +/obj/item/clothing/suit/space/void/medical/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/medical_alt/suit.dmi' -/obj/item/clothing/suit/space/void/security/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/sec_alt/suit.dmi') +/obj/item/clothing/suit/space/void/security/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/sec_alt/suit.dmi' -/obj/item/clothing/suit/space/void/atmos/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/atmos_alt/suit.dmi') +/obj/item/clothing/suit/space/void/atmos/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/atmos_alt/suit.dmi' -/obj/item/clothing/suit/space/void/engineering/salvage/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/salvage/suit.dmi') +/obj/item/clothing/suit/space/void/engineering/salvage + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/salvage/suit.dmi' -/obj/item/clothing/suit/space/void/expedition/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/pilot/suit.dmi') +/obj/item/clothing/suit/space/void/expedition + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/pilot/suit.dmi' -/obj/item/clothing/suit/space/void/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi') +/obj/item/clothing/suit/space/void + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi' -/obj/item/clothing/suit/space/void/wizard/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi') +/obj/item/clothing/suit/space/void/wizard + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi' -/obj/item/clothing/suit/space/void/excavation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi') +/obj/item/clothing/suit/space/void/excavation + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi' diff --git a/mods/species/drakes/_drakes.dme b/mods/species/drakes/_drakes.dme index 44fa41725be..1143d6a510e 100644 --- a/mods/species/drakes/_drakes.dme +++ b/mods/species/drakes/_drakes.dme @@ -7,6 +7,7 @@ // BEGIN_INCLUDE #include "_drakes.dm" +#include "_overrides.dm" #include "clothing.dm" #include "culture.dm" #include "drake_abilities.dm" diff --git a/mods/species/drakes/_overrides.dm b/mods/species/drakes/_overrides.dm new file mode 100644 index 00000000000..a4c564def3c --- /dev/null +++ b/mods/species/drakes/_overrides.dm @@ -0,0 +1,10 @@ +/obj/item + var/_drake_onmob_icon + var/_drake_hatchling_onmob_icon + +/obj/item/backpack/setup_sprite_sheets() + . = ..() + if(_drake_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, _drake_onmob_icon) + if(_drake_hatchling_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, _drake_hatchling_onmob_icon) diff --git a/mods/species/drakes/clothing.dm b/mods/species/drakes/clothing.dm index ac23b01ba19..63c803bc1db 100644 --- a/mods/species/drakes/clothing.dm +++ b/mods/species/drakes/clothing.dm @@ -1,21 +1,11 @@ +/obj/item/backpack + _drake_onmob_icon = 'mods/species/drakes/icons/clothing/backpack.dmi' + _drake_hatchling_onmob_icon = 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi' -/obj/item/backpack/setup_sprite_sheets() - . = ..() - if(!(BODYTYPE_GRAFADREKA in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/backpack.dmi') - if(!(BODYTYPE_GRAFADREKA_HATCHLING in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi') +/obj/item/card/id + _drake_onmob_icon = 'mods/species/drakes/icons/clothing/id.dmi' + _drake_hatchling_onmob_icon = 'mods/species/drakes/icons/clothing/hatchling_id.dmi' -/obj/item/card/id/setup_sprite_sheets() - . = ..() - if(!(BODYTYPE_GRAFADREKA in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/id.dmi') - if(!(BODYTYPE_GRAFADREKA_HATCHLING in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, 'mods/species/drakes/icons/clothing/hatchling_id.dmi') - -/obj/item/bag/setup_sprite_sheets() - . = ..() - if(!(BODYTYPE_GRAFADREKA in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/sack.dmi') - if(!(BODYTYPE_GRAFADREKA_HATCHLING in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi') +/obj/item/bag + _drake_onmob_icon = 'mods/species/drakes/icons/clothing/sack.dmi' + _drake_hatchling_onmob_icon = 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi' diff --git a/mods/species/neoavians/_neoavians.dme b/mods/species/neoavians/_neoavians.dme index e7c8d526399..6c5b71cb056 100644 --- a/mods/species/neoavians/_neoavians.dme +++ b/mods/species/neoavians/_neoavians.dme @@ -2,6 +2,7 @@ #define CONTENT_PACK_NEOAVIANS // BEGIN_INCLUDE #include "_neoavians.dm" +#include "_overrides.dm" #include "clothing.dm" #include "datum\accessory.dm" #include "datum\language.dm" diff --git a/mods/species/neoavians/_overrides.dm b/mods/species/neoavians/_overrides.dm new file mode 100644 index 00000000000..1d745db0a6f --- /dev/null +++ b/mods/species/neoavians/_overrides.dm @@ -0,0 +1,7 @@ +/obj/item + var/_avian_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_avian_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_AVIAN, _avian_onmob_icon) diff --git a/mods/species/neoavians/clothing.dm b/mods/species/neoavians/clothing.dm index 98f5b8dac91..e7d90e623ea 100644 --- a/mods/species/neoavians/clothing.dm +++ b/mods/species/neoavians/clothing.dm @@ -1,11 +1,9 @@ //Shoes -/obj/item/clothing/shoes/magboots/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/feet/magboots.dmi') +/obj/item/clothing/shoes/magboots + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/feet/magboots.dmi' -/obj/item/clothing/shoes/galoshes/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/feet/galoshes.dmi') +/obj/item/clothing/shoes/galoshes + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/feet/galoshes.dmi' //Gloves /obj/item/clothing/gloves/setup_equip_flags() @@ -13,34 +11,31 @@ if(!isnull(bodytype_equip_flags) && !(bodytype_equip_flags & BODY_EQUIP_FLAG_EXCLUDE)) bodytype_equip_flags |= BODY_EQUIP_FLAG_AVIAN -/obj/item/clothing/gloves/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/gloves.dmi') +/obj/item/clothing/gloves + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/gloves.dmi' + +/obj/item/clothing/gloves/ring + _avian_onmob_icon = null //Backpacks & tanks -/obj/item/backpack/satchel/Initialize() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/satchel.dmi') +/obj/item/backpack/satchel + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/satchel.dmi' //Radsuits (theyre essential?) -/obj/item/clothing/head/radiation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/head/rad_helm.dmi') +/obj/item/clothing/head/radiation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/head/rad_helm.dmi' -/obj/item/clothing/suit/radiation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/suit/rad_suit.dmi') +/obj/item/clothing/suit/radiation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/suit/rad_suit.dmi' //cloaks -/obj/item/clothing/suit/cloak/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/accessory/cloak.dmi') +/obj/item/clothing/suit/cloak + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/accessory/cloak.dmi' -/obj/item/clothing/suit/cloak/hide/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/accessory/cloak_hide.dmi') +/obj/item/clothing/suit/cloak/hide + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/accessory/cloak_hide.dmi' //clothing /obj/item/clothing/dress/avian_smock @@ -49,6 +44,7 @@ icon = 'mods/species/neoavians/icons/clothing/under/smock.dmi' icon_state = ICON_STATE_WORLD bodytype_equip_flags = BODY_EQUIP_FLAG_AVIAN + _avian_onmob_icon = null /obj/item/clothing/dress/avian_smock/worker name = "worker's smock" @@ -86,6 +82,7 @@ icon = 'mods/species/neoavians/icons/clothing/feet/shoes.dmi' color = COLOR_GRAY bodytype_equip_flags = BODY_EQUIP_FLAG_AVIAN + _avian_onmob_icon = null /obj/item/clothing/shoes/avian/footwraps name = "cloth footwraps" diff --git a/mods/species/neoavians/machinery/suit_cycler.dm b/mods/species/neoavians/machinery/suit_cycler.dm index 9b368c30577..2fd6323e6ed 100644 --- a/mods/species/neoavians/machinery/suit_cycler.dm +++ b/mods/species/neoavians/machinery/suit_cycler.dm @@ -4,86 +4,68 @@ //mining -/obj/item/clothing/suit/space/void/mining/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi') +/obj/item/clothing/suit/space/void/mining + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi' -/obj/item/clothing/head/helmet/space/void/mining/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/mining + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi' //excavation -/obj/item/clothing/suit/space/void/excavation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi') +/obj/item/clothing/suit/space/void/excavation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi' -/obj/item/clothing/head/helmet/space/void/excavation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/excavation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi' //engineering -/obj/item/clothing/head/helmet/space/void/engineering/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/engineering + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/helmet.dmi' -/obj/item/clothing/suit/space/void/engineering/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/suit.dmi') +/obj/item/clothing/suit/space/void/engineering + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/suit.dmi' -/obj/item/clothing/head/helmet/space/void/atmos/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/atmos + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/helmet.dmi' -/obj/item/clothing/suit/space/void/atmos/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/suit.dmi') +/obj/item/clothing/suit/space/void/atmos + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/suit.dmi' //medical -/obj/item/clothing/suit/space/void/medical/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/suit.dmi') +/obj/item/clothing/suit/space/void/medical + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/suit.dmi' -/obj/item/clothing/head/helmet/space/void/medical/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/medical + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi' //security -/obj/item/clothing/head/helmet/space/void/security/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/security + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/helmet.dmi' -/obj/item/clothing/suit/space/void/security/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/suit.dmi') +/obj/item/clothing/suit/space/void/security + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/suit.dmi' //salvage -/obj/item/clothing/head/helmet/space/void/engineering/salvage/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/engineering/salvage + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/helmet.dmi' -/obj/item/clothing/suit/space/void/engineering/salvage/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/suit.dmi') +/obj/item/clothing/suit/space/void/engineering/salvage + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/suit.dmi' //pilot -/obj/item/clothing/head/helmet/space/void/expedition/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/expedition + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/helmet.dmi' -/obj/item/clothing/suit/space/void/expedition/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/suit.dmi') +/obj/item/clothing/suit/space/void/expedition + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/suit.dmi' //merc -/obj/item/clothing/head/helmet/space/void/merc/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/merc + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/helmet.dmi' -/obj/item/clothing/suit/space/void/merc/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/suit.dmi') \ No newline at end of file +/obj/item/clothing/suit/space/void/merc + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/suit.dmi' \ No newline at end of file From 3e0ac944bc4f1f1c7dac410e13f4aaad9527885c Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 4 Dec 2024 14:05:40 +1100 Subject: [PATCH 091/554] Automatic changelog generation for PR #4597 [ci skip] --- html/changelogs/AutoChangeLog-pr-4597.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4597.yml diff --git a/html/changelogs/AutoChangeLog-pr-4597.yml b/html/changelogs/AutoChangeLog-pr-4597.yml new file mode 100644 index 00000000000..30daa8a51a7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4597.yml @@ -0,0 +1,6 @@ +author: ophelia +changes: + - {tweak: 'You can now put any disk into the research design database or research + design console, but only the correct disk type (tech disk or design disk) will + function.'} +delete-after: true From d248f32207f6af7526c32cc09c7e714e20497c4e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 4 Dec 2024 17:43:02 +1100 Subject: [PATCH 092/554] Adding Doe's crafted backpacks. --- code/datums/outfits/equipment/backpacks.dm | 8 ++++++++ .../objects/items/weapons/storage/backpack.dm | 17 +++++++++++++++++ .../crafting/stack_recipes/recipes_textiles.dm | 11 +++++++++++ .../storage/backpack/backpack_crafted.dmi | Bin 0 -> 901 bytes .../storage/backpack/backpack_haversack.dmi | Bin 0 -> 844 bytes maps/shaded_hills/shaded_hills_define.dm | 12 +++++++----- 6 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 icons/obj/items/storage/backpack/backpack_crafted.dmi create mode 100644 icons/obj/items/storage/backpack/backpack_haversack.dmi diff --git a/code/datums/outfits/equipment/backpacks.dm b/code/datums/outfits/equipment/backpacks.dm index 13b7df63e46..2a4aed715ea 100644 --- a/code/datums/outfits/equipment/backpacks.dm +++ b/code/datums/outfits/equipment/backpacks.dm @@ -43,6 +43,14 @@ name = "Sack" path = /obj/item/bag/sack +/decl/backpack_outfit/haversack + name = "Haversack" + path = /obj/item/backpack/crafted + +/decl/backpack_outfit/backpack/crafted + name = "Handmade Backpack" + path = /obj/item/backpack/crafted/backpack + /* Code */ /decl/backpack_outfit var/flags diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 6b9c600b959..1bc1144dc87 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -445,3 +445,20 @@ name = "security messenger bag" desc = "A tactical backpack worn over one shoulder. This one is in Security colors." icon = 'icons/obj/items/storage/backpack/messenger_sec.dmi' + +// Crafted backpacks. +/obj/item/backpack/crafted + name = "haversack" + desc = "A rather rough handmade haversack." + icon = 'icons/obj/items/storage/backpack/backpack_haversack.dmi' + material = /decl/material/solid/organic/leather + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + +/obj/item/backpack/crafted/backpack + name = "backpack" + desc = "A rather rough handmade backpack." + icon = 'icons/obj/items/storage/backpack/backpack_crafted.dmi' + +/obj/item/backpack/crafted/backpack/update_name() + . = ..() + SetName("handmade [name]") diff --git a/code/modules/crafting/stack_recipes/recipes_textiles.dm b/code/modules/crafting/stack_recipes/recipes_textiles.dm index ee608b17555..7fdbd1b56af 100644 --- a/code/modules/crafting/stack_recipes/recipes_textiles.dm +++ b/code/modules/crafting/stack_recipes/recipes_textiles.dm @@ -60,6 +60,17 @@ crafting_extra_cost_factor = 1.1 // less material is lost because it's relatively simple difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. +/decl/stack_recipe/textiles/leather/sack + result_type = /obj/item/bag/sack + difficulty = MAT_VALUE_HARD_DIY + +/decl/stack_recipe/textiles/leather/backpack + result_type = /obj/item/backpack/crafted/backpack + difficulty = MAT_VALUE_VERY_HARD_DIY + +/decl/stack_recipe/textiles/leather/backpack/haversack + result_type = /obj/item/backpack/crafted + /decl/stack_recipe/textiles/leather/waterskin result_type = /obj/item/chems/waterskin/crafted required_material = /decl/material/solid/organic/leather diff --git a/icons/obj/items/storage/backpack/backpack_crafted.dmi b/icons/obj/items/storage/backpack/backpack_crafted.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e565e4862a1bceac42c1741494324f05a464eeea GIT binary patch literal 901 zcmV;01A6?4P)D@x2wg|OkOGD>q3^YSxO6q52&Ds_u<@=M~A z5|gtL`b>z{mlL0nn3qD1&LX@zl@(n5T);s90COHt%wU^Zr~m*0e@R3^RA_EMenM@{=`KJlfzlr}-)t)d7xOu=v2gW)4Ckd)o>d@{ z?z{r3SHd*lYUqv-t0H4w0o6W(CbWCmk0*&fQ%+t1)msXn-CJ!@1fZawhXV}SJ(mJS z01BLkgG?rq`N_~&Bl-^P@;l9d*eAbYpW)hlS^}=!CmGz^eOd;t-6t8`+kKjWYxije b|2KaCLi$`=a6(Yk00000NkvXXu0mjfW=){1 literal 0 HcmV?d00001 diff --git a/icons/obj/items/storage/backpack/backpack_haversack.dmi b/icons/obj/items/storage/backpack/backpack_haversack.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ca148f6a4eac4bdaae099b0ea1d8c63e11db1738 GIT binary patch literal 844 zcmV-S1GD^zP)D@x2wg|OkOGD>q3^YSxO6q52&Ds_u<@=M~A z5|gtL`b>z{mlL0nn3qD1&LX@zl@(n5T);s90COHt%wU^Zr~m*0MoC0LRA_ zAP|N5IkS(D?8VZ3fb;_-()-bl@Bb=eCQ%B-c4pXR_*O`j;$yN0y zdIVb(p!IO~_32;^Jj_r-H*`ogUkriPSLX{bcOoRrFhx-aB#H$BA9HYXUZ8a6#UprQ zwf#WzvK#`_MPa<&;y_p!m*Wt=1d_Zcz(HGIUyk$1gZQ`#{T;6Y4euwk=?5QfzLxJC z16Lf|YP$fdySopc+Hx6}m;P=A*#@ljH!;+Hp{%uf)r+7N{?@A1XTwBQeJ5ZaR;1mZ z$z(F`h0!X(qKumt5hlT+JfJWnNg$+iWm*C5Qpb?GxiFck;G<7eaOn~YthfEYgI2+% zF6q;&aY1A(U!7yUUXKKLu8J}yW35o0kFrh{UJxCZeC_pfa&J==bJ;*-1F8jO7Cx8&^Oz-NveK!zZ5p+11{ugEh=@4=?-C(y7?Dk25p#e{K->=m z-Ps&uGMUUf!&8s;)!uLL9<=$HR$z1lX$3|{kf;Enr!0TY=m^pZjE*3&z=k9EPxuAK WLqd%9JxMG80000 Date: Wed, 4 Dec 2024 19:31:43 +1100 Subject: [PATCH 093/554] Added a large square woven basket. --- .../extensions/storage/subtypes_basket.dm | 3 +++ .../objects/items/weapons/storage/basket.dm | 17 ++++++++++++++--- .../obj/items/storage/baskets/basket_large.dmi | Bin 0 -> 1156 bytes .../{basket.dmi => baskets/basket_round.dmi} | Bin 940 -> 940 bytes 4 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 icons/obj/items/storage/baskets/basket_large.dmi rename icons/obj/items/storage/{basket.dmi => baskets/basket_round.dmi} (93%) diff --git a/code/datums/extensions/storage/subtypes_basket.dm b/code/datums/extensions/storage/subtypes_basket.dm index 26b00fd25da..e5601ca9115 100644 --- a/code/datums/extensions/storage/subtypes_basket.dm +++ b/code/datums/extensions/storage/subtypes_basket.dm @@ -3,3 +3,6 @@ use_sound = 'sound/effects/storage/box.ogg' max_w_class = ITEM_SIZE_LARGE max_storage_space = DEFAULT_BOX_STORAGE + +/datum/storage/basket/large + max_storage_space = DEFAULT_BACKPACK_STORAGE diff --git a/code/game/objects/items/weapons/storage/basket.dm b/code/game/objects/items/weapons/storage/basket.dm index d7eada18765..65d8c1a3ec6 100644 --- a/code/game/objects/items/weapons/storage/basket.dm +++ b/code/game/objects/items/weapons/storage/basket.dm @@ -1,10 +1,21 @@ /obj/item/basket - name = "woven basket" + name = "basket" desc = "A simple woven basket. Very rustic." - icon = 'icons/obj/items/storage/basket.dmi' + icon = 'icons/obj/items/storage/baskets/basket_round.dmi' icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_HUGE - slot_flags = SLOT_BACK material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC storage = /datum/storage/basket material = /decl/material/solid/organic/plantmatter/grass/dry + var/name_prefix = "woven" + +/obj/item/basket/update_name() + . = ..() + SetName("[name_prefix] [name]") + +/obj/item/basket/large + slot_flags = SLOT_BACK + icon = 'icons/obj/items/storage/baskets/basket_large.dmi' + name_prefix = "large woven" + storage = /datum/storage/basket/large + slowdown_general = 1 // Large and unwieldly diff --git a/icons/obj/items/storage/baskets/basket_large.dmi b/icons/obj/items/storage/baskets/basket_large.dmi new file mode 100644 index 0000000000000000000000000000000000000000..af9d0140ca7e4391ace607f2666842ae4817a899 GIT binary patch literal 1156 zcmV-~1bh35P)005u_0{{R3dEt5<0000LP)t-sz`(#| zVs?s(p2ES&|Ns9K5nZm&E79XC&q!=`zm#6x;WVF~6KlE3 z52f!a){1S{+4Jc+v6clM$`nLeQL0y1hp8yI;Kgmu#aeMvudoh-s5mdJ7167Lbs(au zrj~{2sGxKp1uv#2?zAF$Rj>|Ze?EWj6T`>7uGh@}oNs@o`ACQ1rS&3_NF);ZcWf8s za;kQAkd0T;@nE#n&TgS4AnAB8YMdP;<4`dm>3A?|oE@aDpj8n-((z!_I6JGu0$P;< zNID*j8fOQw-5E4%bUYZPot^E@pjo5i!6@zQYZYkXa(ass>9mMjJtm|OIj9PW${{sAE+E|;?Qo0Go{{{HT z@jIc!l5T?We<6Ny7_1P=nHm2V;wJ+z{x3SgNF)-8{BqXp4<;dQZO#5*65=O;y(^#X z4@z%gf8o#E@BbOFceMYrM)z-)ci6u<;R4t@+W*1PG`GIkmC^~f_6JG-2S)?^>FX`TSKJnwy*_Dla81+!|jAuX> z2~KBy;yXI0xT%++uMS41!%j^JNy~%{#AA47r(T8uK0yV)p?{Vg%9`ANq=}XCV-gPJ zO=~Lj)hXHFf@QMxp1D->sb8)8`e2qQZ*F)aYIG54?K>|hyPtk_!F$u1f*F0fDQ$?| z9p405eJ~4@HzgIcS?JI~c4)flYjXE*+pIVVCp$EE;T0V+c;b_BdJSKE&MOj${D3df W^V(n5M!k6e0000DHg!Mz{0`F|NsArik@X+c1cHEoa$Scu|I7CFn`4gUZD From 48f02aa8ef1d324a0afa9f07eeda6b4519c2af5f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 4 Dec 2024 19:42:21 +1100 Subject: [PATCH 094/554] Generalised the name_prefix system. --- code/game/objects/items/__item.dm | 3 ++ code/game/objects/items/_item_materials.dm | 9 +++-- .../objects/items/blades/spear_improvised.dm | 5 +-- .../objects/items/weapons/storage/basket.dm | 34 ++++++++++-------- .../objects/items/weapons/tools/wrench.dm | 5 +-- .../stool_bed_chair_nest_sofa/stools.dm | 13 +++---- .../crafting/stack_recipes/recipes_grass.dm | 3 ++ code/modules/detectivework/tools/rag.dm | 8 ++--- .../reagents/reagent_containers/beaker.dm | 5 +-- .../items/storage/baskets/basket_large.dmi | Bin 1156 -> 943 bytes .../items/storage/baskets/basket_round.dmi | Bin 940 -> 776 bytes 11 files changed, 43 insertions(+), 42 deletions(-) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 69b1449b419..562b26a9d0c 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -6,6 +6,9 @@ abstract_type = /obj/item temperature_sensitive = TRUE + /// Set to prefix name with this string ('woven' for 'woven basket' etc) + var/name_prefix + /// Set to false to skip state checking and never draw an icon on the mob (except when held) var/draw_on_mob_when_equipped = TRUE diff --git a/code/game/objects/items/_item_materials.dm b/code/game/objects/items/_item_materials.dm index 95bc6402777..7aaf5d6bb26 100644 --- a/code/game/objects/items/_item_materials.dm +++ b/code/game/objects/items/_item_materials.dm @@ -104,10 +104,13 @@ queue_icon_update() /obj/item/proc/update_name() + var/list/new_name = list(base_name || initial(name)) if(material_alteration & MAT_FLAG_ALTERATION_NAME) - SetName("[material.adjective_name] [base_name || initial(name)]") - else - SetName(base_name || initial(name)) + new_name.Insert(1, material.adjective_name) + if(name_prefix) + new_name.Insert(1, name_prefix) + if(length(new_name)) + SetName(jointext(new_name, " ")) /obj/item/get_matter_amount_modifier() . = ..() diff --git a/code/game/objects/items/blades/spear_improvised.dm b/code/game/objects/items/blades/spear_improvised.dm index e2dba3cc598..b6295462833 100644 --- a/code/game/objects/items/blades/spear_improvised.dm +++ b/code/game/objects/items/blades/spear_improvised.dm @@ -1,4 +1,5 @@ /obj/item/bladed/polearm/spear/improvised + name_prefix = "improvised" material = /decl/material/solid/glass hilt_material = /decl/material/solid/metal/steel guard_material = /decl/material/solid/metal/copper @@ -11,10 +12,6 @@ force_binding_color = pick(global.cable_colors) . = ..(ml, material_key, _hilt_mat, _guard_mat) -/obj/item/bladed/polearm/spear/improvised/update_name() - . = ..() - SetName("improvised [name]") - /obj/item/bladed/polearm/spear/improvised/get_guard_color() return force_binding_color || ..() diff --git a/code/game/objects/items/weapons/storage/basket.dm b/code/game/objects/items/weapons/storage/basket.dm index 65d8c1a3ec6..8c7661451a9 100644 --- a/code/game/objects/items/weapons/storage/basket.dm +++ b/code/game/objects/items/weapons/storage/basket.dm @@ -1,21 +1,25 @@ /obj/item/basket - name = "basket" - desc = "A simple woven basket. Very rustic." - icon = 'icons/obj/items/storage/baskets/basket_round.dmi' - icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_HUGE + name_prefix = "woven" + name = "handbasket" + desc = "A simple woven basket. Very rustic." + icon = 'icons/obj/items/storage/baskets/basket_round.dmi' + icon_state = ICON_STATE_WORLD + w_class = ITEM_SIZE_HUGE material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - storage = /datum/storage/basket - material = /decl/material/solid/organic/plantmatter/grass/dry - var/name_prefix = "woven" + storage = /datum/storage/basket + material = /decl/material/solid/organic/plantmatter/grass/dry -/obj/item/basket/update_name() +/obj/item/basket/on_update_icon() . = ..() - SetName("[name_prefix] [name]") + icon_state = get_world_inventory_state() + if(storage?.opened) + icon_state = "[icon_state]-open" /obj/item/basket/large - slot_flags = SLOT_BACK - icon = 'icons/obj/items/storage/baskets/basket_large.dmi' - name_prefix = "large woven" - storage = /datum/storage/basket/large - slowdown_general = 1 // Large and unwieldly + name_prefix = "large woven" + name = "basket" + slot_flags = SLOT_BACK + icon = 'icons/obj/items/storage/baskets/basket_large.dmi' + w_class = ITEM_SIZE_GARGANTUAN + storage = /datum/storage/basket/large + slowdown_general = 1 // Large and unwieldly diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index e3f8e9e9d7a..c117895cea1 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -30,6 +30,7 @@ // Twohanded wrench. /obj/item/wrench/pipe + name_prefix = "enormous" name = "pipe wrench" desc = "You are no longer asking nicely." icon = 'icons/obj/items/tool/pipewrench.dmi' @@ -47,10 +48,6 @@ /obj/item/wrench/pipe/get_handle_color() return null -/obj/item/wrench/pipe/update_name() - . = ..() - SetName("enormous [name]") - /obj/item/wrench/pipe/Initialize() . = ..() set_extension(src, /datum/extension/tool, list(TOOL_WRENCH = TOOL_QUALITY_DEFAULT)) diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm index 59ccd454a5d..b9e169c20ed 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm @@ -157,14 +157,11 @@ return ..() /obj/item/stool/rustic - name = "stool" - icon = 'icons/obj/stool_rustic.dmi' - material = /decl/material/solid/organic/wood/walnut - color = /decl/material/solid/organic/wood/walnut::color - -/obj/item/stool/rustic/update_name() - ..() - SetName("rustic [name]") // rustic oaken stool, not oaken rustic stool + name_prefix = "rustic" + name = "stool" + icon = 'icons/obj/stool_rustic.dmi' + material = /decl/material/solid/organic/wood/walnut + color = /decl/material/solid/organic/wood/walnut::color /obj/item/stool/rustic/can_be_padded() return FALSE diff --git a/code/modules/crafting/stack_recipes/recipes_grass.dm b/code/modules/crafting/stack_recipes/recipes_grass.dm index d6f262e90bc..1005af46bfc 100644 --- a/code/modules/crafting/stack_recipes/recipes_grass.dm +++ b/code/modules/crafting/stack_recipes/recipes_grass.dm @@ -11,6 +11,9 @@ /decl/stack_recipe/woven/basket result_type = /obj/item/basket +/decl/stack_recipe/woven/large_basket + result_type = /obj/item/basket/large + /decl/stack_recipe/woven/banner result_type = /obj/item/banner/woven diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 1097f54f9bc..5487388845d 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -50,13 +50,13 @@ return ..() /obj/item/chems/glass/rag/update_name() - . = ..() if(on_fire) - SetName("burning [name]") + name_prefix = "burning" else if(reagents && reagents.total_volume) - SetName("damp [name]") + name_prefix = "damp" else - SetName("dry [name]") + name_prefix = "dry" + . = ..() /obj/item/chems/glass/rag/on_update_icon() . = ..() diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index 258146c77c4..b593c3f968f 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -65,6 +65,7 @@ take_damage(rand(4,8)) /obj/item/chems/glass/beaker/large + name_prefix = "large" name = "beaker" // see update_name override below desc = "A large beaker." icon = 'icons/obj/items/chem/beakers/large.dmi' @@ -74,10 +75,6 @@ possible_transfer_amounts = @"[5,10,15,25,30,60,120]" w_class = ITEM_SIZE_LARGE -/obj/item/chems/glass/beaker/large/update_name() - . = ..() - SetName("large [name]") // large glass beaker, not glass large beaker - /obj/item/chems/glass/beaker/bowl name = "mixing bowl" desc = "A large mixing bowl." diff --git a/icons/obj/items/storage/baskets/basket_large.dmi b/icons/obj/items/storage/baskets/basket_large.dmi index af9d0140ca7e4391ace607f2666842ae4817a899..71c23d7b6ce115ac70839991c4a2174f636cb779 100644 GIT binary patch delta 876 zcmV-y1C#uO39koGiBL{Q4GJ0x0000DNk~Le0001h0001h1Oos705K4J_y7O^5>QN3 zMZmzoWny-Uik`y3$^ZZVNk?3a@YVPL0004WQchCg*a8jS)Eauo0ylMnWB)CpHit?oReP?pA(;v zn1^JE3DG)>$kv&Zn4FDEpR$6hp9?q|02Q!!XnZSl*bvAs@0qm{0em1vK(H7l|oh_GFKCn9svcuPL@)#^G zP-v0Q=t6rtx;Wp1=9>8)v`YZrrN^xa0UYv{GJr0;n89-wrZIqj0F!r4QC z9c1uD7ucx({#nR|Y}(6t3BZ{D4mkUebv3-;EKr`~g_xX`dW`<{k0k)(&*0zwlz20P zIbMj#*^kmh%cyg9!GDU$**BO70#M%0An9_`nf$&4V7#5dhB`Q6F7b8%IASjGrsf`n zUU80!ii(Pg`V)G8TgAcBwofIj-70z&9mIOet=pFT3K*n^-orPCUp$u{Q$9l?%&B;wSOnB@_qnYlZ@QR zdnB&%egIo_S9Yk%BXO1Y1K6tD7Vl^@8+CaIG?k-I+CZhBq-sduEFfdc=!cXJ4KC2sO;mVWR@c@N-v+&ed&!51q zIzSh*`u=>UTd1Uh^(mP@A;6<6h<%<;l6v07mVV40MlvCfdkj@Xi17qN4r@{Q`><6StI{^r3|S00000001>1Oos70D0kh9smFU6;Mo6 zMZmzoWny-Uik`y3$^ZZVNk?43z`(>+yAA*V00DGTPE!Ct=GbNc006U*P*Q)1i!&v& zs2C__$i8Y7U$%b z#OK6kB<3OMG$C4N5!pH+c4ByqRI4d4ASp398<#$11y?^8aAE)eXfdQb6w_|B000AC zNklLV5Qd2k_XdCD9;Dt|@H{}pb8oP`|En}aNH&`dhSoVVJ(I7tSdM+8?)gRyGeC)P6zt0(1Bk=!2tmPCUlH65(^JmV$8u6*~yT6oP-QhH!o)c@i$`7UQD%Of^*V*&wIkA=n9?BF% zT2ZQ3Scj=7xZuTY&c%OPaZ<0a4uhyTFRc~PtAcePqN=8rh3TlEbRY#UrYG*SB6?M@ z4rG5mfA15+$GxuC%>SHkf2R3JhvB95B9TZW68U#*7v*xQc6N}BSJLrdwA9XSp(P;c zcra?59VFvWF(B!9Flw9~q^_V<5kS)MVAMD}tHT0Xl>$gQ9*ln)X9uy}88mBjJQ$^& zo$bz`S)=2@DDCWQcLvQG9S=rnXJ@-JXx8X>FuK;+(ecqAMk0|&Hjm^NeRe7YR;hed0Shr?{z?p|1`` zr^8N72}#R@4a8%3W~W|;0X{(mzoCDY9m<;Af24_(@?#PXn+a07*qo IM6N<$f^EqXfdBvi diff --git a/icons/obj/items/storage/baskets/basket_round.dmi b/icons/obj/items/storage/baskets/basket_round.dmi index 378fe0f2a2f09a711b1df90f79d6e01be84f619a..c84fe4b7e607201c0f120d47b6fd4b1913f11e25 100644 GIT binary patch delta 669 zcmV;O0%HBF2Z#nCiBL{Q4GJ0x0000DNk~Le0001h0001B1Oos704G#udXXV60i%&n zPJcJQAT>{ki!&v&s2C_{$i~?OP0Y*B zOi@V6PpQ-`&dD!{&xy}S%tLaL3DG)>@aj}naP@Nm2PXjS8)n6`+7S%^00H$$L_t(o zh3%Npj-wzHhUtp;UFhB~?L0uSJ^(7-cYm_@{;#rNCwP7abgnkD316DF-vJTP#6K`r z`Bw-b&U=1@(w^UCKjO!FHc|9LqN2P0{&yyV~f1lTvUD z_~~x_n)OCUAFf@eqJPW|CIrr%3|w6FPTa1dcjSQc`XO%3=FOlVkB8RN=IW}Hrhk{v zTMIMjZ*ODHQwL6VZr!1eu;4&Z)XHg9ad5@!&W#4ie+!E9&4O3vTyG);DJ zn};PC=nO_7U;yxT68<)haxQq_U2C`m@YXMyN6!ThtPe`jKW^i*{G_sO8EeUNiq$VP|7q`DwRs*TXEjgd>+7R^0vLFmTq|)<6hJS z+7iv@0jQ3hp>1OaUGsT>R@(t~T)aZpd>)`x?qK80D|F500b1os(L}?ORnO-ET5YBL zMVh=q*L)tJRc^x$CL;=6^LYTO%L1p^-F4cpenb8OHKTBoeln^F00000NkvXXu0mjf Do?$#_ delta 835 zcmV-J1HAl*2CN4miBL{Q4GJ0x0000DNk~Le0001>0001h1Oos70Det>D3Kv90jrTv zPJfAuGbOXA7|1u|;!G<_%uR)`QB~}jt?&M3`I%*)SA zQAo;9snjjb$uEh|iO)#PL(*wNw9X>3bwcdKa5Sk_6EHwo!PUyZlf>|M#*CCvyk4Gq<;?pga_cq+^1Ue{;yKwt?U^yc5HElmjeWqI}GSn5{t>CUnIQL8DPIhsoS&abWOxVB6D+9KOpnL~j6ee$%bo8xoD$Bu{i@B7K%~UOpO!3{eFJ~^~O^~#UBU7jc*O`AG zo0lsS6zl5A;{Q!}xw69E8$JpypMRQuab|_RH+-;FUV=q9v%=mRUiiAMVsPgTdvCls zqxYsM?7eXqdv6@Z-W!Lp_r_s}%X$oZZzK|lL?Uq>F5c)rlr+2C8R>pdrOnR0Lb@MR zX|tO-ObkT2A5>|x!^$f_r29dYHoFe^>@!pF21I(-(P0clrFA$0ujeKR?A7EzXXlkxOGg&6kU|+`l0cKW?rsf*tldP`c zf*EzyjsFGsWKmTg8H)P@jDPTDmp{y7vp~+KDn-_g)%eae<3~@fbqX%f{8>T zkvKUq^T8~{)?(&^S%^;py?Z+!lx}fD?^#imfZoymhpJOI!1tzZ*DiqG(f$Xk#fZM~ zmvPsQ=7XgF!D@g{M$HF9d@^c27~+#r^T80GjG7My`K06I@2V%{2NW4(pfn+To`3)V N002ovPDHLkV1h3AmfZjV From 71a5a78eda6f405f08ab7a7f23f698427a036b01 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 4 Dec 2024 20:08:38 +1100 Subject: [PATCH 095/554] Adding a lounge. --- .../stool_bed_chair_nest_sofa/pew.dm | 18 +++++++++++++++++- .../recipes_hardness_integrity.dm | 4 ++++ icons/obj/structures/benches.dmi | Bin 1969 -> 1836 bytes icons/obj/structures/lounge.dmi | Bin 0 -> 3905 bytes 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 icons/obj/structures/lounge.dmi diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm index 9e849a85d38..0cae0394ad3 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm @@ -132,4 +132,20 @@ /obj/structure/bed/chair/bench/pew/ebony color = /decl/material/solid/organic/wood/ebony::color - material = /decl/material/solid/organic/wood/ebony \ No newline at end of file + material = /decl/material/solid/organic/wood/ebony + +/obj/structure/bed/chair/bench/lounge + name = "lounge" + desc = "An elegant lounge, perfect for reclining on." + icon = 'icons/obj/structures/lounge.dmi' + icon_state = "lounge_standing" + base_icon = "lounge" + +/obj/structure/bed/chair/bench/lounge/get_material_icon() + return icon + +/obj/structure/bed/chair/bench/lounge/mapped + color = /decl/material/solid/organic/wood/mahogany::color + material = /decl/material/solid/organic/wood/mahogany + reinf_material = /decl/material/solid/organic/cloth + padding_color = COLOR_RED_GRAY diff --git a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm index 92e580a6d0e..7da43a8ec2d 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm @@ -43,6 +43,10 @@ /decl/stack_recipe/hardness/integrity/furniture/bench/pew/single result_type = /obj/structure/bed/chair/bench/pew/single +/decl/stack_recipe/hardness/integrity/furniture/bench/lounge + result_type = /obj/structure/bed/chair/bench/lounge + difficulty = MAT_VALUE_VERY_HARD_DIY + /decl/stack_recipe/hardness/integrity/furniture/closet result_type = /obj/structure/closet diff --git a/icons/obj/structures/benches.dmi b/icons/obj/structures/benches.dmi index 70510d9d975a7e3eb0096cbe90db04d2e01867ec..5a56743224bcfa6cf5aa46aa523c298eae2e3a06 100644 GIT binary patch delta 1574 zcmV+>2HE+s53CNb8UcR={7FPXRCt{2T#cHeAPiizKUQ73@Bg%i)hcS31d-PEGX1{O z6PFl942*`KAH@LEqbN`A-@pl{vKUT#_0TR#olAo%;Ig zV_`18m#ekTfxD$0uy^NxwXHkxkPdVV$Q)1xvOpPlH@=90I`n@St&h(@b-fkVfpVZb zUff)$*qZ?Z5L3;>Kut4H(+nW{k}EJ5fCvw~K5(ZUxRZUroFN2;xdsrn&(^09w$Gq9 zj2Y<0Fb~+KS?$hRa@$jgVSq5Yuy1Mr(^KD}w(iR8xck7&fvpT6`}JT5*>@E`FdTJz z-3k4%?u5~Rb)A26+8rGv7>MfwgZ<`lf!+3Tz+Hs%*xJdJko^;C;gc&b08SJGHspY% z81U^ATV%brUm_1nSAGL12?m<50}a7|Z-2RU*MqG0_OXkuyy_{oS3BalTNUZI5Vl{~ z;l2*rH^{@T4_pDrP8=7=p#9qoS?}!|)WU{&%q=_dhM|AN%D%UCO^+Y44+q-69&T%= z-F|E2k$&r7ZghayItTbjW?Fz)2DSt;WWQ|%44B{X=j{#$`0_Oau|tVvr89d2fPHhm zj6ZL;{~5kKnSoWM-tW>kG_>z(3!--bmq#+-?urEip#FymSoo+QG`;9cxbo>%Sah!C z*@5zK{eypdpsX(pPa2G<{P`bd9uX|ZlNMCCuR>`qQ~T1l&{TfNIkDeXw7AQZ|Mzg+ z<=j0*%7z|{y}*9=6l+8FyTM>nwr+@Vrh7K)fXS=x@8f_(-w#!gh~fQ0i|w~z`z{cj zMUnJ+&Z4Y|haw^S&s#`PK|Tgj>?;F_PzJt;0cL+nn4N)*_WL*>n3QLY0}1v$2CytL zZvi+Pi3!nJ~8VQ;1_g%+R}@LL37Pq3ZieKgGaH;{aCo zJ$-+Yzh^pl76xMOL0bcT-}?IgB!By&KgB?5A7J$Tc?;a@6n(!aeEYKZ3oHYizCUk) zSp$C)TdY0bZfgeO>=O>eQCO5xeSea_eI0!5K>95d6-c-i#`^yC>f7HTki~~``$y>d z-c}sw_8dyY45sWK(DyB??^A&+WiS^XNU*xk>HA9t-Vn$P()WL-mR<<_;|{^V%ZCy` z-yfR!vJ&{mot+tQKovCW7QpI0qwkY_poxF7@0~!`>s4@nR$yih5OsNf#g%&wJOdd} z=GOMT6F7aJu7I1dh-WlAI54&UrV0{~>;R|VAKwAaz^6Nqicub~@~9fg7`jg|f8h8I zIA$yM{X*+bIjRFL5LJ>$TIEsplJQ_b=72Jg1PvkaIBeLu%jh|6EV>c06I^9LmQehvn> z`~@KGFY*Tj`hJc+z~wIhXT-^u1o!nkkoE@$q668!gE`JT zR`+8W$PvgG1{isNYypwJpCynn`3qRye=;D{_wz7-^B36f^BIMI%>dB%H!;BEFR0jOu=fK8!hBSX68LR_G&mZ6%IDGy9>wtekp-?Ck z3WY-PYQXvECk$Ho^??o!etn>WWA=4BTA%2sz~c9bui)Ll>UYUk@NV$y105Xv`alN< z*0w*u0UXFaz=3aJfM1{Js5q0a7l`$VjtYK#po2rOKG3njzkg6D6bgkxp-?CkicDZ+ zkrzx!677rE2g-K+iT1_o1Lc2nAkBVF2>fLJKsE;w?K5Au=a-kI`3oUnec#I;$OUQs zLI~pZfpS5bzYv0WeV|;B<}ZYR)#ZqV@HRV;X#eejEY<$kFu>*yWOE?Vey{Hf@&~dx zK)zs*+ZV47l+S_0K7dbog#)tuh3#kLhQ38mC=?2XLZMJ76bgkxp->(u6bgkxp-}9K Ye<0`hs1HdMb^rhX07*qoM6N<$f@HxEMF0Q* delta 1708 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 Date: Sun, 24 Nov 2024 13:27:22 +1100 Subject: [PATCH 096/554] Replacing wooden plank furniture with chipboard laminate furniture. --- code/game/objects/structures/benches.dm | 4 + code/game/objects/structures/tables.dm | 78 +++++++ .../designs/general/designs_general.dm | 58 +++++ .../solids/materials_solid_wood.dm | 43 ++++ .../materials/material_sheets_mapping.dm | 6 + .../reagents/reactions/reaction_synthesis.dm | 54 +++++ maps/antag_spawn/ert/ert_base.dmm | 10 +- maps/away/bearcat/bearcat-2.dmm | 4 +- maps/away/casino/casino.dmm | 38 ++-- maps/away/errant_pisces/errant_pisces.dmm | 14 +- maps/away/liberia/liberia.dmm | 64 +++--- maps/away/magshield/magshield.dmm | 26 +-- maps/away/mining/mining-signal.dmm | 18 +- maps/away/slavers/slavers_base.dmm | 12 +- maps/away/smugglers/smugglers.dmm | 4 +- maps/away/unishi/unishi-2.dmm | 20 +- maps/away/unishi/unishi-3.dmm | 26 +-- maps/away/yacht/yacht.dmm | 6 +- maps/exodus/exodus-2.dmm | 210 +++++++++--------- maps/exodus/exodus-admin.dmm | 42 ++-- maps/ministation/ministation-0.dmm | 26 +-- maps/ministation/ministation-1.dmm | 60 ++--- maps/ministation/ministation-2.dmm | 52 ++--- maps/tradeship/tradeship-0.dmm | 4 +- maps/tradeship/tradeship-2.dmm | 4 +- .../away_sites/lar_maria/lar_maria-2.dmm | 30 +-- .../government/away_sites/icarus/icarus-1.dmm | 14 +- .../government/away_sites/icarus/icarus-2.dmm | 18 +- mods/gamemodes/heist/heist_base.dmm | 16 +- 29 files changed, 602 insertions(+), 359 deletions(-) diff --git a/code/game/objects/structures/benches.dm b/code/game/objects/structures/benches.dm index ed9805ff78b..0cf79b94173 100644 --- a/code/game/objects/structures/benches.dm +++ b/code/game/objects/structures/benches.dm @@ -38,6 +38,10 @@ material = /decl/material/solid/organic/wood reinf_material = /decl/material/solid/organic/wood +/obj/structure/table/bench/wooden/chipboard + material = /decl/material/solid/organic/wood/chipboard + reinf_material = /decl/material/solid/organic/wood/chipboard + /obj/structure/table/bench/padded icon_state = "padded_preview" material = /decl/material/solid/metal/steel diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index c66281e59f2..3700b2f4e48 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -778,6 +778,84 @@ /obj/structure/table/woodentable_reinforced/ebony/walnut additional_reinf_material = /decl/material/solid/organic/wood/walnut +// Wood laminate tables; chipboard basically. +// Smooth texture like plastic etc for a less rustic vibe on spacer maps. +/obj/structure/table/laminatetable + icon_state = "solid_preview" + color = WOOD_COLOR_GENERIC + material = /decl/material/solid/organic/wood/chipboard + reinf_material = /decl/material/solid/organic/wood/chipboard + +/obj/structure/table/laminatetable/mahogany + color = WOOD_COLOR_RICH + material = /decl/material/solid/organic/wood/chipboard/mahogany + reinf_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/obj/structure/table/laminatetable/maple + color = WOOD_COLOR_PALE + material = /decl/material/solid/organic/wood/chipboard/maple + reinf_material = /decl/material/solid/organic/wood/chipboard/maple + +/obj/structure/table/laminatetable/ebony + color = WOOD_COLOR_BLACK + material = /decl/material/solid/organic/wood/chipboard/ebony + reinf_material = /decl/material/solid/organic/wood/chipboard/ebony + +/obj/structure/table/laminatetable/walnut + color = WOOD_COLOR_CHOCOLATE + material = /decl/material/solid/organic/wood/chipboard/walnut + reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/structure/table/laminatetable_reinforced + icon_state = "reinf_preview" + color = WOOD_COLOR_GENERIC + material = /decl/material/solid/organic/wood/chipboard + reinf_material = /decl/material/solid/organic/wood/chipboard + additional_reinf_material = /decl/material/solid/organic/wood/chipboard + +/obj/structure/table/laminatetable_reinforced/walnut + color = WOOD_COLOR_CHOCOLATE + material = /decl/material/solid/organic/wood/chipboard/walnut + reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/structure/table/laminatetable_reinforced/walnut/maple + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/maple + +/obj/structure/table/laminatetable_reinforced/mahogany + color = WOOD_COLOR_RICH + material = /decl/material/solid/organic/wood/chipboard/mahogany + reinf_material = /decl/material/solid/organic/wood/chipboard/mahogany + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/obj/structure/table/laminatetable_reinforced/mahogany/walnut + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/structure/table/laminatetable_reinforced/ebony + color = WOOD_COLOR_BLACK + material = /decl/material/solid/organic/wood/chipboard/ebony + reinf_material = /decl/material/solid/organic/wood/chipboard/ebony + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/ebony + +/obj/structure/table/laminatetable_reinforced/ebony/walnut + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + + + + + + + + + + + + + + + + + // A table that doesn't smooth, intended for bedside tables or otherwise standalone tables. // TODO: make table legs use material and tabletop use reinf_material // theoretically, this could also be made to use the normal table icon system, unlike desks? diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 47eebe2b454..ae37f50f4d9 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -188,3 +188,61 @@ /datum/fabricator_recipe/fishing_line_high_quality path = /obj/item/fishing_line/high_quality +/datum/fabricator_recipe/chipboard + path = /obj/item/stack/material/sheet/mapped/chipboard_pine + category = "Textiles" + fabricator_types = list( + FABRICATOR_CLASS_GENERAL, + FABRICATOR_CLASS_TEXTILE + ) + +/datum/fabricator_recipe/chipboard/get_resources() + resources = list( + /decl/material/solid/organic/wood = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard + path = /obj/item/stack/material/sheet/mapped/chipboard_pine + +/datum/fabricator_recipe/chipboard/get_resources() + resources = list( + /decl/material/solid/organic/wood = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/maple + path = /obj/item/stack/material/sheet/mapped/chipboard_maple + +/datum/fabricator_recipe/chipboard/maple/get_resources() + resources = list( + /decl/material/solid/organic/wood/maple = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/mahogany + path = /obj/item/stack/material/sheet/mapped/chipboard_mahogany + +/datum/fabricator_recipe/chipboard/mahogany/get_resources() + resources = list( + /decl/material/solid/organic/wood/mahogany = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/ebony + path = /obj/item/stack/material/sheet/mapped/chipboard_ebony + +/datum/fabricator_recipe/chipboard/ebony/get_resources() + resources = list( + /decl/material/solid/organic/wood/ebony = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/walnut + path = /obj/item/stack/material/sheet/mapped/chipboard_walnut + +/datum/fabricator_recipe/chipboard/walnut/get_resources() + resources = list( + /decl/material/solid/organic/wood/walnut = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) diff --git a/code/modules/materials/definitions/solids/materials_solid_wood.dm b/code/modules/materials/definitions/solids/materials_solid_wood.dm index 01629ab0acf..fd8f3626859 100644 --- a/code/modules/materials/definitions/solids/materials_solid_wood.dm +++ b/code/modules/materials/definitions/solids/materials_solid_wood.dm @@ -133,3 +133,46 @@ /decl/material/liquid/heartstopper = 0.1 ) value = 1.8 + +// Used solely to give the old smooth table icons for spacer tables. +// Easy to work, not very strong or valuable. +/decl/material/solid/organic/wood/chipboard + name = "pine chipboard" + adjective_name = "pine laminate" + uid = "solid_wood_chipboard_pine" + lore_text = "Also known as particle board, this material is made from various kinds of pine wood chips and resin, with a plastic laminate." + bench_icon = 'icons/obj/structures/benches.dmi' + pew_icon = 'icons/obj/structures/pews.dmi' + door_icon_base = "metal" + table_icon_base = "metal" + color = WOOD_COLOR_GENERIC + value = 1.1 + default_solid_form = /obj/item/stack/material/sheet + +/decl/material/solid/organic/wood/chipboard/maple + name = "maple chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of maple wood chips and resin, with a plastic laminate." + adjective_name = "maple laminate" + uid = "solid_wood_chipboard_maple" + color = WOOD_COLOR_PALE + +/decl/material/solid/organic/wood/chipboard/mahogany + name = "mahogany chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of mahogany wood chips and resin, with a plastic laminate." + adjective_name = "mahogany laminate" + uid = "solid_wood_chipboard_mahogany" + color = WOOD_COLOR_RICH + +/decl/material/solid/organic/wood/chipboard/ebony + name = "ebony chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of ebony wood chips and resin, with a plastic laminate." + adjective_name = "ebony laminate" + uid = "solid_wood_chipboard_ebony" + color = WOOD_COLOR_BLACK + +/decl/material/solid/organic/wood/chipboard/walnut + name = "walnut chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of walnut wood chips and resin, with a plastic laminate." + adjective_name = "walnut laminate" + uid = "solid_wood_chipboard_walnut" + color = WOOD_COLOR_CHOCOLATE diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index d852c202c26..33dfdcb211c 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -117,4 +117,10 @@ STACK_SUBTYPES(titanium, "titanium", solid/metal/tita STACK_SUBTYPES(cotton, "cotton", solid/organic/cloth, thread, null) STACK_SUBTYPES(dried_gut, "dried gut", solid/organic/leather/gut, thread, null) +STACK_SUBTYPES(chipboard_pine, "pine chipboard", solid/organic/wood/chipboard, sheet, null) +STACK_SUBTYPES(chipboard_maple, "maple chipboard", solid/organic/wood/chipboard/maple, sheet, null) +STACK_SUBTYPES(chipboard_mahogany, "mahogany chipboard", solid/organic/wood/chipboard/mahogany, sheet, null) +STACK_SUBTYPES(chipboard_ebony, "ebony chipboard", solid/organic/wood/chipboard/ebony, sheet, null) +STACK_SUBTYPES(chipboard_walnut, "walnut chipboard", solid/organic/wood/chipboard/walnut, sheet, null) + #undef STACK_SUBTYPES \ No newline at end of file diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index 90f7a0e1957..f30d0c4b049 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -146,3 +146,57 @@ return for(var/i = 1 to create_soap) new /obj/item/soap/crafted(T) + +// Making chipboard out of wood scraps/recycled wood. +/decl/chemical_reaction/synthesis/chipboard + name = "Pine Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + result_amount = 1 + mix_message = "The wood particulate binds with the plastic to form laminated chipboard." + minimum_temperature = 100 CELSIUS + var/chipboard_type = /decl/material/solid/organic/wood/chipboard + +/decl/chemical_reaction/synthesis/chipboard/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) + ..() + var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) + if(!istype(T)) + return + var/create_sheets = floor(created_volume) + if(create_sheets <= 0) + return + new /obj/item/stack/material/sheet(T, create_sheets, chipboard_type) + +/decl/chemical_reaction/synthesis/chipboard/maple + name = "Maple Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/maple = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/maple + +/decl/chemical_reaction/synthesis/chipboard/mahogany + name = "Mahogany Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/mahogany = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/mahogany + +/decl/chemical_reaction/synthesis/chipboard/ebony + name = "Ebony Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/ebony = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/ebony + +/decl/chemical_reaction/synthesis/chipboard/walnut + name = "Walnut Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/walnut = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/walnut diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm index 30c9701f6a8..e1e1f3f16a8 100644 --- a/maps/antag_spawn/ert/ert_base.dmm +++ b/maps/antag_spawn/ert/ert_base.dmm @@ -1555,7 +1555,7 @@ /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) "ev" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/machinery/button/blast_door{ @@ -1567,7 +1567,7 @@ /turf/unsimulated/floor/cult, /area/map_template/rescue_base/base) "ew" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/radio/phone{ @@ -1577,7 +1577,7 @@ /turf/unsimulated/floor/cult, /area/map_template/rescue_base/base) "ex" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/machinery/button/blast_door{ @@ -1747,7 +1747,7 @@ /turf/unsimulated/floor/dark, /area/map_template/rescue_base/base) "eH" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/ashtray, @@ -1761,7 +1761,7 @@ /turf/unsimulated/floor/cult, /area/map_template/rescue_base/base) "eJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /turf/unsimulated/floor/cult, diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index c167b8ef9e0..10ca7b3af29 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -302,7 +302,7 @@ "aM" = ( /obj/item/paper_bin, /obj/item/pen, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -479,7 +479,7 @@ /turf/floor/wood, /area/ship/scrap/command/captain) "bc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable{ icon_state = "0-8" }, diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index b1d54db6ab7..34f3ab6aa0d 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -1293,7 +1293,7 @@ /turf/floor/plating, /area/casino/casino_storage) "dQ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigar{ pixel_y = 5 }, @@ -1317,7 +1317,7 @@ /turf/floor/plating, /area/casino/casino_storage) "dS" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/toolbox/mechanical, /obj/item/stack/cable_coil, /turf/floor/plating, @@ -2244,7 +2244,7 @@ /turf/floor/tiled, /area/casino/casino_mainfloor) "gu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/clothing/mask/smokable/pipe, /obj/machinery/light{ dir = 1 @@ -2253,7 +2253,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "gv" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigar, /obj/item/box/fancy/cigar{ pixel_y = 5 @@ -2726,13 +2726,13 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "ia" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate, /obj/item/utensil/fork, /turf/floor/carpet, /area/casino/casino_mainfloor) "ib" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/casino/casino_mainfloor) "ic" = ( @@ -2855,13 +2855,13 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "iq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate, /obj/item/food/applepie, /turf/floor/carpet, /area/casino/casino_mainfloor) "ir" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate, /obj/item/food/bigbiteburger, /turf/floor/carpet, @@ -3048,7 +3048,7 @@ /turf/floor/tiled, /area/casino/casino_kitchen) "iR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate, /obj/item/utensil/spoon, /turf/floor/carpet, @@ -3385,7 +3385,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "jJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/item/food/cubancarp, /turf/floor/carpet, @@ -3463,7 +3463,7 @@ /turf/floor/tiled, /area/casino/casino_mainfloor) "jU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate, /obj/item/food/waffles, /obj/item/chems/drinks/cans/iced_tea, @@ -3631,7 +3631,7 @@ /turf/floor/tiled, /area/casino/casino_mainfloor) "kt" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pizzabox/meat, /turf/floor/carpet, /area/casino/casino_mainfloor) @@ -4219,14 +4219,14 @@ /turf/floor/wood, /area/casino/casino_private_vip) "lZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigar{ pixel_y = 5 }, /turf/floor/wood, /area/casino/casino_private_vip) "ma" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/random/drinkbottle, /turf/floor/wood, @@ -4281,7 +4281,7 @@ /turf/floor/tiled/white, /area/casino/casino_patron_bathroom) "mj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/drinks/bottle/agedwhiskey, /obj/item/clothing/mask/smokable/cigarette/cigar/havana, /obj/item/clothing/mask/smokable/cigarette/cigar/havana, @@ -4328,12 +4328,12 @@ /turf/floor/wood, /area/casino/casino_private_vip) "mq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /turf/floor/wood, /area/casino/casino_private_vip) "mr" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/casino/casino_private_vip) "ms" = ( @@ -4348,7 +4348,7 @@ /turf/floor/wood, /area/casino/casino_private_vip) "mu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /obj/random/coin, /obj/random/coin, @@ -4368,7 +4368,7 @@ /turf/floor/wood, /area/casino/casino_private1) "mx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index 7e62686eb0d..dd44f08ac77 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -2562,7 +2562,7 @@ /turf/floor/wood, /area/errant_pisces/rooms) "gw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_pump/on{ level = 2 }, @@ -2742,7 +2742,7 @@ /turf/floor/tiled, /area/errant_pisces/dorms) "gZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/errant_pisces/rooms) "ha" = ( @@ -2752,7 +2752,7 @@ /turf/floor/wood, /area/errant_pisces/rooms) "hb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/flashlight/lamp, /turf/floor/wood, @@ -2769,7 +2769,7 @@ /turf/floor/wood, /area/errant_pisces/rooms) "he" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/random/smokes, /turf/floor/wood, @@ -2941,7 +2941,7 @@ name = "south bump"; pixel_y = -24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/smokes, /obj/structure/cable/green, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -5784,7 +5784,7 @@ /turf/floor/wood, /area/errant_pisces/bridge) "pn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/errant_pisces/bridge) "po" = ( @@ -5870,7 +5870,7 @@ /turf/floor/wood, /area/errant_pisces/bridge) "pC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/toy, /turf/floor/wood, /area/errant_pisces/bridge) diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index 35999ef09ff..5808decc8c0 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -1656,7 +1656,7 @@ /turf/floor/tiled/techfloor, /area/liberia/engineeringengines) "cZ" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/machinery/chemical_dispenser/bar_coffee{ dir = 1 }, @@ -3301,7 +3301,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/carpet, /area/liberia/bar) @@ -3325,7 +3325,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "fS" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/light{ dir = 1 @@ -3348,7 +3348,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "fU" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /obj/random/drinkbottle, /obj/structure/window/reinforced{ @@ -3357,12 +3357,12 @@ /turf/floor/wood/ebony, /area/liberia/bar) "fV" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/machinery/chemical_dispenser/bar_soft/full, /turf/floor/wood/ebony, /area/liberia/bar) "fW" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/machinery/light{ dir = 4 }, @@ -3486,7 +3486,7 @@ /area/liberia/bar) "gg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/deck/cards, /turf/floor/carpet, /area/liberia/bar) @@ -3513,7 +3513,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "gl" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/box/glasses/pint, /turf/floor/wood/ebony, /area/liberia/bar) @@ -3640,7 +3640,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "gx" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/structure/window/reinforced{ dir = 8 }, @@ -3653,7 +3653,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "gy" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/ashtray/glass, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -3665,7 +3665,7 @@ /turf/floor/wood/ebony, /area/liberia/bar) "gz" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/chems/glass/rag, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -4194,7 +4194,7 @@ /turf/floor/wood/walnut, /area/liberia/bar) "hA" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/scanner/price, /obj/item/scanner/price, /obj/machinery/light/small, @@ -4206,21 +4206,21 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/engineeringreactor) "hC" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/item/box/matches, /obj/random/smokes, /turf/floor/carpet/red, /area/liberia/captain) "hD" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /mob/living/simple_animal/tindalos{ name = "Eddy" }, /turf/floor/carpet/red, /area/liberia/captain) "hE" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/carpet/red, /area/liberia/captain) @@ -4257,7 +4257,7 @@ /turf/floor/carpet, /area/liberia/personellroom2) "hI" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -4312,7 +4312,7 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/merchantstorage) "hN" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/random/action_figure, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -5178,7 +5178,7 @@ /turf/floor/carpet, /area/liberia/library) "jX" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/lava/orange, /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 @@ -5186,7 +5186,7 @@ /turf/floor/carpet, /area/liberia/library) "jY" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/structure/flora/pottedplant/deskleaf{ pixel_x = -5; pixel_y = 2 @@ -5222,7 +5222,7 @@ /turf/floor/carpet/magenta, /area/liberia/guestroom2) "ka" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/structure/flora/pottedplant/smallcactus{ pixel_x = -5; pixel_y = 9 @@ -5246,7 +5246,7 @@ /turf/floor/carpet, /area/liberia/library) "kc" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/box/fancy/donut, /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 @@ -5424,7 +5424,7 @@ /turf/floor/carpet, /area/liberia/library) "kr" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/modular_computer/laptop/preset/custom_loadout/standard{ dir = 8 }, @@ -5472,7 +5472,7 @@ /turf/floor/carpet, /area/liberia/library) "ky" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/spline/fancy/wood, /obj/machinery/power/apc/liberia{ name = "south bump"; @@ -5482,7 +5482,7 @@ /turf/floor/carpet, /area/liberia/library) "kz" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/pen, /obj/machinery/light/small{ @@ -6241,7 +6241,7 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/merchantstorage) "os" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/spline/fancy/wood, /turf/floor/carpet/red, /area/liberia/traidingroom) @@ -6421,7 +6421,7 @@ /turf/floor/tiled/techfloor, /area/liberia/cryo) "pZ" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/machinery/fabricator/micro/bartender{ pixel_x = 4 }, @@ -6757,7 +6757,7 @@ pixel_x = 4; pixel_y = -4 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, @@ -7120,7 +7120,7 @@ /turf/wall/r_wall/prepainted, /area/liberia/captain) "Af" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/borderfloor{ dir = 10 }, @@ -7748,7 +7748,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /turf/floor/carpet/blue, /area/liberia/personellroom1) "Kh" = ( @@ -7862,7 +7862,7 @@ /turf/wall/r_wall/prepainted, /area/liberia/officeroom) "Ml" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/ashtray/glass, /obj/effect/floor_decal/borderfloor{ dir = 6 @@ -8106,7 +8106,7 @@ /turf/floor/tiled/techfloor, /area/liberia/merchantstorage) "QK" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/borderfloor, /obj/effect/floor_decal/corner/green{ dir = 5 @@ -8512,7 +8512,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 10 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/carpet/blue, /area/liberia/personellroom1) diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index d6e4edc107a..ab90cfc20bc 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -2268,7 +2268,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "gH" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 10 }, /obj/item/box/checkers, @@ -2278,20 +2278,20 @@ /turf/floor/carpet/blue, /area/magshield/west) "gI" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 10 }, /obj/item/belt/champion, /turf/floor/carpet/blue, /area/magshield/west) "gJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 10 }, /turf/floor/carpet/blue, /area/magshield/west) "gK" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 10 }, /obj/item/bible/booze, @@ -2385,7 +2385,7 @@ /turf/floor/tiled, /area/magshield/west) "gY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/action_figure, /turf/floor/tiled, /area/magshield/west) @@ -2483,7 +2483,7 @@ /turf/floor/tiled, /area/magshield/west) "hn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/sword/replica, /turf/floor/tiled, /area/magshield/west) @@ -2523,7 +2523,7 @@ /turf/floor/plating/airless, /area/space) "hw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/plushie/large, /turf/floor/tiled, /area/magshield/west) @@ -2565,7 +2565,7 @@ /turf/floor/tiled, /area/magshield/west) "hC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/toy/shipmodel, /turf/floor/tiled, /area/magshield/west) @@ -2614,7 +2614,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "hK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/supermatter_engine, /turf/floor/carpet/blue, /area/magshield/west) @@ -2665,7 +2665,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "hT" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/evaguide, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -2727,7 +2727,7 @@ /turf/floor/tiled, /area/magshield/west) "hZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/accessory, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -2735,7 +2735,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "ia" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flame/fuelled/lighter/zippo/random, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -2743,7 +2743,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "ib" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/random/smokes, /obj/machinery/light, diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 9876407c368..0d101569e58 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -667,18 +667,18 @@ /turf/floor/wood/broken/three, /area/outpost/abandoned) "co" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/effect/decal/cleanable/dirt, /obj/random/trash, /turf/floor/wood, /area/outpost/abandoned) "cp" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/board, /turf/floor/wood, /area/outpost/abandoned) "cq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/loot, /turf/floor/wood, /area/outpost/abandoned) @@ -773,7 +773,7 @@ /turf/floor/carpet/blue, /area/outpost/abandoned) "cO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/loot, /turf/floor/carpet/blue, /area/outpost/abandoned) @@ -975,13 +975,13 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 10 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/loot, /turf/floor/carpet, /area/outpost/abandoned) "dx" = ( /obj/effect/floor_decal/spline/fancy/wood, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/outpost/abandoned) "dy" = ( @@ -994,7 +994,7 @@ /area/outpost/abandoned) "dz" = ( /obj/effect/floor_decal/spline/fancy/wood, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/loot, /turf/floor/carpet/broken, /area/outpost/abandoned) @@ -1002,7 +1002,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/outpost/abandoned) "dC" = ( @@ -1100,7 +1100,7 @@ /turf/wall/titanium, /area/outpost/abandoned) "dR" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ icon_state = "solid_flip0" }, /turf/floor/carpet/blue, diff --git a/maps/away/slavers/slavers_base.dmm b/maps/away/slavers/slavers_base.dmm index f9648ba2863..660b97f4fde 100644 --- a/maps/away/slavers/slavers_base.dmm +++ b/maps/away/slavers/slavers_base.dmm @@ -2841,12 +2841,12 @@ /turf/floor/tiled/airless, /area/slavers_base/demo) "hO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/radio/shortwave, /turf/floor/tiled/airless, /area/slavers_base/demo) "hP" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/secure_storage/briefcase/money, /obj/random/cash, /obj/random/cash, @@ -2976,12 +2976,12 @@ /turf/floor/tiled/airless, /area/slavers_base/demo) "ij" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/bag/cash, /turf/floor/tiled/airless, /area/slavers_base/demo) "ik" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/cash, /turf/floor/tiled/airless, /area/slavers_base/demo) @@ -3052,7 +3052,7 @@ /turf/floor/tiled, /area/slavers_base/dorms) "iy" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper{ info = "

Contract

This contract describes exchanging of monetary pieces for the right o? the ownership for following examples: <*> Human, age 17. Price - 1500cr. <*> Human, age 49. Price - 1100cr. <*> Human, age 28. Good fist fighter. Price - 2400cr. <*> Human, age 34. Expirienced medic. Price - 6800cr. Overall price: 11800cr
Place for signatures"; name = "Contract" @@ -3060,7 +3060,7 @@ /turf/floor/tiled/airless, /area/slavers_base/demo) "iz" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/coin, /obj/item/pen, /turf/floor/tiled/airless, diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index 808d13e1443..5e6ccae998b 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -611,7 +611,7 @@ /turf/floor/tiled, /area/smugglers/office) "bD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper, /obj/item/pen, /obj/item/flashlight/lamp, @@ -665,7 +665,7 @@ /turf/floor/tiled, /area/smugglers/office) "bK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/coin{ pixel_x = -5; pixel_y = -3 diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index b63e93afd20..d3cc41c6a3b 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -13,7 +13,7 @@ /turf/wall/titanium, /area/space) "ae" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/advdevice, /obj/item/flashlight/lamp, /turf/floor/carpet/red, @@ -32,7 +32,7 @@ /turf/floor/carpet/red, /area/unishi/library) "ai" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp, /turf/floor/carpet/red, /area/unishi/library) @@ -960,18 +960,18 @@ /turf/floor/tiled, /area/unishi/meeting) "cN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/pen/fancy, /turf/floor/tiled, /area/unishi/meeting) "cO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pen/fancy, /turf/floor/tiled, /area/unishi/meeting) "cP" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/folder/yellow, /obj/item/pen/green, /turf/floor/tiled, @@ -1023,7 +1023,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cX" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1033,7 +1033,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1042,7 +1042,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1982,7 +1982,7 @@ /turf/floor/tiled/dark, /area/unishi/common) "fy" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/snack, /obj/item/flashlight/lamp, /turf/floor/tiled/dark, @@ -2008,7 +2008,7 @@ /turf/floor/tiled/dark, /area/unishi/common) "fC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/flashlight/lamp, /turf/floor/tiled/dark, diff --git a/maps/away/unishi/unishi-3.dmm b/maps/away/unishi/unishi-3.dmm index 8ad33994f7d..43eb7353088 100644 --- a/maps/away/unishi/unishi-3.dmm +++ b/maps/away/unishi/unishi-3.dmm @@ -896,7 +896,7 @@ /turf/floor/wood, /area/unishi/lounge) "cH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/cell/crap, /obj/item/stock_parts/circuitboard/gyrotron_control, /obj/item/paper_bin, @@ -910,7 +910,7 @@ /turf/space, /area/space) "cJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/trash/raisins, /obj/item/pizzabox/margherita, /obj/random/advdevice, @@ -920,7 +920,7 @@ /turf/floor/tiled, /area/unishi/living) "cK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/dice, /obj/item/deck/cards, /obj/item/pen/fancy, @@ -928,14 +928,14 @@ /turf/floor/wood, /area/unishi/lounge) "cL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/board, /obj/item/book/manual/mass_spectrometry, /obj/item/book/fluff/stasis, /turf/floor/tiled, /area/unishi/living) "cM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, @@ -1024,7 +1024,7 @@ /turf/floor/tiled, /area/unishi/living) "cY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/trash/raisins, /obj/item/book/manual/nuclear, /turf/floor/tiled, @@ -1091,7 +1091,7 @@ /turf/floor/tiled, /area/unishi/kitchen) "dg" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/trash/candy, /obj/machinery/recharger, /turf/floor/tiled, @@ -1268,7 +1268,7 @@ /turf/floor/tiled, /area/unishi/living) "dD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/cane/fancy/sword, /obj/item/clothing/suit/radiation, /turf/floor/tiled, @@ -1441,7 +1441,7 @@ /turf/floor/tiled, /area/unishi/living) "eb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/poster, /obj/item/grooming/comb/colorable/random, /obj/random/advdevice, @@ -1641,7 +1641,7 @@ /turf/floor/wood, /area/unishi/living) "eB" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, @@ -1720,7 +1720,7 @@ /turf/floor/wood, /area/unishi/living) "eJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/grooming/brush, /obj/item/cosmetics/lipstick/black, /obj/item/cosmetics/lipstick/green, @@ -1780,7 +1780,7 @@ /turf/floor/wood, /area/unishi/living) "eS" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pen/fancy, /obj/random/drinkbottle, /turf/floor/wood, @@ -1796,7 +1796,7 @@ /turf/floor/wood, /area/unishi/living) "eV" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /turf/floor/wood, /area/unishi/living) diff --git a/maps/away/yacht/yacht.dmm b/maps/away/yacht/yacht.dmm index 3e56a19c9e6..84dd4a4fe61 100644 --- a/maps/away/yacht/yacht.dmm +++ b/maps/away/yacht/yacht.dmm @@ -56,7 +56,7 @@ "am" = ( /obj/item/folder/blue, /obj/item/form_printer, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/drinks/glass2/coffeecup, /obj/item/newspaper, /obj/effect/spider/stickyweb, @@ -540,7 +540,7 @@ }, /obj/item/bible, /obj/item/pen/blue, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper{ info = "Let me introduce myself. My name is Commander Archibald McKinley, although the Fleet fucks think that I do not deserve the title. Well, fuck them. They accused me of facilitating a destruction of the ship I was CO of. A small missile cruiser, with zero to fucking none point defenses was attacked, and they first accuse me of escaping before any of my crew. What kind of person wouldn't expect someone to escape when their ship is on fire? It's lunacy. But it only got worse. Then they said that I helped the Terrans take the ship. Well fuck them, they are wrong. That's non sense. I have no connection to the Terrans. They said that I got a large sum of money from them in order to betray my ship's position, which is once again total nonsense. I've got about 20 years of life left here, and I know that I will be safe with my ship here. I need to resupply once every 5 years, given how much food and fuel I have, and I've got enough range to go to pretty much any known part of the galaxy, in complete silence, as we are totally solar powered. I wish I could afford ion thrusters to not have to rely on gas for propulsion, but, our gas heaters should provide us with enough pressure to get anywhere in relative decent speed. Also, I got a robot butler who cooks delicious food for me! No more crappy lance corporal food, eh" }, @@ -1168,7 +1168,7 @@ /obj/item/clothing/suit/det_trench/grey, /obj/item/clothing/gloves/ring/cti, /obj/item/clothing/costume/oldman, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/effect/spider/stickyweb, /obj/random/cash, /obj/random/cash, diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 1b0190807cf..655a78cc42f 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -60,7 +60,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/security/detectives_office) "aae" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/drinks/flask/barflask{ pixel_x = -4; pixel_y = 8 @@ -1539,7 +1539,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/meeting) "adu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flame/candle{ pixel_x = -5; pixel_y = 5 @@ -3533,7 +3533,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/main) "ahH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/megaphone, /obj/item/radio/off, /turf/floor/tiled/dark, @@ -3587,7 +3587,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "ahO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/keycard_auth{ dir = 8 }, @@ -3790,7 +3790,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "air" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "1-4" }, @@ -3805,7 +3805,7 @@ name = "east bump"; pixel_x = 24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/recharger{ pixel_y = 4 }, @@ -3985,7 +3985,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/main) "aiP" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/taperecorder, /turf/floor/tiled/dark, /area/exodus/crew_quarters/heads/hos) @@ -3993,7 +3993,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "aiR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -4004,7 +4004,7 @@ dir = 8; pixel_x = 24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -4507,7 +4507,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/heads/hos) "ajL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/newscaster{ pixel_x = 28; pixel_y = 1 @@ -4951,7 +4951,7 @@ /turf/floor/lino, /area/exodus/security/detectives_office) "akD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /obj/item/secure_storage/safe{ pixel_x = 6; @@ -4986,7 +4986,7 @@ /obj/machinery/alarm{ pixel_y = 22 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flash, /obj/item/clothing/glasses/sunglasses, /obj/item/chems/spray/pepper, @@ -5132,7 +5132,7 @@ /turf/floor/carpet, /area/exodus/security/detectives_office) "akU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray/plastic, /obj/item/box/fancy/cigarettes/dromedaryco, /obj/item/clothing/gloves/forensic, @@ -5495,7 +5495,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/button/alternate/door{ id_tag = "detdoor"; name = "Office Door" @@ -6350,7 +6350,7 @@ /obj/item/secure_storage/safe{ pixel_x = -23 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/lino, /area/exodus/security/detectives_office) @@ -6362,7 +6362,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/button/alternate/door{ id_tag = "detdoor"; name = "Office Door" @@ -6619,7 +6619,7 @@ dir = 8; pixel_x = 22 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/photo_album{ pixel_y = -10 }, @@ -6732,7 +6732,7 @@ /turf/floor/carpet, /area/exodus/security/detectives_office) "aof" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flash, /obj/item/chems/spray/pepper, /obj/item/clothing/glasses/sunglasses, @@ -11368,7 +11368,7 @@ /turf/floor/plating, /area/exodus/maintenance/security_port) "axY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/clothing/glasses/threedglasses, /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) @@ -11381,7 +11381,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) "aya" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/coin, /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) @@ -11797,7 +11797,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) "ayQ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paicard, /obj/structure/cable/green{ icon_state = "4-8" @@ -11810,7 +11810,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) "ayR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -13764,7 +13764,7 @@ /turf/floor/tiled/dark, /area/shuttle/arrival/station) "aDi" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/fabricator/book, /obj/item/stack/material/panel/mapped/plastic/ten, /obj/item/stack/material/plank/mapped/wood/ten, @@ -13891,7 +13891,7 @@ /obj/machinery/status_display{ pixel_y = 32 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 @@ -14224,7 +14224,7 @@ /turf/floor/tiled/dark/monotile, /area/exodus/gateway) "aEh" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/reagentgrinder, /obj/item/chems/drinks/shaker, /obj/item/stack/package_wrap, @@ -14348,7 +14348,7 @@ /turf/floor/plating, /area/exodus/maintenance/bar) "aEv" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/gun/projectile/shotgun/doublebarrel, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/floor/wood/walnut, @@ -14463,7 +14463,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/maintenance/auxsolarport) "aEF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -15576,7 +15576,7 @@ /turf/floor/plating, /area/exodus/maintenance/library) "aGM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/dice/d20, /obj/item/dice, /obj/item/radio/intercom{ @@ -16646,7 +16646,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/secondary/entry/starboard) "aIN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/recharger, /turf/floor/tiled/dark, @@ -16805,7 +16805,7 @@ /turf/wall/r_wall/prepainted, /area/exodus/hallway/primary/central_two) "aJj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -2; pixel_y = 5 @@ -17658,7 +17658,7 @@ /turf/wall/prepainted, /area/exodus/crew_quarters/kitchen) "aLa" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp{ pixel_y = 10 }, @@ -17669,7 +17669,7 @@ /turf/floor/lino, /area/exodus/chapel/office) "aLb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/nullrod, /obj/item/eftpos{ eftpos_name = "Chapel EFTPOS scanner" @@ -17677,7 +17677,7 @@ /turf/floor/lino, /area/exodus/chapel/office) "aLc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pen, /obj/item/chems/drinks/bottle/holywater, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -17752,7 +17752,7 @@ /turf/floor/tiled/dark, /area/exodus/chapel/main) "aLl" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/folder/yellow, /obj/item/pen, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -18471,7 +18471,7 @@ /turf/floor/tiled/dark, /area/exodus/chapel/main) "aMR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/recharger, /turf/floor/wood/walnut, /area/exodus/library) @@ -18541,7 +18541,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/bar) "aNa" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -19130,7 +19130,7 @@ /turf/floor/wood/walnut, /area/exodus/library) "aOg" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/food/junk/chips, /obj/random/single{ name = "randomly spawned cola"; @@ -19445,13 +19445,13 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/port) "aOL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/disposalpipe/segment, /obj/item/deck/cards, /turf/floor/wood/walnut, /area/exodus/library) "aOM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray/plastic{ pixel_x = -1; pixel_y = 1 @@ -20127,7 +20127,7 @@ /turf/floor/plating, /area/exodus/maintenance/arrivals) "aQj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigarettes{ pixel_y = 2 }, @@ -20220,7 +20220,7 @@ /area/exodus/security/prison/restroom) "aQw" = ( /obj/machinery/photocopier, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/walnut, /area/exodus/library) "aQx" = ( @@ -20536,7 +20536,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/library) "aRm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -20657,7 +20657,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/bar) "aRx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/single{ name = "randomly spawned deck of cards"; spawn_object = /obj/item/deck/cards @@ -20925,7 +20925,7 @@ /obj/machinery/camera/network/civilian_east{ c_tag = "Bar East" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/pen/blue{ pixel_x = -3; @@ -21910,7 +21910,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aUp" = ( @@ -22265,7 +22265,7 @@ /turf/floor/plating, /area/exodus/maintenance/bar) "aVi" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/exodus/chapel/main) "aVj" = ( @@ -22655,7 +22655,7 @@ pixel_x = 2; pixel_y = 6 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/condiment/small/saltshaker{ pixel_x = -2; pixel_y = 4 @@ -22696,7 +22696,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aWi" = ( @@ -22890,7 +22890,7 @@ /turf/floor/wood/walnut, /area/exodus/library) "aWH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/light/small{ dir = 4 }, @@ -23262,7 +23262,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/research/mixing) "aXz" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/utensil/fork, /obj/item/utensil/fork, /turf/floor/wood/walnut, @@ -23275,13 +23275,13 @@ /turf/floor/tiled/white, /area/exodus/crew_quarters/kitchen) "aXB" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/board, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aXD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/checkers/chess/red, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -23304,7 +23304,7 @@ /area/exodus/crew_quarters/kitchen) "aXF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/disposalpipe/segment, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -23565,7 +23565,7 @@ /turf/floor/plating, /area/exodus/hallway/secondary/entry/port) "aYl" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -23749,7 +23749,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/locker) "aYF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/checkers, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -24120,7 +24120,7 @@ /turf/floor/tiled/white, /area/exodus/crew_quarters/kitchen) "aZm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aZn" = ( @@ -24147,7 +24147,7 @@ /area/exodus/crew_quarters/kitchen) "aZp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/disposalpipe/segment, /obj/item/camera, /turf/floor/wood/walnut, @@ -24263,7 +24263,7 @@ /turf/floor/carpet, /area/exodus/library) "aZD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper, /turf/floor/wood/walnut, /area/exodus/library) @@ -24278,13 +24278,13 @@ /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "aZF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/camera_film, /obj/item/camera_film, /turf/floor/wood/walnut, /area/exodus/library) "aZG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pen/red{ pixel_x = 2; pixel_y = 6 @@ -24296,11 +24296,11 @@ /turf/floor/wood/walnut, /area/exodus/library) "aZH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/walnut, /area/exodus/library) "aZI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 @@ -24953,7 +24953,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/locker) "bbd" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/condiment/small/peppermill{ pixel_x = 2; pixel_y = 6 @@ -24982,7 +24982,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/primary/starboard) "bbg" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/utensil/fork, /obj/item/utensil/fork, /obj/item/utensil/fork, @@ -25054,7 +25054,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/starboard) "bbo" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flame/candle, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -26531,7 +26531,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "beA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pen, /turf/floor/wood/walnut, /area/exodus/library) @@ -26552,7 +26552,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/captain) "beD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -27056,7 +27056,7 @@ /area/exodus/crew_quarters/captain) "bfG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/checkers/chess, /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) @@ -28096,7 +28096,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai) "bhU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/donut, /obj/structure/cable/green{ icon_state = "4-8" @@ -28290,7 +28290,7 @@ /obj/item/eftpos{ eftpos_name = "Bridge EFTPOS scanner" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -28313,14 +28313,14 @@ /area/exodus/quartermaster/storage) "bir" = ( /obj/item/folder/red, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "4-8" }, /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bis" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -28349,7 +28349,7 @@ /turf/floor/wood/walnut, /area/exodus/bridge/meeting_room) "biv" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/faxmachine/mapped, /turf/floor/wood/walnut, /area/exodus/bridge/meeting_room) @@ -28405,7 +28405,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai) "biE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random_multi/single_item/captains_spare_id, /turf/floor/carpet, /area/exodus/crew_quarters/captain) @@ -29031,12 +29031,12 @@ pixel_y = 7 }, /obj/item/pen, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bjJ" = ( /obj/item/folder/blue, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bjK" = ( @@ -29532,14 +29532,14 @@ /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bkH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/recharger{ pixel_y = 4 }, /turf/floor/wood/walnut, /area/exodus/bridge/meeting_room) "bkI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -29605,7 +29605,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai) "bkN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/recharger{ pixel_y = 4 }, @@ -29985,7 +29985,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/primary/central_one) "blG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/folder/blue, /obj/item/stamp/captain{ pixel_x = -4; @@ -30010,7 +30010,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "blI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/wood/walnut, /area/exodus/crew_quarters/captain) @@ -30022,7 +30022,7 @@ /turf/floor/wood/walnut, /area/exodus/crew_quarters/captain) "blK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pinpointer, /obj/item/disk/nuclear, /obj/item/secure_storage/safe{ @@ -30488,7 +30488,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/donut, /turf/floor/wood/walnut, /area/exodus/bridge/meeting_room) @@ -30602,14 +30602,14 @@ /turf/floor/wood/walnut, /area/exodus/crew_quarters/bar) "bmR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/eftpos{ eftpos_name = "Captain EFTPOS scanner" }, /turf/floor/wood/walnut, /area/exodus/crew_quarters/captain) "bmS" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/whip/chainofcommand, /obj/machinery/alarm{ dir = 8; @@ -31431,7 +31431,7 @@ /area/exodus/research/chargebay) "boF" = ( /obj/machinery/faxmachine/mapped, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/floor/wood/walnut, @@ -31956,7 +31956,7 @@ /turf/floor/plating, /area/exodus/storage/emergency) "bpG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random_multi/single_item/captains_spare_id{ weight = 10 }, @@ -32382,7 +32382,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/research/robotics) "bqw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/carpet, /area/exodus/crew_quarters/captain) @@ -33858,7 +33858,7 @@ dir = 1; pixel_y = -30 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/deck/cards{ pixel_y = 4 }, @@ -35557,7 +35557,7 @@ /turf/floor/tiled/white, /area/exodus/medical/medbay2) "bwU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/matches, /obj/item/clothing/mask/smokable/cigarette/cigar, /obj/item/chems/drinks/flask{ @@ -35724,7 +35724,7 @@ /turf/floor/tiled/white, /area/exodus/medical/medbay2) "bxn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/camera, /obj/item/photo_album{ pixel_y = -10 @@ -47700,7 +47700,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/medical/patient_wing) "bVc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/dice, /turf/floor/wood/walnut, /area/exodus/engineering/break_room) @@ -47734,7 +47734,7 @@ /turf/floor/tiled/white, /area/exodus/research/misc_lab) "bVf" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /turf/floor/wood/walnut, /area/exodus/engineering/break_room) @@ -47950,7 +47950,7 @@ /turf/floor/plating, /area/exodus/engineering/engine_waste) "bVC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/engineering_guide{ pixel_x = 3; pixel_y = 2 @@ -47962,7 +47962,7 @@ /turf/floor/wood/walnut, /area/exodus/engineering/break_room) "bVD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/engineering_construction, /obj/item/book/manual/evaguide{ pixel_x = -2; @@ -48520,7 +48520,7 @@ /turf/floor/tiled/white, /area/exodus/research) "bWO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/clipboard, /obj/item/folder/blue{ @@ -49407,7 +49407,7 @@ /turf/floor/reinforced, /area/exodus/research/mixing) "bYx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/supermatter_engine{ pixel_x = -3 }, @@ -49606,7 +49606,7 @@ /turf/floor/carpet, /area/exodus/engineering/break_room) "bYR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -50243,12 +50243,12 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/engine_smes) "caj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/folder/yellow, /turf/floor/carpet, /area/exodus/engineering/break_room) "cak" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/food/junk/chips, /turf/floor/carpet, /area/exodus/engineering/break_room) @@ -50464,7 +50464,7 @@ /turf/floor/wood, /area/exodus/medical/psych) "caG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -50472,7 +50472,7 @@ /turf/floor/wood, /area/exodus/medical/psych) "caH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/computer/modular/preset/medical, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -52263,7 +52263,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/engine_eva) "cei" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/exodus/medical/psych) "cej" = ( @@ -53272,7 +53272,7 @@ /turf/floor/tiled/white, /area/exodus/medical/virology) "cgu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/recharger, /turf/floor/carpet, /area/exodus/hallway/secondary/entry/starboard) @@ -56547,7 +56547,7 @@ /turf/wall/prepainted, /area/exodus/maintenance/arrivals) "cnn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/taperecorder, /obj/item/camera, /obj/item/eftpos{ diff --git a/maps/exodus/exodus-admin.dmm b/maps/exodus/exodus-admin.dmm index c2576532980..f7b4411a7a1 100644 --- a/maps/exodus/exodus-admin.dmm +++ b/maps/exodus/exodus-admin.dmm @@ -1440,14 +1440,14 @@ /turf/unsimulated/floor/steel, /area/centcom/holding) "aMY" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/amanita_pie, /turf/unsimulated/floor/wood, /area/centcom/holding) "aMZ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/bigbiteburger, @@ -1466,13 +1466,13 @@ /turf/unsimulated/floor/wood, /area/centcom/holding) "aNc" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /turf/unsimulated/floor/wood, /area/centcom/holding) "aNh" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/stew, @@ -1483,7 +1483,7 @@ /turf/unsimulated/floor/lino, /area/centcom/holding) "aNk" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/book/manual/barman_recipes, @@ -1491,14 +1491,14 @@ /turf/unsimulated/floor/lino, /area/centcom/holding) "aNl" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/machinery/chemical_dispenser/bar_alc/full, /turf/unsimulated/floor/lino, /area/centcom/holding) "aNm" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/machinery/chemical_dispenser/bar_soft/full, @@ -1536,28 +1536,28 @@ /turf/floor/tiled/monotile, /area/shuttle/escape_shuttle) "aNB" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/boiledrice, /turf/unsimulated/floor/wood, /area/centcom/holding) "aNC" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/beet, /turf/unsimulated/floor/wood, /area/centcom/holding) "aNI" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/stuffing, /turf/unsimulated/floor/wood, /area/centcom/holding) "aNJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/soylenviridians, @@ -1713,14 +1713,14 @@ /turf/floor/tiled/techfloor/grid, /area/shuttle/escape_shuttle) "aPR" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/blood, /turf/unsimulated/floor/wood, /area/centcom/holding) "aPS" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/skewer/tofu, @@ -1730,7 +1730,7 @@ /turf/unsimulated/wall, /area/centcom/holding) "aRm" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/poppypretzel, @@ -1740,7 +1740,7 @@ /obj/structure/bed/chair/comfy/brown{ dir = 1 }, -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/clothing/pants/slacks/outfit, @@ -1754,13 +1754,13 @@ /obj/structure/bed/chair/comfy/brown{ dir = 1 }, -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /turf/unsimulated/floor/lino, /area/centcom/holding) "bgJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /turf/unsimulated/floor/lino, @@ -1831,7 +1831,7 @@ /turf/floor/tiled/dark/monotile, /area/shuttle/escape_shuttle) "bvb" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/spesslaw, @@ -1845,14 +1845,14 @@ /turf/floor/tiled, /area/shuttle/escape_shuttle) "byb" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/candiedapple, /turf/unsimulated/floor/wood, /area/centcom/holding) "bzm" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/mushroom, @@ -1864,7 +1864,7 @@ /turf/unsimulated/floor/lino, /area/tdome/tdomeadmin) "bMb" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminatetable{ dir = 5 }, /obj/item/food/meatsteak, diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index c715e45dc03..b427b70ebd3 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -31,7 +31,7 @@ /turf/wall/natural/random/ministation, /area/space) "ai" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/pool, /area/ministation/dorms) "ak" = ( @@ -1727,7 +1727,7 @@ /turf/floor/reinforced/airmix, /area/ministation/atmospherics) "gF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/light{ dir = 4 }, @@ -3756,7 +3756,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7267,7 +7267,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /turf/floor/wood, /area/ministation/engine) "EN" = ( @@ -7277,7 +7277,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /obj/item/chems/chem_disp_cartridge/coffee{ name = "coffee canister" }, @@ -7289,7 +7289,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /turf/floor/wood, /area/ministation/engine) "EP" = ( @@ -7317,7 +7317,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 @@ -7405,7 +7405,7 @@ "Fc" = ( /obj/item/wrench, /obj/item/clothing/gloves/insulated, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /turf/floor/wood, /area/ministation/engine) "Fd" = ( @@ -7414,7 +7414,7 @@ }, /obj/item/stack/tape_roll/barricade_tape/atmos, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /obj/item/chems/spray/cleaner, /turf/floor/wood, /area/ministation/engine) @@ -7424,7 +7424,7 @@ }, /obj/item/chems/drinks/glass2/coffeecup/metal, /obj/item/chems/drinks/glass2/coffeecup/metal, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminatetable_reinforced/walnut/maple, /obj/item/chems/drinks/glass2/coffeecup/tall, /turf/floor/wood, /area/ministation/engine) @@ -11756,7 +11756,7 @@ /turf/floor/tiled, /area/ministation/cargo) "Ro" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/clothing/mask/snorkel, /obj/item/clothing/mask/snorkel, /obj/machinery/light{ @@ -12544,7 +12544,7 @@ /turf/space, /area/space) "Ua" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/clothing/mask/snorkel, /obj/item/clothing/mask/snorkel, /turf/floor/pool, @@ -13830,7 +13830,7 @@ dir = 4 }, /obj/machinery/camera/autoname, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/poster, /obj/item/pen, /turf/floor/wood/walnut, diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index ce6e50124ac..61ac63b60d6 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -474,7 +474,7 @@ /turf/floor/plating, /area/ministation/hop) "cA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green, /obj/machinery/firealarm{ dir = 4; @@ -1218,7 +1218,7 @@ /turf/open, /area/ministation/hall/e2) "gB" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/pen/blue, /turf/floor/carpet/red, /area/ministation/security) @@ -1500,7 +1500,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "hC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_pump/on, /obj/item/scanner/spectrometer, /obj/item/handcuffs, @@ -1633,7 +1633,7 @@ /turf/floor/tiled, /area/ministation/security) "id" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -3020,7 +3020,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "pf" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/floor/tiled, /area/ministation/hall/w2) @@ -3069,7 +3069,7 @@ /turf/floor/plating, /area/ministation/maint/l2centraln) "px" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/glass/beaker, /turf/floor/lino, /area/ministation/cafe) @@ -3081,7 +3081,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/structure/window/reinforced{ dir = 4 }, @@ -3269,7 +3269,7 @@ /turf/floor/tiled/white, /area/ministation/detective) "qe" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/tiled, /area/ministation/hall/w2) "qf" = ( @@ -3644,7 +3644,7 @@ /turf/open, /area/ministation/hall/w2) "rA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -4864,7 +4864,7 @@ /turf/floor/plating, /area/ministation/medical) "vq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/manual/detective, /turf/floor/carpet/red, /area/ministation/detective) @@ -5415,7 +5415,7 @@ /turf/floor/plating, /area/ministation/maint/l2centrals) "xn" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/paper_bin, /turf/floor/carpet/red, /area/ministation/security) @@ -6062,7 +6062,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/structure/window/reinforced{ dir = 8 }, @@ -6150,7 +6150,7 @@ pixel_x = -3; pixel_y = 6 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/button/blast_door{ id_tag = "Kitchen1"; name = "Kitchen Shutter"; @@ -6523,7 +6523,7 @@ /turf/floor/plating, /area/ministation/hall/w2) "Bk" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 @@ -6533,7 +6533,7 @@ /turf/floor/carpet, /area/ministation/hall/w2) "Bm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/lino, /area/ministation/cafe) "Br" = ( @@ -6708,7 +6708,7 @@ pixel_y = -24; dir = 1 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/reagent_temperature, /turf/floor/lino, /area/ministation/cafe) @@ -6873,7 +6873,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "Dj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/condiment/enzyme, /obj/item/mollusc/clam, /obj/item/mollusc/clam, @@ -7508,7 +7508,7 @@ /turf/floor/tiled, /area/ministation/hydro) "Hx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/reagent_temperature/cooler, /turf/floor/lino, /area/ministation/cafe) @@ -7639,7 +7639,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "Ia" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/machinery/faxmachine/mapped, /turf/floor/carpet/red, /area/ministation/security) @@ -7832,7 +7832,7 @@ /turf/floor/fake_grass, /area/ministation/hydro) "Jj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/camera/autoname{ dir = 8 }, @@ -7879,7 +7879,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "Jo" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigarettes, /obj/item/pen, /obj/structure/cable{ @@ -8195,7 +8195,7 @@ /turf/floor/tiled, /area/ministation/security) "Lk" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/pen/multi, /turf/floor/carpet/red, /area/ministation/security) @@ -8214,7 +8214,7 @@ /turf/floor/tiled, /area/ministation/security) "Lr" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/reagentgrinder/juicer, /obj/item/chems/glass/beaker, /turf/floor/lino, @@ -8269,7 +8269,7 @@ /turf/floor/carpet/red, /area/ministation/security) "LM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/knife/kitchen/cleaver, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -8903,7 +8903,7 @@ /turf/floor/plating, /area/ministation/medical) "Pd" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigarettes{ pixel_y = 2 }, @@ -9215,7 +9215,7 @@ /turf/floor/tiled, /area/ministation/hall/e2) "QH" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/pen, /turf/floor/carpet/red, /area/ministation/security) @@ -9755,7 +9755,7 @@ /turf/floor/tiled, /area/ministation/security) "TX" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/eftpos, /obj/item/chems/spray/cleaner, /obj/item/chems/packet/honey, @@ -9816,7 +9816,7 @@ /turf/floor/plating, /area/ministation/maint/secmaint) "Ur" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /turf/floor/carpet/red, /area/ministation/security) "Ut" = ( @@ -10132,7 +10132,7 @@ /turf/floor/plating, /area/ministation/medical) "Wa" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -10451,7 +10451,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "XW" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/ammo/beanbags, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index 12a062972d2..07e596175cf 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -350,7 +350,7 @@ /area/ministation/bridge) "bt" = ( /obj/item/flashlight/lamp/green, -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 @@ -497,7 +497,7 @@ /turf/floor/wood/walnut, /area/ministation/bridge) "bI" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/modular_computer/tablet/lease/preset/command, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 @@ -900,7 +900,7 @@ /turf/floor/tiled, /area/ministation/bridge) "dn" = ( -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminatetable_reinforced/walnut, /obj/item/paper_bin, /obj/item/pen/retractable, /turf/floor/carpet/red, @@ -3295,7 +3295,7 @@ /turf/floor, /area/ministation/science) "ps" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminatetable/ebony, /obj/item/paper_bundle, /obj/effect/floor_decal/stoneborder{ dir = 6 @@ -4129,7 +4129,7 @@ /turf/floor/lino, /area/ministation/hall/s3) "wY" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminatetable/ebony, /obj/item/pen/fancy, /obj/item/box/fancy/crayons, /obj/effect/floor_decal/stoneborder{ @@ -5275,7 +5275,7 @@ /turf/floor/plating, /area/ministation/maint/l3central) "DD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/stack/material/panel/mapped/plastic/ten, /obj/item/stack/material/plank/mapped/wood/ten, /obj/item/stack/material/plank/mapped/wood/ten, @@ -5295,7 +5295,7 @@ /turf/floor/tiled/white, /area/ministation/science) "DQ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pill_bottle/dice, /turf/floor/carpet/green, /area/ministation/library) @@ -5335,7 +5335,7 @@ /turf/floor/plating, /area/ministation/maint/l3nw) "Ef" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/carpet/green, /area/ministation/library) "Eg" = ( @@ -5548,7 +5548,7 @@ /turf/floor/tiled/white, /area/ministation/science) "FV" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/mollusc/clam, /obj/machinery/light/small, /turf/floor/wood/mahogany, @@ -5666,7 +5666,7 @@ /turf/floor/tiled, /area/ministation/hall/s3) "Hl" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminatetable/ebony, /obj/item/paper_bin, /obj/effect/floor_decal/stoneborder{ dir = 6 @@ -6064,7 +6064,7 @@ /turf/floor/carpet/green, /area/ministation/library) "Le" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/drinks/cans/waterbottle, /turf/floor/carpet/green, /area/ministation/library) @@ -6264,7 +6264,7 @@ dir = 8; pixel_x = 22 }, -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminatetable_reinforced/walnut, /obj/item/folder, /turf/floor/carpet/red, /area/ministation/court) @@ -6597,7 +6597,7 @@ /turf/floor/tiled, /area/ministation/hall/s3) "Ov" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable/walnut, /obj/machinery/light, /turf/floor/wood/yew, /area/ministation/court) @@ -6731,7 +6731,7 @@ /turf/floor/tiled, /area/ministation/hall/s3) "Pk" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable/walnut, /obj/item/folder/blue, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/floor/wood/yew, @@ -6763,7 +6763,7 @@ /turf/floor/tiled, /area/ministation/hall/n3) "Px" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable/walnut, /obj/item/folder/red, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -6843,7 +6843,7 @@ /turf/floor/tiled, /area/ministation/hall/n3) "PT" = ( -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminatetable_reinforced/walnut, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -6974,7 +6974,7 @@ /turf/floor/tiled, /area/ministation/shuttle/outgoing) "QD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/book/printable_red, /obj/item/pen, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -7023,7 +7023,7 @@ /obj/machinery/firealarm{ pixel_y = 24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/mahogany, /area/ministation/library) "Re" = ( @@ -7271,7 +7271,7 @@ /turf/floor/tiled, /area/ministation/tradehouse_rep) "Sf" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable/walnut, /obj/machinery/light{ dir = 1 }, @@ -7375,7 +7375,7 @@ /turf/floor/plating, /area/ministation/maint/l3ne) "Tk" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood/mahogany, /area/ministation/library) "Tm" = ( @@ -7424,7 +7424,7 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminatetable/ebony, /obj/item/pen, /obj/item/pen/blue, /obj/item/pen/retractable, @@ -7502,7 +7502,7 @@ /turf/floor/tiled, /area/ministation/bridge) "TI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/cash, /obj/item/chems/drinks/cans/waterbottle, /turf/floor/carpet/green, @@ -7735,7 +7735,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/knife/kitchen, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -7788,7 +7788,7 @@ /turf/floor/carpet/red, /area/ministation/court) "Vw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/deck/cards, /turf/floor/carpet/green, /area/ministation/library) @@ -7865,7 +7865,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/fabricator/book, /turf/floor/wood/mahogany, /area/ministation/library) @@ -8584,7 +8584,7 @@ /turf/floor/wood/mahogany, /area/ministation/library) "ZZ" = ( -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminatetable_reinforced/walnut, /obj/item/bell, /turf/floor/carpet/red, /area/ministation/court) diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index 4ff16d85d3a..96d7b8d05c5 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -1074,7 +1074,7 @@ /area/ship/trade/disused) "hc" = ( /obj/item/radio, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminatetable/walnut, /turf/floor/wood/walnut, /area/ship/trade/disused) "hf" = ( @@ -2017,7 +2017,7 @@ /turf/floor, /area/ship/trade/aft_starboard_underside_maint) "Qh" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminatetable/mahogany, /obj/item/cell/crap/empty, /turf/floor/wood/walnut, /area/ship/trade/disused) diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index 5861bc931e5..bba2a2d9e6c 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -58,7 +58,7 @@ "af" = ( /obj/item/paper_bin, /obj/item/pen, -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -7363,7 +7363,7 @@ /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "Rb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/structure/cable{ icon_state = "0-8" }, diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm index cc042aa3f94..c6714398116 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm @@ -854,26 +854,26 @@ /turf/floor/plating, /area/lar_maria/atmos) "cD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/lar_maria/dorms) "cE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/smokes, /turf/floor/wood, /area/lar_maria/dorms) "cF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/toy, /turf/floor/wood, /area/lar_maria/dorms) "cG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/glowsticks, /turf/floor/wood, /area/lar_maria/dorms) "cH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/smokes, /obj/random/drinkbottle, /turf/floor/wood, @@ -1482,7 +1482,7 @@ /turf/floor/tiled, /area/lar_maria/office) "eC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper_bin, /obj/item/pen/blue, /turf/floor/tiled, @@ -1498,18 +1498,18 @@ /turf/floor/tiled, /area/lar_maria/office) "eF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/handcuffs, /turf/floor/wood, /area/lar_maria/dorms) "eG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/smokes, /obj/random/snack, /turf/floor/wood, /area/lar_maria/dorms) "eH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/beakers, /turf/floor/wood, /area/lar_maria/dorms) @@ -1588,7 +1588,7 @@ /turf/floor/tiled, /area/lar_maria/office) "eU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/tiled, /area/lar_maria/office) "eV" = ( @@ -1812,29 +1812,29 @@ /turf/floor/tiled, /area/lar_maria/office) "fF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/cane/aluminium, /turf/floor/wood, /area/lar_maria/dorms) "fG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/clothing/head/soft/zhp_cap, /turf/floor/wood, /area/lar_maria/dorms) "fH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /obj/random/contraband, /turf/floor/wood, /area/lar_maria/dorms) "fI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/toolbox, /obj/item/scalpel, /turf/floor/wood, /area/lar_maria/dorms) "fJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/snack, /turf/floor/wood, /area/lar_maria/dorms) diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index b04503e9333..de66dd98384 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -68,13 +68,13 @@ /turf/floor/wood, /area/icarus/vessel) "au" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flame/fuelled/lighter/zippo/random, /obj/random/smokes, /turf/floor/wood, /area/icarus/vessel) "av" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/wood, /area/icarus/vessel) "aw" = ( @@ -90,7 +90,7 @@ /turf/floor/wood, /area/icarus/vessel) "az" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/smokes, /turf/floor/wood, /area/icarus/vessel) @@ -105,17 +105,17 @@ /turf/floor/wood, /area/icarus/vessel) "aD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/lunchbox/mars, /turf/floor/wood, /area/icarus/vessel) "aE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/photo_album, /turf/floor/wood, /area/icarus/vessel) "aF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/drinkbottle, /obj/random/drinkbottle, /obj/random/snack, @@ -153,7 +153,7 @@ /turf/floor/wood, /area/icarus/vessel) "aL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/fancy/cigar, /turf/floor/wood, /area/icarus/vessel) diff --git a/mods/content/government/away_sites/icarus/icarus-2.dmm b/mods/content/government/away_sites/icarus/icarus-2.dmm index e32afe37e27..b17f4dd06a2 100644 --- a/mods/content/government/away_sites/icarus/icarus-2.dmm +++ b/mods/content/government/away_sites/icarus/icarus-2.dmm @@ -484,12 +484,12 @@ /turf/floor/tiled, /area/icarus/vessel) "bI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/loot, /turf/floor/tiled, /area/icarus/vessel) "bJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /turf/floor/tiled, /area/icarus/vessel) "bK" = ( @@ -647,7 +647,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cl" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/backpack/captain, /obj/machinery/alarm{ alarm_id = "xenobio3_alarm"; @@ -657,7 +657,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/paper/icarus/crew_roster, /obj/item/folder/blue, /turf/floor/tiled, @@ -751,7 +751,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/drinks/bottle/whiskey, /turf/floor/tiled, /area/icarus/vessel) @@ -768,12 +768,12 @@ /turf/floor/tiled, /area/icarus/vessel) "cD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/toy/ship_model, /turf/floor/tiled, /area/icarus/vessel) "cE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/action_figure, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -903,7 +903,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cW" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/disk/secret_project/science, /turf/floor/tiled, /area/icarus/vessel) @@ -1075,7 +1075,7 @@ /turf/floor/tiled, /area/icarus/vessel) "du" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/flashlight/lamp, /turf/floor/tiled, /area/icarus/vessel) diff --git a/mods/gamemodes/heist/heist_base.dmm b/mods/gamemodes/heist/heist_base.dmm index cd92f5dc909..812287b73ee 100644 --- a/mods/gamemodes/heist/heist_base.dmm +++ b/mods/gamemodes/heist/heist_base.dmm @@ -371,7 +371,7 @@ /turf/unsimulated/floor/freezer, /area/map_template/syndicate_mothership/raider_base) "bo" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/effect/floor_decal/carpet{ dir = 8 }, @@ -380,7 +380,7 @@ /turf/unsimulated/floor/carpet, /area/map_template/syndicate_mothership/raider_base) "bp" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/random/action_figure, /obj/random/contraband, /obj/random/junk, @@ -511,7 +511,7 @@ /turf/unsimulated/floor/wood/broken, /area/map_template/syndicate_mothership/raider_base) "bL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/plate/tray{ pixel_y = 5 }, @@ -519,12 +519,12 @@ /turf/unsimulated/floor/wood, /area/map_template/syndicate_mothership/raider_base) "bM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/box/glasses/rocks, /turf/unsimulated/floor/wood, /area/map_template/syndicate_mothership/raider_base) "bN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/machinery/chemical_dispenser/bar_soft/full, /turf/unsimulated/floor/wood/broken6, /area/map_template/syndicate_mothership/raider_base) @@ -592,18 +592,18 @@ /turf/unsimulated/floor/dark, /area/map_template/syndicate_mothership/raider_base) "ca" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/pizzabox/meat, /turf/unsimulated/floor/wood, /area/map_template/syndicate_mothership/raider_base) "cb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/ashtray, /obj/item/trash/cigbutt/cigarbutt, /turf/unsimulated/floor/wood, /area/map_template/syndicate_mothership/raider_base) "cc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminatetable, /obj/item/chems/glass/rag, /obj/random/loot, /turf/unsimulated/floor/wood, From 7242145b9b530e39fb8f3ff612a76f6cbefaf426 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 24 Nov 2024 13:52:17 +1100 Subject: [PATCH 097/554] Adding wood laminate flooring for space maps. --- .../objects/items/stacks/tiles/tile_types.dm | 147 ++++-- code/game/turfs/flooring/flooring_wood.dm | 50 ++ code/game/turfs/floors/subtypes/floor_wood.dm | 54 ++ code/game/turfs/unsimulated/floor.dm | 17 + .../crafting/stack_recipes/recipes_stacks.dm | 23 + .../designs/general/designs_general.dm | 9 + .../solids/materials_solid_wood.dm | 7 + .../materials/material_sheets_mapping.dm | 1 + .../reagents/reactions/reaction_synthesis.dm | 8 + icons/turf/flooring/laminate.dmi | Bin 0 -> 2093 bytes maps/antag_spawn/wizard/wizard_base.dmm | 50 +- maps/away/bearcat/bearcat-2.dmm | 20 +- maps/away/casino/casino.dmm | 98 ++-- maps/away/errant_pisces/errant_pisces.dmm | 80 +-- maps/away/liberia/liberia.dmm | 128 ++--- maps/away/mining/mining-signal.dmm | 26 +- maps/away/unishi/unishi-3.dmm | 72 +-- maps/away/yacht/yacht.dmm | 134 ++--- maps/exodus/exodus-1.dmm | 6 +- maps/exodus/exodus-2.dmm | 490 +++++++++--------- maps/exodus/exodus-admin.dmm | 40 +- maps/ministation/ministation-0.dmm | 222 ++++---- maps/ministation/ministation-1.dmm | 14 +- maps/ministation/ministation-2.dmm | 168 +++--- .../exoplanet_ruins/playablecolony/colony.dmm | 102 ++-- maps/tradeship/tradeship-0.dmm | 20 +- maps/tradeship/tradeship-2.dmm | 44 +- .../away_sites/lar_maria/lar_maria-2.dmm | 122 ++--- .../government/away_sites/icarus/icarus-1.dmm | 48 +- mods/gamemodes/heist/heist_base.dmm | 28 +- 30 files changed, 1223 insertions(+), 1005 deletions(-) create mode 100644 icons/turf/flooring/laminate.dmi diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index a53c61d5bad..6fed8b04b2b 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -70,70 +70,119 @@ * Wood */ /obj/item/stack/tile/wood - name = "wood floor tile" - singular_name = "wood floor tile" - desc = "An easy to fit wooden floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_GENERIC - material = /decl/material/solid/organic/wood + name = "wood floor tile" + singular_name = "wood floor tile" + desc = "An easy-to-fit wooden floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood::color + material = /decl/material/solid/organic/wood /obj/item/stack/tile/wood/cyborg - name = "wood floor tile synthesizer" - desc = "A device that makes wood floor tiles." - uses_charge = 1 - charge_costs = list(250) - stack_merge_type = /obj/item/stack/tile/wood - build_type = /obj/item/stack/tile/wood - max_health = ITEM_HEALTH_NO_DAMAGE + name = "wood floor tile synthesizer" + desc = "A device that makes wood floor tiles." + uses_charge = 1 + charge_costs = list(250) + stack_merge_type = /obj/item/stack/tile/pine_laminate + build_type = /obj/item/stack/tile/pine_laminate + material = /decl/material/solid/organic/wood/chipboard + max_health = ITEM_HEALTH_NO_DAMAGE is_spawnable_type = FALSE /obj/item/stack/tile/mahogany - name = "mahogany floor tile" - singular_name = "mahogany floor tile" - desc = "An easy to fit mahogany wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_RICH - material = /decl/material/solid/organic/wood + name = "mahogany floor tile" + singular_name = "mahogany floor tile" + desc = "An easy-to-fit mahogany wood floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/mahogany::color + material = /decl/material/solid/organic/wood/mahogany /obj/item/stack/tile/maple - name = "maple floor tile" - singular_name = "maple floor tile" - desc = "An easy to fit maple wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_PALE - material = /decl/material/solid/organic/wood + name = "maple floor tile" + singular_name = "maple floor tile" + desc = "An easy-to-fit maple wood floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/maple::color + material = /decl/material/solid/organic/wood/maple /obj/item/stack/tile/ebony - name = "ebony floor tile" - singular_name = "ebony floor tile" - desc = "An easy to fit ebony floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_BLACK - material = /decl/material/solid/organic/wood + name = "ebony floor tile" + singular_name = "ebony floor tile" + desc = "An easy-to-fit ebony floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/ebony::color + material = /decl/material/solid/organic/wood/ebony /obj/item/stack/tile/walnut - name = "walnut floor tile" - singular_name = "walnut floor tile" - desc = "An easy to fit walnut wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_CHOCOLATE - material = /decl/material/solid/organic/wood + name = "walnut floor tile" + singular_name = "walnut floor tile" + desc = "An easy-to-fit walnut wood floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/walnut::color + material = /decl/material/solid/organic/wood/walnut /obj/item/stack/tile/bamboo - name = "bamboo floor tile" - singular_name = "bamboo floor tile" - desc = "An easy to fit bamboo wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_PALE2 - material = /decl/material/solid/organic/wood + name = "bamboo floor tile" + singular_name = "bamboo floor tile" + desc = "An easy-to-fit bamboo wood floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/bamboo::color + material = /decl/material/solid/organic/wood/bamboo /obj/item/stack/tile/yew - name = "yew floor tile" - singular_name = "yew floor tile" - desc = "An easy to fit yew wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_YELLOW - material = /decl/material/solid/organic/wood + name = "yew floor tile" + singular_name = "yew floor tile" + desc = "An easy-to-fit yew wood floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/yew::color + material = /decl/material/solid/organic/wood/yew + +/obj/item/stack/tile/pine_laminate + name = "pine laminate floor tile" + singular_name = "pine laminate floor tile" + desc = "An easy-to-fit pine laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard::color + material = /decl/material/solid/organic/wood/chipboard + +/obj/item/stack/tile/mahogany_laminate + name = "mahogany laminate floor tile" + singular_name = "mahogany laminate floor tile" + desc = "An easy-to-fit mahogany laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard/mahogany::color + material = /decl/material/solid/organic/wood/chipboard/mahogany + +/obj/item/stack/tile/maple_laminate + name = "maple laminate floor tile" + singular_name = "maple laminate floor tile" + desc = "An easy-to-fit maple laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard/maple::color + material = /decl/material/solid/organic/wood/chipboard/maple + +/obj/item/stack/tile/ebony_laminate + name = "ebony laminate floor tile" + singular_name = "ebony laminate floor tile" + desc = "An easy-to-fit ebony laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard/ebony::color + material = /decl/material/solid/organic/wood/chipboard/ebony + +/obj/item/stack/tile/walnut_laminate + name = "walnut laminate floor tile" + singular_name = "walnut laminate floor tile" + desc = "An easy-to-fit walnut laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard/walnut::color + material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/item/stack/tile/yew_laminate + name = "yew laminate floor tile" + singular_name = "yew laminate floor tile" + desc = "An easy-to-fit yew laminate floor tile." + icon_state = "tile-wood" + color = /decl/material/solid/organic/wood/chipboard/yew::color + material = /decl/material/solid/organic/wood/chipboard/yew /obj/item/stack/tile/floor name = "steel floor tile" diff --git a/code/game/turfs/flooring/flooring_wood.dm b/code/game/turfs/flooring/flooring_wood.dm index a9c136bfcb5..fa503f0f5a8 100644 --- a/code/game/turfs/flooring/flooring_wood.dm +++ b/code/game/turfs/flooring/flooring_wood.dm @@ -52,3 +52,53 @@ color = /decl/material/solid/organic/wood/yew::color build_type = /obj/item/stack/tile/yew force_material = /decl/material/solid/organic/wood/yew + +// Chipboard/wood laminate floors. Uses older icons. +/decl/flooring/laminate + name = "wooden laminate floor" + desc = "A stretch of closely-fitted sections of chipboard with a laminated veneer." + icon = 'icons/turf/flooring/laminate.dmi' + icon_base = "wood" + damage_temperature = T0C+200 + descriptor = "sections" + build_type = /obj/item/stack/tile/pine_laminate + flooring_flags = TURF_IS_FRAGILE | TURF_REMOVE_SCREWDRIVER + footstep_type = /decl/footsteps/wood + color = /decl/material/solid/organic/wood/chipboard::color + force_material = /decl/material/solid/organic/wood/chipboard + constructed = TRUE + gender = NEUTER + broken_states = list( + "broken0", + "broken1", + "broken2", + "broken3", + "broken4", + "broken5", + "broken6" + ) + +/decl/flooring/laminate/mahogany + color = /decl/material/solid/organic/wood/chipboard/mahogany::color + build_type = /obj/item/stack/tile/mahogany_laminate + force_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/decl/flooring/laminate/maple + color = /decl/material/solid/organic/wood/chipboard/maple::color + build_type = /obj/item/stack/tile/maple_laminate + force_material = /decl/material/solid/organic/wood/chipboard/maple + +/decl/flooring/laminate/ebony + color = /decl/material/solid/organic/wood/chipboard/ebony::color + build_type = /obj/item/stack/tile/ebony_laminate + force_material = /decl/material/solid/organic/wood/chipboard/ebony + +/decl/flooring/laminate/walnut + color = /decl/material/solid/organic/wood/chipboard/walnut::color + build_type = /obj/item/stack/tile/walnut_laminate + force_material = /decl/material/solid/organic/wood/chipboard/yew + +/decl/flooring/laminate/yew + color = /decl/material/solid/organic/wood/chipboard/yew::color + build_type = /obj/item/stack/tile/yew_laminate + force_material = /decl/material/solid/organic/wood/chipboard/yew diff --git a/code/game/turfs/floors/subtypes/floor_wood.dm b/code/game/turfs/floors/subtypes/floor_wood.dm index 9ab163825a6..4b1069772db 100644 --- a/code/game/turfs/floors/subtypes/floor_wood.dm +++ b/code/game/turfs/floors/subtypes/floor_wood.dm @@ -54,3 +54,57 @@ /turf/floor/wood/yew color = /decl/material/solid/organic/wood/yew::color _flooring = /decl/flooring/wood/yew + +// Laminate floor; basically identical to wood, but uses older smoother icons. +/turf/floor/laminate + name = "wooden laminate floor" + icon = 'icons/turf/flooring/laminate.dmi' + icon_state = "wood0" + color = /decl/material/solid/organic/wood/chipboard::color + _flooring = /decl/flooring/laminate + +/turf/floor/laminate/broken + icon_state = "wood_broken0" + _floor_broken = TRUE + +/turf/floor/laminate/broken/Initialize() + . = ..() + var/setting_broken = _floor_broken + _floor_broken = null + set_floor_broken(setting_broken) + +/turf/floor/laminate/broken/one + icon_state = "wood_broken1" + _floor_broken = "broken1" + +/turf/floor/laminate/broken/two + icon_state = "wood_broken2" + _floor_broken = "broken2" + +/turf/floor/laminate/broken/three + icon_state = "wood_broken3" + _floor_broken = "broken3" + +/turf/floor/laminate/broken/four + icon_state = "wood_broken4" + _floor_broken = "broken4" + +/turf/floor/laminate/mahogany + color = /decl/material/solid/organic/wood/chipboard/mahogany::color + _flooring = /decl/flooring/laminate/mahogany + +/turf/floor/laminate/maple + color = /decl/material/solid/organic/wood/chipboard/maple::color + _flooring = /decl/flooring/laminate/maple + +/turf/floor/laminate/ebony + color = /decl/material/solid/organic/wood/chipboard/ebony::color + _flooring = /decl/flooring/laminate/ebony + +/turf/floor/laminate/walnut + color = /decl/material/solid/organic/wood/chipboard/walnut::color + _flooring = /decl/flooring/laminate/walnut + +/turf/floor/laminate/yew + color = /decl/material/solid/organic/wood/chipboard/yew::color + _flooring = /decl/flooring/laminate/yew diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index 449745e5e12..3ec6296308d 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -52,6 +52,23 @@ /turf/unsimulated/floor/wood/broken6 icon_state = "wood_broken6" +/turf/unsimulated/floor/wood + name = "wooden laminate floor" + icon = 'icons/turf/flooring/laminate.dmi' + icon_state = "wood0" + +/turf/unsimulated/floor/wood/broken + icon_state = "wood_broken0" + +/turf/unsimulated/floor/wood/broken1 + icon_state = "wood_broken1" + +/turf/unsimulated/floor/wood/broken2 + icon_state = "wood_broken2" + +/turf/unsimulated/floor/wood/broken6 + icon_state = "wood_broken6" + /turf/unsimulated/floor/vault icon_state = "vault" diff --git a/code/modules/crafting/stack_recipes/recipes_stacks.dm b/code/modules/crafting/stack_recipes/recipes_stacks.dm index 0e97225f58d..2a929e693f9 100644 --- a/code/modules/crafting/stack_recipes/recipes_stacks.dm +++ b/code/modules/crafting/stack_recipes/recipes_stacks.dm @@ -26,6 +26,29 @@ result_type = /obj/item/stack/tile/walnut required_material = /decl/material/solid/organic/wood/walnut +/decl/stack_recipe/tile/wood/pine_laminate + result_type = /obj/item/stack/tile/pine_laminate + required_material = /decl/material/solid/organic/wood/chipboard + +/decl/stack_recipe/tile/wood/mahogany_laminate + result_type = /obj/item/stack/tile/mahogany_laminate + required_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/decl/stack_recipe/tile/wood/maple_laminate + result_type = /obj/item/stack/tile/maple_laminate + required_material = /decl/material/solid/organic/wood/chipboard/maple + +/decl/stack_recipe/tile/wood/ebony_laminate + result_type = /obj/item/stack/tile/ebony_laminate + required_material = /decl/material/solid/organic/wood/chipboard/ebony + +/decl/stack_recipe/tile/wood/walnut_laminate + result_type = /obj/item/stack/tile/walnut + required_material = /decl/material/solid/organic/wood/chipboard/walnut + +/decl/stack_recipe/tile/wood/yew_laminate + result_type = /obj/item/stack/tile/yew_laminate + required_material = /decl/material/solid/organic/wood/chipboard/yew /decl/stack_recipe/tile/steel abstract_type = /decl/stack_recipe/tile/steel diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index ae37f50f4d9..e390a749c29 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -246,3 +246,12 @@ /decl/material/solid/organic/wood/walnut = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) ) + +/datum/fabricator_recipe/chipboard/yew + path = /obj/item/stack/material/sheet/mapped/chipboard_yew + +/datum/fabricator_recipe/chipboard/yew/get_resources() + resources = list( + /decl/material/solid/organic/wood/yew = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) diff --git a/code/modules/materials/definitions/solids/materials_solid_wood.dm b/code/modules/materials/definitions/solids/materials_solid_wood.dm index fd8f3626859..0285a6f6fac 100644 --- a/code/modules/materials/definitions/solids/materials_solid_wood.dm +++ b/code/modules/materials/definitions/solids/materials_solid_wood.dm @@ -176,3 +176,10 @@ adjective_name = "walnut laminate" uid = "solid_wood_chipboard_walnut" color = WOOD_COLOR_CHOCOLATE + +/decl/material/solid/organic/wood/chipboard/yew + name = "yew chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of yew wood chips and resin, with a plastic laminate." + adjective_name = "yew laminate" + uid = "solid_wood_chipboard_yew" + color = WOOD_COLOR_YELLOW \ No newline at end of file diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index 33dfdcb211c..1c2d2147e08 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -122,5 +122,6 @@ STACK_SUBTYPES(chipboard_maple, "maple chipboard", solid/organic/wood/chip STACK_SUBTYPES(chipboard_mahogany, "mahogany chipboard", solid/organic/wood/chipboard/mahogany, sheet, null) STACK_SUBTYPES(chipboard_ebony, "ebony chipboard", solid/organic/wood/chipboard/ebony, sheet, null) STACK_SUBTYPES(chipboard_walnut, "walnut chipboard", solid/organic/wood/chipboard/walnut, sheet, null) +STACK_SUBTYPES(chipboard_yew, "yew chipboard", solid/organic/wood/chipboard/yew, sheet, null) #undef STACK_SUBTYPES \ No newline at end of file diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index f30d0c4b049..8a3ee19771d 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -200,3 +200,11 @@ /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) ) chipboard_type = /decl/material/solid/organic/wood/chipboard/walnut + +/decl/chemical_reaction/synthesis/chipboard/yew + name = "Yew Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/yew = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/yew diff --git a/icons/turf/flooring/laminate.dmi b/icons/turf/flooring/laminate.dmi new file mode 100644 index 0000000000000000000000000000000000000000..83d4933c155fe0b5b6ff17fe9b578128bc0a0356 GIT binary patch literal 2093 zcmV+|2-5e7P)C0000~P)t-sz`($J zdwYh4hKPuWVq#*iudk}As;#Z9TU%S7pPz(;gs`x%qobp;va+YAr!X)uBqJkXXL75n ztC^XZo12@Rot=k=hn$?8+1c6f@bG_sf3vf*R9L4#00001bW%=J06^y0W&i*Hta?;f zbVOxyV{&P5bZKvH004NLjncge!Y~lP@i}>l(C*SN-CU$aI@ni`YEBc12_(V3zQKar zB6r)}@tgi!sZPUroK$}q9m=?<)TS8g1H=|Tw8nGmL1AxsBD zn68HK-*lxKrvCfSANIr23O@Xj{{R36&q+if$bm6OFmpLjQwl)h?vq{(aJ4&B8iSv_!NDDT{B(r4&GrKd z3>5(YWm`K`6|HO+#)pt*jnl9rnC*xRJyZgqf>;2Gki-V_6xH(lSO6M;FN~|BGXw;yk|rWJUnV5d^KeNRU&%3JzLD zu3CEcXRQtaDA)mAG1&SSv;CQI0oM-z0744DnZ>fNF9%PIK1UMqoI8*%7&+U!MY$u0 z6cEVO8^}9FR~-SsOb{ZH)4xp%44{{Az&b$4Kq{ApQD%lD9QOj34RXQ?v~Smx0==)@ zkv=Ev@A|(O6E47n)c|}jf@?+DuoN+X`u5`(oKTo=0iY6LD?kjWUg-y}sB!0yD+?n;)c0?b6nyp=a5nSbOH4rPa{!fWQSFrn zK<-!ynN0%BxEvSd0|7z+AY}V6{~$TEFj@@D=!#yE517@vR&;hX14Fdk!v#a533<7X zCj`;$(AOQ*fJe*>DIQ(dwcXcOCxltM{p!qBwC&$*E13y^2z^)Z%Law`eu!YuC#OR^ zMEBJ_%)<=x#KP$wt+k7}wz6mVek0}RuSp3fn`oBDN#LRmm>2G{K4yh@*#p4Xz^qwoIj5W9iAq&lr2UuGc2j zBZnof^M!H26JGP1%)avp5ifY-wB+mLEIr&F0Nce$(c1$6g!)_NhCB=}i32Q=SeEjH zR3xw9DW7)`7I|6C5iH;^*?+;x?>_Ws0Dm!rod5&~J1kwQ5v?6X0EJ&0uAUbGl==tO z%8LL>{R3;|-+}|wKfw9}V!Mv?7nI}^On`Rl_XnhQ9_lYB$tM6HJNEknm|Y8Yp4xx# zHXMj^t(hAe)Rf4h`onntLF8~t{R4eDhKxiW)gMOt4`L0}h5ms^4qr2oNA-tU{Rc1S zfY$`+VVRew{(wY|uY0x(^dB_1I3}r?-D~YxYdz@oLw`Ub2QIj|u~n}BK$-PfW*7Fd zGd|tD&i50*`iZx2a`-6Ckqqz40XLlO*e^m(S|=MF_BqKK-52gzV1Zf))1l8Uof-(VAupT^$+y>1CHld9`_fN z2rFvVy03b2jdwmvZBeBWE&x{xjF15?iTQGdX;^?`Tb zz^d~-lN$}e%&2NceZbje>G__?UCysnh9`sdfwkxRAn)}DOs@~T1qY5U5wdY??Zz(5 z=|~vr18{!l$)M6B=l{A;ADAGw_Tlw`8qV(wfgU~o#{`%yk5h&HIk2s<`)PGrEMmo^ z2Isl+|B8A4V4?HxH|d0(HwykffrOFqmd>O8fZY4B{@~~Pb71q0K68F3o!_4=KX6;- z&hO8bzX=DzE{6U9JFx}Nq{`@Jch0Q`B=v{e+i+mo`M*)h$tdf~*9V3^Kk)YnsGlk4e>{!hFa#Q^ z4-9^O;O`UMOXc%F*>6x@`g~r#KL;*%-XAdke80LrVAT*H%s=0+l@kXXg!$+Dweo)f X&(}Q(BtDS500000NkvXXu0mjfY
{{:helper.link(data.disk_name, null, {'eject_disk' : 1})}}
DataStored
{{:value.field}}{{:value.level}}
DataStored
{{:value.field}}{{:value.level}}
{{:data.disk_name}}
" show_browser(linked, jointext(html,null), "window=herald") -/datum/phenomena/create_gateway +/datum/phenomenon/create_gateway name = "Create Gateway" desc = "Creates a gateway from this world to the next. Gateways syphon absurd amounts of power but can be sacrificed to summon powerful minions." cost = 200 flags = PHENOMENA_NEAR_STRUCTURE expected_type = /atom -/datum/phenomena/create_gateway/can_activate(var/atom/a) +/datum/phenomenon/create_gateway/can_activate(var/atom/a) if(!..()) return 0 if(istype(a, /obj/structure/deity/gateway)) @@ -115,20 +115,20 @@ return 0 return 1 -/datum/phenomena/create_gateway/activate(var/atom/a) +/datum/phenomenon/create_gateway/activate(var/atom/a) ..() if(istype(a, /obj/structure/deity/gateway)) qdel(a) else new /obj/structure/deity/gateway(get_turf(a), linked) -/datum/phenomena/flickering_whisper +/datum/phenomenon/flickering_whisper name = "Flickering Whisper" desc = "Whisper to a non-believer, allowing you to intrude on their thoughts and see what they see." flags = PHENOMENA_NONFOLLOWER expected_type = /mob/living -/datum/phenomena/flickering_whisper/activate(var/mob/living/L) +/datum/phenomenon/flickering_whisper/activate(var/mob/living/L) var/atom/whisper_from for(var/obj/structure/deity/radiant_statue/rs in view(3, L)) whisper_from = rs @@ -142,12 +142,12 @@ events_repository.register(/decl/observ/destroyed, L, src, PROC_REF(deactivate_look)) addtimer(CALLBACK(src, PROC_REF(deactivate_look), L), 30 SECONDS) -/datum/phenomena/flickering_whisper/proc/deactivate_look(var/mob/viewer) +/datum/phenomenon/flickering_whisper/proc/deactivate_look(var/mob/viewer) if(!linked.is_follower(viewer)) //Don't remove if they are follower linked.eyenet.remove_source(viewer) events_repository.unregister(/decl/observ/destroyed, viewer, src) -/datum/phenomena/burning_glare +/datum/phenomenon/burning_glare name = "Burning Glare" desc = "Burn a victim. If they are burnt enough, you'll set them ablaze." cost = 100 @@ -155,7 +155,7 @@ cooldown = 30 SECONDS expected_type = /mob/living -/datum/phenomena/burning_glare/activate(var/mob/living/L) +/datum/phenomenon/burning_glare/activate(var/mob/living/L) ..() to_chat(L, SPAN_DANGER("You feel yourself burn!")) L.take_damage(10, BURN) @@ -163,7 +163,7 @@ L.fire_stacks += 50 L.IgniteMob() -/datum/phenomena/divine_right +/datum/phenomenon/divine_right name = "Divine Right" desc = "Trigger your rebirth into the body of someone wearing a herald's uniform. This takes time, requires 3 open gateways, and if the body is destroyed during the ritual... so are you. But once complete, you become an unstoppable demigod of unnatural power." cost = 300 @@ -171,7 +171,7 @@ flags = PHENOMENA_FOLLOWER|PHENOMENA_NEAR_STRUCTURE expected_type = /mob/living -/datum/phenomena/divine_right/can_activate(var/mob/living/L) +/datum/phenomenon/divine_right/can_activate(var/mob/living/L) if(!..()) return FALSE var/active_gateways = 0 @@ -190,7 +190,7 @@ to_chat(linked, SPAN_WARNING("\The [L] is not wearing a herald's uniform.")) return FALSE -/datum/phenomena/divine_right/activate(var/mob/living/L) +/datum/phenomenon/divine_right/activate(var/mob/living/L) ..() to_chat(L, SPAN_OCCULT("Your soul is ripped from your body as your master prepares to possess it.")) to_chat(linked, SPAN_OCCULT("You prepare the body for possession. Keep it safe. If it is totally destroyed, you will die.")) @@ -209,10 +209,10 @@ else to_chat(player, SPAN_NOTICE("Your Master is being reborn into the body of \the [L]. Protect it at all costs.")) -/datum/phenomena/divine_right/proc/fail_ritual(var/mob/living/L) +/datum/phenomenon/divine_right/proc/fail_ritual(var/mob/living/L) qdel(linked) -/datum/phenomena/divine_right/proc/succeed_ritual(var/mob/living/L) +/datum/phenomenon/divine_right/proc/succeed_ritual(var/mob/living/L) to_chat(linked, SPAN_OCCULT("You have been reborn! Your power is limited here, focused on your body, but in return you are both eternal and physical.")) for(var/mob/living/player in global.player_list) sound_to(player, 'sound/effects/cascade.ogg') @@ -221,12 +221,12 @@ L.SetName("[linked] Incarnate") L.real_name = "[linked] Incarnate" -/datum/phenomena/movable_object/wisp +/datum/phenomenon/movable_object/wisp name = "Wisp" desc = "Creates or moves a small ball of light for your followers to use." cost = 30 object_type = /obj/item/flashlight/slime -/datum/phenomena/movable_object/wisp/add_object() +/datum/phenomenon/movable_object/wisp/add_object() ..() object_to_move.SetName("wisp") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm index e86c92ec4d4..381e885d318 100644 --- a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm +++ b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm @@ -1,4 +1,4 @@ -/datum/phenomena/warp +/datum/phenomenon/warp name = "Warp Body" desc = "Corrupt a mortal being, causing their DNA to break and their body to fail on them." cost = 90 @@ -6,20 +6,20 @@ flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER expected_type = /mob/living -/datum/phenomena/warp/activate(var/mob/living/L) +/datum/phenomenon/warp/activate(var/mob/living/L) ..() L.take_damage(20, CLONE) SET_STATUS_MAX(L, STAT_WEAK, 2) to_chat(L, SPAN_DANGER("You feel your body warp and change underneath you!")) -/datum/phenomena/rock_form +/datum/phenomenon/rock_form name = "Rock Form" desc = "Convert your mortal followers into immortal stone beings." cost = 300 flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_FOLLOWER expected_type = /mob/living/human -/datum/phenomena/rock_form/activate(var/mob/living/human/H) +/datum/phenomenon/rock_form/activate(var/mob/living/human/H) ..() to_chat(H, SPAN_DANGER("You feel your body harden as it rapidly is transformed into living crystal!")) H.change_species(SPECIES_GOLEM) diff --git a/mods/gamemodes/deity/screen/intent.dm b/mods/gamemodes/deity/screen/intent.dm index 80b3a423170..9f5b18b6aaa 100644 --- a/mods/gamemodes/deity/screen/intent.dm +++ b/mods/gamemodes/deity/screen/intent.dm @@ -9,24 +9,25 @@ compile_overlays() /obj/screen/intent/deity/proc/sync_to_mob(var/mob) - var/mob/living/deity/D = mob - for(var/i in 1 to D.control_types.len) - var/obj/screen/deity_marker/S = new(null, D) - desc_screens[D.control_types[i]] = S + var/mob/living/deity/deity = mob + for(var/i in 1 to deity.control_types.len) + var/obj/screen/deity_marker/S = new(null, deity) + desc_screens[deity.control_types[i]] = S S.screen_loc = screen_loc //This sets it up right. Trust me. S.maptext_y = 33/2*i - i*i/2 - 10 - D.client.screen += S - + deity.client.screen += S update_text() /obj/screen/intent/deity/proc/update_text() - if(!isdeity(usr)) + var/mob/living/deity/deity = usr + var/mob/owner = owner_ref?.resolve() + if(!istype(deity) || !istype(owner) || owner != deity) return - var/mob/living/deity/D = usr - for(var/i in D.control_types) + var/decl/intent/intent = owner.get_intent() + for(var/i in deity.control_types) var/obj/screen/deity_marker/S = desc_screens[i] - var/datum/phenomena/P = D.intent_phenomenas[intent][i] + var/datum/phenomenon/P = deity.intent_phenomena[intent][i] if(P) S.maptext = "[P.name]" else diff --git a/nano/templates/deity.tmpl b/nano/templates/deity.tmpl index b249a864960..5d1148e300e 100644 --- a/nano/templates/deity.tmpl +++ b/nano/templates/deity.tmpl @@ -7,7 +7,7 @@ Deity Menu. Three seperate modes within it, followers, shop, and phenomena. {{:data.name}} the {{:data.form_name}}
- Current Boon: + Current Boon: {{if data.boon_name}} {{:data.boon_name}} {{else}} @@ -78,13 +78,13 @@ Deity Menu. Three seperate modes within it, followers, shop, and phenomena. {{:helper.link('Bindings', 'key', {'switchMenu' : 1, 'menu' : 'phenomenaMenu'}, data.phenomenaMenu == 1 ? 'disabled' : null)}}
{{if data.phenomenaMenu == 0}} - {{for data.phenomenas}} + {{for data.phenomena}}
{{:helper.link(value.name, null, {'select_phenomena' : value.name})}}
- Use Cost: {{:value.cost}} + Use Cost: {{:value.cost}} {{if value.cooldown}} Cooldown: {{:value.cooldown}} {{/if}} From 46606cf24c56275283f751ec53f9b8d9193abda2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 28 Nov 2024 13:39:00 +1100 Subject: [PATCH 110/554] Intent selector is now dynamically generated. --- code/__defines/hud.dm | 1 - code/_helpers/cmp.dm | 3 + code/_onclick/hud/animal.dm | 2 +- code/_onclick/hud/human.dm | 2 +- code/_onclick/hud/robot.dm | 2 +- code/_onclick/hud/screen/screen_intent.dm | 97 ++++++++++-------- code/datums/repositories/decls.dm | 2 + code/modules/client/ui_styles/_helpers.dm | 1 - code/modules/client/ui_styles/_ui_style.dm | 1 - .../client/ui_styles/_ui_style_states.dm | 9 -- .../client/ui_styles/ui_style_subtypes.dm | 1 - code/modules/mob/mob_intent.dm | 56 +++++++--- icons/mob/screen/styles/intents.dmi | Bin 1512 -> 286 bytes icons/mob/screen/styles/intents_wide.dmi | Bin 0 -> 259 bytes .../mob/screen/styles/minimalist/intents.dmi | Bin 2760 -> 0 bytes icons/screen/intents.dmi | Bin 0 -> 1087 bytes icons/screen/intents_wide.dmi | Bin 0 -> 658 bytes mods/content/xenobiology/slime/slime_hud.dm | 2 +- mods/gamemodes/deity/mobs/deity_hud.dm | 2 +- mods/mobs/borers/mob/borer/borer_hud.dm | 2 +- mods/mobs/dionaea/icons/ui_intent_overlay.dmi | Bin 0 -> 565 bytes mods/mobs/dionaea/icons/ui_intents.dmi | Bin 701 -> 422 bytes mods/mobs/dionaea/mob/_nymph.dm | 10 ++ mods/mobs/dionaea/mob/nymph_ui.dm | 12 ++- .../ascent/icons/ui_intent_overlay.dmi | Bin 0 -> 569 bytes mods/species/ascent/icons/ui_intents.dmi | Bin 695 -> 422 bytes mods/species/ascent/mobs/nymph/_nymph.dm | 10 ++ mods/species/ascent/mobs/nymph/nymph_ui.dm | 18 ++-- 28 files changed, 151 insertions(+), 82 deletions(-) create mode 100644 icons/mob/screen/styles/intents_wide.dmi delete mode 100644 icons/mob/screen/styles/minimalist/intents.dmi create mode 100644 icons/screen/intents.dmi create mode 100644 icons/screen/intents_wide.dmi create mode 100644 mods/mobs/dionaea/icons/ui_intent_overlay.dmi create mode 100644 mods/species/ascent/icons/ui_intent_overlay.dmi diff --git a/code/__defines/hud.dm b/code/__defines/hud.dm index 24e3be0d394..7cb67e0fd28 100644 --- a/code/__defines/hud.dm +++ b/code/__defines/hud.dm @@ -11,7 +11,6 @@ #define UI_ICON_NUTRITION "icon_nutrition" #define UI_ICON_HYDRATION "icon_hydration" #define UI_ICON_FIRE_INTENT "icon_fire_intent" -#define UI_ICON_INTENT "icon_intent" #define UI_ICON_UP_HINT "icon_uphint" #define UI_ICON_STATUS "icon_status" #define UI_ICON_STATUS_FIRE "icon_status_fire" diff --git a/code/_helpers/cmp.dm b/code/_helpers/cmp.dm index 32637fecad8..3a04928449e 100644 --- a/code/_helpers/cmp.dm +++ b/code/_helpers/cmp.dm @@ -137,6 +137,9 @@ /proc/cmp_decl_uid_asc(decl/a, decl/b) return sorttext(b.uid, a.uid) +/proc/cmp_decl_sort_value_asc(decl/a, decl/b) + return a.sort_order - b.sort_order + /proc/cmp_inventory_slot_desc(datum/inventory_slot/a, datum/inventory_slot/b) return b.quick_equip_priority - a.quick_equip_priority diff --git a/code/_onclick/hud/animal.dm b/code/_onclick/hud/animal.dm index 5c1d9173a3a..70b61dffe77 100644 --- a/code/_onclick/hud/animal.dm +++ b/code/_onclick/hud/animal.dm @@ -11,6 +11,6 @@ move_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_MOVEMENT) move_intent.icon_state = mymob.move_intent.hud_icon_state adding += move_intent - action_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) + action_intent = new(null, mymob, ui_style, ui_color, ui_alpha) adding += action_intent ..() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 96f20aa1c3a..44722373ecb 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -17,7 +17,7 @@ // Draw the attack intent dialogue. if(hud_data.show_intent_selector) - action_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) + action_intent = new(null, mymob) src.adding += action_intent hud_elements |= action_intent diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 41ad1300f87..6408ee43038 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -51,7 +51,7 @@ var/global/obj/screen/robot_inventory adding += R.ui_drop_grab //Intent - action_intent = new /obj/screen/intent/robot(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) + action_intent = new /obj/screen/intent/robot(null, mymob) action_intent.icon_state = R.get_intent().icon_state adding += action_intent diff --git a/code/_onclick/hud/screen/screen_intent.dm b/code/_onclick/hud/screen/screen_intent.dm index accd7b27c4f..4682cc14836 100644 --- a/code/_onclick/hud/screen/screen_intent.dm +++ b/code/_onclick/hud/screen/screen_intent.dm @@ -1,52 +1,67 @@ /obj/screen/intent - name = "intent" - icon = 'icons/mob/screen/styles/intents.dmi' - icon_state = "intent_help" - screen_loc = ui_acti - -/obj/screen/intent/proc/get_intent_state_map() - var/static/list/intent_state_map = list( - GET_DECL(I_DISARM) = "intent_disarm", - GET_DECL(I_HELP) = "intent_help", - GET_DECL(I_HARM) = "intent_harm", - GET_DECL(I_GRAB) = "intent_grab" - ) - return intent_state_map + name = "intent" + icon = 'icons/mob/screen/styles/intents.dmi' + icon_state = "intents" + screen_loc = ui_acti + requires_ui_style = FALSE + +/obj/screen/intent/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) + . = ..() + update_icon() /obj/screen/intent/handle_click(mob/user, params) var/mob/owner = owner_ref?.resolve() if(!istype(owner) || QDELETED(owner) || user != owner || !params) return - var/list/P = params2list(params) - var/icon_x = text2num(P["icon-x"]) - var/icon_y = text2num(P["icon-y"]) - if(icon_x <= world.icon_size/2) - if(icon_y <= world.icon_size/2) - owner.set_intent(I_HARM) - else - owner.set_intent(I_HELP) - else if(icon_y <= world.icon_size/2) - owner.set_intent(I_GRAB) - else - owner.set_intent(I_DISARM) - update_icon() + params = params2list(params) + if(owner.set_intent(get_intent_by_position(owner.get_available_intents(), text2num(params["icon-x"]), text2num(params["icon-y"])))) + update_icon() + +/obj/screen/intent/proc/get_intent_by_position(list/intents, icon_x, icon_y) + if(icon_y <= 16) + if(icon_x <= 16) + return intents[1] + return intents[2] + else if(icon_x <= 16) + return intents[3] + return intents[4] + +/obj/screen/intent/proc/apply_intent_overlay_offset(image/overlay, index) + switch(index) + if(2) + overlay.pixel_x = 16 + if(3) + overlay.pixel_y = 16 + if(4) + overlay.pixel_x = 16 + overlay.pixel_y = 16 /obj/screen/intent/on_update_icon() + cut_overlays() var/mob/owner = owner_ref?.resolve() - if(istype(owner) && !QDELETED(owner)) - var/list/intent_state_map = get_intent_state_map() - icon_state = intent_state_map[owner.get_intent()] || intent_state_map[intent_state_map[1]] - else - icon_state = initial(icon_state) + if(!istype(owner) || QDELETED(owner)) + return + var/decl/intent/owner_intent = owner.get_intent() + var/i = 0 + var/image/I + for(var/decl/intent/intent as anything in owner.get_available_intents()) + if(intent == owner_intent) + I = image(intent.icon, intent.icon_state) + else + I = image(intent.icon, "[intent.icon_state]_off") + i++ + apply_intent_overlay_offset(I, i) + add_overlay(I) + compile_overlays() /obj/screen/intent/binary - icon_state = "intent_harm" - -/obj/screen/intent/binary/get_intent_state_map() - var/static/list/intent_state_map = list( - GET_DECL(I_DISARM) = "intent_help", - GET_DECL(I_HELP) = "intent_help", - GET_DECL(I_HARM) = "intent_harm", - GET_DECL(I_GRAB) = "intent_harm" - ) - return intent_state_map + icon = 'icons/mob/screen/styles/intents_wide.dmi' + +/obj/screen/intent/binary/get_intent_by_position(list/intents, icon_x, icon_y) + if(icon_y <= 16) + return intents[1] + return intents[2] + +/obj/screen/intent/binary/apply_intent_overlay_offset(image/overlay, index) + if(index == 2) + overlay.pixel_y = 16 diff --git a/code/datums/repositories/decls.dm b/code/datums/repositories/decls.dm index e7898fa23c3..73a9f14fb61 100644 --- a/code/datums/repositories/decls.dm +++ b/code/datums/repositories/decls.dm @@ -149,6 +149,8 @@ var/global/repository/decls/decls_repository = new var/uid var/decl_flags = null // DECL_FLAG_ALLOW_ABSTRACT_INIT, DECL_FLAG_MANDATORY_UID var/initialized = FALSE + /// General purpose sort value. + var/sort_order /decl/proc/Initialize() SHOULD_CALL_PARENT(TRUE) diff --git a/code/modules/client/ui_styles/_helpers.dm b/code/modules/client/ui_styles/_helpers.dm index 36685c53f35..83ceb172a41 100644 --- a/code/modules/client/ui_styles/_helpers.dm +++ b/code/modules/client/ui_styles/_helpers.dm @@ -13,7 +13,6 @@ UI_ICON_HEALTH = 'icons/mob/screen/styles/health.dmi', UI_ICON_CRIT_MARKER = 'icons/mob/screen/styles/crit_markers.dmi', UI_ICON_HYDRATION = 'icons/mob/screen/styles/hydration.dmi', - UI_ICON_INTENT = 'icons/mob/screen/styles/intents.dmi', UI_ICON_INTERACTION = 'icons/mob/screen/styles/midnight/interaction.dmi', UI_ICON_INTERNALS = 'icons/mob/screen/styles/internals.dmi', UI_ICON_INVENTORY = 'icons/mob/screen/styles/midnight/inventory.dmi', diff --git a/code/modules/client/ui_styles/_ui_style.dm b/code/modules/client/ui_styles/_ui_style.dm index 24e3d908516..5e0a5ba34c4 100644 --- a/code/modules/client/ui_styles/_ui_style.dm +++ b/code/modules/client/ui_styles/_ui_style.dm @@ -13,7 +13,6 @@ UI_ICON_HEALTH = 'icons/mob/screen/styles/health.dmi', UI_ICON_CRIT_MARKER = 'icons/mob/screen/styles/crit_markers.dmi', UI_ICON_HYDRATION = 'icons/mob/screen/styles/hydration.dmi', - UI_ICON_INTENT = 'icons/mob/screen/styles/intents.dmi', UI_ICON_INTERACTION = 'icons/mob/screen/styles/midnight/interaction.dmi', UI_ICON_INTERNALS = 'icons/mob/screen/styles/internals.dmi', UI_ICON_INVENTORY = 'icons/mob/screen/styles/midnight/inventory.dmi', diff --git a/code/modules/client/ui_styles/_ui_style_states.dm b/code/modules/client/ui_styles/_ui_style_states.dm index bac1d053713..881a423335e 100644 --- a/code/modules/client/ui_styles/_ui_style_states.dm +++ b/code/modules/client/ui_styles/_ui_style_states.dm @@ -10,7 +10,6 @@ var/global/list/_ui_all_keys = list( UI_ICON_NUTRITION, UI_ICON_HYDRATION, UI_ICON_FIRE_INTENT, - UI_ICON_INTENT, UI_ICON_UP_HINT, UI_ICON_STATUS, UI_ICON_STATUS_FIRE, @@ -73,14 +72,6 @@ var/global/list/_ui_expected_states "hydration3", "hydration4" ), - UI_ICON_INTENT = list( - "intent_all", - "intent_help", - "intent_disarm", - "intent_grab", - "intent_harm", - "intent_none" - ), UI_ICON_INTERACTION = list( "act_resist", "act_throw_off", diff --git a/code/modules/client/ui_styles/ui_style_subtypes.dm b/code/modules/client/ui_styles/ui_style_subtypes.dm index 7fbd15f6c0d..cff4d996c43 100644 --- a/code/modules/client/ui_styles/ui_style_subtypes.dm +++ b/code/modules/client/ui_styles/ui_style_subtypes.dm @@ -66,7 +66,6 @@ UI_ICON_ATTACK = 'icons/mob/screen/styles/minimalist/attack_selector.dmi', UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/minimalist/fire_intent.dmi', UI_ICON_HANDS = 'icons/mob/screen/styles/minimalist/hands.dmi', - UI_ICON_INTENT = 'icons/mob/screen/styles/minimalist/intents.dmi', UI_ICON_INTERACTION = 'icons/mob/screen/styles/minimalist/interaction.dmi', UI_ICON_INVENTORY = 'icons/mob/screen/styles/minimalist/inventory.dmi', UI_ICON_MOVEMENT = 'icons/mob/screen/styles/minimalist/movement.dmi', diff --git a/code/modules/mob/mob_intent.dm b/code/modules/mob/mob_intent.dm index 7771df5dba1..b73a189e9ac 100644 --- a/code/modules/mob/mob_intent.dm +++ b/code/modules/mob/mob_intent.dm @@ -28,6 +28,8 @@ var/intent_flags = 0 /// Descriptive string used in status panel. var/name + /// Icon used to draw this intent in the selector. + var/icon = 'icons/screen/intents.dmi' /// State used to update intent selector. var/icon_state @@ -37,31 +39,53 @@ . += "null or invalid name" if(!istext(icon_state)) . += "null or invalid icon_state" + if(!icon) + . += "null icon" + if(icon && istext(icon_state)) + if(!check_state_in_icon(icon_state, icon)) + . += "missing icon_state '[icon_state]' from icon '[icon]'" + if(!check_state_in_icon("[icon_state]_off", icon)) + . += "missing icon_state '[icon_state]_off' from icon '[icon]'" // Basic subtypes. -/decl/intent/help - name = "help" - uid = "intent_help" - intent_flags = I_FLAG_HELP - icon_state = "intent_help" - /decl/intent/harm name = "harm" uid = "intent_harm" intent_flags = I_FLAG_HARM icon_state = "intent_harm" + sort_order = 1 // Bottom left of intent selector. /decl/intent/grab name = "grab" uid = "intent_grab" intent_flags = I_FLAG_GRAB icon_state = "intent_grab" + sort_order = 2 // Bottom left of the intent selector. + +/decl/intent/help + name = "help" + uid = "intent_help" + intent_flags = I_FLAG_HELP + icon_state = "intent_help" + sort_order = 3 // Top left of the intent selector. /decl/intent/disarm name = "disarm" uid = "intent_disarm" intent_flags = I_FLAG_DISARM icon_state = "intent_disarm" + sort_order = 4 // Top right of the intent selector. + +// Used by nymphs. +/decl/intent/harm/binary + icon = 'icons/screen/intents_wide.dmi' + uid = "intent_harm_simple" + intent_flags = (I_FLAG_HARM|I_FLAG_DISARM) + +/decl/intent/help/binary + icon = 'icons/screen/intents_wide.dmi' + uid = "intent_help_simple" + intent_flags = (I_FLAG_HARM|I_FLAG_GRAB) /mob /// Decl for current 'intent' of mob; hurt, harm, etc. Initialized by get_intent(). @@ -88,16 +112,22 @@ /mob/proc/get_intent() RETURN_TYPE(/decl/intent) if(!_a_intent) - _a_intent = get_available_intents()[1] + _a_intent = get_default_intent() return _a_intent +/mob/proc/get_default_intent() + return GET_DECL(I_HELP) + /mob/proc/get_available_intents() - var/static/list/available_intents = list( - GET_DECL(I_HELP), - GET_DECL(I_DISARM), - GET_DECL(I_GRAB), - GET_DECL(I_HARM) - ) + var/static/list/available_intents + if(!available_intents) + available_intents = list( + GET_DECL(I_HELP), + GET_DECL(I_DISARM), + GET_DECL(I_GRAB), + GET_DECL(I_HARM) + ) + available_intents = sortTim(available_intents, /proc/cmp_decl_sort_value_asc) return available_intents /mob/proc/cycle_intent(input) diff --git a/icons/mob/screen/styles/intents.dmi b/icons/mob/screen/styles/intents.dmi index 3c26214b74e2ae700720b3916e181bbbf7943f7f..3b0b33f849097d5e990704dff20e96350ecb11d9 100644 GIT binary patch delta 218 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 O0000qnpT3Vosj8UKe zfPH8>Mmae@M!>+p(b>?@)Y&{rJVR1OPhn4JbbyPMpr5C)vRn4<00001bW%=J06^y0 zW&i*HmwHrKbVOxyV{&P5bZKvH004NLQ&w6ZucgD#^TO= z4}u@^BsXs&MBtSWGp~f0dnH7$@G6+Scr}~9dNm(F;Da#a(}O6w2XSmk5R71%yevoX zmfnLbwv(^25hVXyAzo#uMUagvgh?2Nb_sweO(PG)t2m3}I9Q<^NS5JpxlAZ#^C*3L zgGi(F3NmI{2U&*K3~>^>!WBeO%I5~eKe%VO3?O8rgufnO4|t6r%T_VlggvuSj1(@p z=>aehH(~`qfbop9S`TgI`0yop4=rFC#D}A>U|~VFSodv3c1(`(;k)gU?JKszYy^vY zko15@L12YlD2)iP?U->$ZvX>@;oV(|<`b9CjdTZn4_Hxhw`y+xgX@9zp4?AgfAN z0F`tABT-vbk1Oa>Yi*YxkX2DgAg7SzfT5@Z%7JpP_xpWGF#t?m$YKCBvm8}j0Gg3X{v0SUv9!%aFo3!~DCKs-Mlq7!bJGJra@(K$7hEBc zT`5L79EY}Yy#6RZ^#EK$c@7`|TMO##v2QD~V{(kwpBCgju>Yi;)(2$|coYPjxNzfn z4vNW-O7-VG0tV9h;a$49d~T#WXuWytgy>SWGdeHQ>t^CbAX+yP_G zyYsm<|Gh%nop%#8*dcr;0RwR(R-7=r!+}{~CIQnRJ{-jf>5c8r`43z>*(KXoY=zkfTtj&d zQ+MOU;SIZFQ=OQ`0sC+A;BJb56Sr>sgOh&l@;!UK{{kG|r7vx;@qz#V002ovPDHLk FV1o0x>Zj6FSl^c%GR z0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS z%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$qd978j%;*!LYR3K9+Gp{5yuOvPrHK#y{ zi!&v&s2HSxi!-e#F*g;$#!#DBluNW)ptP+qS3|sjj-jJztuVFanhvD378pg}d z!|)6MoC$$P;QJ&`1I)oZF|PeSS4N0^Ic4p4py%um3>S;ztrm(Nty1^*x5=`ekLoZU7I=h858{yvN?y@!z)*e=M% zW8?d-&jOf}c*a-Kc^i;tnR8}JnrcZl(no;2-vqc5a@l7LHRSu=iWK*9h3{{R4<007+Zx2fAr#V-J%00001 zbW%=J06^y0W&i*HgL+h0bVOxyV{&P5bZKvH004NLQ&w?Vi1Gq`RT3I zw(*jW*&wQ0j2*!<`-%fWQn#2|g6p7`fd4G4g|Co*IYCG8!JrV>oZyy)6f)-owh}0a z9l@d!B=wL|LvYW+8ZCkPnp%Qva4(UIs}cmYQp1yAr_iRAHZAp8t2QPvWXZykMn&ICMzSs{QF!diQEdzT*00000NkvXXu0mjf D^gQST literal 0 HcmV?d00001 diff --git a/mods/mobs/dionaea/icons/ui_intents.dmi b/mods/mobs/dionaea/icons/ui_intents.dmi index d8aaeba136e219bc65d494ebe04e3db60c24cef6..7a7f29b4d21c75c396e026db96834dca91efc29d 100644 GIT binary patch delta 321 zcmdnXx{O)1Gr-TCmrII^fq{Y7)59eQNGpIa3p0>x3`su@q!cHrs)`mo`A`dFGnNGT z1v5B2yO9RuWKYcVt6vh)*=?-4d4+^V(ut!p!=}ub&6TLFz2n!;23|IX+LO`(^P^T; z0Tu7@ba4#Pn3y}!knfNIkLy`pDgTr$>S;$<6O#G@n6-s_6c!%173^ZGTPW0Z^-7@e zpM5v%e=@j*vu{X>Wog)buUbA%vEu&xZL$vxk69esB|E7gOx;Y6v#R{+<+xS{rAL20 zMs@Uaq@*PO)?v{X%JgLsZPQ-3oa5s)yG;w`c6~7TvRhJ8@J_>4=0^{v^_lqI-Z*(< zN^Fbwwm6s9T#Em1ny~!s^wemXr*y>k_lf*fbGbHN5A@Re{A5@Uy1vUXmHw@j8$ R69syN!PC{xWt~$(69A1HA<$iBL{Q4GJ0x0000DNk~Le0001B0000$2m=5B0MhD$JOBUyFp(uC zB;4?~soPD$009300GBn z0Mlz<9f1mzVgLXEp-DtRR9J=WSKE@qAP5aMH?vLm|NnLY(Oep;6V`oMWlU@iLm`Mc zbX^Df=xCU6rw{lQfBex8<1mrnkPFH<^bgdq;;7KiKFH!vtDX(ma8wv(CBS)L12!BL zMz5sEk8Hq(vj>X8K$>R{bNCj4%yR^6;3<=f=jdS$-#nMqAp&I=e{79$pkuF-}S1 zQh)8`_2N>OB<_xa!&y^=ZxKZASGbNKO}LIg!IKByC;8|hWFmlz2rmBM{T&|-6yd=G zWfvq54LE&Mf7N{~-&_;U=ebsi@w~U-#A}oY0fhIM@cPWIIybG)uIrE55w!l`|MUkM zzqjI9es9II{N9RZ`Mnj-@_Q@Z`h(UVwEkenO;3gL#y#)$55@fdZvRls|L^t>#r*$n p|4_{T@AeO^KWP0y>kqo_2TATpxAp|1H~;_u07*qo1w^hwV1l;@6fXb( diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 4c8b1a9f496..4e13e530ef9 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -76,6 +76,16 @@ heal_damage(OXY, rads, do_update_health = FALSE) heal_damage(TOX, rads) +/mob/living/simple_animal/alien/diona/get_default_intent() + return GET_DECL(/decl/intent/help/binary/diona) + +/mob/living/simple_animal/alien/diona/get_available_intents() + var/static/list/available_intents = list( + GET_DECL(/decl/intent/harm/binary/diona), + GET_DECL(/decl/intent/help/binary/diona) + ) + return available_intents + /decl/bodytype/diona name = "nymph" bodytype_flag = 0 diff --git a/mods/mobs/dionaea/mob/nymph_ui.dm b/mods/mobs/dionaea/mob/nymph_ui.dm index b337856bd45..0930bb184cd 100644 --- a/mods/mobs/dionaea/mob/nymph_ui.dm +++ b/mods/mobs/dionaea/mob/nymph_ui.dm @@ -1,6 +1,13 @@ /obj/screen/intent/binary/diona + icon = 'mods/mobs/dionaea/icons/ui_intents.dmi' screen_loc = DIONA_SCREEN_LOC_INTENT +/decl/intent/harm/binary/diona + icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' + +/decl/intent/help/binary/diona + icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' + /decl/ui_style/diona name = "Diona" restricted = TRUE @@ -8,7 +15,6 @@ override_icons = list( UI_ICON_HEALTH = 'mods/mobs/dionaea/icons/ui_health.dmi', UI_ICON_HANDS = 'mods/mobs/dionaea/icons/ui_hands.dmi', - UI_ICON_INTENT = 'mods/mobs/dionaea/icons/ui_intents.dmi', UI_ICON_INTERACTION = 'mods/mobs/dionaea/icons/ui_interactions.dmi', UI_ICON_INVENTORY = 'mods/mobs/dionaea/icons/ui_inventory.dmi' ) @@ -27,8 +33,8 @@ var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - action_intent = new /obj/screen/intent/binary/diona(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) - mymob.healths = new /obj/screen/diona_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) + action_intent = new /obj/screen/intent/binary/diona(null, mymob) + mymob.healths = new /obj/screen/diona_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) src.other = list() src.adding = list(mymob.healths, action_intent) ..() diff --git a/mods/species/ascent/icons/ui_intent_overlay.dmi b/mods/species/ascent/icons/ui_intent_overlay.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d49275852d3485b58a6fd646fb89f8727e5e5633 GIT binary patch literal 569 zcmV-90>=G`P)oSPNev|8jzk;J}~|*qq=u3n^sI32Y@$ z5IX|SzTgo-QV%IL1bY_NXbIHU)DmQay+kgqN)Xga4KIR|LYr3FwA5#{KL6MzUmF?l zk&S6+1+f^M4?09}@_ajJ#X-D=cux3-`T@v6N#yy>e$Xi!-RuW7JK#WYu^)VB=m(YT zO*jyI8g%_Ygk6GL{h&YKj^J89coUSk+Yg4<4FCP$i~ZmUHr^jAv|?*m00000NkvXX Hu0mjffgtj~ literal 0 HcmV?d00001 diff --git a/mods/species/ascent/icons/ui_intents.dmi b/mods/species/ascent/icons/ui_intents.dmi index 1e027dcfcdddd90d6999f10bb9aea31c4f5b0bf4..0e8d07ec2fecf6f82ef9e05347c6baffdb6dcbf7 100644 GIT binary patch delta 321 zcmdnax{O)1Gr-TCmrII^fq{Y7)59eQNGpIa3p0>x3`su@q!cHrs*1Mip2`HW8B2ov zf*Bm1-ADs+vM1*G)h~(Y>^4^2yh1`F>BP~QVN+(z=1SDo-tlW^11}px?MZ2Y`B5va zfQt8cx;TbtOw65V$alzq$Mr0)lz++=^|T|b2}ykc%-X^|3JVY13U;y8EfngydL_{K z&%PV>KN;M@**7G`vNY_zS1li>SaE;;HrWS;$1INRlATl#rf#OkSyg`Za$Ku}(xX2g zqdNLIQc{wC>#*nxW%{y+wrMY1&hhb@-KGU|yFM6v*)1t4c&A}2^P>mT`b>OpZ=Ad_ zCAP(TTb#>lF2(;hO<4YRdTO-HQ##`N`$Yb#xm+8s2YTs!elja(_Lt{hSv#-9TP91W Ri2^;s;OXk;vd$@?2>`N`d>#M* delta 596 zcmV-a0;~O|1GfbwiBL{Q4GJ0x0000DNk~Le0001B0000$2m=5B0MhD$JOBUyFp(uC zB=EQ9+fBj$nE?OH0RLtHZ;Jj?00001bW%=J06^y0W&i*Hj*(wZeShacid8xS6Dl549xqw3s z0M@Qw9Wh5kPyhe{n@L1LR9J=Wm+N-JAP9iP=4RGp@Bg*~G&XVJl*!zmDaYJCv`{nw z=N!n*Q8RNdH~1C)e;CGToJp{y1IjcG57e-7R2Y^JWevsEz!TUwDvXQZ;4<~pYc()kZxGc=YmV)QDF{r_rU_#<261CGfxnC6oBKZ;(ziNH4k$8WqPxbc&i^4(#=M) zrH-QI6r|Iu;PS2sDTvJXv+TQ?zdXnt?malH+u+^Ef^4CIe$zKqT*v8~YvTMqmv-XuzPE77YXlDgQr=_Y?K8XPxoP|Cx_xWyL9Y+~ zPkrz%|F7lh{J)l~^Z#0|&i`wbb&V2!bWl5#OWJM_e0000 Date: Thu, 28 Nov 2024 16:15:43 +1100 Subject: [PATCH 111/554] Updating set_intent() to use flags instead of types. --- code/__defines/intent.dm | 7 +---- code/_onclick/other_mobs.dm | 2 +- code/datums/ai/aggressive.dm | 8 +++--- code/datums/ai/hunter.dm | 2 +- code/game/objects/effects/gateway.dm | 2 +- code/modules/keybindings/mob.dm | 8 +++--- code/modules/mechs/mech_interaction.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 4 +-- .../simple_animal/friendly/farm_animals.dm | 2 +- .../simple_animal/hostile/faithful_hound.dm | 2 +- code/modules/mob/mob_intent.dm | 26 +++++++++++------ code/modules/mob/transform_procs.dm | 6 ++-- code/modules/projectiles/projectile/change.dm | 4 +-- .../system/psionics/faculties/_faculty.dm | 8 ++---- .../system/psionics/faculties/coercion.dm | 2 +- .../system/psionics/faculties/energistics.dm | 2 +- .../psionics/faculties/psychokinesis.dm | 2 +- .../system/psionics/faculties/redaction.dm | 2 +- .../system/psionics/mob/mob_interactions.dm | 6 ++-- mods/content/psionics/system/subsystem_psi.dm | 28 ++++++++++++++----- mods/content/xenobiology/slime/slime_AI.dm | 12 ++++---- mods/gamemodes/deity/mobs/deity_phenomena.dm | 10 +++---- mods/mobs/dionaea/mob/nymph_ui.dm | 2 ++ mods/species/ascent/mobs/nymph/nymph_ui.dm | 2 ++ 24 files changed, 86 insertions(+), 65 deletions(-) diff --git a/code/__defines/intent.dm b/code/__defines/intent.dm index f4e895d4af9..2fa914a8b4c 100644 --- a/code/__defines/intent.dm +++ b/code/__defines/intent.dm @@ -1,14 +1,9 @@ -// Intent decls for use in set_intent() -#define I_HELP /decl/intent/help -#define I_DISARM /decl/intent/disarm -#define I_GRAB /decl/intent/grab -#define I_HARM /decl/intent/harm - // Intent bitflags for use in check_intent() #define I_FLAG_HELP BITFLAG(0) #define I_FLAG_DISARM BITFLAG(1) #define I_FLAG_GRAB BITFLAG(2) #define I_FLAG_HARM BITFLAG(3) +#define I_FLAG_ALL (I_FLAG_HELP|I_FLAG_DISARM|I_FLAG_GRAB|I_FLAG_HARM) //NOTE: INTENT_HOTKEY_* defines are not actual intents! //they are here to support hotkeys diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 36e4b7b0420..870865a831f 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -97,7 +97,7 @@ if(check_intent(I_FLAG_HELP) || !attacking_with) return A.attack_animal(src) - set_intent(I_HARM) + set_intent(I_FLAG_HARM) . = A.attackby(attacking_with, src) // attack effects are handled in natural_weapon's apply_hit_effect() instead of here if(!.) diff --git a/code/datums/ai/aggressive.dm b/code/datums/ai/aggressive.dm index e823de88f43..62316d4d197 100644 --- a/code/datums/ai/aggressive.dm +++ b/code/datums/ai/aggressive.dm @@ -10,7 +10,7 @@ /datum/mob_controller/aggressive/New() ..() if(isliving(body) && !QDELETED(body) && !QDELETED(src)) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) /datum/mob_controller/aggressive/set_target(atom/new_target) var/weakref/new_target_ref = weakref(new_target) @@ -113,7 +113,7 @@ SET_STATUS_MAX(victim, STAT_WEAK, 3) return target if(body.Adjacent(target)) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) body.ClickOn(target) return target @@ -140,7 +140,7 @@ // Attack anything on the target turf. var/obj/effect/shield/S = locate(/obj/effect/shield) in targ if(S && S.gen && S.gen.check_flag(MODEFLAG_NONHUMANS)) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) body.ClickOn(S) return @@ -161,7 +161,7 @@ for(var/type in valid_obstacles_by_priority) var/obj/obstacle = locate(type) in targ if(obstacle) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) body.ClickOn(obstacle) return diff --git a/code/datums/ai/hunter.dm b/code/datums/ai/hunter.dm index b5b4425ca89..e60294d4a87 100644 --- a/code/datums/ai/hunter.dm +++ b/code/datums/ai/hunter.dm @@ -17,7 +17,7 @@ return !victim.isSynthetic() && (victim.stat == DEAD || victim.get_object_size() < body.get_object_size()) /datum/mob_controller/passive/hunter/proc/try_attack_prey(mob/living/prey) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) body.ClickOn(prey) /datum/mob_controller/passive/hunter/proc/consume_prey(mob/living/prey) diff --git a/code/game/objects/effects/gateway.dm b/code/game/objects/effects/gateway.dm index 87418769e15..2b6be989f27 100644 --- a/code/game/objects/effects/gateway.dm +++ b/code/game/objects/effects/gateway.dm @@ -60,7 +60,7 @@ qdel(W) var/mob/living/new_mob = new /mob/living/simple_animal/corgi(AM.loc) - new_mob.set_intent(I_HARM) + new_mob.set_intent(I_FLAG_HARM) if(victim.mind) victim.mind.transfer_to(new_mob) else diff --git a/code/modules/keybindings/mob.dm b/code/modules/keybindings/mob.dm index 370af83db5d..4ab7f0f14f9 100644 --- a/code/modules/keybindings/mob.dm +++ b/code/modules/keybindings/mob.dm @@ -52,7 +52,7 @@ full_name = "Select Help Intent" /datum/keybinding/mob/select_help_intent/down(client/user) - user.mob.set_intent(I_HELP) + user.mob.set_intent(I_FLAG_HELP) return TRUE /datum/keybinding/mob/select_disarm_intent @@ -61,7 +61,7 @@ full_name = "Select Disarm Intent" /datum/keybinding/mob/select_disarm_intent/down(client/user) - user.mob.set_intent(I_DISARM) + user.mob.set_intent(I_FLAG_DISARM) return TRUE /datum/keybinding/mob/select_grab_intent @@ -70,7 +70,7 @@ full_name = "Select Grab Intent" /datum/keybinding/mob/select_grab_intent/down(client/user) - user.mob.set_intent(I_GRAB) + user.mob.set_intent(I_FLAG_GRAB) return TRUE /datum/keybinding/mob/select_harm_intent @@ -79,7 +79,7 @@ full_name = "Select Harm Intent" /datum/keybinding/mob/select_harm_intent/down(client/user) - user.mob.set_intent(I_HARM) + user.mob.set_intent(I_FLAG_HARM) return TRUE /datum/keybinding/mob/cycle_intent_right diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index efe8754fc57..77fc243c705 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -328,7 +328,7 @@ user.client.screen -= hud_elements user.client.eye = user if(user in pilots) - set_intent(I_HARM) + set_intent(I_FLAG_HARM) LAZYREMOVE(pilots, user) UNSETEMPTY(pilots) update_pilots() diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index a817ab7e707..903677e4a81 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -209,9 +209,9 @@ return TRUE if(isanimal(M)) - set_intent(I_HARM) + set_intent(I_FLAG_HARM) else - set_intent(I_GRAB) + set_intent(I_FLAG_GRAB) stun_baton.use_on_mob(M, src) //robots and turrets aim for center of mass flick(attack_state, src) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index d260e451868..ae8da0e797f 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -59,7 +59,7 @@ var/atom/food = find_edible_atom(view(1, body.loc)) if(istype(food)) body.stop_automove() - body.set_intent(I_HELP) + body.set_intent(I_FLAG_HELP) body.ClickOn(food) else if(!LAZYLEN(body.grabbed_by)) food = find_edible_atom(oview(5, body.loc)) diff --git a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm index 19765360632..345b7137994 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm @@ -37,7 +37,7 @@ var/new_aggress = 1 var/dist = get_dist(mailman, body) if(dist < 2) //Attack! Attack! - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) body.ClickOn(mailman) return if(dist == 2) diff --git a/code/modules/mob/mob_intent.dm b/code/modules/mob/mob_intent.dm index b73a189e9ac..39a1a9c5606 100644 --- a/code/modules/mob/mob_intent.dm +++ b/code/modules/mob/mob_intent.dm @@ -2,7 +2,8 @@ // - Use mob.get_intent() to retrieve the entire decl structure. // - Use mob.check_intent(I_FOO) for 1:1 intent type checking. // - Use mob.check_intent(I_FLAG_FOO) for 'close enough for government work' flag checking. -// - Use mob.set_intent(I_FOO) to set intent to a type - does not accept flags. +// - Use mob.set_intent(I_FOO) to set intent to a type +// - Use mob.set_intent(I_FLAG_FOO) to set intent to whatever available type has the flag. // - Use mob.cycle_intent(INTENT_HOTKEY_LEFT) or mob.cycle_intent(INTENT_HOTKEY_RIGHT) to step up or down the mob intent list. // - Override mob.get_available_intents() if you want to change the intents from the default four. @@ -24,7 +25,7 @@ /decl/intent abstract_type = /decl/intent decl_flags = DECL_FLAG_MANDATORY_UID - /// Replacing the old usage of I_HURT etc. in attackby() and such. Refer to /mob/proc/check_intent(). + /// Replacing the old usage of I_HARM etc. in attackby() and such. Refer to /mob/proc/check_intent(). var/intent_flags = 0 /// Descriptive string used in status panel. var/name @@ -101,12 +102,21 @@ return (intent == resolve_intent(checking_intent)) /mob/proc/set_intent(decl/intent/new_intent) - new_intent = resolve_intent(new_intent) + + if(!isnum(new_intent)) + new_intent = resolve_intent(new_intent) + else // Retrieve intent decl based on flag. + for(var/decl/intent/intent as anything in get_available_intents()) + if(intent.intent_flags & new_intent) + new_intent = intent + break + if(istype(new_intent) && get_intent() != new_intent) _a_intent = new_intent if(istype(hud_used) && hud_used.action_intent) hud_used.action_intent.update_icon() return TRUE + return FALSE /mob/proc/get_intent() @@ -116,16 +126,16 @@ return _a_intent /mob/proc/get_default_intent() - return GET_DECL(I_HELP) + return GET_DECL(/decl/intent/help) /mob/proc/get_available_intents() var/static/list/available_intents if(!available_intents) available_intents = list( - GET_DECL(I_HELP), - GET_DECL(I_DISARM), - GET_DECL(I_GRAB), - GET_DECL(I_HARM) + GET_DECL(/decl/intent/help), + GET_DECL(/decl/intent/disarm), + GET_DECL(/decl/intent/grab), + GET_DECL(/decl/intent/harm) ) available_intents = sortTim(available_intents, /proc/cmp_decl_sort_value_asc) return available_intents diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index cb58eb00bfe..e0c1d446876 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -154,7 +154,7 @@ qdel(t) var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc) - new_corgi.set_intent(I_HARM) + new_corgi.set_intent(get_intent()) new_corgi.key = key to_chat(new_corgi, "You are now a Corgi. Yap Yap!") @@ -186,7 +186,7 @@ var/mob/new_mob = new mobpath(src.loc) new_mob.key = key - new_mob.set_intent(I_HARM) + new_mob.set_intent(get_intent()) to_chat(new_mob, "You suddenly feel more... animalistic.") @@ -206,7 +206,7 @@ var/mob/new_mob = new mobpath(src.loc) new_mob.key = key - new_mob.set_intent(I_HARM) + new_mob.set_intent(get_intent()) to_chat(new_mob, "You feel more... animalistic.") qdel(src) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index a2a200522e4..8e241456d22 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -54,11 +54,11 @@ var/choice = pick(get_random_transformation_options(M)) var/mob/living/new_mob = apply_transformation(M, choice) if(new_mob) - new_mob.set_intent(I_HARM) + new_mob.set_intent(I_FLAG_HARM) if(M.mind) for (var/spell/S in M.mind.learned_spells) new_mob.add_spell(new S.type) - new_mob.set_intent(I_HARM) + new_mob.set_intent(I_FLAG_HARM) transfer_key_from_mob_to_mob(M, new_mob) to_chat(new_mob, "Your form morphs into that of \a [choice].") else diff --git a/mods/content/psionics/system/psionics/faculties/_faculty.dm b/mods/content/psionics/system/psionics/faculties/_faculty.dm index 16cd63a7e71..03d9fc7a236 100644 --- a/mods/content/psionics/system/psionics/faculties/_faculty.dm +++ b/mods/content/psionics/system/psionics/faculties/_faculty.dm @@ -1,18 +1,16 @@ /decl/psionic_faculty var/id var/name - var/decl/intent/associated_intent + var/associated_intent_flag var/list/armour_types = list() var/list/powers = list() /decl/psionic_faculty/validate() . = ..() - if(associated_intent && !istype(associated_intent)) - . += "non-/decl/intent associated_intent value set" + if(!isnull(associated_intent_flag) && !isnum(associated_intent_flag)) + . += "non-bitflag associated_intent_flag value set" /decl/psionic_faculty/Initialize() - if(ispath(associated_intent)) - associated_intent = GET_DECL(associated_intent) . = ..() for(var/atype in armour_types) SSpsi.armour_faculty_by_type[atype] = id diff --git a/mods/content/psionics/system/psionics/faculties/coercion.dm b/mods/content/psionics/system/psionics/faculties/coercion.dm index 0cddc48bf32..2af44aa9335 100644 --- a/mods/content/psionics/system/psionics/faculties/coercion.dm +++ b/mods/content/psionics/system/psionics/faculties/coercion.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/coercion id = PSI_COERCION name = "Coercion" - associated_intent = I_DISARM + associated_intent_flag = I_FLAG_DISARM armour_types = list(PSIONIC) /decl/psionic_power/coercion diff --git a/mods/content/psionics/system/psionics/faculties/energistics.dm b/mods/content/psionics/system/psionics/faculties/energistics.dm index 2ab1a789936..2396a1e7119 100644 --- a/mods/content/psionics/system/psionics/faculties/energistics.dm +++ b/mods/content/psionics/system/psionics/faculties/energistics.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/energistics id = PSI_ENERGISTICS name = "Energistics" - associated_intent = I_HARM + associated_intent_flag = I_FLAG_HARM armour_types = list(ARMOR_BOMB, ARMOR_LASER, ARMOR_ENERGY) /decl/psionic_power/energistics diff --git a/mods/content/psionics/system/psionics/faculties/psychokinesis.dm b/mods/content/psionics/system/psionics/faculties/psychokinesis.dm index 49c77a70ae0..8d0dd5c61f8 100644 --- a/mods/content/psionics/system/psionics/faculties/psychokinesis.dm +++ b/mods/content/psionics/system/psionics/faculties/psychokinesis.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/psychokinesis id = PSI_PSYCHOKINESIS name = "Psychokinesis" - associated_intent = I_GRAB + associated_intent_flag = I_FLAG_GRAB armour_types = list(ARMOR_MELEE, ARMOR_BULLET) /decl/psionic_power/psychokinesis diff --git a/mods/content/psionics/system/psionics/faculties/redaction.dm b/mods/content/psionics/system/psionics/faculties/redaction.dm index 97354f41a05..8879259a72a 100644 --- a/mods/content/psionics/system/psionics/faculties/redaction.dm +++ b/mods/content/psionics/system/psionics/faculties/redaction.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/redaction id = PSI_REDACTION name = "Redaction" - associated_intent = I_HELP + associated_intent_flag = I_FLAG_HELP armour_types = list(ARMOR_BIO, ARMOR_RAD) /decl/psionic_power/redaction diff --git a/mods/content/psionics/system/psionics/mob/mob_interactions.dm b/mods/content/psionics/system/psionics/mob/mob_interactions.dm index 94806af788f..366adb30882 100644 --- a/mods/content/psionics/system/psionics/mob/mob_interactions.dm +++ b/mods/content/psionics/system/psionics/mob/mob_interactions.dm @@ -25,18 +25,18 @@ return TRUE /datum/ability_handler/psionics/do_grabbed_invocation(mob/user, atom/target) - INVOKE_PSI_POWERS(user, get_grab_powers(SSpsi.faculties_by_intent[user.get_intent()]), target) + INVOKE_PSI_POWERS(user, get_grab_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) /datum/ability_handler/psionics/can_do_melee_invocation(mob/user, atom/target) return TRUE /datum/ability_handler/psionics/do_melee_invocation(mob/user, atom/target) - INVOKE_PSI_POWERS(user, get_melee_powers(SSpsi.faculties_by_intent[user.get_intent()]), target) + INVOKE_PSI_POWERS(user, get_melee_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) /datum/ability_handler/psionics/can_do_ranged_invocation(mob/user, atom/target) return TRUE /datum/ability_handler/psionics/do_ranged_invocation(mob/user, atom/target) - INVOKE_PSI_POWERS(user, get_ranged_powers(SSpsi.faculties_by_intent[user.get_intent()]), target) + INVOKE_PSI_POWERS(user, get_ranged_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) #undef INVOKE_PSI_POWERS \ No newline at end of file diff --git a/mods/content/psionics/system/subsystem_psi.dm b/mods/content/psionics/system/subsystem_psi.dm index 806f911873b..e6621835ce9 100644 --- a/mods/content/psionics/system/subsystem_psi.dm +++ b/mods/content/psionics/system/subsystem_psi.dm @@ -5,13 +5,27 @@ PROCESSING_SUBSYSTEM_DEF(psi) priority = SS_PRIORITY_PSYCHICS flags = SS_POST_FIRE_TIMING | SS_BACKGROUND - var/list/faculties_by_id = list() - var/list/faculties_by_name = list() - var/list/all_aura_images = list() - var/list/psi_dampeners = list() - var/list/psi_monitors = list() + var/list/faculties_by_id = list() + var/list/faculties_by_name = list() + var/list/all_aura_images = list() + var/list/psi_dampeners = list() + var/list/psi_monitors = list() var/list/armour_faculty_by_type = list() - var/list/faculties_by_intent = list() + var/list/faculties_by_intent = new(I_FLAG_ALL) + +/datum/controller/subsystem/processing/psi/proc/get_faculty_by_intent(decl/intent/intent) + var/static/list/intent_flags = list( + I_FLAG_HELP, + I_FLAG_DISARM, + I_FLAG_GRAB, + I_FLAG_HARM + ) + . = faculties_by_intent[intent.intent_flags] + if(!.) + for(var/flag in intent_flags) + if(flag & intent.intent_flags) + . = faculties_by_intent[flag] + faculties_by_intent[intent.intent_flags] = . /datum/controller/subsystem/processing/psi/proc/get_faculty(var/faculty) return faculties_by_name[faculty] || faculties_by_id[faculty] @@ -24,7 +38,7 @@ PROCESSING_SUBSYSTEM_DEF(psi) var/decl/psionic_faculty/faculty = faculties[ftype] faculties_by_id[faculty.id] = faculty faculties_by_name[faculty.name] = faculty - faculties_by_intent[faculty.associated_intent] = faculty.id + faculties_by_intent[faculty.associated_intent_flag] = faculty.id var/list/powers = decls_repository.get_decls_of_subtype(/decl/psionic_power) for(var/ptype in powers) diff --git a/mods/content/xenobiology/slime/slime_AI.dm b/mods/content/xenobiology/slime/slime_AI.dm index 3cade1ddc49..7260e124070 100644 --- a/mods/content/xenobiology/slime/slime_AI.dm +++ b/mods/content/xenobiology/slime/slime_AI.dm @@ -37,13 +37,13 @@ /datum/mob_controller/slime/proc/update_mood() if(!slime || !body) return - body.set_intent(I_HELP) + body.set_intent(I_FLAG_HELP) var/new_mood if(HAS_STATUS(body, STAT_CONFUSE)) new_mood = "pout" else if(rabid || attacked) new_mood = "angry" - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) else if(current_target) new_mood = "mischevous" @@ -146,19 +146,19 @@ if(prob(1)) for(var/mob/living/slime/frenemy in range(1, body)) if(frenemy != body && body.Adjacent(frenemy)) - body.set_intent((frenemy.slime_type == slime.slime_type) ? I_HELP : I_HARM) + body.set_intent((frenemy.slime_type == slime.slime_type) ? I_FLAG_HELP : I_FLAG_HARM) body.UnarmedAttack(frenemy, TRUE) added_delay = 10 else if(slime.Adjacent(current_target)) var/do_attack = FALSE if(issilicon(current_target)) - body.set_intent(I_HARM) + body.set_intent(I_FLAG_HARM) do_attack = TRUE else if(current_target.client && !current_target.current_posture.prone && prob(60 + slime.powerlevel * 4)) - body.set_intent(I_DISARM) + body.set_intent(I_FLAG_DISARM) do_attack = TRUE else if(slime.check_valid_feed_target(current_target) == FEED_RESULT_VALID) - body.set_intent(I_GRAB) + body.set_intent(I_FLAG_GRAB) do_attack = TRUE if(do_attack) body.UnarmedAttack(current_target, TRUE) diff --git a/mods/gamemodes/deity/mobs/deity_phenomena.dm b/mods/gamemodes/deity/mobs/deity_phenomena.dm index eef27a6bdb6..a5abe64946a 100644 --- a/mods/gamemodes/deity/mobs/deity_phenomena.dm +++ b/mods/gamemodes/deity/mobs/deity_phenomena.dm @@ -9,11 +9,11 @@ . = ..() for(var/decl/intent/intent as anything in decls_repository.get_decls_of_type_unassociated(/decl/intent)) //Just in case we somehow remove/add a new intent #futureproofing populate_intent(intent) - set_phenomenon(add_phenomenon(/datum/phenomenon/communicate), GET_DECL(I_HELP), "shift") - set_phenomenon(add_phenomenon(/datum/phenomenon/punish), GET_DECL(I_HELP), "control") - set_phenomenon(add_phenomenon(/datum/phenomenon/point), GET_DECL(I_HELP), "controlshift") - set_phenomenon(add_phenomenon(/datum/phenomenon/conversion), GET_DECL(I_GRAB), "shift") - set_phenomenon(add_phenomenon(/datum/phenomenon/forced_conversion), GET_DECL(I_GRAB), "control") + set_phenomenon(add_phenomenon(/datum/phenomenon/communicate), GET_DECL(/decl/intent/disarm), "shift") + set_phenomenon(add_phenomenon(/datum/phenomenon/punish), GET_DECL(/decl/intent/help), "control") + set_phenomenon(add_phenomenon(/datum/phenomenon/point), GET_DECL(/decl/intent/help), "controlshift") + set_phenomenon(add_phenomenon(/datum/phenomenon/conversion), GET_DECL(/decl/intent/grab), "shift") + set_phenomenon(add_phenomenon(/datum/phenomenon/forced_conversion), GET_DECL(/decl/intent/grab), "control") /mob/living/deity/proc/silence(amount) if(!silenced) diff --git a/mods/mobs/dionaea/mob/nymph_ui.dm b/mods/mobs/dionaea/mob/nymph_ui.dm index 0930bb184cd..f970c597886 100644 --- a/mods/mobs/dionaea/mob/nymph_ui.dm +++ b/mods/mobs/dionaea/mob/nymph_ui.dm @@ -4,9 +4,11 @@ /decl/intent/harm/binary/diona icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' + uid = "intent_harm_binary_diona" /decl/intent/help/binary/diona icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' + uid = "intent_help_binary_diona" /decl/ui_style/diona name = "Diona" diff --git a/mods/species/ascent/mobs/nymph/nymph_ui.dm b/mods/species/ascent/mobs/nymph/nymph_ui.dm index a2296461473..9f1430297d4 100644 --- a/mods/species/ascent/mobs/nymph/nymph_ui.dm +++ b/mods/species/ascent/mobs/nymph/nymph_ui.dm @@ -4,9 +4,11 @@ /decl/intent/harm/binary/ascent icon = 'mods/species/ascent/icons/ui_intent_overlay.dmi' + uid = "intent_harm_binary_ascent" /decl/intent/help/binary/ascent icon = 'mods/species/ascent/icons/ui_intent_overlay.dmi' + uid = "intent_help_binary_ascent" /obj/screen/ascent_nymph_molt name = "molt" From 7348e0aec044132c92e38b2a046743742d3c217a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 28 Nov 2024 16:54:10 +1100 Subject: [PATCH 112/554] Commenting out nymph intent selection/subtypes due to issues with interactions. --- code/modules/banners/sign.dm | 2 +- mods/mobs/dionaea/mob/_nymph.dm | 2 ++ mods/mobs/dionaea/mob/nymph_ui.dm | 6 ++++-- mods/species/ascent/mobs/nymph/_nymph.dm | 2 ++ mods/species/ascent/mobs/nymph/nymph_ui.dm | 5 +++-- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/modules/banners/sign.dm b/code/modules/banners/sign.dm index cfc15e3310c..f7babc034d0 100644 --- a/code/modules/banners/sign.dm +++ b/code/modules/banners/sign.dm @@ -9,7 +9,7 @@ colourise_decal = FALSE /obj/item/banner/sign/attackby(obj/item/used_item, mob/user) - if(IS_KNIFE(used_item) && user.a_intent == I_HELP) + if(IS_KNIFE(used_item) && user.check_intent(I_FLAG_HELP)) var/available_decals = get_available_decals() if(!length(available_decals) || length(decals)) to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 4e13e530ef9..6ec480cda3b 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -76,6 +76,7 @@ heal_damage(OXY, rads, do_update_health = FALSE) heal_damage(TOX, rads) +/* /mob/living/simple_animal/alien/diona/get_default_intent() return GET_DECL(/decl/intent/help/binary/diona) @@ -85,6 +86,7 @@ GET_DECL(/decl/intent/help/binary/diona) ) return available_intents +*/ /decl/bodytype/diona name = "nymph" diff --git a/mods/mobs/dionaea/mob/nymph_ui.dm b/mods/mobs/dionaea/mob/nymph_ui.dm index f970c597886..cdd3a3f8c6d 100644 --- a/mods/mobs/dionaea/mob/nymph_ui.dm +++ b/mods/mobs/dionaea/mob/nymph_ui.dm @@ -1,3 +1,4 @@ +/* Commented out due to issues with interactions and combined intent flags. /obj/screen/intent/binary/diona icon = 'mods/mobs/dionaea/icons/ui_intents.dmi' screen_loc = DIONA_SCREEN_LOC_INTENT @@ -9,6 +10,7 @@ /decl/intent/help/binary/diona icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' uid = "intent_help_binary_diona" +*/ /decl/ui_style/diona name = "Diona" @@ -35,8 +37,8 @@ var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - action_intent = new /obj/screen/intent/binary/diona(null, mymob) - mymob.healths = new /obj/screen/diona_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) + action_intent = new /obj/screen/intent( null, mymob) // Swap to /obj/screen/intent/binary/diona when interaction code supports it. + mymob.healths = new /obj/screen/diona_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) src.other = list() src.adding = list(mymob.healths, action_intent) ..() diff --git a/mods/species/ascent/mobs/nymph/_nymph.dm b/mods/species/ascent/mobs/nymph/_nymph.dm index 2c0a4f3646b..16447b0c51d 100644 --- a/mods/species/ascent/mobs/nymph/_nymph.dm +++ b/mods/species/ascent/mobs/nymph/_nymph.dm @@ -52,6 +52,7 @@ /mob/living/simple_animal/alien/kharmaan/get_dexterity(var/silent) return (DEXTERITY_EQUIP_ITEM) +/* /mob/living/simple_animal/alien/kharmaan/get_default_intent() return GET_DECL(/decl/intent/help/binary/ascent) @@ -61,3 +62,4 @@ GET_DECL(/decl/intent/help/binary/ascent) ) return available_intents +*/ \ No newline at end of file diff --git a/mods/species/ascent/mobs/nymph/nymph_ui.dm b/mods/species/ascent/mobs/nymph/nymph_ui.dm index 9f1430297d4..c100c95b4cd 100644 --- a/mods/species/ascent/mobs/nymph/nymph_ui.dm +++ b/mods/species/ascent/mobs/nymph/nymph_ui.dm @@ -1,3 +1,4 @@ +/* Commented out due to issues with interactions and combined intent flags. /obj/screen/intent/binary/ascent icon = 'mods/species/ascent/icons/ui_intents.dmi' screen_loc = ANYMPH_SCREEN_LOC_INTENT @@ -9,7 +10,7 @@ /decl/intent/help/binary/ascent icon = 'mods/species/ascent/icons/ui_intent_overlay.dmi' uid = "intent_help_binary_ascent" - +*/ /obj/screen/ascent_nymph_molt name = "molt" icon = 'mods/species/ascent/icons/ui_molt.dmi' @@ -53,7 +54,7 @@ molt = new( null, mymob, ui_style, ui_color, ui_alpha) food = new /obj/screen/food( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_NUTRITION) drink = new /obj/screen/drink( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HYDRATION) - action_intent = new /obj/screen/intent/binary/ascent(null) + action_intent = new /obj/screen/intent( null) // Swap to /obj/screen/intent/binary/ascent when interaction code supports it. mymob.healths = new /obj/screen/ascent_nymph_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) src.other = list() src.adding = list(mymob.healths, molt, food, drink, action_intent) From 85b9c56a37464cbf9900889b630dc00697ad6dc8 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 6 Dec 2024 20:25:45 +1100 Subject: [PATCH 113/554] Automatic changelog generation for PR #4583 [ci skip] --- html/changelogs/AutoChangeLog-pr-4583.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4583.yml diff --git a/html/changelogs/AutoChangeLog-pr-4583.yml b/html/changelogs/AutoChangeLog-pr-4583.yml new file mode 100644 index 00000000000..9c592814efd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4583.yml @@ -0,0 +1,5 @@ +author: MistakeNot4892 +changes: + - {tweak: Most wooden floors and tables on space maps are now chipboard laminate + instead.} +delete-after: true From c23b2c84997fb5e0d1778dd81c1babc205b61c16 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sat, 7 Dec 2024 00:53:42 +0000 Subject: [PATCH 114/554] Automatic changelog generation [ci skip] --- html/changelog.html | 12 ++++++------ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-4583.yml | 5 ----- 3 files changed, 10 insertions(+), 11 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4583.yml diff --git a/html/changelog.html b/html/changelog.html index 526d388b528..7aab615f942 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
+

07 December 2024

+

MistakeNot4892 updated:

+
    +
  • Most wooden floors and tables on space maps are now chipboard laminate instead.
  • +
+

05 December 2024

ophelia updated:

    @@ -106,12 +112,6 @@

    Sutures updated:

  • Added a wood plank texture to wood tables, used if the fantasy modpack is included.
  • Fixed wall banners not starting with banners.
- -

05 October 2024

-

MistakeNot4892 updated:

-
    -
  • Sledgehammers can demolish non-reinforced walls.
  • -
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 6bcd5bb4950..3906fe0882f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14929,3 +14929,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: You can now put any disk into the research design database or research design console, but only the correct disk type (tech disk or design disk) will function. +2024-12-07: + MistakeNot4892: + - tweak: Most wooden floors and tables on space maps are now chipboard laminate + instead. diff --git a/html/changelogs/AutoChangeLog-pr-4583.yml b/html/changelogs/AutoChangeLog-pr-4583.yml deleted file mode 100644 index 9c592814efd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4583.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: Most wooden floors and tables on space maps are now chipboard laminate - instead.} -delete-after: true From da85b88111ad77a74c992bcaa26fb0e691ec95f3 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 7 Dec 2024 12:19:21 +1100 Subject: [PATCH 115/554] Adding a large cauldron that cannot be picked up. --- code/modules/food/cooking/cooking_vessels/pot.dm | 13 +++++++++++++ icons/obj/food/cooking_vessels/cauldron.dmi | Bin 0 -> 1078 bytes 2 files changed, 13 insertions(+) create mode 100644 icons/obj/food/cooking_vessels/cauldron.dmi diff --git a/code/modules/food/cooking/cooking_vessels/pot.dm b/code/modules/food/cooking/cooking_vessels/pot.dm index 93c6a4585eb..9465db82d30 100644 --- a/code/modules/food/cooking/cooking_vessels/pot.dm +++ b/code/modules/food/cooking/cooking_vessels/pot.dm @@ -40,3 +40,16 @@ if(. == PROCESS_KILL) last_boil_temp = null + +/obj/item/chems/cooking_vessel/cauldron + name = "cauldron" + desc = "A large round-bodied vessel for making large quantities of potion or soup." + material = /decl/material/solid/metal/iron + color = /decl/material/solid/metal/iron::color + icon = 'icons/obj/food/cooking_vessels/cauldron.dmi' + volume = 1000 + w_class = ITEM_SIZE_STRUCTURE + density = TRUE + +/obj/item/chems/cooking_vessel/cauldron/can_be_picked_up(mob/user) + return FALSE diff --git a/icons/obj/food/cooking_vessels/cauldron.dmi b/icons/obj/food/cooking_vessels/cauldron.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7be32a10bde46e4549464f184f1c1bf40bc7b108 GIT binary patch literal 1078 zcmV-61j+k}P)005u_0{{R3dEt5<0000jP)t-sz`(%5 z!O8#s|4Bz&Wny;t`1p#7o}!|;RZ?j3^z-=p^x);`+S}g%|1-eAz%rM_zW@LL0d!JM zQvg8b*k%9#0O@*ESad{Xb7OL8aCB*JZU6vyoSl=w4uUWYhR^IN7Q7mRN{kmT24gtr zE0Dq}ENskdL*v_9;G|Il9+v!F`Za&sZN~S9V|wPvDP=dbPMU`Ac)W;MaF@bY6s%V) zs8E)b9|GsWBgyb?tP&v$gtU(0B?~SVG!FVTE3*hCHa^S2;U7qr8>wVdenvNRiwYhj zqs4aq;ry&!RBcl~{&6*szs<#8&Apd)roCnw!RMfq8|kNqM60izgGo?tei}i|>#=i^ z1y0&_mtVBjj$MSn!dUS1V5t+D|42-OtG}hr_~D%NU*QSE-SHiYfi-ae00P2EL_t(& zf$f>kZrVT)#!Zbul^V$|?3!a~UZ9CB&L9)3N9N$DM^9+N}4bK%_g=qvQldoF!} zyi3MJz^o~MtZpyO{3Im4+40ACv8_+wdCcqK{m0O$Uq4B%J~;KuvdpDpCq)u>C*3Fq z#1Tma0IZIB`c0bV`8d7a76MTeh482r6H=(C z%AIZ|-5eQr(oLl;keHm&H`EV1ePZ3u`q~(+F0*av0l6oeGLPeUO7!t{KTrC`sLMe{ zI_C6v&s!|+Eq!!7Gb-svmse&s^qi26RD^d*q{g2d85$WOQfgO*xl(ATjH?MVZDfgd zwTFI=BPwO`>~!yWhACc#(rBGHGQ1w(ePZx+?Pd@CZbz5*@_5$mI58Xy$BD*Ud6o`y z7bE(*d^{ldXlTw{7?xA{*~^o`)z^X-ch}KHy}@^Jvj5i5-R?0Ab2fGJV0%8FAJc!z ze?=w#(LC5H!_wlgUgy2yaNgU?i?NWR7l#LR{X7UuP;gk+&x1ntWOzi^&x5Bl!!QiP zFwFV177Loj_VQkJ{SN#P+tVidp)(Z@}E#@Np%1d5!mwu*2H(K$k=&L3aam9&(b00V`_l&g?2uy_4{Cn zea1Mn$1n`TFwB2UaJq#cO=K6E%e|gD|4%D`VoD32BfWS0QNy?2scMyfA1mr7Z{%ud z9}?JxVbhX79;q@0L=o-cR$~boOl2aN67y-JvZ;?hscHb+(%(!29Poxtysi;L4_aQ+ z`oMR;tZspkmafBBsO}*cTMv(aN29L2F7v6~(5ei~FbwnRc`A8%d$D`VhHS`&Y*_NU w>ixHdYnuy~hEE$mXNFtYkPX?84PU9@GbAMo@~I=ung9R*07*qoM6N<$f>5askpKVy literal 0 HcmV?d00001 From 7e9b86efe877a4ce8005f0adc2c9c131f156cffe Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 7 Dec 2024 12:55:57 +1100 Subject: [PATCH 116/554] Adding a candelabra. --- code/game/objects/items/candelabra.dm | 54 ++++++++++++++++++ code/game/objects/items/flame/_flame.dm | 4 +- code/game/objects/items/flame/flame_candle.dm | 10 +++- icons/obj/items/candelabra.dmi | Bin 0 -> 355 bytes icons/obj/items/flame/candle.dmi | Bin 1059 -> 1057 bytes nebula.dme | 1 + 6 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 code/game/objects/items/candelabra.dm create mode 100644 icons/obj/items/candelabra.dmi diff --git a/code/game/objects/items/candelabra.dm b/code/game/objects/items/candelabra.dm new file mode 100644 index 00000000000..1f82ec443aa --- /dev/null +++ b/code/game/objects/items/candelabra.dm @@ -0,0 +1,54 @@ +/datum/storage/candelabra + can_hold = list(/obj/item/flame/candle) + storage_slots = 3 + var/static/list/candle_offsets = list( + list("x" = -4, "y" = 17), + list("x" = 1, "y" = 19), + list("x" = 6, "y" = 17) + ) + +/datum/storage/candelabra/can_be_inserted(obj/item/W, mob/user, stop_messages, click_params) + . = ..() && holder && length(holder.get_stored_inventory()) < length(candle_offsets) + +/obj/item/candelabra + name = "candelabra" + desc = "A three-tined candle stand." + icon = 'icons/obj/items/candelabra.dmi' + icon_state = ICON_STATE_WORLD + storage = /datum/storage/candelabra + material = /decl/material/solid/metal/brass + material_alteration = MAT_FLAG_ALTERATION_ALL + +/obj/item/candelabra/attackby(obj/item/used_item, mob/user) + if(!user.check_intent(I_FLAG_HARM) && (used_item.isflamesource() || used_item.get_heat() > T100C)) + for(var/obj/item/flame/candle/candle in contents) + if(!candle.lit && candle.attackby(used_item, user)) + return TRUE + . = ..() + +/obj/item/candelabra/filled/Initialize(ml, material_key) + new /obj/item/flame/candle/random(src) + new /obj/item/flame/candle/random(src) + new /obj/item/flame/candle/random(src) + . = ..() + update_icon() + +// Workaround for vis_contents propagating color. +/obj/item/candelabra/on_update_icon() + ..() + var/datum/storage/candelabra/candles_storage = storage + if(istype(candles_storage)) + var/i = 1 + for(var/obj/item/flame/candle/candle in get_stored_inventory()) + var/offsets = candles_storage.candle_offsets[i] + candle.set_dir(SOUTH) + for(var/image/candle_overlay in candle.get_sconce_overlay()) + candle_overlay.pixel_x = offsets["x"] + candle_overlay.pixel_y = offsets["y"] + candle_overlay.dir = SOUTH + candle_overlay.appearance_flags |= RESET_COLOR|RESET_ALPHA + add_overlay(candle_overlay) + i++ + if(i > length(candles_storage.candle_offsets)) + break + compile_overlays() diff --git a/code/game/objects/items/flame/_flame.dm b/code/game/objects/items/flame/_flame.dm index 52c0cb31cc7..1078285da3b 100644 --- a/code/game/objects/items/flame/_flame.dm +++ b/code/game/objects/items/flame/_flame.dm @@ -205,9 +205,9 @@ if(!other.can_manually_light) other.light(user) -/obj/item/flame/attackby(obj/item/W, mob/user) +/obj/item/flame/attackby(obj/item/used_item, mob/user) - if(!user.check_intent(I_FLAG_HARM) && !can_manually_light && (W.isflamesource() || W.get_heat() > T100C)) + if(!user.check_intent(I_FLAG_HARM) && !can_manually_light && (used_item.isflamesource() || used_item.get_heat() > T100C)) light(user) return TRUE diff --git a/code/game/objects/items/flame/flame_candle.dm b/code/game/objects/items/flame/flame_candle.dm index dcf647104f6..906824d52bc 100644 --- a/code/game/objects/items/flame/flame_candle.dm +++ b/code/game/objects/items/flame/flame_candle.dm @@ -41,7 +41,7 @@ /obj/item/flame/candle/get_sconce_overlay() . = list(overlay_image(icon, "[icon_state]-sconce", color = color, flags = RESET_COLOR)) if(lit) - . += overlay_image(icon, "[icon_state]-sconce-lit", color = color, flags = RESET_COLOR) + . += overlay_image(icon, "[icon_state]-sconce-lit", color = COLOR_WHITE, flags = RESET_COLOR) /obj/item/flame/candle/on_update_icon() @@ -63,6 +63,9 @@ // TODO: emissives add_overlay(overlay_image(icon, "[icon_state]_lit", flags = RESET_COLOR)) + if(istype(loc, /obj/item/candelabra)) + loc.queue_icon_update() + /obj/item/flame/candle/proc/get_available_colors() return null @@ -83,6 +86,11 @@ /obj/item/flame/candle/get_available_scents() return null +/obj/item/flame/candle/set_dir(ndir) + if(istype(loc, /obj/item/candelabra)) + ndir = SOUTH + . = ..() + /obj/item/flame/candle/scented name = "scented candle" desc = "A candle which releases pleasant-smelling oils into the air when burned." diff --git a/icons/obj/items/candelabra.dmi b/icons/obj/items/candelabra.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3d0b0010945249def7f6a4317e5a1437c54b48a5 GIT binary patch literal 355 zcmV-p0i6DcP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+DJL;6TZxM^C9|j)$T#HTOe;#vO@*-Gs><_=a#C=qQdV&Fa{*fp02BWt+1k96 zrT_o{fk{L`R5*?8kFgSiAP__kA-#v#2N?S(rq2wf*Ma~47U`Yad_de{n|*V8OZ3-L z`~$F|M=|%FpDZIP_{Gk_i$KR#$7Uj+eKf9_{KN7xu9*zz!&Ft|oXp$RaRmV7RMH0l zRE8bqk2p*a_}VbSiuK?MR<@nnmSF{@3=iD8=mcK#3vrzggcm8Cd}N_w0b_bg*^j9?4d`GrrkXH JX0b9OGXOxC7Ayb& delta 55 zcmZ3;v6y2*BIC}9Nwd^hmd`dgJVoVokH*$>Gk}!l)^jZlrKh;o)#*KmVPx>!_4wzj Lz{lo`6&aZU!!sF% diff --git a/nebula.dme b/nebula.dme index 44929d11201..340b6ddc06f 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1086,6 +1086,7 @@ #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\buttons.dm" +#include "code\game\objects\items\candelabra.dm" #include "code\game\objects\items\christmas.dm" #include "code\game\objects\items\contraband.dm" #include "code\game\objects\items\crutches.dm" From dc462371a9431bf80853a15dcb7be443a702ecef Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 7 Dec 2024 14:24:29 +1100 Subject: [PATCH 117/554] Adding a small circular rug. --- code/game/objects/structures/rug.dm | 12 ++++++++++++ .../crafting/stack_recipes/recipes_grass.dm | 6 ++++++ .../crafting/stack_recipes/recipes_textiles.dm | 16 +++++++++++----- icons/obj/structures/rug.dmi | Bin 0 -> 352 bytes nebula.dme | 1 + 5 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 code/game/objects/structures/rug.dm create mode 100644 icons/obj/structures/rug.dmi diff --git a/code/game/objects/structures/rug.dm b/code/game/objects/structures/rug.dm new file mode 100644 index 00000000000..b4bf628184f --- /dev/null +++ b/code/game/objects/structures/rug.dm @@ -0,0 +1,12 @@ +/obj/structure/rug + name = "rug" + desc = "A small, circular floor covering." + icon = 'icons/obj/structures/rug.dmi' + material = /decl/material/solid/organic/cloth/wool + icon_state = ICON_STATE_WORLD + paint_color = COLOR_GRAY20 + color = COLOR_GRAY20 + +/obj/structure/rug/crafted + paint_color = null + color = null diff --git a/code/modules/crafting/stack_recipes/recipes_grass.dm b/code/modules/crafting/stack_recipes/recipes_grass.dm index d6f262e90bc..a492af45bb2 100644 --- a/code/modules/crafting/stack_recipes/recipes_grass.dm +++ b/code/modules/crafting/stack_recipes/recipes_grass.dm @@ -8,6 +8,12 @@ return FALSE return ..() +/decl/stack_recipe/woven/rug + result_type = /obj/structure/rug/crafted + one_per_turf = TRUE + on_floor = TRUE + category = "furniture" + /decl/stack_recipe/woven/basket result_type = /obj/item/basket diff --git a/code/modules/crafting/stack_recipes/recipes_textiles.dm b/code/modules/crafting/stack_recipes/recipes_textiles.dm index c43dffe7ce1..b9dba122da8 100644 --- a/code/modules/crafting/stack_recipes/recipes_textiles.dm +++ b/code/modules/crafting/stack_recipes/recipes_textiles.dm @@ -7,9 +7,15 @@ crafting_extra_cost_factor = 1.5 // measure twice, cut once; material is lost. todo: produce scraps? abstract_type = /decl/stack_recipe/textiles +/decl/stack_recipe/textiles/rug + result_type = /obj/structure/rug/crafted + one_per_turf = TRUE + on_floor = TRUE + category = "furniture" + /decl/stack_recipe/textiles/cloak - result_type = /obj/item/clothing/suit/cloak/hide - category = "clothing" + result_type = /obj/item/clothing/suit/cloak/hide + category = "clothing" /decl/stack_recipe/textiles/banner name = "banner" @@ -60,9 +66,9 @@ category = "clothing" /decl/stack_recipe/textiles/leather/bedroll - result_type = /obj/item/bedroll - difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. - category = "bedding" + result_type = /obj/item/bedroll + difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. + category = "bedding" /decl/stack_recipe/textiles/leather/shoes result_type = /obj/item/clothing/shoes/craftable diff --git a/icons/obj/structures/rug.dmi b/icons/obj/structures/rug.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ab64dd8fba6a20b5be1a4790a19316ab78a05240 GIT binary patch literal 352 zcmV-m0iXVfP)i?^ zC?`dUi!&v&s2IpMx4!`(Mp%u<@hb1| ziE$6wxG(dRwefEeN!rj_N|8+k`2{#GMH#LjA{pM0HNl&p-@GxLKvg-LjT&{OB0T@a y+|G|#&wU0%7R^J|2DT6-3n*d%d*ptEc9sjA<$8$FksV_I0000 Date: Sat, 7 Dec 2024 15:11:48 +1100 Subject: [PATCH 118/554] Added several wider pillars. --- code/game/objects/structures/pillar.dm | 11 +++++++++++ .../crafting/stack_recipes/recipes_bricks.dm | 13 +++++++++++++ .../obj/structures/pillars/pillar_wide_inset.dmi | Bin 0 -> 387 bytes .../obj/structures/pillars/pillar_wide_round.dmi | Bin 0 -> 390 bytes .../obj/structures/pillars/pillar_wide_square.dmi | Bin 0 -> 347 bytes 5 files changed, 24 insertions(+) create mode 100644 icons/obj/structures/pillars/pillar_wide_inset.dmi create mode 100644 icons/obj/structures/pillars/pillar_wide_round.dmi create mode 100644 icons/obj/structures/pillars/pillar_wide_square.dmi diff --git a/code/game/objects/structures/pillar.dm b/code/game/objects/structures/pillar.dm index 6f625ac789b..6c77b5c5379 100644 --- a/code/game/objects/structures/pillar.dm +++ b/code/game/objects/structures/pillar.dm @@ -17,3 +17,14 @@ /obj/structure/pillar/triad icon = 'icons/obj/structures/pillars/pillar_triad.dmi' + +/obj/structure/pillar/wide + name = "wide pillar" + w_class = ITEM_SIZE_LARGE_STRUCTURE + icon = 'icons/obj/structures/pillars/pillar_wide_round.dmi' + +/obj/structure/pillar/wide/square + icon = 'icons/obj/structures/pillars/pillar_wide_square.dmi' + +/obj/structure/pillar/wide/inset + icon = 'icons/obj/structures/pillars/pillar_wide_inset.dmi' diff --git a/code/modules/crafting/stack_recipes/recipes_bricks.dm b/code/modules/crafting/stack_recipes/recipes_bricks.dm index 1901075e8e0..ec8bf11e3b3 100644 --- a/code/modules/crafting/stack_recipes/recipes_bricks.dm +++ b/code/modules/crafting/stack_recipes/recipes_bricks.dm @@ -71,6 +71,19 @@ name = "pillar, round" result_type = /obj/structure/pillar/round +/decl/stack_recipe/bricks/furniture/pillar/wide_round + name = "pillar, wide round" + result_type = /obj/structure/pillar/wide + +/decl/stack_recipe/bricks/furniture/pillar/wide_square + name = "pillar, wide square" + + result_type = /obj/structure/pillar/wide/square + +/decl/stack_recipe/bricks/furniture/pillar/wide_inset + name = "pillar, wide inset" + result_type = /obj/structure/pillar/wide/inset + /decl/stack_recipe/bricks/furniture/pillar/pedestal name = "pedestal, square" result_type = /obj/structure/pedestal diff --git a/icons/obj/structures/pillars/pillar_wide_inset.dmi b/icons/obj/structures/pillars/pillar_wide_inset.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8f307cd2eb0b4e4ad7be6734a1be1a50b223b3f8 GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{S0LThHSf^Dlb-G|*RJ0B z|NnouyYT^_C}T;GUoeBivm0qZPG(g|M2SmkadJ^+K}lwQ9s@(goZzs6qSEhQf(t%= zeWK;9t99jJaWn(XeIgchCnG~WBywYaBhPrEK zx3TKx6%r@RpFHx>_B!L+x?!ql%-@&;$CwzbnWT&vvb3K9EnVg5;uxYav2;Q&Z?l4c z+g7~`hxH0Lm?hK=jxy$y{14@-VV~2v?}&@t{l6a9?>e-apWCZz&~%VB(aFF{@XnO% zI4uKz$G3`(bAy_eHZ@2++ciDs+Hc>gJn5!_qCA7&$)e52S$?LSkxWf!Gioq02$r;4 z*c+d;{@B6vr1GRASuCkvEd(5EPL}V{C_3==`{%9v3qQ6V{L&f!_^`p6i3esxIhANe fo{X}%eD;RDZn5pj3W2krz-91s^>bP0l+XkKhH{;r literal 0 HcmV?d00001 diff --git a/icons/obj/structures/pillars/pillar_wide_round.dmi b/icons/obj/structures/pillars/pillar_wide_round.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c0625980dd8753fcb66fba404b086387fe7e2d98 GIT binary patch literal 390 zcmV;10eSw3P)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*+P6 zMdnPMSmN)Hwk%%;E4ZPh#_&{-;g}O*2Qda<$$1!5sGZ56wUmu!V=HC-yJ6MP*WPg% zI1~t6DG8#$R;hp&-z((2$QyKw9f5fnJ8X4r=^myEnvue&)brOD@*Q}*S_M^s5$AYM kNlYK9y!$Dim(^>20RPc0p&`v}N&o-=07*qoM6N<$f)Y=nn*aa+ literal 0 HcmV?d00001 diff --git a/icons/obj/structures/pillars/pillar_wide_square.dmi b/icons/obj/structures/pillars/pillar_wide_square.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a5ea0d80445b27b3f5b3ff849f3e779f4a47951b GIT binary patch literal 347 zcmV-h0i^zkP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*+P6ES+`vw;%^cz0PgpMPvYXlYju1a3TX=X%TnjS tNWv9JjOvVmQ*%WpVVf0|N?fV0eE@t%G>Z98YI6Vp002ovPDHLkV1jY6i< Date: Mon, 2 Dec 2024 18:54:24 +1100 Subject: [PATCH 119/554] Adding gemstones and basic gemcutting. --- code/game/turfs/flooring/_flooring.dm | 3 + code/game/turfs/flooring/flooring_grass.dm | 4 + code/game/turfs/floors/floor_digging.dm | 29 +++-- code/game/turfs/turf_digging.dm | 38 ++++-- code/game/turfs/walls/wall_natural.dm | 5 + code/modules/gemstones/_gemstone.dm | 89 ++++++++++++++ code/modules/gemstones/gemstone_cuts.dm | 75 ++++++++++++ code/modules/materials/_materials.dm | 5 + .../solids/materials_solid_gemstones.dm | 111 ++++++++++-------- .../solids/materials_solid_mineral.dm | 2 + .../solids/materials_solid_stone.dm | 2 + code/modules/mechs/equipment/utility.dm | 2 +- code/modules/mining/drilling/drill_act.dm | 2 +- icons/obj/items/gemstones/baguette.dmi | Bin 0 -> 423 bytes icons/obj/items/gemstones/hexagon.dmi | Bin 0 -> 419 bytes icons/obj/items/gemstones/octagon.dmi | Bin 0 -> 445 bytes icons/obj/items/gemstones/poor.dmi | Bin 0 -> 382 bytes icons/obj/items/gemstones/round.dmi | Bin 0 -> 401 bytes icons/obj/items/gemstones/uncut.dmi | Bin 0 -> 538 bytes mods/content/fantasy/datum/skills.dm | 5 +- nebula.dme | 2 + 21 files changed, 303 insertions(+), 71 deletions(-) create mode 100644 code/modules/gemstones/_gemstone.dm create mode 100644 code/modules/gemstones/gemstone_cuts.dm create mode 100644 icons/obj/items/gemstones/baguette.dmi create mode 100644 icons/obj/items/gemstones/hexagon.dmi create mode 100644 icons/obj/items/gemstones/octagon.dmi create mode 100644 icons/obj/items/gemstones/poor.dmi create mode 100644 icons/obj/items/gemstones/round.dmi create mode 100644 icons/obj/items/gemstones/uncut.dmi diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index 3fc9cf8adc2..9d3ce2f33cf 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -347,3 +347,6 @@ var/global/list/flooring_cache = list() /decl/flooring/proc/handle_environment_proc(turf/floor/target) return PROCESS_KILL + +/decl/flooring/proc/handle_turf_digging(turf/floor/target) + return TRUE diff --git a/code/game/turfs/flooring/flooring_grass.dm b/code/game/turfs/flooring/flooring_grass.dm index 802c509f573..a9e70bbf736 100644 --- a/code/game/turfs/flooring/flooring_grass.dm +++ b/code/game/turfs/flooring/flooring_grass.dm @@ -21,6 +21,10 @@ return TRUE return ..() +/decl/flooring/grass/handle_turf_digging(turf/floor/target) + target.set_flooring(null) + return FALSE + /decl/flooring/grass/wild name = "wild grass" icon = 'icons/turf/flooring/wildgrass.dmi' diff --git a/code/game/turfs/floors/floor_digging.dm b/code/game/turfs/floors/floor_digging.dm index 4262e953ad8..3351970e8af 100644 --- a/code/game/turfs/floors/floor_digging.dm +++ b/code/game/turfs/floors/floor_digging.dm @@ -1,3 +1,6 @@ +/turf/floor + var/gemstone_dropped = FALSE + /turf/floor/proc/is_fundament() var/decl/flooring/flooring = get_topmost_flooring() return flooring ? !flooring.constructed : TRUE @@ -23,21 +26,31 @@ /turf/floor/can_dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return can_be_dug(tool_hardness, using_tool) && get_physical_height() > -(FLUID_DEEP) -/turf/floor/dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) - if(!is_fundament()) +/turf/floor/dig_trench(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) + if(is_fundament()) + handle_trench_digging(user) + +/turf/floor/proc/handle_trench_digging(mob/user) + var/decl/flooring/flooring = get_topmost_flooring() + if(!flooring.handle_turf_digging(src)) return - var/new_height = max(get_physical_height()-TRENCH_DEPTH_PER_ACTION, -(FLUID_DEEP)) - var/height_diff = abs(get_physical_height()-new_height) // Only drop mats if we actually changed the turf height sufficiently. + var/old_height = get_physical_height() + var/new_height = max(old_height-TRENCH_DEPTH_PER_ACTION, -(FLUID_DEEP)) + var/height_diff = abs(old_height-new_height) if(height_diff >= TRENCH_DEPTH_PER_ACTION) - drop_diggable_resources() + drop_diggable_resources(user) set_physical_height(new_height) -/turf/floor/dig_pit(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/floor/dig_pit(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return has_flooring() ? null : ..() /turf/floor/get_diggable_resources() var/decl/material/my_material = get_material() if(is_fundament() && istype(my_material) && my_material.dug_drop_type && (get_physical_height() > -(FLUID_DEEP))) - return list(my_material.dug_drop_type = list(3, 2)) - return null + . = list() + .[my_material.dug_drop_type] = list("amount" = 3, "variance" = 2, "material" = my_material.type) + if(!gemstone_dropped && prob(my_material.gemstone_chance) && LAZYLEN(my_material.gemstone_types)) + gemstone_dropped = TRUE + var/gem_mat = pick(my_material.gemstone_types) + .[/obj/item/gemstone] = list("amount" = 1, "material" = gem_mat) diff --git a/code/game/turfs/turf_digging.dm b/code/game/turfs/turf_digging.dm index 6eea34afe2e..5f832ae8045 100644 --- a/code/game/turfs/turf_digging.dm +++ b/code/game/turfs/turf_digging.dm @@ -1,5 +1,5 @@ -/// Return an assoc list of resource item type to a base and a random component -/// ex. return list(/obj/item/stack/material/ore/handful/sand = list(3, 2)) +/// Return an assoc list of resource item type to a metadata list containing base amount, random component, and material override +/// ex. return list(/obj/item/stack/material/ore/handful/sand = list("amount" = 3, "variance" = 2, "material" = /decl/material/foo)) /turf/proc/get_diggable_resources() return null @@ -10,17 +10,31 @@ /turf/proc/can_be_dug(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return FALSE -/turf/proc/drop_diggable_resources() +/turf/proc/drop_diggable_resources(mob/user) SHOULD_CALL_PARENT(TRUE) var/list/diggable_resources = get_diggable_resources() if(!length(diggable_resources)) return for(var/resource_type in diggable_resources) - var/list/resource_amounts = diggable_resources[resource_type] + + var/list/resource_data = diggable_resources[resource_type] + var/list/loot = list() + var/amount = max(1, resource_data["amount"] + resource_data["variance"]) + var/spawn_material = resource_data["material"] + if(ispath(resource_type, /obj/item/stack)) - LAZYADD(., new resource_type(src, resource_amounts[1] + rand(resource_amounts[2]), get_material_type())) + loot += new resource_type(src, amount, spawn_material) else - LAZYADD(., new resource_type(src, get_material_type())) + for(var/i = 1 to amount) + loot += new resource_type(src, spawn_material) + + if(length(loot)) + if(user) + for(var/obj/item/thing in loot) + if(thing.material && thing.material != get_material()) + to_chat(user, SPAN_NOTICE("You unearth \a [thing]!")) + LAZYADD(., loot) + clear_diggable_resources() // Procs for digging pits. @@ -29,10 +43,10 @@ /turf/proc/try_dig_pit(var/mob/user, var/obj/item/tool, using_tool = TOOL_SHOVEL) if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 5 SECONDS, check_skill = SKILL_HAULING, set_cooldown = TRUE)) - return dig_pit(tool?.material?.hardness, using_tool) + return dig_pit(user, tool?.material?.hardness, using_tool) return null -/turf/proc/dig_pit(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/proc/dig_pit(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return can_dig_pit(tool_hardness, using_tool) && new /obj/structure/pit(src) // Procs for digging farms. @@ -44,10 +58,10 @@ if(!material?.tillable) return if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 5 SECONDS, set_cooldown = TRUE, check_skill = SKILL_BOTANY)) - return dig_farm(tool?.material?.hardness, using_tool) + return dig_farm(user, tool?.material?.hardness, using_tool) return null -/turf/proc/dig_farm(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/proc/dig_farm(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return can_dig_farm(tool_hardness, using_tool) && new /obj/machinery/portable_atmospherics/hydroponics/soil(src) // Proc for digging trenches. @@ -56,8 +70,8 @@ /turf/proc/try_dig_trench(mob/user, obj/item/tool, using_tool = TOOL_SHOVEL) if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 2.5 SECONDS, check_skill = SKILL_HAULING, set_cooldown = TRUE)) - return dig_trench(tool?.material?.hardness, using_tool) + return dig_trench(user, tool?.material?.hardness, using_tool) return null -/turf/proc/dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/proc/dig_trench(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return FALSE diff --git a/code/game/turfs/walls/wall_natural.dm b/code/game/turfs/walls/wall_natural.dm index e878e59747e..96967f55e2e 100644 --- a/code/game/turfs/walls/wall_natural.dm +++ b/code/game/turfs/walls/wall_natural.dm @@ -10,6 +10,7 @@ var/image/ore_overlay var/static/list/exterior_wall_shine_cache = list() var/being_mined = FALSE + var/gem_dropped = FALSE /turf/wall/natural/flooded flooded = /decl/material/liquid/water @@ -150,6 +151,10 @@ if(prob(30) && !ramp_slope_direction && material) var/drop_type = material.ore_type || /obj/item/stack/material/ore pass_geodata_to(new drop_type(src, material.ore_result_amount, material.type)) + if(!gem_dropped && material && prob(material.gemstone_chance) && LAZYLEN(material.gemstone_types)) + gem_dropped = TRUE + new /obj/item/gemstone(get_turf(src), pickweight(material.gemstone_types)) + visible_message(SPAN_NOTICE("A glimmer of colour shines amongst the rubble...")) /turf/wall/natural/proc/pass_geodata_to(obj/O) var/datum/extension/geological_data/ours = get_extension(src, /datum/extension/geological_data) diff --git a/code/modules/gemstones/_gemstone.dm b/code/modules/gemstones/_gemstone.dm new file mode 100644 index 00000000000..087266d34f8 --- /dev/null +++ b/code/modules/gemstones/_gemstone.dm @@ -0,0 +1,89 @@ +var/global/list/_available_gemstone_cuts + +/proc/get_available_gemstone_cuts() + if(!global._available_gemstone_cuts) + global._available_gemstone_cuts = list() + for(var/decl/gemstone_cut/cut as anything in decls_repository.get_decls_of_type_unassociated(/decl/gemstone_cut)) + if(cut.can_be_cut) + global._available_gemstone_cuts += cut + return global._available_gemstone_cuts + +/obj/item/gemstone + name = "uncut gemstone" + desc = "A hunk of uncut gemstone." + icon = 'icons/obj/items/gemstones/uncut.dmi' + w_class = ITEM_SIZE_TINY + material = /decl/material/solid/gemstone/diamond + material_alteration = MAT_FLAG_ALTERATION_COLOR // Name and desc are handled manually. + var/decl/gemstone_cut/cut = /decl/gemstone_cut/uncut + var/work_skill = SKILL_CONSTRUCTION + +/obj/item/gemstone/Initialize(ml, material_key) + cut = GET_DECL(cut) + . = ..() + update_from_cut() + +/obj/item/gemstone/proc/update_from_cut() + icon = cut.icon + desc = cut.desc + update_name() + update_icon() + +/obj/item/gemstone/update_name() + SetName("[cut.adjective] [material.solid_name]") + +/obj/item/gemstone/get_single_monetary_worth() + . = ..() * cut.worth_multiplier + +/obj/item/gemstone/attackby(obj/item/used_item, mob/user) + if(IS_HAMMER(used_item) && !user.check_intent(I_FLAG_HARM)) // TOOL_CHISEL when? + if(!cut.can_attempt_cut) + to_chat(user, SPAN_WARNING("\The [src] has already been cut.")) + return TRUE + var/decl/gemstone_cut/desired_cut = input(user, "What cut would you like to attempt?", "Cut Gemstone") as null|anything in get_available_gemstone_cuts() + if(!desired_cut || QDELETED(src) || QDELETED(user) || !CanPhysicallyInteract(user) || !cut.can_attempt_cut) + return TRUE + user.visible_message(SPAN_NOTICE("\The [user] begins carefully cutting \the [src].")) + if(!user.do_skilled(10 SECONDS, work_skill, src, check_holding = TRUE) || !CanPhysicallyInteract(user)) + if(QDELETED(src) || !cut.can_attempt_cut || QDELETED(user)) + return TRUE + to_chat(user, SPAN_DANGER("You were interrupted, botching the cut!")) + cut = GET_DECL(/decl/gemstone_cut/poor) + else + if(QDELETED(src) || !cut.can_attempt_cut || QDELETED(user)) + return TRUE + user.visible_message(SPAN_NOTICE("\The [user] finishes cutting \the [src].")) + if(user.skill_fail_prob(work_skill, 100, SKILL_EXPERT)) + to_chat(user, SPAN_DANGER("You've done a really poor job...")) + cut = GET_DECL(/decl/gemstone_cut/poor) + else + cut = desired_cut + update_from_cut() + return TRUE + . = ..() + +// Subtypes for mapping/spawning etc. +/obj/item/gemstone/poor + name = "poorly-cut diamond" + cut = /decl/gemstone_cut/poor + icon = 'icons/obj/items/gemstones/poor.dmi' + +/obj/item/gemstone/baguette + name = "baguette-cut diamond" + cut = /decl/gemstone_cut/baguette + icon = 'icons/obj/items/gemstones/baguette.dmi' + +/obj/item/gemstone/hexagon + name = "hexagon-cut diamond" + cut = /decl/gemstone_cut/hexagon + icon = 'icons/obj/items/gemstones/hexagon.dmi' + +/obj/item/gemstone/octagon + name = "octagon-cut diamond" + cut = /decl/gemstone_cut/octagon + icon = 'icons/obj/items/gemstones/octagon.dmi' + +/obj/item/gemstone/round + name = "round-cut diamond" + cut = /decl/gemstone_cut/round + icon = 'icons/obj/items/gemstones/round.dmi' diff --git a/code/modules/gemstones/gemstone_cuts.dm b/code/modules/gemstones/gemstone_cuts.dm new file mode 100644 index 00000000000..86509cc2c17 --- /dev/null +++ b/code/modules/gemstones/gemstone_cuts.dm @@ -0,0 +1,75 @@ +/decl/gemstone_cut + abstract_type = /decl/gemstone_cut + var/worth_multiplier = 1.5 + var/name + var/desc + var/adjective + var/icon + // Can we cut this cut into a new cut? + var/can_attempt_cut = FALSE + // Can we attempt to cut to this cut? + var/can_be_cut = TRUE + +/decl/gemstone_cut/validate() + . = ..() + if(!istext(name)) + . += "invalid or null name" + if(!istext(desc)) + . += "invalid or null desc" + if(!istext(adjective)) + . += "invalid or null adjective" + if(icon) + if(!check_state_in_icon(ICON_STATE_WORLD, icon)) + . += "missing world state from '[icon]'" + if(!check_state_in_icon(ICON_STATE_INV, icon)) + . += "missing inventory state from '[icon]'" + var/check_state = "[ICON_STATE_WORLD]-set" + if(!check_state_in_icon(check_state, icon)) + . += "missing state '[check_state]' from '[icon]'" + check_state = "[ICON_STATE_INV]-set" + if(!check_state_in_icon(check_state, icon)) + . += "missing state '[check_state]' from '[icon]'" + else + . += "null or unset icon" + +// Subtypes below. +/decl/gemstone_cut/uncut + name = "uncut" + adjective = "uncut" + desc = "A rough, uncut gemstone." + icon = 'icons/obj/items/gemstones/uncut.dmi' + can_attempt_cut = TRUE + can_be_cut = FALSE + worth_multiplier = 1 + +/decl/gemstone_cut/poor + name = "poorly-cut" + adjective = "poorly-cut" + desc = "A poorly-cut and uneven gemstone." + icon = 'icons/obj/items/gemstones/poor.dmi' + worth_multiplier = 0.5 + can_be_cut = FALSE + +/decl/gemstone_cut/baguette + name = "baguette" + adjective = "baguette-cut" + desc = "A square-cut gemstone." + icon = 'icons/obj/items/gemstones/baguette.dmi' + +/decl/gemstone_cut/hexagon + name = "hexagon" + adjective = "hexagon-cut" + desc = "A hexagon-cut gemstone." + icon = 'icons/obj/items/gemstones/hexagon.dmi' + +/decl/gemstone_cut/octagon + name = "octagon" + adjective = "octagon-cut" + desc = "A octagon-cut gemstone." + icon = 'icons/obj/items/gemstones/octagon.dmi' + +/decl/gemstone_cut/round + name = "round" + adjective = "round-cut" + desc = "A round-cut gemstone." + icon = 'icons/obj/items/gemstones/round.dmi' diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 01aa188e0cc..4b12ce62dee 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -363,6 +363,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /// If an item has a null paint_verb, it automatically sets it based on material. var/paint_verb = "painted" + /// Chance of a natural wall made of this material dropping a gemstone, if the gemstone_types list is populated. + var/gemstone_chance = 5 + /// Assoc weighted list of gemstone material types to weighting. + var/list/gemstone_types + // Placeholders for light tiles and rglass. /decl/material/proc/reinforce(var/mob/user, var/obj/item/stack/material/used_stack, var/obj/item/stack/material/target_stack, var/use_sheets = 1) if(!used_stack.can_use(use_sheets)) diff --git a/code/modules/materials/definitions/solids/materials_solid_gemstones.dm b/code/modules/materials/definitions/solids/materials_solid_gemstones.dm index f0718ad4ccf..dcb3b5d38a6 100644 --- a/code/modules/materials/definitions/solids/materials_solid_gemstones.dm +++ b/code/modules/materials/definitions/solids/materials_solid_gemstones.dm @@ -1,54 +1,69 @@ /decl/material/solid/gemstone - name = null - flags = MAT_FLAG_UNMELTABLE - cut_delay = 60 - color = COLOR_DIAMOND - opacity = 0.4 - shard_type = SHARD_SHARD - tableslam_noise = 'sound/effects/Glasshit.ogg' - reflectiveness = MAT_VALUE_MIRRORED - conductive = 0 - ore_icon_overlay = "gems" - default_solid_form = /obj/item/stack/material/gemstone - abstract_type = /decl/material/solid/gemstone - sound_manipulate = 'sound/foley/pebblespickup1.ogg' - sound_dropped = 'sound/foley/pebblesdrop1.ogg' + flags = MAT_FLAG_UNMELTABLE + cut_delay = 60 + color = COLOR_DIAMOND + opacity = 0.4 + shard_type = SHARD_SHARD + tableslam_noise = 'sound/effects/Glasshit.ogg' + conductive = 0 + ore_icon_overlay = "gems" + default_solid_form = /obj/item/stack/material/gemstone + abstract_type = /decl/material/solid/gemstone + sound_manipulate = 'sound/foley/pebblespickup1.ogg' + sound_dropped = 'sound/foley/pebblesdrop1.ogg' + exoplanet_rarity_plant = MAT_RARITY_UNCOMMON + exoplanet_rarity_gas = MAT_RARITY_NOWHERE + dissolves_in = MAT_SOLVENT_IMMUNE + dissolves_into = null + hardness = MAT_VALUE_VERY_HARD + reflectiveness = MAT_VALUE_VERY_SHINY + construction_difficulty = MAT_VALUE_VERY_HARD_DIY /decl/material/solid/gemstone/diamond - name = "diamond" - uid = "solid_diamond" - lore_text = "An extremely hard allotrope of carbon. Valued for its use in industrial tools." - melting_point = 4300 - boiling_point = null - ignition_point = null - brute_armor = 10 - burn_armor = 50 // Diamond walls are immune to fire, therefore it makes sense for them to be almost undamageable by burn damage type. - stack_origin_tech = @'{"materials":6}' - hardness = MAT_VALUE_VERY_HARD + 20 - construction_difficulty = MAT_VALUE_VERY_HARD_DIY - ore_name = "rough diamonds" - ore_result_amount = 1 - ore_spread_chance = 10 - ore_scan_icon = "mineral_rare" - xarch_source_mineral = /decl/material/gas/ammonia - value = 1.8 - sparse_material_weight = 5 - rich_material_weight = 5 - ore_type_value = ORE_PRECIOUS - ore_data_value = 2 - exoplanet_rarity_plant = MAT_RARITY_UNCOMMON - exoplanet_rarity_gas = MAT_RARITY_NOWHERE - dissolves_in = MAT_SOLVENT_IMMUNE - dissolves_into = null + name = "diamond" + uid = "solid_diamond" + lore_text = "An extremely hard allotrope of carbon. Valued for its use in industrial tools." + melting_point = 4300 + boiling_point = null + ignition_point = null + brute_armor = 10 + burn_armor = 50 // Diamond walls are immune to fire, therefore it makes sense for them to be almost undamageable by burn damage type. + stack_origin_tech = @'{"materials":6}' + hardness = MAT_VALUE_VERY_HARD + 20 + ore_name = "rough diamonds" + ore_result_amount = 1 + ore_spread_chance = 10 + ore_scan_icon = "mineral_rare" + xarch_source_mineral = /decl/material/gas/ammonia + value = 1.8 + sparse_material_weight = 5 + rich_material_weight = 5 + ore_type_value = ORE_PRECIOUS + ore_data_value = 2 /decl/material/solid/gemstone/crystal - name = "crystal" - uid = "solid_crystal" - hardness = MAT_VALUE_VERY_HARD - reflectiveness = MAT_VALUE_VERY_SHINY + name = "crystal" + uid = "solid_crystal" + value = 2 hidden_from_codex = TRUE - value = 2 - exoplanet_rarity_plant = MAT_RARITY_UNCOMMON - exoplanet_rarity_gas = MAT_RARITY_NOWHERE - dissolves_in = MAT_SOLVENT_IMMUNE - dissolves_into = null + +/decl/material/solid/gemstone/ruby + name = "ruby" + lore_text = "A rich red stone sometimes found in marble." + uid = "solid_ruby" + value = 1.6 + color = "#d00000" + +/decl/material/solid/gemstone/sapphire + name = "sapphire" + lore_text = "A deep blue gemstone sometimes found in clay or other sediment." + uid = "solid_sapphite" + value = 1.6 + color = "#2983de" + +/decl/material/solid/gemstone/topaz + name = "topaz" + lore_text = "A golden gemstone sometimes found in granite." + uid = "solid_topaz" + value = 1.6 + color = "#f7b92d" diff --git a/code/modules/materials/definitions/solids/materials_solid_mineral.dm b/code/modules/materials/definitions/solids/materials_solid_mineral.dm index 2be84c6c5df..3dea5d14d81 100644 --- a/code/modules/materials/definitions/solids/materials_solid_mineral.dm +++ b/code/modules/materials/definitions/solids/materials_solid_mineral.dm @@ -258,6 +258,8 @@ // lower than the temperature expected from a kiln so that clay can be used to make bricks to make a high-temperature kiln. bakes_into_at_temperature = 950 CELSIUS can_backfill_turf_type = /turf/floor/clay + gemstone_chance = 0.01 + gemstone_types = list(/decl/material/solid/gemstone/sapphire = 1) /decl/material/solid/soil name = "soil" diff --git a/code/modules/materials/definitions/solids/materials_solid_stone.dm b/code/modules/materials/definitions/solids/materials_solid_stone.dm index 6334b03f1b8..acf1e65ed86 100644 --- a/code/modules/materials/definitions/solids/materials_solid_stone.dm +++ b/code/modules/materials/definitions/solids/materials_solid_stone.dm @@ -51,6 +51,7 @@ brute_armor = 15 explosion_resistance = 15 integrity = 500 //granite is very strong + gemstone_types = list(/decl/material/solid/gemstone/topaz = 1) dissolves_into = list( /decl/material/solid/silicon = 0.75, /decl/material/solid/bauxite = 0.15, @@ -88,6 +89,7 @@ brute_armor = 3 integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system construction_difficulty = MAT_VALUE_HARD_DIY + gemstone_types = list(/decl/material/solid/gemstone/ruby = 1) /decl/material/solid/stone/basalt name = "basalt" diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm index f645599c8ac..f76503b97bb 100644 --- a/code/modules/mechs/equipment/utility.dm +++ b/code/modules/mechs/equipment/utility.dm @@ -517,7 +517,7 @@ for(var/turf/asteroid as anything in RANGE_TURFS(target, 1)) if (!(get_dir(owner, asteroid) & owner.dir)) continue - if(asteroid.can_be_dug(drill_head.material?.hardness) && asteroid.drop_diggable_resources()) + if(asteroid.can_be_dug(drill_head.material?.hardness) && asteroid.drop_diggable_resources(user)) drill_head.durability -= 1 scoop_ore(asteroid) return diff --git a/code/modules/mining/drilling/drill_act.dm b/code/modules/mining/drilling/drill_act.dm index 6a17a4c5b53..39759df1a4c 100644 --- a/code/modules/mining/drilling/drill_act.dm +++ b/code/modules/mining/drilling/drill_act.dm @@ -1,7 +1,7 @@ /turf/proc/drill_act() SHOULD_CALL_PARENT(TRUE) drop_diggable_resources() - dig_pit(MAT_VALUE_VERY_HARD) + dig_pit(tool_hardness = MAT_VALUE_VERY_HARD) var/base_turf = get_base_turf_by_area(src) if(!istype(src, base_turf)) return ChangeTurf(base_turf) diff --git a/icons/obj/items/gemstones/baguette.dmi b/icons/obj/items/gemstones/baguette.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1fecb840ccbf5ded0e5e05be39e759c59eaaae30 GIT binary patch literal 423 zcmV;Y0a*TtP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Gp{T)uOz>yQi+Q*C9|j)C}zmTnO2mTn+jpWRhH)$<)jc)1vgK(IJJa0Gx4cZ zR&e!m0ecJpTK_=<$43C`0002CNklz<=fH%o}n5;R(};BJ66nX~yHcCTpUcq72-0cXy9%Lm0?6pg)T RrF;MY002ovPDHLkV1g8@vlIXT literal 0 HcmV?d00001 diff --git a/icons/obj/items/gemstones/hexagon.dmi b/icons/obj/items/gemstones/hexagon.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8b9b72ab45371ba64bd05443aa8b344dbc7aa05e GIT binary patch literal 419 zcmV;U0bKrxP)V=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zDKoDuHLoPUs8WfGGbOXA7$|1Q#hF%=n41b=!&R2&7v-c7R0TIrw>Y(gI5Y97R90~H za{+q{09yY+1II@I>i_@%wMj%lR7i>KltC7QAPfbea)1IJpuBJZ6Fq>~``@W{$B%tx zZ~eO@lL0n3_g{G$b6*S~$+^N)Mupb`E~rQ-^pp}PJfU!?g)4OpVVMBPG3MMgSQvmn zg{gLpZQE95U^KLbhFW6n4I=6eW8|?nwASE=unT+{kHUK6=F;@fNtbmsS{9DzBKT8RQtO1?X0`A=Tl@DZJ5|aXjh!X$+ N002ovPDHLkV1hDUtkwVk literal 0 HcmV?d00001 diff --git a/icons/obj/items/gemstones/octagon.dmi b/icons/obj/items/gemstones/octagon.dmi new file mode 100644 index 0000000000000000000000000000000000000000..06b5d8617572be65c905bcee8a4f6b25db21fda6 GIT binary patch literal 445 zcmV;u0Yd(XP)p8x;V=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zDKoDuHLoPUs8WfGGbOXA7$|1Q#hF%=n41b=!&R2&7v-c7R0TIrw>Y(gI5Y97R90~H za{+q{09yY+1II@I>i_@%&q+iKl*)-z0j`1V9a@2Uvoh61;B*B8b@IGXP0py nJ%$~(&Q{t7nB9^)cfRHg>yH^c0zk}a00000NkvXXu0mjfGR?Zi literal 0 HcmV?d00001 diff --git a/icons/obj/items/gemstones/poor.dmi b/icons/obj/items/gemstones/poor.dmi new file mode 100644 index 0000000000000000000000000000000000000000..95fb0bb44f4e3fae2f36829be265e99c5e107d0e GIT binary patch literal 382 zcmV-^0fGLBP)V=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zDKoDuHLoPUs8WfGGbOXA7$|1Q#hF%=n41b=!&R2&7v-c7R0TIrw>Y(gI5Y97R90~H za{+q{09yY+1II@I>i_@%kV!;AR7i>KlfezcAPfKKuUb_3Fc&7~KhVcQbhWi6pt0_2l~lwJjF#bs`X3p{Nteu=Bz`;cw{i cjY;w+Z;A8@xVZmdk^lez07*qoM6N<$g0dl?b^rhX literal 0 HcmV?d00001 diff --git a/icons/obj/items/gemstones/round.dmi b/icons/obj/items/gemstones/round.dmi new file mode 100644 index 0000000000000000000000000000000000000000..12517ea0b4f5358688b42a8bc61a44ee8f38d4e0 GIT binary patch literal 401 zcmV;C0dD?@P)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Gp{T)uOz>yQi+Q*C9|j)C}zmTnO2mTn+jpWRhH)$<)jc)1vgK(IJJa0Gx4cZ zR&e!m0ecJpTK_=<$43C`0001>NklH1vqxoL$SXkyLiM*w{N0 z_qBNJsTU9t8%c!_eBUt0?|^361YoV@0ljU!4!r&-PPqnsQBNlKQ2rt??7gNCe00DGTPE!Ct=GbNc004n{R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Gp{T)uOz>yQi+Q*C9|j)C}zmTnO2mTn+jpWRhH)$<)jc)1vgK(IJJa0Gx4cZ zR&e!m0ecJpTK_=<$43C`0003gNkl=Hp3`N1o_K`4s6gdX~a)7XF_wfw6 z|5d^!g=Nngr%37FA>KTs8NitT%FDsNg#!RxTVdISCV|ntg{FWprG^4ya;64z2Ev4jm&^-_jh+Y{2#dihV zTL3DefQV{kBSsH?EK3RdSp&eBr7sF_189Jla+YaYN>q&sz(8Z)i!xk6;}#?2oQoRM zmQf$U2-176fXgImXqyOTnYF zH2@$mtQfCm8P{p<2;nAcy_6K@UrZJYaB*#MW#b?CBb$Ib`9 cnKKXb4eT5(mk}vo3IG5A07*qoM6N<$g0WZT2LJ#7 literal 0 HcmV?d00001 diff --git a/mods/content/fantasy/datum/skills.dm b/mods/content/fantasy/datum/skills.dm index 164ade162b6..f800e76d7be 100644 --- a/mods/content/fantasy/datum/skills.dm +++ b/mods/content/fantasy/datum/skills.dm @@ -73,7 +73,7 @@ /decl/skill/crafting/artifice name = "Artifice" uid = "skill_crafting_artifice" - desc = "Your ability to create, install, and comprehend complex devices and mechanisms, as well as your ability to create finely-detailed objects." + desc = "Your ability to create, install, and comprehend complex devices and mechanisms, as well as your ability to create finely-detailed objects like cut gems or jewellery." levels = list( "Unskilled" = "You know that gears turn together when intermeshed and that axles are used to connect spinning things, but you've never done more work on a machine than hitting it if it's broken. You struggle with the precision needed to work on finely-detailed objects.", "Basic" = "You know some basic mechanical principles, like the construction of a basic pulley, or how to put a wheel on an axle. You could fix a broken or stuck well winch, but you'd struggle to deal with a malfunctioning windmill or granary. You have a steadier hand than most, able to place small gems on jewelry and connect small mechanisms.", @@ -306,3 +306,6 @@ "Experienced" = "You work as an pharmacist, or else you are a doctor with training in chemistry. If you are a pharmacist, you can make most medications. At this stage, you're working mostly by-the-book.
- You can examine held containers for some reagents.", "Master" = "You specialized in chemistry or pharmaceuticals; you are either a medical researcher or professional chemist. You can create custom mixes and make even the trickiest of medications easily. You understand how your pharmaceuticals interact with the bodies of your patients. You are probably the originator of at least one new chemical innovation.
- You can examine held containers for all reagents." ) + +/obj/item/gemstone + work_skill = SKILL_ARTIFICE diff --git a/nebula.dme b/nebula.dme index 44929d11201..63eab7de9d3 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2456,6 +2456,8 @@ #include "code\modules\games\cards_cag.dm" #include "code\modules\games\spaceball_cards.dm" #include "code\modules\games\tarot.dm" +#include "code\modules\gemstones\_gemstone.dm" +#include "code\modules\gemstones\gemstone_cuts.dm" #include "code\modules\genetics\_gene.dm" #include "code\modules\genetics\plants\_gene_plant.dm" #include "code\modules\genetics\plants\_plant_trait.dm" From 8ca797128c29392912434ab828dee6ac53b11640 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 5 Dec 2024 14:23:41 +1100 Subject: [PATCH 120/554] Removed deity mode. --- code/modules/species/outsider/shadow.dm | 48 - code/modules/species/outsider/starlight.dm | 153 --- maps/exodus/exodus.dm | 1 - maps/exodus/exodus_antagonism.dm | 9 - maps/modpack_testing/modpack_testing.dm | 1 - maps/tradeship/tradeship.dm | 1 - mods/gamemodes/cult/_cult.dme | 4 - mods/gamemodes/cult/ghosttrap.dm | 6 - mods/gamemodes/cult/items.dm | 2 +- mods/gamemodes/deity/_defines.dm | 19 - mods/gamemodes/deity/_deity.dm | 2 - mods/gamemodes/deity/_deity.dme | 80 -- mods/gamemodes/deity/codex.dm | 38 - mods/gamemodes/deity/deity_base.dm | 14 - mods/gamemodes/deity/deity_base.dmm | 1035 ----------------- mods/gamemodes/deity/deity_role.dm | 15 - .../deity/extensions/deity_be_near.dm | 67 -- mods/gamemodes/deity/forms/forms.dm | 48 - .../deity/forms/narsie/deity_items/basic.dm | 34 - .../deity/forms/narsie/deity_items/minions.dm | 37 - .../forms/narsie/deity_items/sacrificing.dm | 42 - .../forms/narsie/deity_items/smithing.dm | 29 - mods/gamemodes/deity/forms/narsie/items.dm | 77 -- mods/gamemodes/deity/forms/narsie/narsie.dm | 51 - .../deity/forms/narsie/spells/tear_veil.dm | 37 - .../deity/forms/narsie/structures.dm | 36 - .../forms/starlight/deity_items/artifacts.dm | 32 - .../forms/starlight/deity_items/phenomena.dm | 41 - .../forms/starlight/deity_items/spells.dm | 62 - mods/gamemodes/deity/forms/starlight/items.dm | 159 --- mods/gamemodes/deity/forms/starlight/mobs.dm | 29 - .../forms/starlight/spells/disable_tech.dm | 4 - .../forms/starlight/spells/starlight_aura.dm | 5 - .../forms/starlight/spells/veil_of_shadows.dm | 57 - .../deity/forms/starlight/starlight.dm | 47 - .../deity/forms/starlight/structures.dm | 272 ----- .../forms/tower/deity_items/conjuration.dm | 107 -- .../forms/tower/deity_items/transmutation.dm | 97 -- mods/gamemodes/deity/forms/tower/spells.dm | 67 -- .../gamemodes/deity/forms/tower/structures.dm | 25 - mods/gamemodes/deity/forms/tower/tower.dm | 49 - mods/gamemodes/deity/gamemode.dm | 12 - mods/gamemodes/deity/god_cultist_role.dm | 106 -- mods/gamemodes/deity/mobs/deity.dm | 134 --- mods/gamemodes/deity/mobs/deity_Stat.dm | 14 - mods/gamemodes/deity/mobs/deity_boons.dm | 54 - mods/gamemodes/deity/mobs/deity_click.dm | 24 - mods/gamemodes/deity/mobs/deity_hud.dm | 9 - mods/gamemodes/deity/mobs/deity_items.dm | 33 - mods/gamemodes/deity/mobs/deity_phenomena.dm | 94 -- mods/gamemodes/deity/mobs/deity_power.dm | 21 - mods/gamemodes/deity/mobs/deity_pylon.dm | 21 - mods/gamemodes/deity/mobs/deity_sources.dm | 84 -- mods/gamemodes/deity/mobs/deity_topic.dm | 56 - mods/gamemodes/deity/mobs/deity_tracking.dm | 40 - mods/gamemodes/deity/mobs/freelook/cultnet.dm | 13 - mods/gamemodes/deity/mobs/freelook/mask.dm | 11 - .../deity/mobs/items/blood_crafting.dm | 19 - mods/gamemodes/deity/mobs/items/deity_item.dm | 39 - mods/gamemodes/deity/mobs/items/general.dm | 26 - mods/gamemodes/deity/mobs/items/generic.dm | 25 - mods/gamemodes/deity/mobs/menu/deity_nano.dm | 81 -- .../deity/mobs/phenomena/_defines.dm | 4 - .../deity/mobs/phenomena/communication.dm | 80 -- .../deity/mobs/phenomena/conjuration.dm | 67 -- .../deity/mobs/phenomena/conversion.dm | 51 - .../gamemodes/deity/mobs/phenomena/generic.dm | 36 - mods/gamemodes/deity/mobs/phenomena/narsie.dm | 37 - .../deity/mobs/phenomena/phenomena.dm | 75 -- .../deity/mobs/phenomena/starlight.dm | 232 ---- .../deity/mobs/phenomena/transmutation.dm | 26 - mods/gamemodes/deity/mobs/say.dm | 9 - mods/gamemodes/deity/overrides.dm | 27 - mods/gamemodes/deity/screen/intent.dm | 45 - mods/gamemodes/deity/spells/boon.dm | 11 - mods/gamemodes/deity/spells/construction.dm | 55 - mods/gamemodes/deity/spells/open_gateway.dm | 34 - mods/gamemodes/deity/spells/vision.dm | 21 - mods/gamemodes/deity/structures/altar.dm | 106 -- .../gamemodes/deity/structures/blood_forge.dm | 66 -- mods/gamemodes/deity/structures/pylon.dm | 75 -- mods/gamemodes/deity/structures/structures.dm | 68 -- mods/gamemodes/deity/structures/trap.dm | 30 - nano/templates/deity.tmpl | 116 -- nebula.dme | 2 - test/check-paths.sh | 2 +- 86 files changed, 2 insertions(+), 5128 deletions(-) delete mode 100644 code/modules/species/outsider/shadow.dm delete mode 100644 code/modules/species/outsider/starlight.dm delete mode 100644 mods/gamemodes/deity/_defines.dm delete mode 100644 mods/gamemodes/deity/_deity.dm delete mode 100644 mods/gamemodes/deity/_deity.dme delete mode 100644 mods/gamemodes/deity/codex.dm delete mode 100644 mods/gamemodes/deity/deity_base.dm delete mode 100644 mods/gamemodes/deity/deity_base.dmm delete mode 100644 mods/gamemodes/deity/deity_role.dm delete mode 100644 mods/gamemodes/deity/extensions/deity_be_near.dm delete mode 100644 mods/gamemodes/deity/forms/forms.dm delete mode 100644 mods/gamemodes/deity/forms/narsie/deity_items/basic.dm delete mode 100644 mods/gamemodes/deity/forms/narsie/deity_items/minions.dm delete mode 100644 mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm delete mode 100644 mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm delete mode 100644 mods/gamemodes/deity/forms/narsie/items.dm delete mode 100644 mods/gamemodes/deity/forms/narsie/narsie.dm delete mode 100644 mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm delete mode 100644 mods/gamemodes/deity/forms/narsie/structures.dm delete mode 100644 mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm delete mode 100644 mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm delete mode 100644 mods/gamemodes/deity/forms/starlight/deity_items/spells.dm delete mode 100644 mods/gamemodes/deity/forms/starlight/items.dm delete mode 100644 mods/gamemodes/deity/forms/starlight/mobs.dm delete mode 100644 mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm delete mode 100644 mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm delete mode 100644 mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm delete mode 100644 mods/gamemodes/deity/forms/starlight/starlight.dm delete mode 100644 mods/gamemodes/deity/forms/starlight/structures.dm delete mode 100644 mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm delete mode 100644 mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm delete mode 100644 mods/gamemodes/deity/forms/tower/spells.dm delete mode 100644 mods/gamemodes/deity/forms/tower/structures.dm delete mode 100644 mods/gamemodes/deity/forms/tower/tower.dm delete mode 100644 mods/gamemodes/deity/gamemode.dm delete mode 100644 mods/gamemodes/deity/god_cultist_role.dm delete mode 100644 mods/gamemodes/deity/mobs/deity.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_Stat.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_boons.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_click.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_hud.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_items.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_phenomena.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_power.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_pylon.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_sources.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_topic.dm delete mode 100644 mods/gamemodes/deity/mobs/deity_tracking.dm delete mode 100644 mods/gamemodes/deity/mobs/freelook/cultnet.dm delete mode 100644 mods/gamemodes/deity/mobs/freelook/mask.dm delete mode 100644 mods/gamemodes/deity/mobs/items/blood_crafting.dm delete mode 100644 mods/gamemodes/deity/mobs/items/deity_item.dm delete mode 100644 mods/gamemodes/deity/mobs/items/general.dm delete mode 100644 mods/gamemodes/deity/mobs/items/generic.dm delete mode 100644 mods/gamemodes/deity/mobs/menu/deity_nano.dm delete mode 100644 mods/gamemodes/deity/mobs/phenomena/_defines.dm delete mode 100644 mods/gamemodes/deity/mobs/phenomena/communication.dm delete mode 100644 mods/gamemodes/deity/mobs/phenomena/conjuration.dm delete mode 100644 mods/gamemodes/deity/mobs/phenomena/conversion.dm delete mode 100644 mods/gamemodes/deity/mobs/phenomena/generic.dm delete mode 100644 mods/gamemodes/deity/mobs/phenomena/narsie.dm delete mode 100644 mods/gamemodes/deity/mobs/phenomena/phenomena.dm delete mode 100644 mods/gamemodes/deity/mobs/phenomena/starlight.dm delete mode 100644 mods/gamemodes/deity/mobs/phenomena/transmutation.dm delete mode 100644 mods/gamemodes/deity/mobs/say.dm delete mode 100644 mods/gamemodes/deity/overrides.dm delete mode 100644 mods/gamemodes/deity/screen/intent.dm delete mode 100644 mods/gamemodes/deity/spells/boon.dm delete mode 100644 mods/gamemodes/deity/spells/construction.dm delete mode 100644 mods/gamemodes/deity/spells/open_gateway.dm delete mode 100644 mods/gamemodes/deity/spells/vision.dm delete mode 100644 mods/gamemodes/deity/structures/altar.dm delete mode 100644 mods/gamemodes/deity/structures/blood_forge.dm delete mode 100644 mods/gamemodes/deity/structures/pylon.dm delete mode 100644 mods/gamemodes/deity/structures/structures.dm delete mode 100644 mods/gamemodes/deity/structures/trap.dm delete mode 100644 nano/templates/deity.tmpl diff --git a/code/modules/species/outsider/shadow.dm b/code/modules/species/outsider/shadow.dm deleted file mode 100644 index 709f5d38ffe..00000000000 --- a/code/modules/species/outsider/shadow.dm +++ /dev/null @@ -1,48 +0,0 @@ -/decl/bodytype/starlight/shadow - name = "shadow" - desc = "A wound of darkness inflicted upon the world." - icon_base = 'icons/mob/human_races/species/shadow/body.dmi' - icon_deformed = 'icons/mob/human_races/species/shadow/body.dmi' - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS - eye_darksight_range = 8 - uid = "bodytype_starlight_shadow" - -/decl/blood_type/shadowstuff - name = "shadowstuff" - antigen_category = "shadowstuff" - splatter_name = "shadowstuff" - splatter_desc = "A puddle of shadowstuff." - splatter_colour = COLOR_GRAY80 - -/decl/species/starlight/shadow - name = "Shadow" - name_plural = "shadows" - description = "A being of pure darkness, hates the light and all that comes with it." - butchery_data = null - - available_bodytypes = list(/decl/bodytype/starlight/shadow) - - unarmed_attacks = list(/decl/natural_attack/claws/strong, /decl/natural_attack/bite/sharp) - shock_vulnerability = 0 - - blood_types = list( - /decl/blood_type/shadowstuff - ) - flesh_color = "#aaaaaa" - - remains_type = /obj/effect/decal/cleanable/ash - death_message = "dissolves into ash..." - - species_flags = SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED - -/decl/species/starlight/shadow/handle_environment_special(var/mob/living/human/H) - if(H.is_in_stasis() || H.stat == DEAD || H.isSynthetic()) - return - var/light_amount = 0 - if(isturf(H.loc)) - var/turf/T = H.loc - light_amount = T.get_lumcount() * 10 - if(light_amount > 2) //if there's enough light, start dying - H.take_overall_damage(1,1) - else //heal in the dark - H.heal_overall_damage(1,1) \ No newline at end of file diff --git a/code/modules/species/outsider/starlight.dm b/code/modules/species/outsider/starlight.dm deleted file mode 100644 index 215ba3cf5e9..00000000000 --- a/code/modules/species/outsider/starlight.dm +++ /dev/null @@ -1,153 +0,0 @@ -/decl/species/starlight - abstract_type = /decl/species/starlight - butchery_data = null - spawn_flags = SPECIES_IS_RESTRICTED - available_pronouns = list(/decl/pronouns/neuter) - force_background_info = list( - /decl/background_category/heritage = /decl/background_detail/heritage/other - ) - hidden_from_codex = TRUE - -/decl/bodytype/starlight - abstract_type = /decl/bodytype/starlight - has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/unbreakable), - BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable), - BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbreakable), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbreakable), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/unbreakable), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unbreakable), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/unbreakable), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unbreakable), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unbreakable), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbreakable) - ) - has_organ = list( - BP_BRAIN = /obj/item/organ/internal/brain/starlight - ) - -/obj/item/organ/internal/brain/starlight - name = "essence of fire" - desc = "A fancy name for ash. Still, it does look a bit different from the regular stuff." - icon = 'icons/obj/objects.dmi' - icon_state = "ash" - -/decl/bodytype/starlight/starborn - name = "starborn" - desc = "A blazing mass of light." - icon_base = 'icons/mob/human_races/species/starborn/body.dmi' - icon_deformed = 'icons/mob/human_races/species/starborn/body.dmi' - husk_icon = 'icons/mob/human_races/species/starborn/husk.dmi' - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS - uid = "bodytype_starlight_starborn" - cold_level_1 = 260 - cold_level_2 = 250 - cold_level_3 = 235 - heat_level_1 = 20000 - heat_level_2 = 30000 - heat_level_3 = 40000 - cold_discomfort_level = 300 - cold_discomfort_strings = list( - "You feel your fire dying out...", - "Your fire begins to shrink away from the cold.", - "You feel slow and sluggish from the cold." - ) - heat_discomfort_level = 10000 - heat_discomfort_strings = list( - "Surprisingly, you start burning!", - "You're... burning!?!" - ) - -/decl/blood_type/starstuff - name = "starstuff" - antigen_category = "starstuff" - splatter_name = "starstuff" - splatter_desc = "A puddle of starstuff." - splatter_colour = "#ffff00" - -/decl/species/starlight/handle_death(var/mob/living/human/H) - addtimer(CALLBACK(H, TYPE_PROC_REF(/mob, dust)),0) - -/decl/species/starlight/starborn - name = "Starborn" - name_plural = "Starborn" - description = "Beings of fire and light, split off from a sun deity of unbelievable power." - available_bodytypes = list(/decl/bodytype/starlight/starborn) - - blood_types = list( - /decl/blood_type/starstuff - ) - flesh_color = "#ffff00" - - unarmed_attacks = list(/decl/natural_attack/punch/starborn) - - warning_low_pressure = 50 - hazard_low_pressure = 0 - shock_vulnerability = 0 - hunger_factor = 0 - thirst_factor = 0 - death_message = "dissolves into pure flames!" - breath_type = null - - - total_health = 250 - body_temperature = T0C + 500 //We are being of fire and light. - species_flags = SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED | SPECIES_FLAG_NO_TANGLE - - base_auras = list( - /obj/aura/starborn - ) - -/decl/species/starlight/starborn/handle_death(var/mob/living/human/H) - ..() - var/turf/T = get_turf(H) - T.add_to_reagents(/decl/material/liquid/fuel, 20) - T.hotspot_expose(FLAMMABLE_GAS_MINIMUM_BURN_TEMPERATURE) - -/decl/bodytype/starlight/blueforged - name = "blueforged" - desc = "A mass of carved and shaped spacetime." - icon_base = 'icons/mob/human_races/species/blueforged/body.dmi' - icon_deformed = 'icons/mob/human_races/species/blueforged/body.dmi' - eye_icon = 'icons/mob/human_races/species/blueforged/eyes.dmi' - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS - override_organ_types = list(BP_EYES = /obj/item/organ/internal/eyes/blueforged) - uid = "bodytype_starlight_blueforged" - -/decl/blood_type/spacestuff - name = "spacestuff" - antigen_category = "spacestuff" - splatter_name = "spacestuff" - splatter_desc = "A puddle of spacestuff." - splatter_colour = "#2222ff" - -/decl/species/starlight/blueforged - name = "Blueforged" - name_plural = "Blueforged" - description = "Living chunks of spacetime, carved out of the original dimension and given life by a being of unbelievable power." - available_bodytypes = list(/decl/bodytype/starlight/blueforged) - - flesh_color = "#2222ff" - - warning_low_pressure = 50 - hazard_low_pressure = 0 - hunger_factor = 0 - thirst_factor = 0 - breath_type = null - - burn_mod = 10 - brute_mod = 0 - oxy_mod = 0 - toxins_mod = 0 - radiation_mod = 0 - species_flags = SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED | SPECIES_FLAG_NO_TANGLE - -/decl/species/starlight/blueforged/handle_death(var/mob/living/human/H) - ..() - new /obj/effect/temporary(get_turf(H),11, 'icons/mob/mob.dmi', "liquify") - -/obj/item/organ/internal/eyes/blueforged - name = "bluespace prism" - desc = "You can see an endless blue plane when looking through it. Your eyes tingle if you stare too hard." - icon = 'icons/mob/human_races/species/blueforged/organs.dmi' diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 6c13c0ddb9c..44e718bbf09 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,7 +1,6 @@ #if !defined(USING_MAP_DATUM) #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" diff --git a/maps/exodus/exodus_antagonism.dm b/maps/exodus/exodus_antagonism.dm index 92660ef3608..322bebbf1d3 100644 --- a/maps/exodus/exodus_antagonism.dm +++ b/maps/exodus/exodus_antagonism.dm @@ -3,15 +3,6 @@ LAZYINITLIST(protected_jobs) protected_jobs |= list(/datum/job/officer, /datum/job/warden, /datum/job/detective, /datum/job/captain, /datum/job/lawyer, /datum/job/hos) -/decl/special_role/godcultist/Initialize() - . = ..() - LAZYINITLIST(restricted_jobs) - restricted_jobs |= list(/datum/job/lawyer, /datum/job/captain, /datum/job/hos) - LAZYINITLIST(protected_jobs) - protected_jobs |= list(/datum/job/officer, /datum/job/warden, /datum/job/detective) - LAZYINITLIST(blacklisted_jobs) - blacklisted_jobs |= /datum/job/chaplain - /decl/special_role/cultist/Initialize() . = ..() LAZYINITLIST(restricted_jobs) diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 0e75223cde4..de68e49bc7b 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -4,7 +4,6 @@ #include "blank.dmm" #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 115fdd551c9..f3134a1184a 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -5,7 +5,6 @@ #endif #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" diff --git a/mods/gamemodes/cult/_cult.dme b/mods/gamemodes/cult/_cult.dme index bda33c4bf96..e35ffed9db6 100644 --- a/mods/gamemodes/cult/_cult.dme +++ b/mods/gamemodes/cult/_cult.dme @@ -1,10 +1,6 @@ #ifndef GAMEMODE_PACK_CULT #define GAMEMODE_PACK_CULT -#ifdef GAMEMODE_PACK_DEITY -#warn Deity modpack loaded before Cult modpack, Nar'sie godform will be unavailable! -#endif - // BEGIN_INCLUDE #include "_cult.dm" #include "archaeology.dm" diff --git a/mods/gamemodes/cult/ghosttrap.dm b/mods/gamemodes/cult/ghosttrap.dm index 3e5d7452df6..07faf87515f 100644 --- a/mods/gamemodes/cult/ghosttrap.dm +++ b/mods/gamemodes/cult/ghosttrap.dm @@ -20,9 +20,3 @@ var/obj/item/soulstone/stone = new(get_turf(user)) stone.shade = new(stone) request_player(stone.shade, "The soul stone shade summon ritual has been performed. ") - -#ifdef GAMEMODE_PACK_DEITY -/decl/ghosttrap/cult_shade/Initialize() - ban_checks |= /decl/special_role/godcultist - . = ..() -#endif \ No newline at end of file diff --git a/mods/gamemodes/cult/items.dm b/mods/gamemodes/cult/items.dm index 01a8555e665..1674cdb92eb 100644 --- a/mods/gamemodes/cult/items.dm +++ b/mods/gamemodes/cult/items.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/weapon/swords/cult.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME -// separated into a proc so that deity can modify it +// separated into a proc so that subtypes can modify it /obj/item/sword/cultblade/proc/can_use_safely(mob/living/user) return iscultist(user) diff --git a/mods/gamemodes/deity/_defines.dm b/mods/gamemodes/deity/_defines.dm deleted file mode 100644 index 99f85b14f61..00000000000 --- a/mods/gamemodes/deity/_defines.dm +++ /dev/null @@ -1,19 +0,0 @@ -#define DEITY_TREE_SACRIFICE "Sacrificing" -#define DEITY_TREE_SOUL "Soul Arts" -#define DEITY_TREE_DARK_MINION "Summoning" -#define DEITY_TREE_TRANSMUTATION "Transmutation" -#define DEITY_TREE_CONJURATION "Conjuration" -#define DEITY_TREE_ARTIFACT "Artifacts" -#define DEITY_TREE_FIRECONJ "Fire Conjuration" -#define DEITY_TREE_HERALD "Phenomena" - -#define DEITY_BLOOD_CRAFT "Blood Crafting" -#define DEITY_ARMOR_CRAFT "Armor Crafting" -#define DEITY_VOID_CRAFT "Void Crafting" -#define DEITY_UNLOCK_ARMS "Unlock Armaments" -#define DEITY_UNLOCK_HEAL "Unlock Cleric Spells" - -#define isdeity(A) istype(A, /mob/living/deity) - -#define DEITY_STRUCTURE_NEAR_IMPORTANT 1 //Whether this needs to be near an important structure. -#define DEITY_STRUCTURE_ALONE 2 //Whether this can be near another of the same type. \ No newline at end of file diff --git a/mods/gamemodes/deity/_deity.dm b/mods/gamemodes/deity/_deity.dm deleted file mode 100644 index 6c658e122b3..00000000000 --- a/mods/gamemodes/deity/_deity.dm +++ /dev/null @@ -1,2 +0,0 @@ -/decl/modpack/deity - name = "Deity Gamemode Content" \ No newline at end of file diff --git a/mods/gamemodes/deity/_deity.dme b/mods/gamemodes/deity/_deity.dme deleted file mode 100644 index a1603dd317d..00000000000 --- a/mods/gamemodes/deity/_deity.dme +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef GAMEMODE_PACK_DEITY -#define GAMEMODE_PACK_DEITY -// BEGIN_INCLUDE -#include "_defines.dm" -#include "_deity.dm" -#include "codex.dm" -#include "deity_base.dm" -#include "deity_role.dm" -#include "gamemode.dm" -#include "god_cultist_role.dm" -#include "overrides.dm" -#include "extensions\deity_be_near.dm" -#include "forms\forms.dm" -// These should only load if cult is loaded. -#ifdef GAMEMODE_PACK_CULT -#include "forms\narsie\items.dm" -#include "forms\narsie\narsie.dm" -#include "forms\narsie\structures.dm" -#include "forms\narsie\deity_items\basic.dm" -#include "forms\narsie\deity_items\minions.dm" -#include "forms\narsie\deity_items\sacrificing.dm" -#include "forms\narsie\deity_items\smithing.dm" -#include "forms\narsie\spells\tear_veil.dm" -#endif -#include "forms\starlight\items.dm" -#include "forms\starlight\mobs.dm" -#include "forms\starlight\starlight.dm" -#include "forms\starlight\structures.dm" -#include "forms\starlight\deity_items\artifacts.dm" -#include "forms\starlight\deity_items\phenomena.dm" -#include "forms\starlight\deity_items\spells.dm" -#include "forms\starlight\spells\disable_tech.dm" -#include "forms\starlight\spells\starlight_aura.dm" -#include "forms\starlight\spells\veil_of_shadows.dm" -#include "forms\tower\spells.dm" -#include "forms\tower\structures.dm" -#include "forms\tower\tower.dm" -#include "forms\tower\deity_items\conjuration.dm" -#include "forms\tower\deity_items\transmutation.dm" -#include "mobs\deity.dm" -#include "mobs\deity_boons.dm" -#include "mobs\deity_click.dm" -#include "mobs\deity_hud.dm" -#include "mobs\deity_items.dm" -#include "mobs\deity_phenomena.dm" -#include "mobs\deity_power.dm" -#include "mobs\deity_pylon.dm" -#include "mobs\deity_sources.dm" -#include "mobs\deity_Stat.dm" -#include "mobs\deity_topic.dm" -#include "mobs\deity_tracking.dm" -#include "mobs\say.dm" -#include "mobs\freelook\cultnet.dm" -#include "mobs\freelook\mask.dm" -#include "mobs\items\blood_crafting.dm" -#include "mobs\items\deity_item.dm" -#include "mobs\items\general.dm" -#include "mobs\items\generic.dm" -#include "mobs\menu\deity_nano.dm" -#include "mobs\phenomena\_defines.dm" -#include "mobs\phenomena\communication.dm" -#include "mobs\phenomena\conjuration.dm" -#include "mobs\phenomena\conversion.dm" -#include "mobs\phenomena\generic.dm" -#include "mobs\phenomena\narsie.dm" -#include "mobs\phenomena\phenomena.dm" -#include "mobs\phenomena\starlight.dm" -#include "mobs\phenomena\transmutation.dm" -#include "screen\intent.dm" -#include "spells\boon.dm" -#include "spells\construction.dm" -#include "spells\open_gateway.dm" -#include "spells\vision.dm" -#include "structures\altar.dm" -#include "structures\blood_forge.dm" -#include "structures\pylon.dm" -#include "structures\structures.dm" -#include "structures\trap.dm" -// END_INCLUDE -#endif \ No newline at end of file diff --git a/mods/gamemodes/deity/codex.dm b/mods/gamemodes/deity/codex.dm deleted file mode 100644 index fae5bfe607a..00000000000 --- a/mods/gamemodes/deity/codex.dm +++ /dev/null @@ -1,38 +0,0 @@ -/datum/codex_entry/deity - abstract_type = /datum/codex_entry/deity - -/datum/codex_entry/deity/altar - associated_paths = list(/obj/structure/deity/altar) - mechanics_text = "To place someone upon the altar, first have them in an aggressive grab and click the altar while adjacent." - antag_text = "This structure anchors your deity within this realm, granting them additional power to influence it and empower their followers. Additionally, using it as a focus for their powers, they can convert someone laying on top of the altar.
" - disambiguator = "occult" - -/datum/codex_entry/deity/blood_forge - associated_paths = list(/obj/structure/deity/blood_forge) - antag_text = "Allows creation of special items by feeding your blood into it. Only usable by cultists of the aligned deity." - disambiguator = "occult" - -/datum/codex_entry/deity/gateway - associated_paths = list(/obj/structure/deity/gateway) - antag_text = "Stand within the gateway to be transported to an unknown dimension and transformed into a flaming Starborn, a mysterious Blueforged or a subtle Shadowling." - disambiguator = "occult" - -/datum/codex_entry/deity/radiant_statue - associated_paths = list(/obj/structure/deity/radiant_statue) - antag_text = "Allows storage of power if cultists are nearby. This stored power can be expended to charge Starlight items." - disambiguator = "occult" - -/datum/codex_entry/deity/blood_forge/starlight - associated_paths = list(/obj/structure/deity/blood_forge/starlight) - antag_text = "Allows creation of special Starlight items. Only usable by cultists of the aligned deity. Use of this powerful forge will inflict burns." - disambiguator = "occult" - -/datum/codex_entry/deity/wizard_recharger - associated_paths = list(/obj/structure/deity/wizard_recharger) - antag_text = "A well of arcane power. When charged, a cultist may absorb this power to refresh their spells." - disambiguator = "occult" - -/datum/codex_entry/deity/pylon - associated_paths = list(/obj/structure/deity/pylon) - antag_text = "Serves as a conduit for a deity to speak through, making their will known in this dimension to any who hear it." - disambiguator = "occult" \ No newline at end of file diff --git a/mods/gamemodes/deity/deity_base.dm b/mods/gamemodes/deity/deity_base.dm deleted file mode 100644 index 0d7268ebd64..00000000000 --- a/mods/gamemodes/deity/deity_base.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/map_template/ruin/antag_spawn/deity - name = "Deity Base" - mappaths = list( - "mods/gamemodes/deity/deity_base.dmm" - ) - apc_test_exempt_areas = list( - /area/map_template/deity_spawn = NO_SCRUBBER|NO_VENT|NO_APC - ) - -/area/map_template/deity_spawn - name = "\improper Deity Spawn" - icon_state = "yellow" - requires_power = 0 - dynamic_lighting = FALSE diff --git a/mods/gamemodes/deity/deity_base.dmm b/mods/gamemodes/deity/deity_base.dmm deleted file mode 100644 index 7e009c2d0bd..00000000000 --- a/mods/gamemodes/deity/deity_base.dmm +++ /dev/null @@ -1,1035 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/space/infinity, -/area/map_template/deity_spawn) -"b" = ( -/turf/unsimulated/floor/lava, -/area/map_template/deity_spawn) -"c" = ( -/turf/unsimulated/floor/water, -/area/map_template/deity_spawn) -"d" = ( -/obj/abstract/landmark{ - name = "DeitySpawn" - }, -/turf/unsimulated/floor/lava, -/area/map_template/deity_spawn) -"e" = ( -/obj/abstract/landmark{ - name = "DeitySpawn" - }, -/turf/unsimulated/floor/water, -/area/map_template/deity_spawn) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(2,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(3,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(4,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(5,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(6,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(7,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(8,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(9,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(10,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(11,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(12,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(13,1,1) = {" -a -a -a -a -b -b -b -b -b -b -d -b -b -b -b -b -b -a -a -a -a -"} -(14,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(15,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(16,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(17,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(18,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(19,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(20,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(21,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(22,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(23,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(24,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(25,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(26,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(27,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(28,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(29,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(30,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(31,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(32,1,1) = {" -a -a -a -a -c -c -c -c -c -c -e -c -c -c -c -c -c -a -a -a -a -"} -(33,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(34,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(35,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(36,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(37,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(38,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(39,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(40,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(41,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(42,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(43,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(44,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} diff --git a/mods/gamemodes/deity/deity_role.dm b/mods/gamemodes/deity/deity_role.dm deleted file mode 100644 index 0426f6e8568..00000000000 --- a/mods/gamemodes/deity/deity_role.dm +++ /dev/null @@ -1,15 +0,0 @@ -/decl/special_role/deity - name = "Deity" - name_plural = "Deities" - mob_path = /mob/living/deity - welcome_text = "This is not your world. This is not your reality. But here you exist. Use your powers, feed off the faith of others.
You have to click on yourself to choose your form.
Everything you say will be heard by your cultists!
To get points your cultists need to build!
Build Shrine and Construction are the best starting boons!" - landmark_id = "DeitySpawn" - - flags = ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB - - hard_cap = 2 - hard_cap_round = 2 - initial_spawn_req = 1 - initial_spawn_target = 1 - - base_to_load = "Deity Base" diff --git a/mods/gamemodes/deity/extensions/deity_be_near.dm b/mods/gamemodes/deity/extensions/deity_be_near.dm deleted file mode 100644 index 5eed3ae1fe4..00000000000 --- a/mods/gamemodes/deity/extensions/deity_be_near.dm +++ /dev/null @@ -1,67 +0,0 @@ -/datum/extension/deity_be_near - base_type = /datum/extension/deity_be_near - expected_type = /obj/item - var/keep_away_instead = FALSE - var/mob/living/deity/connected_deity - var/threshold_base = 6 - var/expected_helmet - flags = EXTENSION_FLAG_IMMEDIATE - -/datum/extension/deity_be_near/New(var/datum/holder, var/mob/living/deity/connect) - ..() - events_repository.register(/decl/observ/moved, holder,src, PROC_REF(check_movement)) - connected_deity = connect - events_repository.register(/decl/observ/destroyed, holder, src, PROC_REF(dead_deity)) - var/obj/O = holder - O.desc += "
This item deals damage to its wielder the [keep_away_instead ? "closer" : "farther"] it is from a deity structure" - - -/datum/extension/deity_be_near/Destroy() - events_repository.unregister(/decl/observ/moved, holder,src) - events_repository.unregister(/decl/observ/destroyed, holder, src) - events_repository.unregister(/decl/observ/item_equipped, holder, src) - . = ..() - -/datum/extension/deity_be_near/proc/check_movement() - var/obj/item/I = holder - if(!isliving(I.loc)) - return - var/min_dist = INFINITY - for(var/s in connected_deity.structures) - var/dist = get_dist(holder,s) - if(dist < min_dist) - min_dist = dist - if(keep_away_instead && min_dist < threshold_base) - deal_damage(I.loc, round(threshold_base/min_dist)) - else if(min_dist > threshold_base) - deal_damage(I.loc, round(min_dist/threshold_base)) - - -/datum/extension/deity_be_near/proc/deal_damage(var/mob/living/victim, var/mult) - return - -/datum/extension/deity_be_near/proc/dead_deity() - var/obj/item/I = holder - I.visible_message(SPAN_WARNING("\The [holder]'s power fades!")) - qdel(src) - -/datum/extension/deity_be_near/proc/wearing_full() - var/obj/item/I = holder - - if(!ishuman(I.loc)) - return FALSE - var/mob/living/human/H = I.loc - if(H.get_equipped_slot_for_item(I) != slot_wear_suit_str) - return FALSE - if(expected_helmet && !istype(H.get_equipped_item(slot_head_str), expected_helmet)) - return FALSE - return TRUE - -/datum/extension/deity_be_near/champion/deal_damage(var/mob/living/victim,var/mult) - victim.take_damage(3 * mult, OXY) - -/datum/extension/deity_be_near/oracle/deal_damage(var/mob/living/victim, var/mult) - victim.take_damage(mult, BURN) - -/datum/extension/deity_be_near/traitor/deal_damage(var/mob/living/victim, var/mult) - victim.take_damage(5 * mult, PAIN) \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/forms.dm b/mods/gamemodes/deity/forms/forms.dm deleted file mode 100644 index 6f1f2f135b3..00000000000 --- a/mods/gamemodes/deity/forms/forms.dm +++ /dev/null @@ -1,48 +0,0 @@ -/*A god form basically is a combination of a sprite sheet choice and a gameplay choice. -Each plays slightly different and has different challenges/benefits -*/ - -/datum/god_form - var/name = "Form" - var/info = "This is a form your being can take." - var/desc = "This is the mob's description given." - var/faction = MOB_FACTION_NEUTRAL //For stuff like mobs and shit - var/god_icon_state = "nar-sie" //What you look like - var/pylon_icon_state //What image shows up when appearing in a pylon - var/mob/living/deity/linked_god = null - var/starting_power_min = 10 - var/starting_regeneration = 1 - var/list/buildables = list() //Both a list of var changes and a list of buildables. - var/list/items - -/datum/god_form/New(var/mob/living/deity/D) - ..() - D.icon_state = god_icon_state - D.desc = desc - D.power_min = starting_power_min - D.power_per_regen = starting_regeneration - linked_god = D - if(items && items.len) - var/list/complete_items = list() - for(var/l in items) - var/datum/deity_item/di = new l() - complete_items[di.name] = di - D.set_items(complete_items) - items.Cut() - -// TODO: Make this not a thing. It's so bad. -/datum/god_form/proc/sync_structure(var/obj/O) - var/list/svars = buildables[O.type] - if(!svars) - return - for(var/V in svars) - O.vars[V] = svars[V] - -/datum/god_form/proc/take_charge(var/mob/living/user, var/charge) - return TRUE - -/datum/god_form/Destroy() - if(linked_god) - linked_god.form = null - linked_god = null - return ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm b/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm deleted file mode 100644 index 59e8a7d1586..00000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm +++ /dev/null @@ -1,34 +0,0 @@ -/datum/deity_item/boon/eternal_darkness - name = "Eternal Darkness" - desc = "Allows a follower to cause insanity in a target." - category = "Dark Spells" - base_cost = 40 - boon_path = /spell/targeted/shatter - -/datum/deity_item/boon/torment - name = "Torment" - desc = "Gives a follower the ability to cause mass hysteria and pain." - category = "Dark Spells" - base_cost = 50 - boon_path = /spell/targeted/torment - -/datum/deity_item/boon/blood_shard - name = "Blood Shard" - desc = "Lets a follower cause a target's blood to literally explode out of their skin into dangerous projectiles." - category = "Dark Spells" - base_cost = 75 - boon_path = /spell/hand/charges/blood_shard - -/datum/deity_item/boon/drain_blood - name = "Drain Blood" - desc = "Lets a follower drain blood from all those around them." - category = "Dark Spells" - base_cost = 110 - boon_path = /spell/aoe_turf/drain_blood - -/datum/deity_item/phenomenon/exude_blood - name = "Phenomenon: Exude Blood" - desc = "You extract the raw blood used in your faith and give it to one of your flock." - category = "Dark Spells" - base_cost = 30 - phenomenon_path = /datum/phenomenon/exude_blood \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm b/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm deleted file mode 100644 index be4c8fe14ed..00000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/deity_item/minions - name = DEITY_TREE_DARK_MINION - desc = "Unlock abilities that allow your followers to craft and summon useful creatures." - category = DEITY_TREE_DARK_MINION - base_cost = 75 - -/datum/deity_item/boon/soul_shard - name = "Soul Stone Shard" - desc = "Give your follower a sliver of soulstone to capture a life in." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 20 - boon_path = /obj/item/soulstone - -/datum/deity_item/boon/blood_zombie - name = "Blood Plague" - desc = "Give a vessel to a follower filled with infection so vile, it turns all sapient creatures into mindless husks." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 300 - boon_path = /obj/item/chems/drinks/zombiedrink - -/datum/deity_item/boon/tear_veil - name = "Tear Veil" - desc = "Grant your follower the ability to literally rip a hole in this reality, allowing things to pass through." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 100 - boon_path = /spell/tear_veil - -/datum/deity_item/phenomenon/hellscape - name = "Phenomenon: Reveal Hellscape" - desc = "You show a non-believer what their future will be like." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 110 - phenomenon_path = /datum/phenomenon/hellscape \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm deleted file mode 100644 index 7e5d631c7f9..00000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm +++ /dev/null @@ -1,42 +0,0 @@ -/datum/deity_item/sacrifice - name = DEITY_TREE_SACRIFICE - desc = "Unlocks the tools necessary to allow your followers to sacrifice in your name." - category = DEITY_TREE_SACRIFICE - base_cost = 50 - max_level = 1 - -/datum/deity_item/boon/sac_dagger - name = "Sacrificial Dagger" - desc = "A small dagger embued with your powers. Lets your followers give you power through sacrifices on an altar." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 10 - boon_path = /obj/item/knife/ritual/sacrifice - -/datum/deity_item/boon/sac_spell - name = "Sacrifice Spell" - desc = "This ability makes the user take INCREDIBLE amounts of damage to heal a target for a similar amount of damage." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 10 - boon_path = /spell/targeted/heal_target/sacrifice - -/datum/deity_item/boon/execution_axe - name = "Greedy Axe" - desc = "This axe can store the very souls of those it kills to be later transfered to you through an altar." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 50 - boon_path = /obj/item/bladed/axe/fire/cult - -/datum/deity_item/blood_stone - name = "Bloodied Stone" - desc = "Unlocks the blood stone building, which allows followers to increase your power through ritual and prayer." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 50 - max_level = 1 - -/datum/deity_item/blood_stone/buy(var/mob/living/deity/user) - ..() - user.form.buildables |= /obj/structure/deity/blood_stone \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm deleted file mode 100644 index bcb12ff11e3..00000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/deity_item/blood_crafting/narsie - recipes = list( - /obj/item/sword/cultblade = 50, - /obj/item/clothing/head/culthood/alt = 10, - /obj/item/clothing/suit/cultrobes/alt = 20 - ) - -/datum/deity_item/blood_crafting/armored - name = DEITY_ARMOR_CRAFT - desc = "Unlock the secrets to tempered blood smithing, allowing your followers to smith more powerful and expensive armaments." - category = DEITY_BLOOD_CRAFT - base_cost = 75 - requirements = list(DEITY_BLOOD_CRAFT = 1) - recipes = list( - /obj/item/clothing/suit/cultrobes/magusred = 80, - /obj/item/clothing/head/culthood/magus = 50, - /obj/structure/constructshell/cult = 70 - ) //also shield? - -/datum/deity_item/blood_crafting/space - name = DEITY_VOID_CRAFT - desc = "Allows your followers to craft space suits, allowing you to finally spread across the cosmos." - category = DEITY_BLOOD_CRAFT - base_cost = 100 - requirements = list(DEITY_BLOOD_CRAFT = 1, DEITY_ARMOR_CRAFT = 1) - recipes = list( - /obj/item/clothing/suit/space/cult = 100, - /obj/item/clothing/head/helmet/space/cult = 70 - ) //Probably more too. \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/items.dm b/mods/gamemodes/deity/forms/narsie/items.dm deleted file mode 100644 index 56d3ffe89f8..00000000000 --- a/mods/gamemodes/deity/forms/narsie/items.dm +++ /dev/null @@ -1,77 +0,0 @@ - -//SACRIFICE DAGGER -//If used on a person on an altar, causes the user to carve into them, dealing moderate damage and gaining points for the altar's god. -/obj/item/knife/ritual/sacrifice - name = "sacrificial dagger" - desc = "This knife is dull but well used." - material = /decl/material/solid/stone/cult - -/obj/item/knife/ritual/sacrifice/resolve_attackby(var/atom/a, var/mob/user, var/click_params) - var/turf/T = get_turf(a) - var/obj/structure/deity/altar/altar = locate() in T - if(!altar) - return ..() - if(isliving(a)) - var/mob/living/L = a - var/multiplier = 1 - if(L.mind) - multiplier++ - if(ishuman(L)) - var/mob/living/human/H = L - if(H.should_have_organ(BP_HEART)) - multiplier++ - if(L.stat == DEAD) - to_chat(user, SPAN_WARNING("\The [a] is already dead! There is nothing to take!")) - return - - user.visible_message(SPAN_WARNING("\The [user] hovers \the [src] over \the [a], whispering an incantation.")) - if(!do_after(user,200, L)) - return - user.visible_message(SPAN_DANGER("\The [user] plunges the knife down into \the [a]!")) - L.take_damage(20) - if(altar.linked_god) - altar.linked_god.adjust_power_min(2 * multiplier,0,"from a delicious sacrifice!") - - -//EXEC AXE -//If a person hit by this axe within three seconds dies, sucks in their soul to be harvested at altars. -/obj/item/bladed/axe/fire/cult - name = "terrible axe" - desc = "Its head is sharp and stained red with heavy use." - icon = 'icons/obj/items/weapon/bone_axe.dmi' - var/stored_power = 0 - -/obj/item/bladed/axe/fire/cult/examine(mob/user) - . = ..() - if(stored_power) - to_chat(user, SPAN_NOTICE("It exudes a death-like smell.")) - -/obj/item/bladed/axe/fire/cult/resolve_attackby(var/atom/a, var/mob/user, var/click_params) - if(istype(a, /obj/structure/deity/altar)) - var/obj/structure/deity/altar/altar = a - if(stored_power && altar.linked_god) - altar.linked_god.adjust_power_min(stored_power, "from harvested souls.") - altar.visible_message(SPAN_WARNING("\The [altar] absorbs a black mist exuded from \the [src].")) - return - if(ismob(a)) - var/mob/M = a - if(M.stat != DEAD) - events_repository.register(/decl/observ/death, M,src, TYPE_PROC_REF(/obj/item/bladed/axe/fire/cult, gain_power)) - spawn(30) - events_repository.unregister(/decl/observ/death, M,src) - return ..() - -/obj/item/bladed/axe/fire/cult/proc/gain_power() - stored_power += 50 - src.visible_message(SPAN_OCCULT("\The [src] screeches as the smell of death fills the air!")) - -/obj/item/chems/drinks/zombiedrink - name = "well-used urn" - desc = "Said to bring those who drink it back to life, no matter the price." - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "urn" - volume = 10 - amount_per_transfer_from_this = 10 - -/obj/item/chems/drinks/zombiedrink/populate_reagents() - add_to_reagents(/decl/material/liquid/zombie, reagents.maximum_volume) diff --git a/mods/gamemodes/deity/forms/narsie/narsie.dm b/mods/gamemodes/deity/forms/narsie/narsie.dm deleted file mode 100644 index 8ebf2dfc818..00000000000 --- a/mods/gamemodes/deity/forms/narsie/narsie.dm +++ /dev/null @@ -1,51 +0,0 @@ -/datum/god_form/narsie - name = "Nar-Sie" - info = {"The Geometer of Blood, you crave blood and destruction.
- Benefits:
- +Can gain power from blood sacrifices.
- +Ability to forge weapons and armor.
- Drawbacks:
- -Servant abilities require copious amounts of their blood. - "} - desc = "A being made of a million nightmares, a billion deaths." - god_icon_state = "nar-sie" - pylon_icon_state = "shade" - faction = "cult" - - buildables = list( - /obj/structure/deity/altar/narsie, - /obj/structure/deity/pylon - ) - items = list( - /datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/boon/eternal_darkness, - /datum/deity_item/boon/torment, - /datum/deity_item/boon/blood_shard, - /datum/deity_item/boon/drain_blood, - /datum/deity_item/phenomenon/exude_blood, - /datum/deity_item/sacrifice, - /datum/deity_item/boon/sac_dagger, - /datum/deity_item/boon/sac_spell, - /datum/deity_item/boon/execution_axe, - /datum/deity_item/blood_stone, - /datum/deity_item/minions, - /datum/deity_item/boon/soul_shard, - /datum/deity_item/boon/blood_zombie, - /datum/deity_item/boon/tear_veil, - /datum/deity_item/phenomenon/hellscape, - /datum/deity_item/blood_crafting/narsie, - /datum/deity_item/blood_crafting/armored, - /datum/deity_item/blood_crafting/space - ) - -/datum/god_form/narsie/take_charge(var/mob/living/user, var/charge) - charge = min(100, charge * 0.25) - if(prob(charge)) - to_chat(user, SPAN_WARNING("You feel drained...")) - var/mob/living/human/H = user - if(istype(H) && H.should_have_organ(BP_HEART)) - H.vessel.remove_any(charge) - else - user.take_damage(charge) - return 1 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm b/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm deleted file mode 100644 index daf6b5d59d9..00000000000 --- a/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/tear_veil - name = "Tear Veil" - desc = "Use your mental strength to literally tear a hole from this dimension to the next, letting things through..." - - charge_max = 300 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - number_of_channels = 0 - time_between_channels = 200 - hud_state = "const_floor" - cast_sound = 'sound/effects/meteorimpact.ogg' - var/list/possible_spawns = list( - /mob/living/simple_animal/hostile/scarybat/cult, - /mob/living/simple_animal/hostile/creature/cult, - /mob/living/simple_animal/hostile/revenant/cult - ) - -/spell/tear_veil/choose_targets() - var/turf/T = get_turf(holder) - holder.visible_message(SPAN_NOTICE("A strange portal rips open underneath \the [holder]!")) - var/obj/effect/gateway/hole = new(get_turf(T)) - hole.density = FALSE - return list(hole) - -/spell/tear_veil/cast(var/list/targets, var/mob/holder, var/channel_count) - if(channel_count == 1) - return - var/type = pick(possible_spawns) - var/mob/living/L = new type(get_turf(targets[1])) - L.faction = holder.faction - L.visible_message(SPAN_WARNING("\A [L] escapes from the portal!")) - -/spell/tear_veil/after_spell(var/list/targets) - qdel(targets[1]) - return \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/structures.dm b/mods/gamemodes/deity/forms/narsie/structures.dm deleted file mode 100644 index af576963a1f..00000000000 --- a/mods/gamemodes/deity/forms/narsie/structures.dm +++ /dev/null @@ -1,36 +0,0 @@ -/obj/structure/deity/altar/narsie - name = "altar" - desc = "A small desk, covered in blood." - icon_state = "talismanaltar" - -//BLOODLETTING STRUCTURE -//A follower can stand here and mumble prayers as they let their blood flow slowly into the structure. -/obj/structure/deity/blood_stone - name = "bloody stone" - desc = "A jagged stone covered in the various stages of blood, from dried to fresh." - icon_state = "blood_stone" - // TODO: material-based health for deity structures - current_health = 100 //It's a piece of rock. - build_cost = 700 - -/obj/structure/deity/blood_stone/attack_hand(var/mob/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return ..() - var/mob/living/human/H = user - user.visible_message( - SPAN_WARNING("\The [user] calmly slices their finger on \the [src], smearing their blood over the black stone."), - SPAN_WARNING("You slowly slide your finger down one of \the [src]'s sharp edges, smearing your blood over its smooth surface.") - ) - while(do_after(H, 5 SECONDS, src)) - user.audible_message("\The [user] utters something under their breath.", SPAN_OCCULT("You mutter a dark prayer to your master as you feel the stone eat away at your lifeforce.")) - if(H.should_have_organ(BP_HEART)) - H.drip(5, get_turf(src)) - else - H.take_damage(5) - linked_god.adjust_power_min(1, 1) - return TRUE - -/datum/codex_entry/deity/blood_stone - associated_paths = list(/obj/structure/deity/blood_stone) - antag_text = "Allows the user to feed blood directly to the aligned deity, granting it power." - disambiguator = "occult" \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm b/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm deleted file mode 100644 index 286be5afd10..00000000000 --- a/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/deity_item/boon/blazing_blade - name = "Blazing Blade" - desc = "A divine blade of burning fury. If it stays too far away from an altar of some sort, it disappears." - base_cost = 250 - category = DEITY_TREE_ARTIFACT - boon_path = /obj/item/sword/blazing - -/datum/deity_item/boon/holy_beacon - name = "Holy Beacon" - desc = "A staff capable of producing an almost harmless bolt of sunlight, capable of blinding anyone in the room, at least for a while." - base_cost = 200 - category = DEITY_TREE_ARTIFACT - boon_path = /obj/item/gun/energy/staff/beacon - -/datum/deity_item/boon/black_death - name = "Black Death" - desc = "A small dagger capable of poisoning those it bites. Careful, if it loses all its charges, it will burn the user. It can be recharged at a radiant statue." - base_cost = 150 - category = DEITY_TREE_ARTIFACT - boon_path = /obj/item/knife/ritual/shadow - -/datum/deity_item/blood_crafting/firecrafting - name = "Fire Crafting" - desc = "Gain the ability for your minions to build smithing stations that can make many rings of power." - base_cost = 300 - category = DEITY_TREE_ARTIFACT - max_level = 1 - forge_type = /obj/structure/deity/blood_forge/starlight - recipes = list(/obj/item/clothing/gloves/ring/aura_ring/talisman_of_starborn = 70, - /obj/item/clothing/gloves/ring/aura_ring/talisman_of_blueforged = 70, - /obj/item/clothing/gloves/ring/aura_ring/talisman_of_shadowling = 70 - ) \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm b/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm deleted file mode 100644 index 37f830d27cb..00000000000 --- a/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm +++ /dev/null @@ -1,41 +0,0 @@ -/datum/deity_item/phenomenon/herald - name = "Choose Herald" - desc = "Gives you the ability to choose a herald. Can only be used once so be careful." - phenomenon_path = /datum/phenomenon/herald - base_cost = 100 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomenon/wisp - name = "Summon Wisp" - desc = "Manipulate around a small light." - phenomenon_path = /datum/phenomenon/movable_object/wisp - base_cost = 100 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomenon/flickering_whisper - name = "Flickering Whisper" - desc = "Send a subtle message to a non-follower, and see what they see for a while." - phenomenon_path = /datum/phenomenon/flickering_whisper - base_cost = 50 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomenon/burning_glare - name = "Burning Glare" - desc = "Use your divine power to physically burn a person." - phenomenon_path = /datum/phenomenon/burning_glare - base_cost = 200 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomenon/open_gateway - name = "Open Gateway" - desc = "Unlocks the ability to open a gateway. Required for rebirth." - phenomenon_path = /datum/phenomenon/create_gateway - base_cost = 250 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomenon/divine_right - name = "Divine Right" - desc = "Unlocks the ability to possess your Herald, permanently transforming you into a physical god." - phenomenon_path = /datum/phenomenon/divine_right - base_cost = 300 - category = DEITY_TREE_HERALD \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm b/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm deleted file mode 100644 index 33c6e19a55a..00000000000 --- a/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm +++ /dev/null @@ -1,62 +0,0 @@ -/datum/deity_item/boon/starburst - name = "Starburst" - desc = "Grant your minion the power to blind non-followers nearby." - base_cost = 60 - boon_path = /spell/targeted/genetic/blind/starburst - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/exchange_wounds - name = "Exchange Wounds" - desc = "Allow a follower to sacrifice their own well-being for that of those around them." - base_cost = 120 - boon_path = /spell/aoe_turf/exchange_wounds - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/radiant_aura - name = "Radiant Aura" - desc = "This spell makes one of your followers immune to laser fire, for a short while at least." - base_cost = 70 - boon_path = /spell/radiant_aura/starlight - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/burning_touch - name = "Burning Touch" - desc = "Sets your minion's hand aflame, allowing them to burn people with an ever-increasing flame." - base_cost = 60 - boon_path = /spell/targeted/equip_item/burning_hand - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/burning_grip - name = "Burning Grip" - desc = "Give your follower the ability to burn an item in someone's hand so badly it causes them to burn." - base_cost = 50 - boon_path = /spell/hand/burning_grip - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/blood_boil - name = "Blood Boil" - desc = "Allow a follower to concentrate so deeply on a target that their body temperature increases, eventually setting them on fire." - base_cost = 90 - boon_path = /spell/targeted/blood_boil - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/fireball - name = "Fireball" - desc = "A classic spell, grants your follower the ability to throw an exploding ball of flame in any direction." - base_cost = 100 - boon_path = /spell/targeted/projectile/dumbfire/fireball - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/emp - name = "Disable Machinery" - desc = "Gives your follower a spell of disabling machinery, and mechanical hearts." - base_cost = 110 - boon_path = /spell/aoe_turf/disable_tech/starlight - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/cure_light - name = "Cure Light Wounds" - desc = "Grant mercy on your followers, giving them the ability to heal themselves slightly." - base_cost = 70 - boon_path = /spell/targeted/heal_target - category = DEITY_TREE_FIRECONJ \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/items.dm b/mods/gamemodes/deity/forms/starlight/items.dm deleted file mode 100644 index 31645b2d3ac..00000000000 --- a/mods/gamemodes/deity/forms/starlight/items.dm +++ /dev/null @@ -1,159 +0,0 @@ -/obj/item/clothing/gloves/ring/aura_ring - var/obj/aura/granted_aura - -/obj/item/clothing/gloves/ring/aura_ring/equipped(var/mob/living/L, var/slot) - ..() - if(granted_aura && slot == slot_gloves_str) - L.add_aura(granted_aura) - -/obj/item/clothing/gloves/ring/aura_ring/dropped(var/mob/living/L) - ..() - if(granted_aura) - L.remove_aura(granted_aura) - -/obj/item/clothing/gloves/ring/aura_ring/Destroy() - QDEL_NULL(granted_aura) - . = ..() - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_starborn - name = "Talisman of the Starborn" - desc = "This ring seems to shine with more light than is put on it." - icon = 'icons/clothing/accessories/jewelry/rings/ring_star.dmi' - material = /decl/material/solid/metal/blackbronze - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_starborn/Initialize() - . = ..() - granted_aura = new /obj/aura/starborn() - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_blueforged - name = "Talisman of the Blueforged" - desc = "The gem on this ring is quite peculiar..." - icon = 'icons/clothing/accessories/jewelry/rings/ring_blue.dmi' - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_blueforged/Initialize() - . = ..() - granted_aura = new /obj/aura/blueforge_aura() - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_shadowling - name = "Talisman of the Shadowling" - desc = "If you weren't looking at this, you probably wouldn't have noticed it." - icon = 'icons/clothing/accessories/jewelry/rings/ring_shadow.dmi' - material = /decl/material/solid/metal/blackbronze - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_shadowling/Initialize() - . = ..() - granted_aura = new /obj/aura/shadowling_aura() - -/obj/item/clothing/suit/armor/sunsuit - name = "knight's armor" - desc = "Now, you can be the knight in shining armor you've always wanted to be. With complementary sun insignia." - icon = 'icons/clothing/suits/deity/star_champion.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, - ARMOR_BULLET = ARMOR_BALLISTIC_AP, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/head/helmet/sunhelm - name = "knight's helm" - desc = "It's a shiny metal helmet. It looks ripped straight out of the Dark Ages, actually." - icon = 'icons/clothing/head/star_champion.dmi' - flags_inv = HIDEEARS | BLOCK_ALL_HAIR - -/obj/item/clothing/suit/armor/sunrobe - name = "oracle's robe" - desc = "The robes of a priest. One that praises the sun, apparently. Well, it certainly reflects light well." - icon = 'icons/clothing/suits/deity/star_oracle.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/suit/armor/sunrobe/Initialize() - . = ..() - set_light(4, 0.3) - -/obj/item/clothing/suit/space/shadowsuit - name = "traitor's cloak" - desc = "There is absolutely nothing visible through the fabric. The shadows stick to your skin when you touch it." - item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_AIRTIGHT - min_pressure_protection = 0 - icon = 'icons/clothing/suits/deity/star_traitor.dmi' - -/obj/item/clothing/head/helmet/space/shadowhood - name = "traitor's hood" - desc = "No light can pierce this hood. It's unsettling." - icon = 'icons/clothing/head/star_traitor.dmi' - flags_inv = HIDEEARS | BLOCK_ALL_HAIR - -/obj/item/knife/ritual/shadow - name = "black death" - desc = "An obsidian dagger. The singed remains of a green cloth are wrapped around the 'handle.'" - var/charge = 5 - -/obj/item/knife/ritual/shadow/apply_hit_effect(var/mob/living/target, var/mob/living/user, var/hit_zone) - . = ..() - if(charge) - if(target.get_damage(BRUTE) > 15) - var/datum/reagents/R = target.reagents - if(!R) - return - R.add_reagent(/decl/material/liquid/venom, 5) - new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "fire_goon") - charge-- - else - user.take_damage(5, BURN) - if(prob(5)) - to_chat(user, SPAN_WARNING("\The [src] appears to be out of power!")) - new /obj/effect/temporary(get_turf(user),3, 'icons/effects/effects.dmi', "fire_goon") - -/obj/item/gun/energy/staff/beacon - name = "holy beacon" - desc = "Look closely into its crystal; there's a miniature sun. Or maybe that's just some fancy LEDs. Either way, it looks thoroughly mystical." - icon = 'icons/obj/wizard.dmi' - icon_state = "starstaff" - self_recharge = 0 - max_shots = 10 - projectile_type = /obj/item/projectile/energy/flash - required_antag_type = /decl/special_role/godcultist - -/obj/item/sword/blazing - name = "blazing blade" - icon = 'icons/obj/items/weapon/swords/flaming.dmi' - atom_damage_type = BURN - material_alteration = MAT_FLAG_ALTERATION_NONE - var/last_near_structure = 0 - var/mob/living/deity/linked - -/obj/item/sword/blazing/Initialize(var/maploading, var/material, var/deity) - . = ..() - START_PROCESSING(SSobj, src) - linked = deity - -/obj/item/sword/blazing/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/sword/blazing/Process() - if(!linked || last_near_structure + 10 SECONDS > world.time) - return - - if(linked.near_structure(src,1)) - if(last_near_structure < world.time - 30 SECONDS) - to_chat(loc, SPAN_NOTICE("\The [src] surges with power anew!")) - last_near_structure = world.time - else - if(last_near_structure < world.time - 30 SECONDS) //If it has been at least 30 seconds. - if(prob(5)) - to_chat(loc, SPAN_WARNING("\The [src] begins to fade, its power dimming this far away from a shrine.")) - else if(last_near_structure + 1800 < world.time) - visible_message(SPAN_WARNING("\The [src] disintegrates into a pile of ash!")) - new /obj/effect/decal/cleanable/ash(get_turf(src)) - qdel(src) diff --git a/mods/gamemodes/deity/forms/starlight/mobs.dm b/mods/gamemodes/deity/forms/starlight/mobs.dm deleted file mode 100644 index 5748cf2e2f4..00000000000 --- a/mods/gamemodes/deity/forms/starlight/mobs.dm +++ /dev/null @@ -1,29 +0,0 @@ -/mob/living/starlight_soul - name = "soul" - desc = "A captured soul." - anchored = TRUE - butchery_data = null - -/mob/living/starlight_soul/Initialize(var/maploading, var/mob/living/old_mob) - . = ..() - if(old_mob) - name = old_mob.real_name - -/mob/living/starlight_soul/proc/set_deity(var/mob/living/deity/deity) - var/mob/observer/eye/freelook/cult/eye - if(eyeobj) - eye = eyeobj - eyeobj.release(src) - else - eye = new(src) - eye.suffix = "Soul" - eyeobj = eye - eye.visualnet = deity.eyenet - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(src.mind,1,"lost soul of [deity]", "You have been captured by \the [deity]! You now can only see into your own reality through the same rips and tears it uses. Your only chance at another body will be one in your captor's image...",specific_god=deity) - eyeobj.possess(src) - -/mob/living/starlight_soul/Destroy() - if(eyeobj) - QDEL_NULL(eyeobj) - . = ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm b/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm deleted file mode 100644 index f6462ae33fe..00000000000 --- a/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm +++ /dev/null @@ -1,4 +0,0 @@ -/spell/aoe_turf/disable_tech/starlight - hidden_from_codex = TRUE - charge_max = 600 - spell_flags = 0 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm b/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm deleted file mode 100644 index 8ad867e41b3..00000000000 --- a/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm +++ /dev/null @@ -1,5 +0,0 @@ -/spell/radiant_aura/starlight - name = "Starlight Aura" - desc = "This spell makes you immune to laser fire, for a short while at least." - spell_flags = 0 - charge_max = 400 diff --git a/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm b/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm deleted file mode 100644 index e47edecd082..00000000000 --- a/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm +++ /dev/null @@ -1,57 +0,0 @@ -/spell/veil_of_shadows - name = "Veil of Shadows" - desc = "Become intangable, invisible. Like a ghost." - charge_max = 400 - invocation_type = SpI_EMOTE - invocation = "flickers out of existance" - school = "Divine" - spell_flags = 0 - duration = 100 - var/timer_id - var/light_steps = 4 - - hud_state = "wiz_statue" - -/spell/veil_of_shadows/choose_targets() - if(!timer_id && ishuman(holder)) - return list(holder) - . = null - -/spell/veil_of_shadows/cast(var/list/targets, var/mob/user) - var/mob/living/human/H = user - H.AddMovementHandler(/datum/movement_handler/mob/incorporeal) - if(H.add_cloaking_source(src)) - H.visible_message(SPAN_WARNING("\The [H] shrinks from view!")) - events_repository.register(/decl/observ/moved, H,src,PROC_REF(check_light)) - timer_id = addtimer(CALLBACK(src,PROC_REF(cancel_veil)),duration, TIMER_STOPPABLE) - -/spell/veil_of_shadows/proc/cancel_veil() - var/mob/living/human/H = holder - H.RemoveMovementHandler(/datum/movement_handler/mob/incorporeal) - deltimer(timer_id) - timer_id = null - var/turf/T = get_turf(H) - if(T.get_lumcount() > 0.1) //If we're somewhere somewhat shadowy we can stay invis as long as we stand still - drop_cloak() - else - events_repository.unregister(/decl/observ/moved, H,src) - events_repository.register(/decl/observ/moved, H,src,PROC_REF(drop_cloak)) - -/spell/veil_of_shadows/proc/drop_cloak() - var/mob/living/human/H = holder - if(H.remove_cloaking_source(src)) - H.visible_message(SPAN_NOTICE("\The [H] appears from nowhere!")) - events_repository.unregister(/decl/observ/moved, H,src) - -/spell/veil_of_shadows/proc/check_light() - if(light_steps) - light_steps-- - return - light_steps = initial(light_steps) - for(var/obj/machinery/light/light in view(1,holder)) - light.flicker(20) - -/spell/veil_of_shadows/Destroy() - deltimer(timer_id) - cancel_veil() - .= ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/starlight.dm b/mods/gamemodes/deity/forms/starlight/starlight.dm deleted file mode 100644 index 1469947fe10..00000000000 --- a/mods/gamemodes/deity/forms/starlight/starlight.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/god_form/starlight - name = "Starlight Herald" - info = {"Sun and fire incarnate.
- Benefits:
- +Ability to summon powerful minions via sacrifices.
- +Bless one of your minions as a Herald, giving them species powers and armor.
- Drawbacks:
- -Servant's powers will burn them.
- -You require copious amounts of power regeneration.
- "} - desc = "The bringer of life, and all that entails." - god_icon_state = "sungod" - pylon_icon_state = "god" - faction = "herald" - - buildables = list(/obj/structure/deity/altar/starlight, - /obj/structure/deity/pylon/starlight, - /obj/structure/deity/radiant_statue, - ) - items = list(/datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/boon/blazing_blade, - /datum/deity_item/boon/holy_beacon, - /datum/deity_item/boon/black_death, - /datum/deity_item/blood_crafting/firecrafting, - /datum/deity_item/boon/starburst, - /datum/deity_item/boon/exchange_wounds, - /datum/deity_item/boon/radiant_aura, - /datum/deity_item/boon/burning_touch, - /datum/deity_item/boon/burning_grip, - /datum/deity_item/boon/blood_boil, - /datum/deity_item/boon/emp, - /datum/deity_item/boon/cure_light, - /datum/deity_item/phenomenon/herald, - /datum/deity_item/phenomenon/wisp, - /datum/deity_item/phenomenon/flickering_whisper, - /datum/deity_item/phenomenon/burning_glare, - /datum/deity_item/phenomenon/open_gateway, - /datum/deity_item/phenomenon/divine_right - ) - -/datum/god_form/starlight/take_charge(var/mob/living/user, var/charge) - charge = max(5, charge/100) - if(prob(charge)) - to_chat(user, SPAN_DANGER("Your body burns!")) - user.take_damage(charge, BURN) - return 1 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/structures.dm b/mods/gamemodes/deity/forms/starlight/structures.dm deleted file mode 100644 index 7134d19ce48..00000000000 --- a/mods/gamemodes/deity/forms/starlight/structures.dm +++ /dev/null @@ -1,272 +0,0 @@ -/obj/structure/deity/altar/starlight - icon_state = "altarcandle" - -/obj/structure/deity/pylon/starlight - name = "sun pylon" - desc = "A miniature sun, floating ontop of a small pillar." - icon_state = "star_pylon" - -/obj/structure/deity/gateway - name = "gateway" - desc = "A gateway into the unknown." - icon = 'icons/obj/singularity.dmi' - icon_state = "singularity_s1" - power_adjustment = 1 - density = FALSE - var/weakref/target_ref - var/start_time = 0 - var/power_drain = 7 - var/looking_for - var/static/list/possible_forms = list( - "Starborn" = list( - "description" = "A species of hardy fire-wreathed soldiers.", - "message" = "As a Starborn, you are immune to laser-fire. You are a hardy soldier, able to take on the greatest of foes.", - "species" = "Starborn" - ), - "Blueforged" = list( - "description" = "Trans-dimensional beings with a multitude of miraculous abilities.", - "message" = "As a Blueforged, you are immune to all physical damage... except for heat. Not even your god can protect you.", - "species" = "Blueforged", - "spells" = list( - /spell/targeted/ethereal_jaunt, - /spell/targeted/shatter, - /spell/hand/burning_grip, - /spell/aoe_turf/disable_tech, - /spell/targeted/projectile/magic_missile, - /spell/open_gateway - ) - ), - "Shadowling" = list( - "description" = "Beings that come from a place of no light. They sneak from place to place, disabling everyone they touch.", - "message" = "As a Shadow you take damage from the light itself but have the ability to vanish from sight itself.", - "species" = "Shadow", - "spells" = list( - /spell/veil_of_shadows, - /spell/targeted/subjugation, - /spell/targeted/projectile/magic_missile - ) - ) - ) - -/obj/structure/deity/gateway/Initialize() - . = ..() - if(linked_god) - linked_god.power_per_regen -= power_drain - START_PROCESSING(SSobj, src) - -/obj/structure/deity/gateway/Process() - if(!linked_god) - return - if(linked_god.power <= 0) - to_chat(linked_god,SPAN_WARNING("\The [src] disappears from your lack of power!")) - qdel(src) - return - var/mob/living/human/target - if(target_ref) - target = target_ref.resolve() - if(target) - if(get_turf(target) != get_turf(src)) - target = null - target_ref = null - start_time = 0 - return - else if(prob(5)) - to_chat(target,SPAN_DANGER("\The [src] sucks at your lifeforce!")) - if(start_time && world.time > start_time + 300) - start_time = 0 - to_chat(target,SPAN_DANGER("You have been sucked into \the [src], your soul used to fuel \the [linked_god]'s minions.")) - var/mob/living/starlight_soul/ss = new(get_turf(linked_god),target) - if(target.mind) - target.mind.transfer_to(ss) - else - ss.ckey = target.ckey - ss.set_deity(linked_god) - target.dust() - if(power_drain >= 3) - linked_god.power_per_regen += 3 - power_drain -= 3 - else - //Get new target - var/mob/living/human/T = locate() in get_turf(src) - if(T) - target_ref = weakref(T) - start_time = world.time - to_chat(T, SPAN_DANGER("You feel your lifeforce begin to drain into \the [src]!")) - -/obj/structure/deity/gateway/Destroy() - linked_god.power_per_regen += power_drain - . = ..() - -/obj/structure/deity/gateway/attack_deity(var/mob/living/deity/deity) - var/list/html = list() - html += "

Servant List

" - html += "
Select a minion type to summon
" - html += "" - for(var/a in possible_forms) - var/list/form = possible_forms[a] - html += "" - html += "
NameDescription
[a][form["description"]]
" - show_browser(linked_god, jointext(html, null), "window=gateway") - -/obj/structure/deity/gateway/CanUseTopic(var/mob/user) - if(linked_god && (user == linked_god || user.loc == linked_god.loc)) - return STATUS_INTERACTIVE - return STATUS_CLOSE - -/obj/structure/deity/gateway/proc/stop_looking_for(var/successful) - if(looking_for) - if(!successful) - to_chat(linked_god, SPAN_WARNING("\The [src] did not find any [looking_for]. You may try again if you wish.")) - looking_for = null - -/obj/structure/deity/gateway/OnTopic(var/mob/user, var/list/href_list) - if(href_list["accept"] && istype(user,/mob/living/starlight_soul)) - if(href_list["accept"] != looking_for) - return TOPIC_HANDLED - var/mob/living/human/H = new(get_turf(src)) - user.mind.transfer_to(H) - H.set_species(possible_forms[looking_for]["species"]) - for(var/s in possible_forms[looking_for]["spells"]) - var/spell/S = new s - H.add_spell(S) - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(H.mind, 1, "[looking_for] of [linked_god]", "You are a powerful entity in the service to \the [linked_god]. [possible_forms[looking_for]["species"]]", specific_god = linked_god) - stop_looking_for(TRUE) - - return TOPIC_HANDLED - if(href_list["spawn_type"] && user == linked_god) - if(looking_for) - to_chat(usr, SPAN_WARNING("\The [src] is already looking for a [looking_for].")) - else - looking_for = href_list["spawn_type"] - to_chat(usr, SPAN_NOTICE("\The [src] is now looking for a [looking_for].")) - for(var/l in get_turf(linked_god)) - if(istype(l, /mob/living/starlight_soul)) - to_chat(l, "\The [src] is looking for a soul to become a [looking_for]. Accept? (
Yes)") - addtimer(CALLBACK(src, PROC_REF(stop_looking_for), FALSE), 30 SECONDS) - show_browser(linked_god, null, "window=gateway") - return TOPIC_HANDLED - -/obj/structure/deity/radiant_statue - name = "radiant statue" - icon_state = "statue" - build_cost = 750 - power_adjustment = 1 - deity_flags = DEITY_STRUCTURE_NEAR_IMPORTANT|DEITY_STRUCTURE_ALONE - var/charge = 0 - var/charging = 0 //Charging, dispersing, etc. - -/obj/structure/deity/radiant_statue/on_update_icon() - ..() - if(charging) - icon_state = "statue_charging" - else if(charge) - icon_state = "statue_active" - else - icon_state = "statue" - -/obj/structure/deity/radiant_statue/Destroy() - if(charging) - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/structure/deity/radiant_statue/proc/get_followers_nearby() - . = list() - if(linked_god) - for(var/m in linked_god.minions) - var/datum/mind/M = m - if(get_dist(M.current, src) <= 3) - . += M.current - -/obj/structure/deity/radiant_statue/attack_hand(var/mob/L) - SHOULD_CALL_PARENT(FALSE) - var/obj/O = L.get_equipped_item(slot_wear_suit_str) - if(O && has_extension(O,/datum/extension/deity_be_near)) - if(activate_charging()) - to_chat(L, SPAN_NOTICE("You place your hands on \the [src], feeling your master's power course through you.")) - else - to_chat(L, SPAN_WARNING("\The [src] has already been activated.")) - else - to_chat(L, SPAN_WARNING("\The [src] does not recognize you as a herald of \the [linked_god]. You must wear a full set of herald's armor.")) - return TRUE - -/obj/structure/deity/radiant_statue/attack_deity(var/mob/living/deity/deity) - if(activate_charging()) - to_chat(deity,SPAN_NOTICE("You activate \the [src], and it begins to charge as long as at least one of your followers is nearby.")) - else - to_chat(deity,SPAN_WARNING("\The [src] is either already activated, or there are no followers nearby to charge it.")) - -/obj/structure/deity/radiant_statue/proc/activate_charging() - var/list/followers = get_followers_nearby() - if(is_processing || !followers.len) - return 0 - charging = 1 - START_PROCESSING(SSobj, src) - src.visible_message(SPAN_NOTICE("\The [src] hums, activating.")) - update_icon() - return 1 - -/obj/structure/deity/radiant_statue/attackby(var/obj/item/I, var/mob/user) - if(charging && (istype(I, /obj/item/knife/ritual/shadow) || istype(I, /obj/item/gun/energy/staff/beacon)) && charge_item(I, user)) - return - ..() - -/obj/structure/deity/radiant_statue/proc/charge_item(var/obj/item/I, var/mob/user) - . = 0 - if(istype(I, /obj/item/gun/energy)) - var/obj/item/gun/energy/energy = I - var/obj/item/cell/power_supply = energy.get_cell() - if(power_supply) - power_supply.give(energy.charge_cost * energy.max_shots) - . = 1 - else if(istype(I ,/obj/item/knife/ritual/shadow)) - var/obj/item/knife/ritual/shadow/shad = I - shad.charge = initial(shad.charge) - . = 1 - if(.) - to_chat(user, SPAN_NOTICE("\The [src]'s glow envelops \the [I], restoring it to proper use.")) - charge -= 1 - -/obj/structure/deity/radiant_statue/Process() - if(charging) - charge++ - var/list/followers = get_followers_nearby() - if(followers.len == 0) - stop_charging() - return - - if(charge == 40) - src.visible_message(SPAN_NOTICE("\The [src] lights up, pulsing with energy.")) - charging = 0 - update_icon() - else - charge -= 0.5 - var/list/followers = get_followers_nearby() - if(followers.len) - for(var/m in followers) - var/mob/living/L = m - L.heal_damage(BURN, 5) - if(prob(5)) - to_chat(L, SPAN_NOTICE("You feel a pleasant warmth spread throughout your body...")) - for(var/s in L.mind.learned_spells) - var/spell/spell = s - spell.charge_counter = spell.charge_max - if(charge == 0) - stop_charging() - -/obj/structure/deity/radiant_statue/proc/stop_charging() - STOP_PROCESSING(SSobj, src) - src.visible_message(SPAN_NOTICE("\The [src] powers down, returning to its dormant form.")) - charging = 0 - update_icon() - -/obj/structure/deity/blood_forge/starlight - name = "radiant forge" - desc = "a swath of heat and fire permeats from this forge." - recipe_feat_list = "Fire Crafting" - text_modifications = list( - "Cost" = "Burn", - "Dip" = "fire. Pain envelopes you as dark burns mar your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire, ignoring the painful burns it gives you in the process.", - "Out" = "flames" - ) diff --git a/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm b/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm deleted file mode 100644 index 0d6f820540b..00000000000 --- a/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm +++ /dev/null @@ -1,107 +0,0 @@ -/datum/deity_item/conjuration - name = DEITY_TREE_CONJURATION - desc = "Conjuration is the school of creation and teleportation, summoning fireballs or teleporting long distances, this school is extremely powerful." - category = DEITY_TREE_CONJURATION - max_level = 3 - base_cost = 50 - -/datum/deity_item/conjuration/get_cost(var/mob/living/deity/D) - return base_cost * (level + 1) - -//Level 1 -/datum/deity_item/boon/single_charge/create_air - name = "Create Air" - desc = "Allows your follower to generate a livable atmosphere in the area they are in." - base_cost = 25 - category = DEITY_TREE_CONJURATION - boon_path = /spell/create_air/tower - requirements = list(DEITY_TREE_CONJURATION = 1) - -/datum/deity_item/boon/single_charge/acid_spray - name = "Acid Spray" - desc = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." - base_cost = 130 - category = DEITY_TREE_CONJURATION - boon_path = /spell/acid_spray/tower - requirements = list(DEITY_TREE_CONJURATION = 1) - -/datum/deity_item/boon/single_charge/force_wall - name = "Force Wall" - desc = "A temporary invincible wall for followers to summon." - base_cost = 30 - category = DEITY_TREE_CONJURATION - boon_path = /spell/aoe_turf/conjure/forcewall/tower - requirements = list(DEITY_TREE_CONJURATION = 1) - -/datum/deity_item/phenomenon/dimensional_locker - name = "Phenomenon: Dimensional Locker" - desc = "Gain the ability to move a magical locker around. While it cannot move living things, you can move it around as you please, even disappearing it into the nether." - base_cost = 50 - category = DEITY_TREE_CONJURATION - phenomenon_path = /datum/phenomenon/movable_object/dimensional_locker - requirements = list(DEITY_TREE_CONJURATION = 1) - -//Level 2 -/datum/deity_item/boon/single_charge/faithful_hound - name = "Faithful Hound" - desc = "This spell allows a follower to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." - base_cost = 40 - category = DEITY_TREE_CONJURATION - boon_path = /spell/aoe_turf/conjure/faithful_hound/tower - requirements = list(DEITY_TREE_CONJURATION = 2) - -/datum/deity_item/wizard_armaments - name = DEITY_UNLOCK_ARMS - desc = "Unlock spells related to the summoning of weapons and armor. These spells only last a short duration, but are extremely effective." - base_cost = 25 - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_TREE_CONJURATION = 2) - -/datum/deity_item/boon/single_charge/sword - name = "Summon Sword" - desc = "This spell allows your followers to summon a golden firey sword for a short duration." - base_cost = 50 - boon_path = /spell/targeted/equip_item/dyrnwyn/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_UNLOCK_ARMS = 1) - -/datum/deity_item/boon/single_charge/shield - name = "Summon Shield" - desc = "This spell allows your followers to summon a magical shield for a short duration." - base_cost = 20 - boon_path = /spell/targeted/equip_item/shield/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_UNLOCK_ARMS = 1) - -/datum/deity_item/phenomenon/portals - name = "Phenomenon: Portals" - desc = "Gain the ability to create portals for your followers to enter through. You will need to create two for it work. Any created past that will delete the oldest portal." - base_cost = 75 - requirements = list(DEITY_TREE_CONJURATION = 2) - category = DEITY_TREE_CONJURATION - phenomenon_path = /datum/phenomenon/portals - -//Level 3 -/datum/deity_item/boon/single_charge/fireball - name = "Fireball" - desc = "Embue your follower with the power of exploding fire." - base_cost = 85 - boon_path = /spell/targeted/projectile/dumbfire/fireball/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_TREE_CONJURATION = 3) - -/datum/deity_item/boon/single_charge/force_portal - name = "Force Portal" - desc = "This spell allows a follower to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." - base_cost = 45 - boon_path = /spell/aoe_turf/conjure/force_portal/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_TREE_CONJURATION = 3) - -/datum/deity_item/phenomenon/banishing_smite - name = "Phenomenon: Banishing Smite" - desc = "Gain the ability to smite an individual, dealing damage to them. If they are weakened enough, this can cause them to temporarily be transported." - base_cost = 75 - requirements = list(DEITY_TREE_CONJURATION = 3) - category = DEITY_TREE_CONJURATION - phenomenon_path = /datum/phenomenon/banishing_smite \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm b/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm deleted file mode 100644 index 5eb1dd34785..00000000000 --- a/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm +++ /dev/null @@ -1,97 +0,0 @@ -/datum/deity_item/transmutation - name = DEITY_TREE_TRANSMUTATION - desc = "Transmutation is the school of change. It cannot be used to create things, only modify them or even destroy them." - category = DEITY_TREE_TRANSMUTATION - max_level = 3 - base_cost = 50 - -/datum/deity_item/conjuration/get_cost(var/mob/living/deity/D) - return base_cost * (level + 1) - -//Level 1 -/datum/deity_item/boon/single_charge/slippery_surface - name = "Slippery Surface" - desc = "Allows a follower to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." - base_cost = 10 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/hand/slippery_surface/tower - -/datum/deity_item/boon/single_charge/smoke - name = "Smoke" - desc = "Allows a follower to distill the nearby air into smoke." - base_cost = 10 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/aoe_turf/smoke/tower - -//Level 2 -/datum/deity_item/boon/single_charge/knock - name = "Knock" - desc = "Allows a follower to open nearby doors without the keys." - base_cost = 25 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/aoe_turf/knock/tower - requirements = list(DEITY_TREE_TRANSMUTATION = 2) - -/datum/deity_item/boon/single_charge/burning_grip - name = "Burning Grip" - desc = "Allows a follower cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." - base_cost = 15 - boon_path = /spell/hand/burning_grip/tower - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 2) - -/datum/deity_item/phenomenon/warp_body - name = "Phenomenon: Warp Body" - desc = "Gain the ability to warp the very structure of a target's body, wracking pain and weakness." - base_cost = 75 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 2) - phenomenon_path = /datum/phenomenon/warp - -//Level 3 -/datum/deity_item/boon/single_charge/jaunt - name = "Ethereal Jaunt" - desc = "Allows a follower to liquify for a short duration, letting them pass through all dense objects." - base_cost = 25 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/targeted/ethereal_jaunt/tower - requirements = list(DEITY_TREE_TRANSMUTATION = 3) - -/datum/deity_item/healing_spells - name = DEITY_UNLOCK_HEAL - desc = "Of transmutation, healing is perhaps the most immediately effective and useful. This unlocks the healing spells for your followers." - base_cost = 50 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 3) - -/datum/deity_item/boon/single_charge/heal - name = "Minor Heal" - desc = "Allows your follower to heal themselves, or others, for a slight amount." - base_cost = 15 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_UNLOCK_HEAL = 1) - boon_path = /spell/targeted/heal_target/tower - -/datum/deity_item/boon/single_charge/heal/major - name = "Major Heal" - desc = "Allows your follower to heal others for a great amount." - base_cost = 25 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_UNLOCK_HEAL = 1) - boon_path = /spell/targeted/heal_target/major/tower - -/datum/deity_item/boon/single_charge/heal/area - name = "Area Heal" - desc = "Allows your follower to heal everyone in an area for minor damage." - base_cost = 20 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_UNLOCK_HEAL = 1) - boon_path = /spell/targeted/heal_target/area/tower - -/datum/deity_item/phenomenon/rock_form - name = "Phenomenon: Rock Form" - desc = "Gain the ability to transform your followers into beings of rock and stone." - base_cost = 75 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 3) - phenomenon_path = /datum/phenomenon/rock_form \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/spells.dm b/mods/gamemodes/deity/forms/tower/spells.dm deleted file mode 100644 index 18b88647edf..00000000000 --- a/mods/gamemodes/deity/forms/tower/spells.dm +++ /dev/null @@ -1,67 +0,0 @@ -/spell/create_air/tower - desc = "Allows you to generate a livable atmosphere in the area you are in." - charge_max = 5 - -/spell/hand/burning_grip/tower - desc = "Allows you cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." - charge_max = 3 - -/spell/hand/slippery_surface/tower - desc = "Allows you to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." - charge_max = 2 - -/spell/aoe_turf/knock/tower - charge_max = 2 - hidden_from_codex = TRUE - -/spell/aoe_turf/smoke/tower - charge_max = 2 - hidden_from_codex = TRUE - -/spell/aoe_turf/conjure/faithful_hound/tower - desc = "This spell allows you to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." - charge_max = 1 - spell_flags = 0 - -/spell/aoe_turf/conjure/force_portal/tower - desc = "This spell allows you to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." - charge_max = 2 - spell_flags = 0 - -/spell/acid_spray/tower - desc = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." - charge_max = 2 - -/spell/targeted/heal_target/tower - desc = "Allows you to heal yourself, or others, for a slight amount." - charge_max = 2 - -/spell/targeted/heal_target/major/tower - charge_max = 1 - spell_flags = INCLUDEUSER | SELECTABLE - desc = "Allows you to heal others for a great amount." - -/spell/targeted/heal_target/area/tower - desc = "Allows you to heal everyone in an area for minor damage." - charge_max = 1 - -/spell/targeted/ethereal_jaunt/tower - desc = "Allows you to liquefy for a short duration, letting you pass through all dense objects." - charge_max = 2 - spell_flags = Z2NOCAST | INCLUDEUSER - -/spell/aoe_turf/conjure/forcewall/tower - desc = "A temporary invincible wall for you to summon." - charge_max = 3 - -/spell/targeted/equip_item/dyrnwyn/tower - desc = "This spell allows you to summon a fiery golden sword for a short duration." - charge_max = 1 - -/spell/targeted/equip_item/shield/tower - desc = "This spell allows you to summon a magical shield for a short duration." - charge_max = 1 - -/spell/targeted/projectile/dumbfire/fireball/tower - desc = "Imbue yourself with the power of exploding fire." - charge_max = 2 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/structures.dm b/mods/gamemodes/deity/forms/tower/structures.dm deleted file mode 100644 index 453caf22de2..00000000000 --- a/mods/gamemodes/deity/forms/tower/structures.dm +++ /dev/null @@ -1,25 +0,0 @@ -/obj/structure/deity/altar/tower - icon_state = "tomealtar" - -/obj/structure/deity/wizard_recharger - name = "fountain of power" - desc = "Refreshing, cool water surrounded by archaic carvings." - icon_state = "fountain" - power_adjustment = 2 - build_cost = 700 - -/obj/structure/deity/wizard_recharger/attack_hand(var/mob/hitter) - SHOULD_CALL_PARENT(FALSE) - if(!length(hitter.mind?.learned_spells)) - to_chat(hitter, SPAN_WARNING("You don't feel as if this will do anything for you.")) - return TRUE - - hitter.visible_message(SPAN_NOTICE("\The [hitter] dips their hands into \the [src], a soft glow emanating from them.")) - if(do_after(hitter,300,src,check_holding=0)) - for(var/s in hitter.mind.learned_spells) - var/spell/spell = s - spell.charge_counter = spell.charge_max - to_chat(hitter, SPAN_NOTICE("You feel refreshed!")) - else - to_chat(hitter, SPAN_WARNING("You need to keep in contact with \the [src]!")) - return TRUE \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/tower.dm b/mods/gamemodes/deity/forms/tower/tower.dm deleted file mode 100644 index 37f63bce440..00000000000 --- a/mods/gamemodes/deity/forms/tower/tower.dm +++ /dev/null @@ -1,49 +0,0 @@ -/datum/god_form/wizard - name = "The Tower" - info = {"Only from destruction does the Tower grow. Its bricks smelted from crumbled ignorance and the fires of ambition.
- Benefits:
- +Learn spells from two different schools.
- +Deity gains power through each spell use.

- Drawbacks:
- -Abilities hold a limited amount of charge and must be charged at a fountain of power. - "} - desc = "A single solitary tower" - god_icon_state = "tower" - pylon_icon_state = "nim" - - buildables = list(/obj/structure/deity/altar/tower, - /obj/structure/deity/pylon, - /obj/structure/deity/wizard_recharger - ) - items = list(/datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/conjuration, - /datum/deity_item/boon/single_charge/create_air, - /datum/deity_item/boon/single_charge/acid_spray, - /datum/deity_item/boon/single_charge/force_wall, - /datum/deity_item/phenomenon/dimensional_locker, - /datum/deity_item/boon/single_charge/faithful_hound, - /datum/deity_item/wizard_armaments, - /datum/deity_item/boon/single_charge/sword, - /datum/deity_item/boon/single_charge/shield, - /datum/deity_item/phenomenon/portals, - /datum/deity_item/boon/single_charge/fireball, - /datum/deity_item/boon/single_charge/force_portal, - /datum/deity_item/phenomenon/banishing_smite, - /datum/deity_item/transmutation, - /datum/deity_item/boon/single_charge/slippery_surface, - /datum/deity_item/boon/single_charge/smoke, - /datum/deity_item/boon/single_charge/knock, - /datum/deity_item/boon/single_charge/burning_grip, - /datum/deity_item/phenomenon/warp_body, - /datum/deity_item/boon/single_charge/jaunt, - /datum/deity_item/healing_spells, - /datum/deity_item/boon/single_charge/heal, - /datum/deity_item/boon/single_charge/heal/major, - /datum/deity_item/boon/single_charge/heal/area, - /datum/deity_item/phenomenon/rock_form - ) - -/datum/god_form/wizard/take_charge(var/mob/living/user, var/charge) - linked_god.adjust_power_min(max(round(charge/100), 1),silent = 1) - return 1 \ No newline at end of file diff --git a/mods/gamemodes/deity/gamemode.dm b/mods/gamemodes/deity/gamemode.dm deleted file mode 100644 index 9bf79d8ca87..00000000000 --- a/mods/gamemodes/deity/gamemode.dm +++ /dev/null @@ -1,12 +0,0 @@ -/decl/game_mode/godmode - name = "Deity" - round_description = "An otherworldly beast has turned its attention to you and your fellow cremembers." - extended_round_description = "The station has been infiltrated by a fanatical group of death-cultists! They will use powers from beyond your comprehension to subvert you to their cause and ultimately please their gods through sacrificial summons and physical immolation! Try to survive!" - uid = "god" - required_players = 10 - required_enemies = 3 - end_on_antag_death = FALSE - associated_antags = list( - /decl/special_role/deity, - /decl/special_role/godcultist - ) \ No newline at end of file diff --git a/mods/gamemodes/deity/god_cultist_role.dm b/mods/gamemodes/deity/god_cultist_role.dm deleted file mode 100644 index d1c5bced882..00000000000 --- a/mods/gamemodes/deity/god_cultist_role.dm +++ /dev/null @@ -1,106 +0,0 @@ -/decl/special_role/godcultist - name = "God Cultist" - name_plural = "God Cultists" - blacklisted_jobs = list(/datum/job/submap) - antag_indicator = "hudcultist" - faction_verb = /mob/living/proc/dpray - welcome_text = "You are under the guidance of a powerful otherwordly being. Spread its will and keep your faith.
Use dpray to communicate directly with your master!
Ask your master for spells to start building!" - flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE - hard_cap = 5 - hard_cap_round = 6 - initial_spawn_req = 3 - initial_spawn_target = 3 - antaghud_indicator = "hudcultist" - skill_setter = /datum/antag_skill_setter/station - blocked_job_event_categories = list(ASSIGNMENT_ROBOT, ASSIGNMENT_COMPUTER) - -/decl/special_role/godcultist/add_antagonist_mind(var/datum/mind/player, var/ignore_role, var/nonstandard_role_type, var/nonstandard_role_msg, var/mob/living/deity/specific_god) - if(!..()) - return 0 - - if(specific_god) - add_cultist(player, specific_god) - - return 1 - -/decl/special_role/godcultist/post_spawn() - var/decl/special_role/deity = GET_DECL(/decl/special_role/deity) - if(!deity.current_antagonists.len) - return - var/count = 1 - var/deity_count = 1 - while(count <= current_antagonists.len) - if(deity_count > deity.current_antagonists.len) - deity_count = 1 - var/datum/mind/deity_mind = deity.current_antagonists[deity_count] - var/datum/mind/mind = current_antagonists[count] - add_cultist(mind, deity_mind.current) - count++ - deity_count++ - - -/decl/special_role/godcultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) - var/mob/living/deity/god = get_deity(player) - if(!..()) - return 0 - remove_cultist(player, god) - return 1 - -/decl/special_role/godcultist/get_extra_panel_options(var/datum/mind/player) - return "\[Select Deity\]" - -/decl/special_role/godcultist/Topic(href, href_list) - if(..()) - return 1 - if(href_list["selectgod"]) - var/list/god_list = list() - var/decl/special_role/deity = GET_DECL(/decl/special_role/deity) - if(length(deity.current_antagonists)) - for(var/m in deity.current_antagonists) - var/datum/mind/mind = m - god_list += mind.current - else - for(var/mob/living/deity/specific_deity in global.player_list) - god_list += specific_deity - if(god_list.len) - var/mob/living/deity/D = input(usr, "Select a deity for this cultist.") in null|god_list - if(D) - var/datum/mind/player = locate(href_list["selectgod"]) - remove_cultist(player) //Remove him from any current deity. - add_cultist(player, D) - log_and_message_admins("has set [key_name(player.current)] to be a minion of [key_name(D)]") - else - to_chat(usr, SPAN_WARNING("There are no deities to be linked to.")) - return 1 - -/decl/special_role/godcultist/proc/add_cultist(var/datum/mind/player, var/mob/living/deity/deity) - deity.add_follower(player.current) - player.current.add_language(/decl/language/cultcommon) - -/decl/special_role/godcultist/proc/remove_cultist(var/datum/mind/player, var/mob/living/deity/god) - god.remove_follower(player.current) - player.current.remove_language(/decl/language/cultcommon) - -/decl/special_role/godcultist/proc/get_deity(var/datum/mind/player) - var/decl/special_role/deity = GET_DECL(/decl/special_role/deity) - for(var/m in deity.current_antagonists) - var/datum/mind/mind = m - var/mob/living/deity/god = mind.current - if(god && god.is_follower(player.current,1)) - return god - -/mob/living/proc/dpray(var/msg as text) - set category = "Abilities" - - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - if(!src.mind || !godcult.is_antagonist(mind)) - return - msg = sanitize(msg) - var/mob/living/deity/D = godcult.get_deity(mind) - if(!D || !msg) - return - - //Make em wait a few seconds. - src.visible_message("\The [src] bows their head down, muttering something.", SPAN_NOTICE("You send the message \"[msg]\" to your master.")) - to_chat(D, "\The [src] (J) prays, \"[msg]\"") - log_and_message_admins("dprayed, \"[msg]\" to \the [key_name(D)]") diff --git a/mods/gamemodes/deity/mobs/deity.dm b/mods/gamemodes/deity/mobs/deity.dm deleted file mode 100644 index 96fc8fb54da..00000000000 --- a/mods/gamemodes/deity/mobs/deity.dm +++ /dev/null @@ -1,134 +0,0 @@ -/mob/living/deity - name = "shapeless creature" - desc = "A shape of otherworldly matter, not yet ready to be unleashed into this world." - icon = 'icons/mob/deity_big.dmi' - icon_state = "egg" - pixel_x = -128 - pixel_y = -128 - max_health = 100 - universal_understand = TRUE - mob_sort_value = 5 - is_spawnable_type = FALSE - butchery_data = null - - var/eye_type = /mob/observer/eye/freelook/cult - var/datum/visualnet/cultnet/eyenet - var/list/minions = list() //Minds of those who follow him - var/list/structures = list() //The objs that this dude controls. - var/list/feats = list() - var/datum/god_form/form - var/datum/current_boon - var/mob/living/following - -/mob/living/deity/Initialize() - . = ..() - eyenet = new() - eyeobj = new eye_type(get_turf(src), eyenet) - eyeobj.possess(src) - eyenet.add_source(src) - -/mob/living/deity/death(gibbed) - . = ..() - if(.) - for(var/m in minions) - var/datum/mind/M = m - remove_follower_spells(M) - to_chat(M.current, "Your connection has been severed! \The [src] is no more!") - sound_to(M.current, 'sound/hallucinations/far_noise.ogg') - SET_STATUS_MAX(M.current, STAT_WEAK, 10) - for(var/s in structures) - var/obj/structure/deity/S = s - S.linked_god = null - -/mob/living/deity/shared_nano_interaction() - if(stat == DEAD) - return STATUS_CLOSE - return STATUS_INTERACTIVE - -/mob/living/deity/Destroy() - - for(var/phenomenon in phenomena) - remove_phenomenon(phenomenon) - - if(length(items_by_category)) - for(var/cat in items_by_category) - var/list/L = items_by_category[cat] - L.Cut() - items_by_category.Cut() - - if(length(items)) - for(var/i in items) - qdel(items[i]) - items.Cut() - - death() - if(length(minions)) - minions.Cut() - if(length(structures)) - structures.Cut() - - if(eyeobj) - eyeobj.release() - QDEL_NULL(eyeobj) - QDEL_NULL(eyenet) //We do it here as some mobs have eyes that have access to the visualnet and we only want to destroy it when the deity is destroyed - - QDEL_NULL(form) - - return ..() - -/mob/living/deity/verb/return_to_plane() - set category = "Godhood" - - eyeobj.forceMove(get_turf(src)) - -/mob/living/deity/verb/choose_form() - set name = "Choose Form" - set category = "Godhood" - - var/dat = list() - dat += {"

Choose a Form

- This choice is permanent. Choose carefully, but quickly. - - - - - - "} - var/list/forms = subtypesof(/datum/god_form) - - for(var/form in forms) - var/datum/god_form/god = form - var/god_name = initial(god.name) - var/icon/god_icon = icon('icons/mob/mob.dmi', initial(god.pylon_icon_state)) - send_rsc(src,god_icon, "[god_name].png") - dat += {" - - - - "} - dat += "
NameThemeDescription
[god_name][initial(god.info)]
" - show_browser(src, JOINTEXT(dat), "window=godform;can_close=0") - -/mob/living/deity/proc/set_form(var/type) - form = new type(src) - to_chat(src, SPAN_NOTICE("You undergo a transformation into your new form!")) - spawn(1) - SetName(form.name) - var/newname = sanitize(input(src, "Choose a name for your new form.", "Name change", form.name) as text, MAX_NAME_LEN) - if(newname) - fully_replace_character_name(newname) - src.verbs -= /mob/living/deity/verb/choose_form - show_browser(src, null, "window=godform") - for(var/m in minions) - var/datum/mind/mind = m - var/mob/living/L = mind.current - L.faction = form.faction - -//Gets the name based on form, or if there is no form name, type. -/mob/living/deity/proc/get_type_name(var/type) - if(form && form.buildables[type]) - var/list/vars = form.buildables[type] - if(vars["name"]) - return vars["name"] - var/atom/movable/M = type - return initial(M.name) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_Stat.dm b/mods/gamemodes/deity/mobs/deity_Stat.dm deleted file mode 100644 index 6105b7f9af3..00000000000 --- a/mods/gamemodes/deity/mobs/deity_Stat.dm +++ /dev/null @@ -1,14 +0,0 @@ -/mob/living/deity/Stat() - . = ..() - if(statpanel("Status")) - stat("Structure Num", structures.len) - stat("Minion Num", minions.len) - var/boon_name = "None" - if(current_boon) - if(istype(current_boon, /spell)) - var/spell/S = current_boon - boon_name = S.name - else - var/obj/O = current_boon - boon_name = O.name - stat("Current Boon",boon_name) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_boons.dm b/mods/gamemodes/deity/mobs/deity_boons.dm deleted file mode 100644 index da05d9a5ff2..00000000000 --- a/mods/gamemodes/deity/mobs/deity_boons.dm +++ /dev/null @@ -1,54 +0,0 @@ -/mob/living/deity/proc/set_boon(var/datum/boon) - if(current_boon) - qdel(current_boon) - current_boon = boon - to_chat(src, SPAN_NOTICE("You now have the boon [boon]")) - if(istype(boon, /atom/movable)) - var/atom/movable/A = boon - nano_data["boon_name"] = A.name - A.forceMove(src) - else if(istype(boon, /spell)) - var/spell/S = boon - nano_data["boon_name"] = S.name - -/mob/living/deity/proc/grant_boon(var/mob/living/L) - if(istype(current_boon, /spell) && !grant_spell(L, current_boon)) - return - else if(istype(current_boon, /obj/item)) - var/obj/item/I = current_boon - I.dropInto(L.loc) - var/origin_text = "on the floor" - if(L.equip_to_appropriate_slot(I)) - origin_text = "on your body" - else if(L.put_in_hands_or_del(I)) - origin_text = "in your hands" - else - var/obj/O = L.equip_to_storage(I) - if(O) - origin_text = "in \the [O]" - to_chat(L, SPAN_NOTICE("It appears [origin_text].")) - - to_chat(L, SPAN_OCCULT("\The [src] grants you a boon of [current_boon]!")) - to_chat(src, SPAN_NOTICE("You give \the [L] a boon of [current_boon].")) - log_and_message_admins("gave [key_name(L)] the boon [current_boon]") - current_boon = null - nano_data["boon_name"] = null - return - -/mob/living/deity/proc/grant_spell(var/mob/living/target, var/spell/spell) - var/datum/mind/M = target.mind - for(var/s in M.learned_spells) - var/spell/S = s - if(istype(S, spell.type)) - to_chat(src, SPAN_WARNING("They already know that spell!")) - return 0 - target.add_spell(spell) - spell.set_connected_god(src) - to_chat(target, SPAN_NOTICE("You feel a surge of power as you learn the art of [current_boon].")) - return 1 - -/* This is a generic proc used by the God to enact a sacrifice from somebody. Power is a value of magnitude. -*/ -/mob/living/deity/proc/take_charge(var/mob/living/L, var/power) - if(form) - form.take_charge(L, power) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_click.dm b/mods/gamemodes/deity/mobs/deity_click.dm deleted file mode 100644 index aae71fd6257..00000000000 --- a/mods/gamemodes/deity/mobs/deity_click.dm +++ /dev/null @@ -1,24 +0,0 @@ -/mob/living/deity/ClickOn(var/atom/A, var/params) - if(A == src) - if(form) - ui_interact(src) - else - choose_form() - return - var/list/modifiers = params2list(params) - if(modifiers["shift"] || modifiers["ctrl"]) - if(silenced) - to_chat(src, SPAN_WARNING("You cannot do that as you are silenced!")) - else - var/datum/phenomenon/phenomenon = get_phenomenon(modifiers["shift"], modifiers["ctrl"]) - if(phenomenon) - phenomenon.Click(A) - return - if(current_boon && is_follower(A)) - grant_boon(A) - else if(istype(A, /obj/structure/deity)) - var/obj/structure/deity/D = A - if(D.linked_god == src) - D.attack_deity(src) - return - ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_hud.dm b/mods/gamemodes/deity/mobs/deity_hud.dm deleted file mode 100644 index 12824de9904..00000000000 --- a/mods/gamemodes/deity/mobs/deity_hud.dm +++ /dev/null @@ -1,9 +0,0 @@ -/mob/living/deity - hud_used = /datum/hud/deity - -/datum/hud/deity/FinalizeInstantiation() - action_intent = new /obj/screen/intent/deity(null, mymob) - adding += action_intent - ..() - var/obj/screen/intent/deity/D = action_intent - D.sync_to_mob(mymob) diff --git a/mods/gamemodes/deity/mobs/deity_items.dm b/mods/gamemodes/deity/mobs/deity_items.dm deleted file mode 100644 index 3dfa6e4dc64..00000000000 --- a/mods/gamemodes/deity/mobs/deity_items.dm +++ /dev/null @@ -1,33 +0,0 @@ -/mob/living/deity - var/list/items - var/list/items_by_category - -/mob/living/deity/proc/set_items(var/list/_items) - items = _items - items_by_category = list() - for(var/i in items) - var/datum/deity_item/di = items[i] - if(!items_by_category[di.category]) - items_by_category[di.category] = list() - items_by_category[di.category] += di - -/mob/living/deity/proc/has_item(var/name, var/minimum_level = 1) - if(!(name in items)) - return FALSE - var/datum/deity_item/di = items[name] - . = di.level >= minimum_level - -/mob/living/deity/proc/upgrade_item(var/name) - if(!(name in items)) - return FALSE - var/datum/deity_item/di = items[name] - if(!di.can_buy(src)) - return FALSE - di.buy(src) - . = TRUE - -/mob/living/deity/proc/get_item_level(var/name) - . = 0 - if(items[name]) - var/datum/deity_item/di = items[name] - . = di.level diff --git a/mods/gamemodes/deity/mobs/deity_phenomena.dm b/mods/gamemodes/deity/mobs/deity_phenomena.dm deleted file mode 100644 index a5abe64946a..00000000000 --- a/mods/gamemodes/deity/mobs/deity_phenomena.dm +++ /dev/null @@ -1,94 +0,0 @@ -/mob/living/deity - var/silenced = 0 - var/list/phenomena = list() - var/list/intent_phenomena = list() - var/static/list/control_types = list("control", "controlshift", "shift") - - -/mob/living/deity/Initialize() - . = ..() - for(var/decl/intent/intent as anything in decls_repository.get_decls_of_type_unassociated(/decl/intent)) //Just in case we somehow remove/add a new intent #futureproofing - populate_intent(intent) - set_phenomenon(add_phenomenon(/datum/phenomenon/communicate), GET_DECL(/decl/intent/disarm), "shift") - set_phenomenon(add_phenomenon(/datum/phenomenon/punish), GET_DECL(/decl/intent/help), "control") - set_phenomenon(add_phenomenon(/datum/phenomenon/point), GET_DECL(/decl/intent/help), "controlshift") - set_phenomenon(add_phenomenon(/datum/phenomenon/conversion), GET_DECL(/decl/intent/grab), "shift") - set_phenomenon(add_phenomenon(/datum/phenomenon/forced_conversion), GET_DECL(/decl/intent/grab), "control") - -/mob/living/deity/proc/silence(amount) - if(!silenced) - to_chat(src, SPAN_WARNING("You've been silenced! Your phenomena are disabled!")) - var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent - if(istype(SD)) - SD.color = "#ff0000" - silenced += amount - for(var/phenom in phenomena) //Also make it so that you don't do cooldowns. - var/datum/phenomenon/P = phenomena[phenom] - if(P.refresh_time) - P.refresh_time += amount - -/mob/living/deity/handle_regular_status_updates() - . = ..() - if(.) - if(silenced > 0) - silenced-- - if(!silenced) - to_chat(src, SPAN_NOTICE("You are no longer silenced.")) - var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent - if(istype(SD)) - SD.color = null - if(power_per_regen < 0 || power < power_min) - adjust_power(power_per_regen) - -/mob/living/deity/proc/add_phenomenon(phenomena_type) - LAZYINITLIST(phenomena) - for(var/P in phenomena) - if(istype(phenomena[P], phenomena_type)) - return - var/datum/phenomenon/P = new phenomena_type(src) - phenomena[P.name] = P - return P - -/mob/living/deity/proc/remove_phenomena_from_intent(decl/intent/intent, modifier, update = 1) - var/list/intent_list = intent_phenomena[intent] - intent_list[modifier] = null - if(update) - update_phenomena_bindings() - -/mob/living/deity/proc/remove_phenomenon(to_remove) - var/datum/phenomenon/P = phenomena[to_remove] - phenomena -= to_remove // this isn't going to work, is it? - for(var/intent in intent_phenomena) - var/list/intent_list = intent_phenomena[intent] - for(var/mod in intent_list) - if(intent_list[mod] == P) - intent_list[mod] = null - var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent - if(istype(SD)) - SD.update_text() - update_phenomena() - update_phenomena_bindings() - if(selected == to_remove) - selected = null - qdel(P) - -/mob/living/deity/proc/populate_intent(decl/intent/intent) - LAZYDISTINCTADD(intent_phenomena[intent], control_types) - -/mob/living/deity/proc/set_phenomenon(datum/phenomenon/phenomenon, decl/intent/intent, modifiers) - if(!LAZYACCESS(intent_phenomena, intent)) - populate_intent(intent) - var/list/intent_list = intent_phenomena[intent] - intent_list[modifiers] = phenomenon - -/mob/living/deity/proc/get_phenomenon(shift = 0, control = 0) - var/list/intent_list = intent_phenomena[get_intent()] - if(intent_list) - var/type = "" - if(shift) - type = "shift" - if(control) - type = "control[type]" - if(intent_list[type]) - return intent_list[type] - return null \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_power.dm b/mods/gamemodes/deity/mobs/deity_power.dm deleted file mode 100644 index ffe073b014a..00000000000 --- a/mods/gamemodes/deity/mobs/deity_power.dm +++ /dev/null @@ -1,21 +0,0 @@ -/mob/living/deity - var/power = 0 - var/power_min = 10 - var/power_per_regen = 1 - -/mob/living/deity/proc/adjust_power(var/amount) - if(amount) - power = max(0, power + amount) - -/mob/living/deity/proc/adjust_power_min(var/amount, var/silent = 0, var/msg) - if(amount) - power_min = max(initial(power_min), power_min + amount) - if(!silent) - var/feel = "" - if(abs(amount) > 20) - feel = " immensely" - else if(abs(amount) > 10) - feel = " greatly" - if(abs(amount) >= 5) - var/class = amount > 0 ? "notice" : "warning" - to_chat(src, "You feel your power [amount > 0 ? "increase" : "decrease"][feel][msg ? " [msg]" : ""]") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_pylon.dm b/mods/gamemodes/deity/mobs/deity_pylon.dm deleted file mode 100644 index 7f84dc5b339..00000000000 --- a/mods/gamemodes/deity/mobs/deity_pylon.dm +++ /dev/null @@ -1,21 +0,0 @@ -/mob/living/deity - var/image/pylon_image - var/obj/structure/deity/pylon/pylon - -/mob/living/deity/set_form(var/type) - ..() - pylon_image = image('icons/mob/mob.dmi', icon_state = form.pylon_icon_state) - pylon_image.alpha = 180 - -/mob/living/deity/proc/possess_pylon(var/obj/structure/deity/pylon/P) - if(pylon) - leave_pylon() - pylon = P - pylon.overlays += pylon_image - playsound(pylon,'sound/effects/phasein.ogg',40,1) - -/mob/living/deity/proc/leave_pylon() - if(!pylon) - return - pylon.overlays -= pylon_image - pylon = null \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_sources.dm b/mods/gamemodes/deity/mobs/deity_sources.dm deleted file mode 100644 index a1ec947983d..00000000000 --- a/mods/gamemodes/deity/mobs/deity_sources.dm +++ /dev/null @@ -1,84 +0,0 @@ -/mob/living/deity/proc/add_follower(var/mob/living/L) - if(is_follower(L, silent=1)) - return - - adjust_source(3, L) - minions += L.mind - var/spell/construction/C = new() - L.add_spell(C) - C.set_connected_god(src) - if(form) - L.faction = form.faction - update_followers() - events_repository.register(/decl/observ/destroyed, L,src, PROC_REF(dead_follower)) - events_repository.register(/decl/observ/death, L,src, PROC_REF(update_followers)) - -/mob/living/deity/proc/dead_follower(var/mob/living/L) - events_repository.unregister(/decl/observ/death, L,src) - events_repository.unregister(/decl/observ/destroyed, L,src) - -/mob/living/deity/proc/remove_follower_spells(var/datum/mind/M) - if(M.learned_spells) - for(var/s in M.learned_spells) - var/spell/S = s - if(S.connected_god == src) - M.current.remove_spell(S) - qdel(S) - -/mob/living/deity/proc/remove_follower(var/mob/living/L) - if(!is_follower(L, silent=1)) - return - - adjust_source(-3, L) - minions -= L.mind - L.faction = MOB_FACTION_NEUTRAL - if(L.mind) - remove_follower_spells(L.mind) - update_followers() - - -/mob/living/deity/proc/adjust_source(var/amount, var/atom/source, var/silent = 0, var/msg) - adjust_power_min(amount, silent, msg) - if(!ismovable(source)) - return - if(amount > 0) - eyenet.add_source(source) - if(istype(source, /obj/structure/deity)) - structures |= source - else - eyenet.remove_source(source) - if(istype(source, /obj/structure/deity)) - structures -= source - -/mob/living/deity/proc/is_follower(var/mob/living/L, var/silent = 0) - if(istype(L)) - if(L.mind) - if(L.mind in minions) - return 1 - if(!silent) - to_chat(src, SPAN_WARNING("You do not feel a malleable mind behind that frame.")) - return 0 - -/mob/living/deity/fully_replace_character_name(var/new_name, var/in_depth = TRUE) - if(!..()) - return 0 - for(var/m in minions) - var/datum/mind/minion = m - to_chat(minion.current, "Your master is now known as [new_name].") - minion.assigned_special_role = "Servant of [new_name]" - eyeobj.SetName("[src] ([eyeobj.name_sufix])") - nano_data["name"] = new_name - return 1 - -//Whether we are near an important structure. -/mob/living/deity/proc/near_structure(var/atom/A, var/all_structures = 0) - var/turf/T = get_turf(A) - for(var/s in structures) - if(!all_structures) - var/obj/structure/deity/D = s - if(D.deity_flags & DEITY_STRUCTURE_NEAR_IMPORTANT)//If it needs to be near an important structure, it isn't important. - continue - - if(get_dist(T, s) <= 3) - return 1 - return 0 \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_topic.dm b/mods/gamemodes/deity/mobs/deity_topic.dm deleted file mode 100644 index 4ff77504393..00000000000 --- a/mods/gamemodes/deity/mobs/deity_topic.dm +++ /dev/null @@ -1,56 +0,0 @@ -/mob/living/deity/OnSelfTopic(list/href_list) - if(href_list["form"]) - var/type = locate(href_list["form"]) in subtypesof(/datum/god_form) - if(type) - set_form(type) - return TOPIC_HANDLED - if(href_list["select_phenomenon"]) - nano_data["phenomenaMenu"] = 1 - selected = phenomena[href_list["select_phenomenon"]] - nano_data["selectedPhenomenaName"] = selected.name - return TOPIC_HANDLED - if(href_list["clear_selected"]) - nano_data["phenomenaMenu"] = 0 - selected = null - nano_data["selectedPhenomenaName"] = null - return TOPIC_HANDLED - if(href_list["select_intent"]) - var/decl/intent/intent = locate(href_list["select_intent"]) - if(!istype(intent)) - return TOPIC_NOACTION - var/binding = href_list["select_binding"] - var/list/phenomenon = intent_phenomena[intent] - if(phenomenon[binding]) - remove_phenomena_from_intent(intent, binding, 0) - if(selected) - set_phenomenon(selected, intent, binding) - update_phenomena_bindings() - return TOPIC_HANDLED - - if(href_list["jump"]) - var/atom/a = locate(href_list["jump"]) - var/follow = 0 - if(href_list["follow"]) - follow = 1 - if(a) - if(following) - stop_follow() - eyeobj.setLoc(get_turf(a)) - if(follow) - follow_follower(a) - to_chat(src, SPAN_NOTICE("[follow ? "Following" : "Jumping to"] \the [a]")) - return TOPIC_HANDLED - if(href_list["buy"]) - var/datum/deity_item/di = locate(href_list["buy"]) - if(di.can_buy(src)) - di.buy(src) - else - to_chat(di,SPAN_WARNING("You don't meet all the requirements for [di.name]!")) - return TOPIC_HANDLED - if(href_list["switchCategory"]) - set_nano_category(text2num(href_list["switchCategory"])) - return 1 - if(href_list["switchMenu"]) - nano_data[href_list["menu"]] = text2num(href_list["switchMenu"]) - return TOPIC_HANDLED - return ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_tracking.dm b/mods/gamemodes/deity/mobs/deity_tracking.dm deleted file mode 100644 index 27e9d3b552d..00000000000 --- a/mods/gamemodes/deity/mobs/deity_tracking.dm +++ /dev/null @@ -1,40 +0,0 @@ -/mob/living/deity/verb/jump_to_follower() - set category = "Godhood" - - if(!minions) - return - - var/list/could_follow = list() - for(var/m in minions) - var/datum/mind/M = m - if(M.current && M.current.stat != DEAD) - could_follow += M.current - - if(!could_follow.len) - return - - var/choice = input(src, "Jump to follower", "Teleport") as null|anything in could_follow - if(choice) - follow_follower(choice) - -/mob/living/deity/proc/follow_follower(var/mob/living/L) - if(!L || L.stat == DEAD || !is_follower(L, silent=1)) - return - if(following) - stop_follow() - eyeobj.setLoc(get_turf(L)) - to_chat(src, SPAN_NOTICE("You begin to follow \the [L].")) - following = L - events_repository.register(/decl/observ/moved, L, src, TYPE_PROC_REF(/mob/living/deity, keep_following)) - events_repository.register(/decl/observ/destroyed, L, src, TYPE_PROC_REF(/mob/living/deity, stop_follow)) - events_repository.register(/decl/observ/death, L, src, TYPE_PROC_REF(/mob/living/deity, stop_follow)) - -/mob/living/deity/proc/stop_follow() - events_repository.unregister(/decl/observ/moved, following, src) - events_repository.unregister(/decl/observ/destroyed, following, src) - events_repository.unregister(/decl/observ/death, following,src) - to_chat(src, SPAN_NOTICE("You stop following \the [following].")) - following = null - -/mob/living/deity/proc/keep_following(var/atom/movable/moving_instance, var/atom/old_loc, var/atom/new_loc) - eyeobj.setLoc(new_loc) diff --git a/mods/gamemodes/deity/mobs/freelook/cultnet.dm b/mods/gamemodes/deity/mobs/freelook/cultnet.dm deleted file mode 100644 index 86c718fa0f5..00000000000 --- a/mods/gamemodes/deity/mobs/freelook/cultnet.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/visualnet/cultnet - valid_source_types = list(/mob/living/, /obj/structure/deity) - chunk_type = /datum/chunk/cultnet - -/datum/chunk/cultnet/acquire_visible_turfs(var/list/visible) - for(var/source in sources) - if(isliving(source)) - var/mob/living/L = source - if(L.stat == DEAD) - continue - - for(var/turf/t in seen_turfs_in_range(source, world.view)) - visible[t] = t \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/freelook/mask.dm b/mods/gamemodes/deity/mobs/freelook/mask.dm deleted file mode 100644 index 6310effcb1c..00000000000 --- a/mods/gamemodes/deity/mobs/freelook/mask.dm +++ /dev/null @@ -1,11 +0,0 @@ -/mob/observer/eye/freelook/cult - name = "Mask of God" - desc = "A terrible fracture of reality coinciding into a mirror to another world." - living_eye = FALSE - -/mob/observer/eye/freelook/cult/EyeMove() - if(isdeity(owner)) - var/mob/living/deity/D = owner - if(D.following) - D.stop_follow() - return ..() diff --git a/mods/gamemodes/deity/mobs/items/blood_crafting.dm b/mods/gamemodes/deity/mobs/items/blood_crafting.dm deleted file mode 100644 index 3db0c0e161d..00000000000 --- a/mods/gamemodes/deity/mobs/items/blood_crafting.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/deity_item/blood_crafting - abstract_type = /datum/deity_item/blood_crafting - name = DEITY_BLOOD_CRAFT - desc = "Unlocks the blood smithing structure which allows followers to forge unholy tools from blood and flesh." - category = DEITY_BLOOD_CRAFT - max_level = 1 - base_cost = 75 - var/forge_type = /obj/structure/deity/blood_forge - var/list/recipes = list() - -/datum/deity_item/blood_crafting/buy(var/mob/living/deity/user) - ..() - user.form.buildables |= forge_type //put structure here - var/list/L = user.feats[name] - if(!L) - L = list() - for(var/type in recipes) - L[type] = recipes[type] - user.feats[name] = L \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/items/deity_item.dm b/mods/gamemodes/deity/mobs/items/deity_item.dm deleted file mode 100644 index 7590bbb9037..00000000000 --- a/mods/gamemodes/deity/mobs/items/deity_item.dm +++ /dev/null @@ -1,39 +0,0 @@ -// todo: declize /datum/deity_item -/datum/deity_item - var/name - var/desc - var/base_cost = 1 - var/category - var/level = 0 - var/max_level = 0 - var/list/requirements //Name of item = level of item - -/datum/deity_item/proc/can_buy(var/mob/living/deity/D) - if(max_level && level == max_level) - return FALSE - var/cost = get_cost(D) - if(cost && D.power < cost) - return FALSE - if(requirements && requirements.len) - for(var/name in requirements) - if(!D.has_item(name,requirements[name])) - return FALSE - return TRUE - -/datum/deity_item/proc/buy(var/mob/living/deity/D) - D.adjust_power(-get_cost(D)) - level++ - -/datum/deity_item/proc/get_cost(var/mob/living/deity/D) - return base_cost - - -/datum/deity_item/proc/print_level() - return "[level][max_level ? "/[max_level]" : ""]" - -/datum/deity_item/proc/print_requirements() - if(!requirements) - return "N/A" - . = "" - for(var/l in requirements) - . += "[l] [requirements[l]]
" \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/items/general.dm b/mods/gamemodes/deity/mobs/items/general.dm deleted file mode 100644 index d5c21756578..00000000000 --- a/mods/gamemodes/deity/mobs/items/general.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/deity_item/general - category = "General" - -/datum/deity_item/general/potential - name = "Increase Potential" - desc = "Increase the amount of natural power you regenerate." - base_cost = 10 - -/datum/deity_item/general/potential/buy(var/mob/living/deity/D) - ..() - D.adjust_power_min(5) - -/datum/deity_item/general/potential/get_cost(var/mob/living/deity/D) - return base_cost + base_cost * level**2 - -/datum/deity_item/general/regeneration - name = "Increase Power Syphon" - desc = "Decreases the time it takes to charge your power." - base_cost = 5 - -/datum/deity_item/general/regeneration/buy(var/mob/living/deity/D) - ..() - D.power_per_regen++ - -/datum/deity_item/general/regeneration/get_cost(var/mob/living/deity/D) - return base_cost + 10 * level \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/items/generic.dm b/mods/gamemodes/deity/mobs/items/generic.dm deleted file mode 100644 index 665814e0788..00000000000 --- a/mods/gamemodes/deity/mobs/items/generic.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/deity_item/boon - var/boon_path - -/datum/deity_item/boon/buy(var/mob/living/deity/D) - ..() - if(boon_path) - . = new boon_path() - D.set_boon(.) - -/datum/deity_item/phenomenon - var/phenomenon_path - max_level = 1 - -/datum/deity_item/phenomenon/buy(var/mob/living/deity/D) - ..() - if(level == 1 && phenomenon_path) - D.add_phenomenon(phenomenon_path) - D.update_phenomena() - -/datum/deity_item/boon/single_charge/buy(var/mob/living/deity/D) - . = ..() - if(istype(.,/spell)) - var/spell/S = . - S.charge_counter = S.charge_max - S.charge_type = Sp_CHARGES \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/menu/deity_nano.dm b/mods/gamemodes/deity/mobs/menu/deity_nano.dm deleted file mode 100644 index 37f488f5b61..00000000000 --- a/mods/gamemodes/deity/mobs/menu/deity_nano.dm +++ /dev/null @@ -1,81 +0,0 @@ -/mob/living/deity - var/list/nano_data = list() - var/datum/phenomenon/selected - -/mob/living/deity/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/uistate = global.self_topic_state) - if(!nano_data["categories"]) //If we don't have the categories set yet, we should populate our data. - var/list/categories = list() - for(var/cat in items_by_category) - categories += cat - nano_data["name"] = name - nano_data["form_name"] = form.name - nano_data["categories"] = categories - nano_data["menu"] = 0 //0 followers, 1 shop, 2 phenomena - nano_data["phenomenaMenu"] = 0 //0 Phenoms 1 Bindings - set_nano_category(0) - update_followers() - update_phenomena() - update_phenomena_bindings() - else - update_category() - nano_data["power"] = power - nano_data["power_min"] = power_min - nano_data["regen"] = power_per_regen - ui = SSnano.try_update_ui(user, src, ui_key, ui, nano_data, force_open) - if(!ui) - ui = new(user, src, ui_key, "deity.tmpl", "Deity Menu", 650, 600, state = uistate) - ui.set_initial_data(nano_data) - ui.open() - ui.set_auto_update(TRUE) - -/mob/living/deity/proc/set_nano_category(var/num) - nano_data["category"] = num - update_category() - -/mob/living/deity/proc/update_category() - var/actual_cat = nano_data["categories"][nano_data["category"] + 1] - var/list/cat_items = items_by_category[actual_cat] - var/list/item_data = list() - for(var/item in cat_items) - var/datum/deity_item/di = item - item_data[++item_data.len] = list("name" = di.name, "desc" = di.desc, "requirements" = di.print_requirements(), "level" = di.print_level(), "cost" = di.get_cost(), "ref" = "\ref[di]") - nano_data["item_data"] = item_data - -/mob/living/deity/proc/update_followers() - var/list/follower_data = list() - for(var/m in minions) - var/list/minion_data = list() - var/datum/mind/mind = m - if(mind.current) - if(mind.current.stat != DEAD && mind.current.loc) - minion_data["ref"] = "\ref[mind.current]" - minion_data["name"] = "[mind.current.name]" - else - minion_data["name"] = mind.name - follower_data[++follower_data.len] = minion_data - nano_data["followers"] = follower_data - -/mob/living/deity/proc/update_phenomena() - var/list/phenomena_data = list() - for(var/p in phenomena) - var/datum/phenomenon/phenomenon = phenomena[p] - phenomena_data[++phenomena_data.len] = list("name" = p, "description" = phenomenon.desc, "cost" = phenomenon.cost, "cooldown" = phenomenon.cooldown) - nano_data["phenomena"] = phenomena_data - -/mob/living/deity/proc/update_phenomena_bindings() - var/list/phenomena_bindings = list() - for(var/intent in intent_phenomena) - var/list/intent_data = list() - for(var/binding in intent_phenomena[intent]) - var/datum/phenomenon/P = intent_phenomena[intent][binding] - var/list/data = list() - if(P) - data["phenomena_name"] = P.name - data["binding"] = binding - intent_data[++intent_data.len] = data - phenomena_bindings[++phenomena_bindings.len] = list("intent" = "\ref[intent]", "intent_data" = intent_data) - nano_data["bindings"] = phenomena_bindings - //Update the hud as well. - var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent - if(istype(SD)) - SD.update_text() \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/_defines.dm b/mods/gamemodes/deity/mobs/phenomena/_defines.dm deleted file mode 100644 index e0268f37fa5..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/_defines.dm +++ /dev/null @@ -1,4 +0,0 @@ -#define PHENOMENA_NEAR_STRUCTURE 1 //Must be done near a structure -#define PHENOMENA_FOLLOWER 2 //Can be done on a follower -#define PHENOMENA_NONFOLLOWER 4 //Can be done on a nonfollower. -#define PHENOMENA_MUNDANE 8 //Can affect mundane (no mind, no client) things. \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/communication.dm b/mods/gamemodes/deity/mobs/phenomena/communication.dm deleted file mode 100644 index 2b815ce00ed..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/communication.dm +++ /dev/null @@ -1,80 +0,0 @@ -/datum/phenomenon/communicate - name = "Direct Communication" - desc = "Communicate directly with a mortal being. You may communicate with non-followers, but they will find you easier to ignore." - cost = 0 - flags = PHENOMENA_FOLLOWER | PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/communicate/activate(var/mob/living/L) - var/text_to_send = sanitize(input(linked, "Subjugate a member to your will", "Message a Believer") as text) - if(text_to_send) - var/text_size = 4 - if(!linked.is_follower(L)) - text_size = 1 - to_chat(L, "[text_to_send]") //Note to self: make this go to ghosties - to_chat(linked, SPAN_NOTICE("You send the message [text_to_send] to \the [L]")) - log_and_message_admins("communicated the message \"[text_to_send]\" to [key_name(L)]", linked) - -/datum/phenomenon/point - name = "Point" - desc = "Attract your follower's attentions to something nearby." - cost = 0 - flags = PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /atom - var/image/arrow - -/datum/phenomenon/point/activate(var/atom/a) - ..() - if(!arrow) - arrow = image('icons/effects/markers.dmi', icon_state = "arrow", layer = POINTER_LAYER) - var/turf/T = get_turf(a) - arrow.loc = T - var/list/view = view(7,T) - for(var/m in linked.minions) - var/datum/mind/mind = m - if(mind.current) - var/mob/M = mind.current - if((M in view) && M.client) - to_chat(M, SPAN_OCCULT("Your attention is eerily drawn to \the [a].")) - M.client.images += arrow - events_repository.register(/decl/observ/logged_out, M, src, TYPE_PROC_REF(/datum/phenomenon/point, remove_image)) - spawn(20) - if(M.client) - remove_image(M) - -/datum/phenomenon/point/proc/remove_image(var/mob/living/L) - L.client.images -= arrow - events_repository.unregister(/decl/observ/logged_out, L, src) - -/datum/phenomenon/punish - name = "Punish" - desc = "Punish your followers for insubordination, the cost to use this phenomenon is based on how deadly you choose the punishment to be." - cost = 0 - flags = PHENOMENA_FOLLOWER - expected_type = /mob/living - var/static/list/punishment_list = list("Pain (0)" = 0, "Light Wound (5)" = 5, "Brain Damage (10)" = 10, "Heavy Wounds (20)" = 20) - -/datum/phenomenon/punish/activate(var/mob/living/L) - var/pain = input(linked, "Choose their punishment.", "Punishment") as null|anything in punishment_list - if(!pain) - return - if(punishment_list[pain] && linked.power < punishment_list[pain]) - to_chat(linked, SPAN_WARNING("[pain] costs too much power for you to use on \the [L]")) - return - ..() - linked.adjust_power(-punishment_list[pain]) - switch(pain) - if("Pain (0)") - L.take_damage(15, PAIN) - to_chat(L, SPAN_WARNING("You feel intense disappointment coming at you from beyond the veil.")) - if("Light Wound (5)") - L.take_damage(5) - to_chat(L, SPAN_WARNING("You feel an ethereal whip graze your very soul!")) - if("Brain Damage (10)") - L.take_damage(5, BRAIN) - to_chat(L, SPAN_DANGER("You feel your mind breaking under a otherwordly hammer...")) - if("Heavy Wounds (20)") - L.take_damage(25) - to_chat(L, SPAN_DANGER("You feel your master turn its destructive potential against you!")) - to_chat(linked, SPAN_NOTICE("You punish \the [L].")) - log_admin("[key_name(linked)] used Punishment [pain] on \the [key_name(L)]") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/conjuration.dm b/mods/gamemodes/deity/mobs/phenomena/conjuration.dm deleted file mode 100644 index d7dd22f3e26..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/conjuration.dm +++ /dev/null @@ -1,67 +0,0 @@ -/datum/phenomenon/movable_object/dimensional_locker - object_type = /obj/structure/closet - name = "Dimensional Locker" - cost = 10 - desc = "Summon a trans-dimensional locker anywhere within your influence. You may transport objects and things, but not people in it." - -/datum/phenomenon/movable_object/dimensional_locker/activate(var/atom/a, var/mob/living/deity/user) - var/list/mobs_inside = list() - recursive_content_check(object_to_move, mobs_inside, client_check = 0, sight_check = 0, include_objects = 0) - - for(var/i in mobs_inside) - var/mob/M = i - M.dropInto(object_to_move.loc) - to_chat(M,SPAN_WARNING("You are suddenly flung out of \the [object_to_move]!")) - ..() - -/datum/phenomenon/portals - name = "Portals" - desc = "Summon a portal linked to the last portal you've created. The portal will be destroyed if it is not linked when someone crosses it." - cost = 30 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /atom - var/list/portals = list() - -/datum/phenomenon/portals/activate(var/atom/a, var/mob/living/deity/user) - ..() - var/obj/effect/portal/P = new(get_turf(a), null, 0) - P.failchance = 0 - portals += P - events_repository.register(/decl/observ/destroyed, P,src, TYPE_PROC_REF(/datum/phenomenon/portals, remove_portal)) - if(portals.len > 2) - var/removed = portals[1] - remove_portal(removed) - qdel(removed) - if(portals.len > 1) - var/obj/effect/portal/P1 = portals[1] - var/obj/effect/portal/P2 = portals[2] - P1.target = get_turf(P2) - P2.target = get_turf(P1) - -/datum/phenomenon/portals/proc/remove_portal(var/portal) - portals -= portal - events_repository.unregister(/decl/observ/destroyed, portal,src) - var/turf/T = get_turf(portal) - for(var/obj/effect/portal/P in portals) - if(P.target == T) - P.target = null - -/datum/phenomenon/banishing_smite - name = "Banishing Smite" - desc = "Deal a terrible blow to a mortal. If they are hurt enough ,they will find themselves trapped in a rift for 30 seconds." - cost = 70 - cooldown = 300 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/banishing_smite/activate(var/mob/living/L, var/mob/living/deity/user) - ..() - L.take_overall_damage(rand(5,30),0,0,0,"blunt intrument") //Actual spell does 5d10 but maaaybe too much. - playsound(get_turf(L), 'sound/effects/bamf.ogg', 100, 1) - to_chat(L, SPAN_DANGER("Something hard hits you!")) - if(L.current_health < L.get_max_health()/2) //If it reduces past 50% - var/obj/effect/rift/R = new(get_turf(L)) - L.visible_message(SPAN_DANGER("\The [L] is quickly sucked into \a [R]!")) - L.forceMove(R) - spawn(300) - qdel(R) diff --git a/mods/gamemodes/deity/mobs/phenomena/conversion.dm b/mods/gamemodes/deity/mobs/phenomena/conversion.dm deleted file mode 100644 index 1f0954c9135..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/conversion.dm +++ /dev/null @@ -1,51 +0,0 @@ -/datum/phenomenon/conversion - name = "Conversion" - desc = "Ask a non-follower to convert to your cult. This is completely voluntary. Requires the subject to be close to an altar." - cost = 20 - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/conversion/can_activate(var/atom/target) - if(!..()) - return 0 - var/is_good = 0 - for(var/obj/structure/deity/altar/A in linked.structures) - if(get_dist(target, A) < 2) - is_good = 1 - break - if(!is_good) - to_chat(linked,SPAN_WARNING("\The [target] needs to be near \a [linked.get_type_name(/obj/structure/deity/altar)].")) - return 0 - return 1 - -/datum/phenomenon/conversion/activate(var/mob/living/L) - to_chat(src,SPAN_NOTICE("You give \the [L] a chance to willingly convert. May they choose wisely.")) - var/choice = alert(L, "You feel a weak power enter your mind attempting to convert it.", "Conversion", "Allow Conversion", "Deny Conversion") - if(choice == "Allow Conversion") - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(L.mind,1, "Servant of [linked]", "You willingly give your mind to it, may it bring you fortune.", specific_god=linked) - else - to_chat(L, SPAN_WARNING("With little difficulty you force the intrusion out of your mind. May it stay that way.")) - to_chat(src, SPAN_WARNING("\The [L] decides not to convert.")) - -/datum/phenomenon/forced_conversion - name = "Forced Conversion" - desc = "Force a non-follower to join you. They need to be on top of an altar and conscious for this to work. They may resist, but that will hurt them." - cost = 100 - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/forced_conversion/can_activate(var/mob/living/L) - if(!..()) - return 0 - var/obj/structure/deity/altar/A = locate() in get_turf(L) - if(!A || A.linked_god != linked) - to_chat(linked,SPAN_WARNING("\The [L] needs to be on \a [linked.get_type_name(/obj/structure/deity/altar)] to be forcefully converted.")) - return 0 - - return 1 - -/datum/phenomenon/forced_conversion/activate(var/mob/living/L) - var/obj/structure/deity/altar/A = locate() in get_turf(L) - A.set_target(L) - to_chat(linked, SPAN_NOTICE("You imbue \the [A] with your power, setting forth to force \the [L] to your will.")) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/generic.dm b/mods/gamemodes/deity/mobs/phenomena/generic.dm deleted file mode 100644 index 3163ea42ab5..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/generic.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/phenomenon/movable_object - var/object_type - var/atom/movable/object_to_move - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /atom - -/datum/phenomenon/movable_object/New() - ..() - add_object() - -/datum/phenomenon/movable_object/Destroy() - events_repository.unregister(/decl/observ/destroyed, object_to_move,src) - if(!object_to_move.loc) - QDEL_NULL(object_to_move) - . = ..() - -/datum/phenomenon/movable_object/proc/add_object() - if(object_to_move) - events_repository.unregister(/decl/observ/destroyed, object_to_move,src) - object_to_move = new object_type() - events_repository.register(/decl/observ/destroyed, object_to_move, src, PROC_REF(add_object)) - -/datum/phenomenon/movable_object/activate(var/atom/a, var/mob/living/deity/user) - ..() - if(object_to_move == a) - object_to_move.forceMove(null) //Move to null space - else - var/turf/T = get_turf(a) - //No dense turf/stuff - if(T.density) - return - for(var/i in T) - var/atom/A = i - if(A.density) - return - object_to_move.forceMove(T) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/narsie.dm b/mods/gamemodes/deity/mobs/phenomena/narsie.dm deleted file mode 100644 index 8a94ae441cb..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/narsie.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/phenomenon/exude_blood - name = "Exhude Blood" - desc = "Take pity on a follower, converting a pitance of your power into blood. Don't let them forget your mercy." - cost = 20 - flags = PHENOMENA_FOLLOWER - expected_type = /mob/living/human - -/datum/phenomenon/exude_blood/can_activate(var/mob/living/human/H) - if(!..()) - return 0 - - if(!H.should_have_organ(BP_HEART) || H.vessel.total_volume == H.species.blood_volume) - to_chat(linked, SPAN_WARNING("\The [H] doesn't require anymore blood.")) - return 0 - return 1 - -/datum/phenomenon/exude_blood/activate(var/mob/living/human/H, var/mob/living/deity/user) - H.adjust_blood(30) - to_chat(H,SPAN_NOTICE("You feel a rush as new blood enters your system.")) - - -/datum/phenomenon/hellscape - name = "Reveal Hellscape" - desc = "Show a non-follower what awaits their souls after you are through with them." - cost = 60 - cooldown = 450 - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - var/static/list/creepy_notes = list("Your knees give out as an unnatural screaming rings your ears.", - "You breathe in ash and decay, your lungs gasping for air as your body gives way to the floor.", - "An extreme pressure comes over you, as if an unknown force has marked you.") - -/datum/phenomenon/hellscape/activate(var/mob/living/L) - to_chat(L, "[pick(creepy_notes)]") - L.damageoverlaytemp = 100 - sound_to(L, 'sound/hallucinations/far_noise.ogg') - SET_STATUS_MAX(L, STAT_WEAK, 2) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/phenomena.dm b/mods/gamemodes/deity/mobs/phenomena/phenomena.dm deleted file mode 100644 index 8d28ab5fc6e..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/phenomena.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/phenomenon - var/name = "Phenomena" - var/desc = "This has no desc." - var/cost = 0 - var/mob/living/deity/linked - var/flags = 0 - var/cooldown = 10 - var/refresh_time = 0 - var/expected_type - -/datum/phenomenon/New(var/master) - linked = master - ..() - -/datum/phenomenon/Destroy() - linked.remove_phenomenon(src) - return ..() - -/datum/phenomenon/proc/Click(var/atom/target) - if(can_activate(target)) - linked.adjust_power(-cost) - refresh_time = world.time + cooldown - activate(target) - -/datum/phenomenon/proc/can_activate(var/atom/target) - if(!linked) - return 0 - if(refresh_time > world.time) - to_chat(linked, SPAN_WARNING("\The [src] is still on cooldown for [round((refresh_time - world.time)/10)] more seconds!")) - return 0 - - if(!linked.form) - to_chat(linked, SPAN_WARNING("You must choose your form first!")) - return 0 - - if(expected_type && !istype(target,expected_type)) - return 0 - - if(flags & PHENOMENA_NEAR_STRUCTURE) - if(!linked.near_structure(target, 1)) - to_chat(linked, SPAN_WARNING("\The [target] needs to be near a holy structure for your powers to work!")) - return 0 - - if(isliving(target)) - var/mob/living/L = target - if(!L.mind || !L.client) - if(!(flags & PHENOMENA_MUNDANE)) - to_chat(linked, SPAN_WARNING("\The [L]'s mind is too mundane for you to influence.")) - return 0 - else - if(linked.is_follower(target, silent = 1)) - if(!(flags & PHENOMENA_FOLLOWER)) - to_chat(linked, SPAN_WARNING("You can't use [name] on the flock!")) - return 0 - else if(!(flags & PHENOMENA_NONFOLLOWER)) - to_chat(linked, SPAN_WARNING("You can't use [name] on non-believers.")) - return 0 - - if(cost > linked.power) - to_chat(linked, SPAN_WARNING("You need more power to use [name] (Need [cost] power, have [linked.power])!")) - return 0 - - return 1 - -/datum/phenomenon/proc/activate(var/target) - to_chat(linked, SPAN_NOTICE("You use the phenomenon [name] on \the [target]")) - log_and_message_admins("uses the phenomenon [name] on \the [target]", linked, get_turf(target)) - return - -/datum/phenomenon/proc/get_desc() - . = desc - if(cooldown) - . = "Cooldown: [cooldown/10] seconds. [.]" - if(cost) - . = "Cost: [cost] power. [.]" \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/starlight.dm b/mods/gamemodes/deity/mobs/phenomena/starlight.dm deleted file mode 100644 index 1351a50a892..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/starlight.dm +++ /dev/null @@ -1,232 +0,0 @@ -/datum/phenomenon/herald - name = "Bestow Heraldry" - desc = "Turn one of your followers into a herald of your coming." - cost = 100 - cooldown = 60 SECONDS - flags = PHENOMENA_FOLLOWER - expected_type = /mob/living/human - var/static/list/possible_forms = list( - "Champion" = list("description" = "A protector of the faith. Fully protected by knightly armor, a Champion can shoot fire from their hands.", - "armor" = /obj/item/clothing/suit/armor/sunsuit, - "helm" = /obj/item/clothing/head/helmet/sunhelm, - "extension" = /datum/extension/deity_be_near/champion, - "spells" = list(/spell/hand/duration/sunwrath) - ), - "Oracle" = list("description" = "A preacher of the faith, the Oracle gives off heavenly light that they can use to heal followers and stun enemies.", - "armor" = /obj/item/clothing/suit/armor/sunrobe, - "extension" = /datum/extension/deity_be_near/oracle, - "spells" = list(/spell/targeted/glimpse_of_eternity) - ), - "Traitor" = list("description" = "Believers that reject the sun god's blessings, instead reveling in the shadows. Can turn invisible when its dark, and can move unprotected in space.", - "armor" = /obj/item/clothing/suit/space/shadowsuit, - "helm" = /obj/item/clothing/head/helmet/space/shadowhood, - "extension" = /datum/extension/deity_be_near/traitor, - "spells" = list(/spell/veil_of_shadows) - ) - ) - -/datum/phenomenon/herald/can_activate(var/a) - if(!..()) - return FALSE - return valid_for_herald(a) - -/datum/phenomenon/herald/proc/valid_for_herald(var/a) - var/mob/living/human/H = a - if(!istype(H)) - return FALSE - var/obj/item/I = H.get_equipped_item(slot_wear_suit_str) - if(I) - var/datum/extension/deity_be_near/dbn = get_extension(I, /datum/extension/deity_be_near) - if(dbn) - return FALSE - return TRUE - -/datum/phenomenon/herald/proc/equip_slot(var/mob/living/L, var/slot_id, var/new_item) - var/equipped = L.get_equipped_slot_for_item(slot_id) - if(equipped) - L.try_unequip(equipped, get_turf(L)) - L.equip_to_slot_if_possible(new_item, slot_id) - -/datum/phenomenon/herald/Topic(var/href, var/list/href_list) - if(..()) - return 1 - if(usr != linked) - return 1 - - if(href_list["herald"]) - var/list/form = possible_forms[href_list["herald"]] - var/mob/living/L = locate(href_list["target"]) - var/turf/T = get_turf(L) - if(!L || !valid_for_herald(L) || !form) - return 1 - var/type = form["armor"] - var/obj/item/I = new type(T) - var/datum/extension/deity_be_near/extension = set_extension(I, form["extension"], linked) - L.equip_to_slot_or_store_or_drop(I, slot_wear_suit_str) - if(form["helm"]) - var/h_type = form["helm"] - var/obj/item/helm = new h_type(T) - L.equip_to_slot_or_store_or_drop(helm, slot_head_str) - extension.expected_helmet = helm.type //We only do by type because A. its easier to manage and B the chances of it being non-unique in a normal game is very small - if(form["weapon"]) - var/w_type = form["weapon"] - L.put_in_hands_or_store_or_drop(new w_type(T)) - if(form["spells"]) - for(var/s in form["spells"]) - var/spell/boon = new s - boon.set_connected_god(linked) - L.add_spell(boon) - to_chat(L, "You have been chosen by your master to lead your fellow followers into the next age of rebirth.
You have been granted powerful armor and a powerful spell. Don't lose them, as they are your key to your divinity and leadership.
You also have particular sway over your deity's structures.
") - to_chat(linked, SPAN_NOTICE("\The [L] is now your herald!")) - linked.remove_phenomenon(name) - show_browser(linked, null, "window=herald") - -/datum/phenomenon/herald/activate(var/mob/living/human/H) - var/list/html = list() - html += "

Heralds

" - html += "
Pick the type of herald you want.
" - html += "" - for(var/type in possible_forms) - var/list/form = possible_forms[type] - html += "" - html += "
NameDescription
[type][form["description"]]
" - show_browser(linked, jointext(html,null), "window=herald") - -/datum/phenomenon/create_gateway - name = "Create Gateway" - desc = "Creates a gateway from this world to the next. Gateways syphon absurd amounts of power but can be sacrificed to summon powerful minions." - cost = 200 - flags = PHENOMENA_NEAR_STRUCTURE - expected_type = /atom - -/datum/phenomenon/create_gateway/can_activate(var/atom/a) - if(!..()) - return 0 - if(istype(a, /obj/structure/deity/gateway)) - var/obj/structure/deity/gateway/G = a - if(G.linked_god == linked) - return 1 - var/turf/T = get_turf(a) - if(!T || T.density) - return 0 - for(var/i in T) - var/atom/at = i - if(at.density) - return 0 - return 1 - -/datum/phenomenon/create_gateway/activate(var/atom/a) - ..() - if(istype(a, /obj/structure/deity/gateway)) - qdel(a) - else - new /obj/structure/deity/gateway(get_turf(a), linked) - -/datum/phenomenon/flickering_whisper - name = "Flickering Whisper" - desc = "Whisper to a non-believer, allowing you to intrude on their thoughts and see what they see." - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/flickering_whisper/activate(var/mob/living/L) - var/atom/whisper_from - for(var/obj/structure/deity/radiant_statue/rs in view(3, L)) - whisper_from = rs - break - var/message = sanitize(input(linked, "What is your message?", null) as null|text) - if(!linked || !message || QDELETED(src)) - return - to_chat(L, SPAN_OCCULT("[whisper_from ? "The [whisper_from] speaks to you" : "You hear a whisper say"] \"[message]\"")) - - linked.eyenet.add_source(L) - events_repository.register(/decl/observ/destroyed, L, src, PROC_REF(deactivate_look)) - addtimer(CALLBACK(src, PROC_REF(deactivate_look), L), 30 SECONDS) - -/datum/phenomenon/flickering_whisper/proc/deactivate_look(var/mob/viewer) - if(!linked.is_follower(viewer)) //Don't remove if they are follower - linked.eyenet.remove_source(viewer) - events_repository.unregister(/decl/observ/destroyed, viewer, src) - -/datum/phenomenon/burning_glare - name = "Burning Glare" - desc = "Burn a victim. If they are burnt enough, you'll set them ablaze." - cost = 100 - flags = PHENOMENA_NONFOLLOWER|PHENOMENA_NEAR_STRUCTURE - cooldown = 30 SECONDS - expected_type = /mob/living - -/datum/phenomenon/burning_glare/activate(var/mob/living/L) - ..() - to_chat(L, SPAN_DANGER("You feel yourself burn!")) - L.take_damage(10, BURN) - if(L.get_damage(BURN) > 60) - L.fire_stacks += 50 - L.IgniteMob() - -/datum/phenomenon/divine_right - name = "Divine Right" - desc = "Trigger your rebirth into the body of someone wearing a herald's uniform. This takes time, requires 3 open gateways, and if the body is destroyed during the ritual... so are you. But once complete, you become an unstoppable demigod of unnatural power." - cost = 300 - cooldown = 180 SECONDS - flags = PHENOMENA_FOLLOWER|PHENOMENA_NEAR_STRUCTURE - expected_type = /mob/living - -/datum/phenomenon/divine_right/can_activate(var/mob/living/L) - if(!..()) - return FALSE - var/active_gateways = 0 - for(var/obj/structure/deity/gateway/G in linked.structures) - active_gateways += 1 - - if(active_gateways < 3) - to_chat(linked, SPAN_WARNING("You do not have enough gateways activated.")) - return FALSE - - var/obj/O = L.get_equipped_item(slot_wear_suit_str) - if(O && has_extension(O, /datum/extension/deity_be_near)) - var/datum/extension/deity_be_near/dbn = get_extension(O, /datum/extension/deity_be_near) - if(dbn.wearing_full()) - return TRUE - to_chat(linked, SPAN_WARNING("\The [L] is not wearing a herald's uniform.")) - return FALSE - -/datum/phenomenon/divine_right/activate(var/mob/living/L) - ..() - to_chat(L, SPAN_OCCULT("Your soul is ripped from your body as your master prepares to possess it.")) - to_chat(linked, SPAN_OCCULT("You prepare the body for possession. Keep it safe. If it is totally destroyed, you will die.")) - L.ghostize() - SET_STATUS_MAX(L, STAT_WEAK, 1) - new /obj/aura/starborn(L) - L.status_flags |= GODMODE - events_repository.register(/decl/observ/destroyed, L,src,PROC_REF(fail_ritual)) - addtimer(CALLBACK(src, PROC_REF(succeed_ritual), L), 600 SECONDS) //6 minutes - for(var/mob/living/player in global.player_list) - sound_to(player, 'sound/effects/cascade.ogg') - if(player?.mind?.assigned_job?.is_holy) - to_chat(player, SPAN_OCCULT("Something bad is coming.... you know you don't have much time. Find and destroy the vessel, before its too late.")) - else if(player != linked && !linked.is_follower(player, silent = 1)) - to_chat(player, SPAN_WARNING("The world swims around you for just a moment... something is wrong. Very wrong.")) - else - to_chat(player, SPAN_NOTICE("Your Master is being reborn into the body of \the [L]. Protect it at all costs.")) - -/datum/phenomenon/divine_right/proc/fail_ritual(var/mob/living/L) - qdel(linked) - -/datum/phenomenon/divine_right/proc/succeed_ritual(var/mob/living/L) - to_chat(linked, SPAN_OCCULT("You have been reborn! Your power is limited here, focused on your body, but in return you are both eternal and physical.")) - for(var/mob/living/player in global.player_list) - sound_to(player, 'sound/effects/cascade.ogg') - to_chat(player, SPAN_OCCULT("\The [linked] has been born into flesh. Kneel to its authority or else.")) - linked.mind.transfer_to(L) - L.SetName("[linked] Incarnate") - L.real_name = "[linked] Incarnate" - -/datum/phenomenon/movable_object/wisp - name = "Wisp" - desc = "Creates or moves a small ball of light for your followers to use." - cost = 30 - object_type = /obj/item/flashlight/slime - -/datum/phenomenon/movable_object/wisp/add_object() - ..() - object_to_move.SetName("wisp") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm deleted file mode 100644 index 381e885d318..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/phenomenon/warp - name = "Warp Body" - desc = "Corrupt a mortal being, causing their DNA to break and their body to fail on them." - cost = 90 - cooldown = 300 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/warp/activate(var/mob/living/L) - ..() - L.take_damage(20, CLONE) - SET_STATUS_MAX(L, STAT_WEAK, 2) - to_chat(L, SPAN_DANGER("You feel your body warp and change underneath you!")) - -/datum/phenomenon/rock_form - name = "Rock Form" - desc = "Convert your mortal followers into immortal stone beings." - cost = 300 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_FOLLOWER - expected_type = /mob/living/human - -/datum/phenomenon/rock_form/activate(var/mob/living/human/H) - ..() - to_chat(H, SPAN_DANGER("You feel your body harden as it rapidly is transformed into living crystal!")) - H.change_species(SPECIES_GOLEM) - SET_STATUS_MAX(H, STAT_WEAK, 5) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/say.dm b/mods/gamemodes/deity/mobs/say.dm deleted file mode 100644 index 1dab1a38aa3..00000000000 --- a/mods/gamemodes/deity/mobs/say.dm +++ /dev/null @@ -1,9 +0,0 @@ -/mob/living/deity/say(var/message, var/decl/language/speaking = null, var/verb="says") - if(!..()) - return 0 - if(pylon) - pylon.audible_message("\The [pylon] reverberates, \"[message]\"") - else - for(var/m in minions) - var/datum/mind/mind = m - to_chat(mind.current, "[message]") \ No newline at end of file diff --git a/mods/gamemodes/deity/overrides.dm b/mods/gamemodes/deity/overrides.dm deleted file mode 100644 index c052abdf9a2..00000000000 --- a/mods/gamemodes/deity/overrides.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/item/sword/cultblade/can_use_safely(mob/living/user) - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - return ..() || (user.mind in godcult.current_antagonists) - -/datum/reagents/Topic(href, href_list) - . = ..() - if(!. && href_list["deconvert"]) - var/list/data = REAGENT_DATA(src, /decl/material/liquid/water) - if(LAZYACCESS(data, "holy")) - var/mob/living/target = locate(href_list["deconvert"]) - if(istype(target) && !QDELETED(target) && target.mind) - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.remove_antagonist(target.mind, TRUE) - -/decl/material/liquid/water/affect_holy(mob/living/M, removed, datum/reagents/holder) - . = ..() - if(.) - return . - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - if(M.mind && godcult.is_antagonist(M.mind)) - if(REAGENT_VOLUME(holder, type) > 5) - M.take_damage(5, PAIN, do_update_health = FALSE) - M.take_damage(1, BRUTE) - if(prob(10)) //Only annoy them a /bit/ - to_chat(M, SPAN_DANGER("You feel your insides curdle and burn! \[Give Into Purity\]")) - return TRUE - return FALSE \ No newline at end of file diff --git a/mods/gamemodes/deity/screen/intent.dm b/mods/gamemodes/deity/screen/intent.dm deleted file mode 100644 index 9f5b18b6aaa..00000000000 --- a/mods/gamemodes/deity/screen/intent.dm +++ /dev/null @@ -1,45 +0,0 @@ -/obj/screen/intent/deity - var/list/desc_screens = list() - screen_loc = "RIGHT-5:122,BOTTOM:8" - -/obj/screen/intent/deity/on_update_icon() - . = ..() - cut_overlays() - add_overlay(image('icons/mob/screen/phenomena.dmi', icon_state = "hud", pixel_x = -138, pixel_y = -1)) - compile_overlays() - -/obj/screen/intent/deity/proc/sync_to_mob(var/mob) - var/mob/living/deity/deity = mob - for(var/i in 1 to deity.control_types.len) - var/obj/screen/deity_marker/S = new(null, deity) - desc_screens[deity.control_types[i]] = S - S.screen_loc = screen_loc - //This sets it up right. Trust me. - S.maptext_y = 33/2*i - i*i/2 - 10 - deity.client.screen += S - update_text() - -/obj/screen/intent/deity/proc/update_text() - var/mob/living/deity/deity = usr - var/mob/owner = owner_ref?.resolve() - if(!istype(deity) || !istype(owner) || owner != deity) - return - var/decl/intent/intent = owner.get_intent() - for(var/i in deity.control_types) - var/obj/screen/deity_marker/S = desc_screens[i] - var/datum/phenomenon/P = deity.intent_phenomena[intent][i] - if(P) - S.maptext = "[P.name]" - else - S.maptext = null - -/obj/screen/intent/deity/handle_click(mob/user, params) - ..() - update_text() - -/obj/screen/deity_marker - name = "" //Don't want them to be able to actually right click it. - mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - icon_state = "blank" - maptext_width = 128 - maptext_x = -125 \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/boon.dm b/mods/gamemodes/deity/spells/boon.dm deleted file mode 100644 index 269a0b4bc4c..00000000000 --- a/mods/gamemodes/deity/spells/boon.dm +++ /dev/null @@ -1,11 +0,0 @@ -/spell - var/mob/living/deity/connected_god //Do we have this spell based off a boon from a god? - -/spell/proc/set_connected_god(var/mob/living/deity/god) - connected_god = god - -// todo: godform check_charge to parallel take_charge. currently a boon always succeeds -/spell/take_charge(mob/user, skipcharge) - if(connected_god) - return connected_god.take_charge(user, max(1, charge_max/10)) - return ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/construction.dm b/mods/gamemodes/deity/spells/construction.dm deleted file mode 100644 index 0005154ad6e..00000000000 --- a/mods/gamemodes/deity/spells/construction.dm +++ /dev/null @@ -1,55 +0,0 @@ -#define CONSTRUCT_SPELL_COST 1 -#define CONSTRUCT_SPELL_TYPE 2 - -/spell/construction - name = "Basic Construction" - desc = "This ability will let you summon a structure of your choosing." - - cast_delay = 10 - charge_max = 100 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - hud_state = "const_wall" - cast_sound = 'sound/effects/meteorimpact.ogg' - -/spell/construction/choose_targets() - var/list/possible_targets = list() - if(connected_god && connected_god.form) - for(var/type in connected_god.form.buildables) - var/cost = 10 - if(ispath(type, /obj/structure/deity)) - var/obj/structure/deity/D = type - cost = initial(D.build_cost) - possible_targets["[connected_god.get_type_name(type)] - [cost]"] = list(cost, type) - var/choice = input("Construct to build.", "Construction") as null|anything in possible_targets - if(!choice) - return - if(locate(/obj/structure/deity) in get_turf(holder)) - return - - return possible_targets[choice] - else - return - -/spell/construction/cast_check(var/skipcharge, var/mob/user, var/list/targets) - if(!..()) - return 0 - var/turf/T = get_turf(user) - if(skipcharge && !valid_deity_structure_spot(targets[CONSTRUCT_SPELL_TYPE], T, connected_god, user)) - return 0 - else - for(var/obj/O in T) - if(O.density) - to_chat(user, SPAN_WARNING("Something here is blocking your construction!")) - return 0 - return 1 - -/spell/construction/cast(var/target, mob/user) - charge_max = target[CONSTRUCT_SPELL_COST] - target = target[CONSTRUCT_SPELL_TYPE] - var/turf/T = get_turf(user) - new target(T, connected_god) -#undef CONSTRUCT_SPELL_COST -#undef CONSTRUCT_SPELL_TYPE \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/open_gateway.dm b/mods/gamemodes/deity/spells/open_gateway.dm deleted file mode 100644 index db83a05c891..00000000000 --- a/mods/gamemodes/deity/spells/open_gateway.dm +++ /dev/null @@ -1,34 +0,0 @@ -/spell/open_gateway - name = "Open Gateway" - desc = "Open a gateway for your master. Don't do it for too long, or you will die." - - charge_max = 600 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - number_of_channels = 0 - time_between_channels = 200 - hud_state = "const_wall" - cast_sound = 'sound/effects/meteorimpact.ogg' - -/spell/open_gateway/choose_targets() - var/mob/living/spellcaster = holder - var/turf/source_turf = get_turf(spellcaster) - holder.visible_message(SPAN_NOTICE("A gateway opens up underneath \the [spellcaster]!")) - var/deity - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - if(spellcaster.mind && (spellcaster.mind in godcult.current_antagonists)) - deity = godcult.get_deity(spellcaster.mind) - return list(new /obj/structure/deity/gateway(source_turf, deity)) - -/spell/open_gateway/cast(var/list/targets, var/mob/holder, var/channel_count) - if(prob((channel_count / 5) * 100)) - to_chat(holder, SPAN_DANGER("If you hold the portal open for much longer you'll be ripped apart!")) - if(channel_count == 6) - to_chat(holder, SPAN_DANGER("The gateway consumes you... leaving nothing but dust.")) - holder.dust() - - -/spell/open_gateway/after_spell(var/list/targets) - QDEL_NULL_LIST(targets) \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/vision.dm b/mods/gamemodes/deity/spells/vision.dm deleted file mode 100644 index dabe6cf4fca..00000000000 --- a/mods/gamemodes/deity/spells/vision.dm +++ /dev/null @@ -1,21 +0,0 @@ -/spell/camera_connection/god_vision - name = "All Seeing Eye" - desc = "See what your master sees." - - charge_max = 10 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - extension_type = /datum/extension/eye/freelook - - hud_state = "gen_mind" - -/spell/camera_connection/god_vision/set_connected_god(var/mob/living/deity/god) - ..() - - var/datum/extension/eye/freelook/fl = get_extension(src, /datum/extension/eye) - if(!fl) - return - fl.set_visualnet(god.eyenet) - diff --git a/mods/gamemodes/deity/structures/altar.dm b/mods/gamemodes/deity/structures/altar.dm deleted file mode 100644 index 888e4c935a9..00000000000 --- a/mods/gamemodes/deity/structures/altar.dm +++ /dev/null @@ -1,106 +0,0 @@ -/obj/structure/deity/altar - name = "altar" - desc = "A structure made for the express purpose of religion." - current_health = 50 - power_adjustment = 5 - deity_flags = DEITY_STRUCTURE_ALONE - build_cost = 1000 - var/mob/living/target - var/cycles_before_converted = 5 - var/next_cycle = 0 - -/obj/structure/deity/altar/Destroy() - if(target) - remove_target() - if(linked_god) - to_chat(src, SPAN_DANGER("You've lost an altar!")) - return ..() - -/obj/structure/deity/altar/grab_attack(obj/item/grab/grab, mob/user) - var/mob/living/victim = grab.get_affecting_mob() - if(grab.force_danger() && istype(victim)) - victim.dropInto(loc) - SET_STATUS_MAX(victim, STAT_WEAK, 1) - user.visible_message(SPAN_WARNING("\The [user] throws \the [victim] onto \the [src]!")) - qdel(grab) - return TRUE - return ..() - -/obj/structure/deity/altar/Process() - if(!target || world.time < next_cycle) - return - if(!linked_god || target.stat) - to_chat(linked_god, SPAN_WARNING("\The [target] has lost consciousness, breaking \the [src]'s hold on their mind!")) - remove_target() - return - - next_cycle = world.time + 10 SECONDS - cycles_before_converted-- - if(!cycles_before_converted) - src.visible_message("For one thundering moment, \the [target] cries out in pain before going limp and broken.") - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(target.mind,1, "Servant of [linked_god]","Your loyalty may be faulty, but you know that it now has control over you...", specific_god=linked_god) - remove_target() - return - - switch(cycles_before_converted) - if(4) - text = "You can't think straight..." - if(3) - text = "You feel like your thought are being overriden..." - if(2) - text = "You can't... concentrate... must... resist!" - if(1) - text = "Can't... resist... anymore." - to_chat(linked_god, SPAN_WARNING("\The [target] is getting close to conversion!")) - to_chat(target, "[text]. Resist Conversion") - - -//Used for force conversion. -/obj/structure/deity/altar/proc/set_target(var/mob/living/L) - if(target || !linked_god) - return - cycles_before_converted = initial(cycles_before_converted) - START_PROCESSING(SSobj, src) - target = L - update_icon() - events_repository.register(/decl/observ/destroyed, L,src, TYPE_PROC_REF(/obj/structure/deity/altar, remove_target)) - events_repository.register(/decl/observ/moved, L, src, TYPE_PROC_REF(/obj/structure/deity/altar, remove_target)) - events_repository.register(/decl/observ/death, L, src, TYPE_PROC_REF(/obj/structure/deity/altar, remove_target)) - -/obj/structure/deity/altar/proc/remove_target() - STOP_PROCESSING(SSobj, src) - events_repository.unregister(/decl/observ/destroyed, target, src) - events_repository.unregister(/decl/observ/moved, target, src) - events_repository.unregister(/decl/observ/death, target, src) - target = null - update_icon() - -/obj/structure/deity/altar/OnTopic(var/user, var/list/href_list) - if(href_list["resist"]) - var/mob/living/M = locate(href_list["resist"]) - if(!istype(M) || target != M || M.stat || M.is_on_special_ability_cooldown()) - return TOPIC_HANDLED - - M.set_special_ability_cooldown(10 SECONDS) - M.visible_message(SPAN_WARNING("\The [M] writhes on top of \the [src]!"), SPAN_NOTICE("You struggle against the intruding thoughts, keeping them at bay!")) - to_chat(linked_god, SPAN_WARNING("\The [M] slows its conversion through willpower!")) - cycles_before_converted++ - if(prob(50)) - to_chat(M, SPAN_DANGER("The mental strain is too much for you! You feel your body weakening!")) - M.take_damage(15, TOX, do_update_health = FALSE) - M.take_damage(30, PAIN) - return TOPIC_REFRESH - -/obj/structure/deity/altar/on_update_icon() - ..() - if(target) - add_overlay(image('icons/effects/effects.dmi', icon_state = "summoning")) - -/obj/structure/deity/altar/nullrod_act(mob/user, obj/item/nullrod/rod) - if(!linked_god.silenced) //Don't want them to infinity spam it. - linked_god.silence(10) - new /obj/effect/temporary(get_turf(src),'icons/effects/effects.dmi',"purple_electricity_constant", 10) - visible_message(SPAN_NOTICE("\The [src] groans in protest as reality settles around \the [rod].")) - return TRUE - return FALSE \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/blood_forge.dm b/mods/gamemodes/deity/structures/blood_forge.dm deleted file mode 100644 index 3b23da40630..00000000000 --- a/mods/gamemodes/deity/structures/blood_forge.dm +++ /dev/null @@ -1,66 +0,0 @@ -/obj/structure/deity/blood_forge - name = "unholy forge" - desc = "This forge gives off no heat, no light, its flames look almost unnatural." - icon_state = "forge" - build_cost = 1000 - current_health = 50 - var/busy = 0 - var/recipe_feat_list = "Blood Crafting" - var/text_modifications = list( - "Cost" = "Blood", - "Dip" = "fire. Pain envelops you as blood seeps out of your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire as more and more blood comes out.", - "Out" = "flames" - ) - - power_adjustment = 2 - -/obj/structure/deity/blood_forge/attack_hand(var/mob/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return ..() - var/list/recipes = linked_god.feats[recipe_feat_list] - if(!recipes) - return TRUE - var/dat = "
Recipes


Item - [text_modifications["Cost"]] Cost
" - for(var/type in recipes) - var/atom/a = type - var/cost = recipes[type] - dat += "[initial(a.name)] - [cost]
[initial(a.desc)]

" - show_browser(user, dat, "window=forge") - return TRUE - -/obj/structure/deity/blood_forge/CanUseTopic(var/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return STATUS_CLOSE - return ..() - -/obj/structure/deity/blood_forge/OnTopic(var/user, var/list/href_list) - if(href_list["make_recipe"]) - var/list/recipes = linked_god.feats[recipe_feat_list] - var/type = locate(href_list["make_recipe"]) in recipes - if(type) - var/cost = recipes[type] - craft_item(type, cost, user) - return TOPIC_REFRESH - -/obj/structure/deity/blood_forge/proc/craft_item(var/path, var/blood_cost, var/mob/user) - if(busy) - to_chat(user, SPAN_WARNING("Someone is already using \the [src]!")) - return - - busy = 1 - to_chat(user, SPAN_NOTICE("You dip your hands into \the [src]'s [text_modifications["Dip"]]")) - for(var/count = 0, count < blood_cost/10, count++) - if(!do_after(user, 50,src)) - busy = 0 - return - user.visible_message("\The [user] swirls their hands in \the [src].", text_modifications["Shape"]) - if(linked_god) - linked_god.take_charge(user, 10) - var/obj/item/I = new path(get_turf(src)) - user.visible_message("\The [user] pull out \the [I] from the [text_modifications["Out"]].", "You pull out the completed [I] from the [text_modifications["Out"]].") - busy = 0 - -/obj/structure/deity/blood_forge/proc/take_charge(var/mob/living/user, var/charge) - if(linked_god) - linked_god.take_charge(user, charge) \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/pylon.dm b/mods/gamemodes/deity/structures/pylon.dm deleted file mode 100644 index 4b977e2726d..00000000000 --- a/mods/gamemodes/deity/structures/pylon.dm +++ /dev/null @@ -1,75 +0,0 @@ - -/obj/structure/deity/pylon - name = "pylon" - desc = "A crystal platform used to communicate with the deity." - build_cost = 400 - icon = 'icons/obj/structures/pylon.dmi' - icon_state = "pylon" - var/list/intuned = list() - -/obj/structure/deity/pylon/attack_deity(var/mob/living/deity/D) - if(D.pylon == src) - D.leave_pylon() - else - D.possess_pylon(src) - -/obj/structure/deity/pylon/Destroy() - if(linked_god && linked_god.pylon == src) - linked_god.leave_pylon() - return ..() - -/obj/structure/deity/pylon/attack_hand(var/mob/L) - SHOULD_CALL_PARENT(FALSE) - if(!linked_god) - return FALSE - if(L in intuned) - remove_intuned(L) - else - add_intuned(L) - return TRUE - -/obj/structure/deity/pylon/proc/add_intuned(var/mob/living/L) - if(L in intuned) - return - to_chat(L, SPAN_NOTICE("You place your hands on \the [src], feeling yourself intune to its vibrations.")) - intuned += L - events_repository.register(/decl/observ/destroyed, L,src, TYPE_PROC_REF(/obj/structure/deity/pylon, remove_intuned)) - -/obj/structure/deity/pylon/proc/remove_intuned(var/mob/living/L) - if(!(L in intuned)) - return - to_chat(L, SPAN_WARNING("You no longer feel intuned to \the [src].")) - intuned -= L - events_repository.unregister(/decl/observ/destroyed, L, src) - -/obj/structure/deity/pylon/OnTopic(var/mob/living/human/user, var/href_list) - if(href_list["vision_jump"]) - if(istype(user)) - to_chat(user,SPAN_WARNING("You feel your body lurch uncomfortably as your consciousness jumps to \the [src]")) - if(prob(5)) - user.vomit() - else - to_chat(user, SPAN_NOTICE("You jump to \the [src]")) - if(user.eyeobj) - user.eyeobj.setLoc(locate(href_list["vision_jump"])) - else - CRASH("[user] does not have an eyeobj") - . = TOPIC_REFRESH - . = ..() - -/obj/structure/deity/pylon/hear_talk(mob/M, text, verb, decl/language/speaking) - if(!linked_god) - return - if(linked_god.pylon != src) - if(!(M in intuned)) - return - for(var/obj/structure/deity/pylon/P in linked_god.structures) - if(P == src || linked_god.pylon == P) - continue - P.audible_message("\The [P] resonates, \"[text]\"") - to_chat(linked_god, "[html_icon(src)] [M] (P) [verb], [linked_god.pylon == src ? "" : ""]\"[text]\"[linked_god.pylon == src ? "" : ""]") - if(linked_god.minions.len) - for(var/minion in linked_god.minions) - var/datum/mind/mind = minion - if(mind.current && mind.current.eyeobj) //If it is currently having a vision of some sort - to_chat(mind.current,"[html_icon(src)] [M] (J) [verb], \"[text]\"") diff --git a/mods/gamemodes/deity/structures/structures.dm b/mods/gamemodes/deity/structures/structures.dm deleted file mode 100644 index c3d9ea65b30..00000000000 --- a/mods/gamemodes/deity/structures/structures.dm +++ /dev/null @@ -1,68 +0,0 @@ -/proc/valid_deity_structure_spot(var/type, var/turf/target, var/mob/living/deity/deity, var/mob/living/user) - var/obj/structure/deity/D = type - var/flags = initial(D.deity_flags) - - if(flags & DEITY_STRUCTURE_NEAR_IMPORTANT && !deity.near_structure(target)) - if(user) - to_chat(user, SPAN_WARNING("You need to be near \a [deity.get_type_name(/obj/structure/deity/altar)] to build this!")) - return 0 - - if(flags & DEITY_STRUCTURE_ALONE) - for(var/structure in deity.structures) - if(istype(structure,type) && get_dist(target,structure) <= 3) - if(user) - to_chat(user, SPAN_WARNING("You are too close to another [deity.get_type_name(type)]!")) - return 0 - return 1 - -/obj/structure/deity - icon = 'icons/obj/cult.dmi' - max_health = 10 - density = TRUE - anchored = TRUE - icon_state = "tomealtar" - is_spawnable_type = FALSE // will usually runtime without a linked god - - var/mob/living/deity/linked_god - var/power_adjustment = 1 //How much power we get/lose - var/build_cost = 0 //How much it costs to build this item. - var/deity_flags = DEITY_STRUCTURE_NEAR_IMPORTANT - -/obj/structure/deity/Initialize(mapload, var/god) - . = ..(mapload) - if(god) - linked_god = god - linked_god.form.sync_structure(src) - linked_god.adjust_source(power_adjustment, src) - -/obj/structure/deity/Destroy() - if(linked_god) - linked_god.adjust_source(-power_adjustment, src) - linked_god = null - return ..() - -/obj/structure/deity/attackby(obj/item/W, mob/user) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - user.do_attack_animation(src) - playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 50, 1) - user.visible_message( - SPAN_DANGER("[user] hits \the [src] with \the [W]!"), - SPAN_DANGER("You hit \the [src] with \the [W]!"), - SPAN_DANGER("You hear something breaking!") - ) - take_damage(W.get_attack_force(user), W.atom_damage_type) - -/obj/structure/deity/physically_destroyed(mob/user) - SHOULD_CALL_PARENT(FALSE) - qdel(src) - . = TRUE - -/obj/structure/deity/physically_destroyed(var/skip_qdel) - visible_message(SPAN_DANGER("\The [src] crumbles!")) - . = ..() - -/obj/structure/deity/bullet_act(var/obj/item/projectile/P) - take_damage(P.damage, P.atom_damage_type) - -/obj/structure/deity/proc/attack_deity(var/mob/living/deity/deity) - return \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/trap.dm b/mods/gamemodes/deity/structures/trap.dm deleted file mode 100644 index 240050d33b9..00000000000 --- a/mods/gamemodes/deity/structures/trap.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/structure/deity/trap - density = FALSE - current_health = 1 - var/triggered = 0 - -/obj/structure/deity/trap/Initialize() - . = ..() - events_repository.register(/decl/observ/entered, get_turf(src),src, TYPE_PROC_REF(/obj/structure/deity/trap, trigger)) - -/obj/structure/deity/trap/Destroy() - events_repository.unregister(/decl/observ/entered, get_turf(src),src) - return ..() - -/obj/structure/deity/trap/Move() - events_repository.unregister(/decl/observ/entered, get_turf(src),src) - . = ..() - events_repository.register(/decl/observ/entered, get_turf(src), src, TYPE_PROC_REF(/obj/structure/deity/trap, trigger)) - -/obj/structure/deity/trap/attackby(obj/item/W, mob/user) - trigger(user) - return ..() - -/obj/structure/deity/trap/bullet_act() - return - -/obj/structure/deity/trap/proc/trigger(var/atom/entered, var/atom/movable/enterer) - if(triggered > world.time || !isliving(enterer)) - return - - triggered = world.time + 30 SECONDS \ No newline at end of file diff --git a/nano/templates/deity.tmpl b/nano/templates/deity.tmpl deleted file mode 100644 index 5d1148e300e..00000000000 --- a/nano/templates/deity.tmpl +++ /dev/null @@ -1,116 +0,0 @@ - -
-

Deity Menu

-
- {{:data.name}} the {{:data.form_name}} -
-
- Current Boon: - {{if data.boon_name}} - {{:data.boon_name}} - {{else}} - N/A - {{/if}} -
-
- Power: {{:data.power}} Power Minimum: {{:data.power_min}} Regen: {{:data.regen}} -
-
- {{:helper.link('Followers', 'person', {'switchMenu' : 0, 'menu' : 'menu'}, data.menu == 0 ? 'disabled' : null)}} - {{:helper.link('Shop', 'suitcase', {'switchMenu' : 1, 'menu' : 'menu'}, data.menu == 1 ? 'disabled' : null)}} - {{:helper.link('Phenomena', 'star', {'switchMenu' : 2, 'menu' : 'menu'}, data.menu == 2 ? 'disabled' : null)}} -
-
-{{if data.menu == 0}} -

Followers

- {{for data.followers}} -
- {{:value.name}} -
-
- {{:helper.link('Jump', 'zoomin', {'jump' : value.ref}, value.ref ? null : 'disabled')}} - {{:helper.link('Follow', 'zoomout', {'jump' : value.ref, 'follow' : 1}, value.ref ? null : 'disabled')}} -
- {{empty}} - You have no minions! - {{/for}} -{{else data.menu == 1}} -

Shop

-
- {{for data.categories}} - {{:helper.link(value, null, {'switchCategory' : index}, index == data.category ? 'disabled' : null)}} - {{/for}} -
-
- {{for data.item_data}} -
-
- {{:helper.link(value.name, null, {'buy' : value.ref})}} (Level {{:value.level}}) -
-
- Costs: {{:value.cost}} Requires: {{:value.requirements}} -
-
- {{:value.desc}} -
-
- {{empty}} - There is nothing there! - {{/for}} -{{else data.menu == 2}} -

Phenomena

-
-
- Selected Phenomena: -
-
- {{if data.selectedPhenomenaName}} - {{:helper.link(data.selectedPhenomenaName, null, {'clear_selected' : 1})}} - {{else}} - N/A - {{/if}} -
-
-
- {{:helper.link('Phenomena', 'star', {'switchMenu' : 0, 'menu' : 'phenomenaMenu'}, data.phenomenaMenu == 0 ? 'disabled' : null)}} - {{:helper.link('Bindings', 'key', {'switchMenu' : 1, 'menu' : 'phenomenaMenu'}, data.phenomenaMenu == 1 ? 'disabled' : null)}} -
- {{if data.phenomenaMenu == 0}} - {{for data.phenomena}} -
-
- {{:helper.link(value.name, null, {'select_phenomena' : value.name})}} -
-
- Use Cost: {{:value.cost}} - {{if value.cooldown}} - Cooldown: {{:value.cooldown}} - {{/if}} -
-
- {{:value.description}} -
-
- {{empty}} - You don't have any phenomena! - {{/for}} - {{else data.phenomenaMenu == 1}} - {{for data.bindings}} -

{{:value.intent}}

- {{for value.intent_data :intentValue:intentKey}} -
-
- {{:intentValue.binding}} -
-
- {{:helper.link(intentValue.phenomena_name ? intentValue.phenomena_name : 'N/A', null, {'select_intent' : value.intent, 'select_binding' : intentValue.binding})}} -
-
- {{/for}} -
- {{/for}} - {{/if}} -{{/if}} -
\ No newline at end of file diff --git a/nebula.dme b/nebula.dme index 44929d11201..b8ec2783341 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3763,8 +3763,6 @@ #include "code\modules\species\species_shapeshifter.dm" #include "code\modules\species\species_shapeshifter_bodytypes.dm" #include "code\modules\species\outsider\random.dm" -#include "code\modules\species\outsider\shadow.dm" -#include "code\modules\species\outsider\starlight.dm" #include "code\modules\species\station\golem.dm" #include "code\modules\species\station\human.dm" #include "code\modules\species\station\human_bodytypes.dm" diff --git a/test/check-paths.sh b/test/check-paths.sh index 16121645824..77f46145433 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -47,7 +47,7 @@ exactly 3 "unmarked globally scoped variables" '^(/|)var/(?!global)' -P exactly 0 "global-marked member variables" '\t(/|)var.*/global/.+' -P exactly 0 "static-marked globally scoped variables" '^(/|)var.*/static/.+' -P exactly 1 "direct usage of decls_repository.get_decl()" 'decls_repository\.get_decl\(' -P -exactly 20 "direct loc set" '(\t|;|\.)loc\s*=(?!=)' -P +exactly 19 "direct loc set" '(\t|;|\.)loc\s*=(?!=)' -P exactly 0 "magic number mouse opacity set" 'mouse_opacity\s*=\s*[0-2]' -P exactly 1 "magic number density set" '\bdensity\s*=\s*[01]' -P exactly 0 "magic number anchored set" '\banchored\s*=\s*[01]' -P From 88d1e5722de79d1c0ecc210e95f758bb04f59b76 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 4 Dec 2024 17:21:27 +1100 Subject: [PATCH 121/554] Adding Doe's room dividers. --- code/game/objects/structures/divider.dm | 48 ++++++++++++++++++ .../crafting/stack_recipes/recipes_planks.dm | 5 ++ icons/obj/structures/divider.dmi | Bin 0 -> 545 bytes nebula.dme | 1 + 4 files changed, 54 insertions(+) create mode 100644 code/game/objects/structures/divider.dm create mode 100644 icons/obj/structures/divider.dmi diff --git a/code/game/objects/structures/divider.dm b/code/game/objects/structures/divider.dm new file mode 100644 index 00000000000..d0cb78e85df --- /dev/null +++ b/code/game/objects/structures/divider.dm @@ -0,0 +1,48 @@ +/obj/structure/divider + name = "room divider" + desc = "A thin, somewhat flimsy folding room divider." + icon = 'icons/obj/structures/divider.dmi' + icon_state = ICON_STATE_WORLD + "-closed" + material = /decl/material/solid/organic/wood/bamboo + color = /decl/material/solid/organic/wood/bamboo::color + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + var/extended = FALSE + +/obj/structure/divider/extended + icon_state = ICON_STATE_WORLD + extended = TRUE + +/obj/structure/divider/wood + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + +/obj/structure/divider/extended/wood + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + +/obj/structure/divider/attack_hand(mob/user) + if(user.check_intent(I_FLAG_HELP) && user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, silent = TRUE)) + extended = !extended + if(material.dooropen_noise) + playsound(loc, material.dooropen_noise, 50, 1) + update_divider() + visible_message(SPAN_NOTICE("\The [user] [extended ? "extends" : "collapses"] \the [src].")) + return TRUE + . = ..() + +/obj/structure/divider/Initialize() + . = ..() + update_divider() + +/obj/structure/divider/proc/update_divider() + anchored = extended + density = extended + opacity = extended || (material.opacity < 0.5) + update_icon() + +/obj/structure/divider/on_update_icon() + . = ..() + if(extended) + icon_state = ICON_STATE_WORLD + else + icon_state = ICON_STATE_WORLD + "-closed" diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index f8a75075499..f58f931cf5b 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -222,3 +222,8 @@ /decl/stack_recipe/planks/furniture/gravemarker result_type = /obj/item/gravemarker difficulty = MAT_VALUE_NORMAL_DIY + +/decl/stack_recipe/planks/furniture/divider + result_type = /obj/structure/divider + difficulty = MAT_VALUE_HARD_DIY + diff --git a/icons/obj/structures/divider.dmi b/icons/obj/structures/divider.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5016482a2a1a740de5245e13695a1c7006702be2 GIT binary patch literal 545 zcmV++0^a?JP)p8x;sVP5=M^0d!JMQvg8b*k%9#0Csv*Sad{Xb7OL8aCB*J zZU6vyoKseCa&`CgQ*iP1D@x2wg|Jao=_cpo7pEdAHbGIWtl;YB0(Juc zO!z0Gl`RsA0003vNkl^!8U}@2U1G7cTS7iVkAW? z0#k7An1Zh6XjTNa)7!M2rmm@35eRFsCaegUW-xMeu_MHE`1GElN?f{OebOzFr0smPX zc%^2?Rs_E2-$r2t5x8)jNmyqQprJCi$uhH*#?0eGeh+R!eh>aWAif8;arcK3r^E|* jRzRE*FW^~$hrb8ksLQZ5vNt~K00000NkvXXu0mjf`5Eii literal 0 HcmV?d00001 diff --git a/nebula.dme b/nebula.dme index 44929d11201..d3da872dbb5 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1440,6 +1440,7 @@ #include "code\game\objects\structures\curtains.dm" #include "code\game\objects\structures\defensive_barrier.dm" #include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\divider.dm" #include "code\game\objects\structures\dogbed.dm" #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\double_sign.dm" From 9e4b0f9c631f73600fd5e7fb4032d9c96cd82faa Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 7 Dec 2024 12:10:36 -0500 Subject: [PATCH 122/554] Fix banner merge skew --- code/modules/banners/__banner.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/modules/banners/__banner.dm b/code/modules/banners/__banner.dm index 647f3adc73a..34727eaa11b 100644 --- a/code/modules/banners/__banner.dm +++ b/code/modules/banners/__banner.dm @@ -1,5 +1,6 @@ /obj/item/banner name = "banner" + base_name = "banner" // necessary for premapped subtypes desc = "A furled-up banner." icon = 'icons/obj/items/banners/banner.dmi' icon_state = ICON_STATE_WORLD @@ -12,7 +13,6 @@ var/hung_desc = "The banner is rather unremarkable." var/banner_type = /obj/item/banner var/embroiderable = TRUE - var/name_prefix var/list/decals var/trim_color @@ -66,11 +66,6 @@ var/global/list/banner_type_to_symbols = list() . = ..() -// 'woven grass banner', 'forked linen banner' -/obj/item/banner/update_name() - . = ..() - SetName("[name_prefix] [name]") - /obj/item/banner/examine(mob/user, distance, infix, suffix) . = ..() var/decorations = get_decal_string() From e6d6c44c4d9bc36ecbc534c552b34208d9cd72e6 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 27 Nov 2024 20:49:12 -0500 Subject: [PATCH 123/554] Make cables use paint_color --- code/_global_vars/lists/flavor.dm | 8 +++---- code/modules/power/cable.dm | 37 ++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/code/_global_vars/lists/flavor.dm b/code/_global_vars/lists/flavor.dm index ccf00b40b7e..b2096edc0a4 100644 --- a/code/_global_vars/lists/flavor.dm +++ b/code/_global_vars/lists/flavor.dm @@ -115,15 +115,13 @@ GLOBAL_GETTER(cable_colors, /list, SetupCableColors()) /proc/SetupCableColors() . = list() - var/list/valid_cable_coils = typesof(/obj/item/stack/cable_coil) - for(var/ctype in list( + var/list/valid_cable_coils = typesof(/obj/item/stack/cable_coil) - typesof( /obj/item/stack/cable_coil/single, /obj/item/stack/cable_coil/cut, /obj/item/stack/cable_coil/cyborg, /obj/item/stack/cable_coil/fabricator, /obj/item/stack/cable_coil/random - )) - valid_cable_coils -= typesof(ctype) + ) var/special_name_mappings = list(/obj/item/stack/cable_coil = "Red") for(var/coil_type in valid_cable_coils) @@ -132,6 +130,6 @@ GLOBAL_GETTER(cable_colors, /list, SetupCableColors()) var/obj/item/stack/cable_coil/C = coil_type if(!initial(C.can_have_color)) continue - var/color = initial(C.color) + var/color = initial(C.paint_color) || initial(C.color) .[name] = color . = sortTim(., /proc/cmp_text_asc) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 4cc7b4d0751..29c71764deb 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -26,9 +26,10 @@ By design, d1 is the smallest direction and d2 is the highest name = "power cable" desc = "A flexible superconducting cable for heavy-duty power transfer." icon = 'icons/obj/power_cond_white.dmi' - icon_state = "0-1" - layer = EXPOSED_WIRE_LAYER - color = COLOR_MAROON + icon_state = "0-1" + layer = EXPOSED_WIRE_LAYER + color = COLOR_MAROON + paint_color = COLOR_MAROON anchored = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED level = LEVEL_BELOW_PLATING @@ -55,24 +56,31 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/yellow color = COLOR_AMBER + paint_color = COLOR_AMBER /obj/structure/cable/green color = COLOR_GREEN + paint_color = COLOR_GREEN /obj/structure/cable/blue color = COLOR_CYAN_BLUE + paint_color = COLOR_CYAN_BLUE /obj/structure/cable/pink color = COLOR_PURPLE + paint_color = COLOR_PURPLE /obj/structure/cable/orange color = COLOR_ORANGE + paint_color = COLOR_ORANGE /obj/structure/cable/cyan color = COLOR_SKY_BLUE + paint_color = COLOR_SKY_BLUE /obj/structure/cable/white color = COLOR_SILVER + paint_color = COLOR_SILVER /obj/structure/cable/Initialize(var/ml) // ensure d1 & d2 reflect the icon_state for entering and exiting cable @@ -264,7 +272,7 @@ By design, d1 is the smallest direction and d2 is the highest var/color_n = "#dd0000" if(colorC) color_n = colorC - color = color_n + set_color(color_n) ///////////////////////////////////////////////// // Cable laying helpers @@ -502,6 +510,7 @@ By design, d1 is the smallest direction and d2 is the highest amount = MAXCOIL max_amount = MAXCOIL color = COLOR_MAROON + paint_color = COLOR_MAROON desc = "A coil of wiring, suitable for both delicate electronics and heavy duty power supply." singular_name = "length" w_class = ITEM_SIZE_NORMAL @@ -544,7 +553,7 @@ By design, d1 is the smallest direction and d2 is the highest TOOL_SUTURES = TOOL_QUALITY_MEDIOCRE )) if (can_have_color && param_color) // It should be red by default, so only recolor it if parameter was specified. - color = param_color + set_color(param_color) update_icon() update_wclass() @@ -569,9 +578,9 @@ By design, d1 is the smallest direction and d2 is the highest /obj/item/stack/cable_coil/on_update_icon() . = ..() - if (!color && can_have_color) + if (!paint_color && can_have_color) var/list/possible_cable_colours = get_global_cable_colors() - color = possible_cable_colours[pick(possible_cable_colours)] + set_color(possible_cable_colours[pick(possible_cable_colours)]) if(amount == 1) icon_state = "coil1" SetName("cable piece") @@ -594,7 +603,7 @@ By design, d1 is the smallest direction and d2 is the highest if(!final_color) selected_color = "Red" final_color = possible_cable_colours[selected_color] - color = final_color + set_color(final_color) to_chat(user, SPAN_NOTICE("You change \the [src]'s color to [lowertext(selected_color)].")) /obj/item/stack/cable_coil/proc/update_wclass() @@ -627,7 +636,7 @@ By design, d1 is the smallest direction and d2 is the highest to_chat(usr, SPAN_WARNING("You need at least 15 [plural_name] of cable to make restraints!")) return var/obj/item/handcuffs/cable/B = new /obj/item/handcuffs/cable(usr.loc) - B.color = color + B.set_color(color) to_chat(usr, SPAN_NOTICE("You wind some [plural_name] of cable together to make some restraints.")) else to_chat(usr, SPAN_NOTICE("You cannot do that.")) @@ -842,31 +851,39 @@ By design, d1 is the smallest direction and d2 is the highest /obj/item/stack/cable_coil/yellow color = COLOR_AMBER + paint_color = COLOR_AMBER /obj/item/stack/cable_coil/blue color = COLOR_CYAN_BLUE + paint_color = COLOR_CYAN_BLUE /obj/item/stack/cable_coil/green color = COLOR_GREEN + paint_color = COLOR_GREEN /obj/item/stack/cable_coil/pink color = COLOR_PURPLE + paint_color = COLOR_PURPLE /obj/item/stack/cable_coil/orange color = COLOR_ORANGE + paint_color = COLOR_ORANGE /obj/item/stack/cable_coil/cyan color = COLOR_SKY_BLUE + paint_color = COLOR_SKY_BLUE /obj/item/stack/cable_coil/white color = COLOR_SILVER + paint_color = COLOR_SILVER /obj/item/stack/cable_coil/lime color = COLOR_LIME + paint_color = COLOR_LIME /obj/item/stack/cable_coil/random/Initialize(mapload, c_length, param_color) var/list/possible_cable_colours = get_global_cable_colors() - color = possible_cable_colours[pick(possible_cable_colours)] + set_color(possible_cable_colours[pick(possible_cable_colours)]) . = ..() // Produces cable coil from a rig power cell. From 7eb2d72c2d6438854f615dd1b739d4df293ed6f5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 27 Nov 2024 20:49:32 -0500 Subject: [PATCH 124/554] Simplify shard alpha calculation --- code/game/objects/items/weapons/material/shards.dm | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 0f7ba375f55..dd248df7bb7 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -51,12 +51,8 @@ /obj/item/shard/on_update_icon() . = ..() - if(material) - // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity - alpha = 255 * (1 - (1 - material.opacity)*(1 - material.opacity)) - else - color = "#ffffff" - alpha = 255 + // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity + alpha = 255 * (material ? (1 - (1 - material.opacity)**2) : 1) /obj/item/shard/attackby(obj/item/W, mob/user) if(IS_WELDER(W) && material.shard_can_repair) From 7a9febd36f718e0220dbb5d1935a11c0d0c5cbb8 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 27 Nov 2024 20:50:05 -0500 Subject: [PATCH 125/554] Rewrite table icon code --- code/game/objects/structures/tables.dm | 141 +++++++++++++------------ 1 file changed, 75 insertions(+), 66 deletions(-) diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index c66281e59f2..0f6a48c2a6b 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -59,8 +59,11 @@ // We do this because need to make sure adjacent tables init their material before we try and merge. /obj/structure/table/LateInitialize() ..() - update_connections(TRUE) - update_icon() + if(is_flipped) + flip(dir, TRUE) + else + update_connections(TRUE) + update_icon() /obj/structure/table/get_material_health_modifier() . = additional_reinf_material ? 0.75 : 0.5 @@ -290,80 +293,78 @@ if(additional_reinf_material) desc = "[desc] It has been reinforced with [additional_reinf_material.solid_name]." -/obj/structure/table/on_update_icon() - - color = "#ffffff" +/obj/structure/table/update_material_colour() + if(is_flipped) + return ..() alpha = 255 - ..() - - if(!handle_generic_blending) - return + reset_color() +/obj/structure/table/proc/handle_normal_icon() icon_state = "blank" - if(!is_flipped) - mob_offset = initial(mob_offset) - var/image/I - // Base frame shape. + var/image/I + // Base frame shape. + for(var/i = 1 to 4) + I = image(icon, dir = BITFLAG(i-1), icon_state = connections ? connections[i] : "0") + I.color = material.color + I.alpha = 255 * material.opacity + add_overlay(I) + // Tabletop + if(reinf_material) for(var/i = 1 to 4) - I = image(icon, dir = BITFLAG(i-1), icon_state = connections ? connections[i] : "0") - I.color = material.color - I.alpha = 255 * material.opacity - add_overlay(I) - // Tabletop - if(reinf_material) - for(var/i = 1 to 4) - I = image(icon, "[reinf_material.table_icon_base]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) - I.color = reinf_material.color - I.alpha = 255 * reinf_material.opacity - add_overlay(I) - if(additional_reinf_material) - for(var/i = 1 to 4) - I = image(icon, "[additional_reinf_material.table_icon_reinforced]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) - I.color = additional_reinf_material.color - I.alpha = 255 * additional_reinf_material.opacity - add_overlay(I) - - if(felted) - for(var/i = 1 to 4) - add_overlay(image(icon, "carpet_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1))) - else - - mob_offset = 0 - - var/obj/structure/table/left_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, -90)) - var/obj/structure/table/right_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, 90)) - var/left_neighbor_blend = istype(left_neighbor) && blend_with(left_neighbor) && left_neighbor.is_flipped == is_flipped && left_neighbor.dir == dir - var/right_neighbor_blend = istype(right_neighbor) && blend_with(right_neighbor) && right_neighbor.is_flipped == is_flipped && right_neighbor.dir == dir - - var/flip_type = 0 - var/flip_mod = "" - if(left_neighbor_blend && right_neighbor_blend) - flip_type = 2 - icon_state = "flip[flip_type]" - else if(left_neighbor_blend || right_neighbor_blend) - flip_type = 1 - flip_mod = (left_neighbor_blend ? "+" : "-") - icon_state = "flip[flip_type][flip_mod]" - - color = material.color - alpha = 255 * material.opacity - - var/image/I - if(reinf_material) - I = image(icon, "[reinf_material.table_icon_base]_flip[flip_type][flip_mod]") + I = image(icon, "[reinf_material.table_icon_base]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) I.color = reinf_material.color I.alpha = 255 * reinf_material.opacity - I.appearance_flags |= RESET_COLOR|RESET_ALPHA add_overlay(I) - if(additional_reinf_material) - I = image(icon, "[reinf_material.table_icon_reinforced]_flip[flip_type][flip_mod]") + if(additional_reinf_material) + for(var/i = 1 to 4) + I = image(icon, "[additional_reinf_material.table_icon_reinforced]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) I.color = additional_reinf_material.color I.alpha = 255 * additional_reinf_material.opacity - I.appearance_flags |= RESET_COLOR|RESET_ALPHA add_overlay(I) - if(felted) - add_overlay("carpet_flip[flip_type][flip_mod]") + if(felted) + for(var/i = 1 to 4) + add_overlay(image(icon, "carpet_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1))) + +/obj/structure/table/proc/handle_flipped_icon() + var/obj/structure/table/left_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, -90)) + var/obj/structure/table/right_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, 90)) + var/left_neighbor_blend = istype(left_neighbor) && blend_with(left_neighbor) && left_neighbor.is_flipped == is_flipped && left_neighbor.dir == dir + var/right_neighbor_blend = istype(right_neighbor) && blend_with(right_neighbor) && right_neighbor.is_flipped == is_flipped && right_neighbor.dir == dir + + var/flip_type = 0 + var/flip_mod = "" + if(left_neighbor_blend && right_neighbor_blend) + flip_type = 2 + icon_state = "flip[flip_type]" + else if(left_neighbor_blend || right_neighbor_blend) + flip_type = 1 + flip_mod = (left_neighbor_blend ? "+" : "-") + icon_state = "flip[flip_type][flip_mod]" + + var/image/I + if(reinf_material) + I = image(icon, "[reinf_material.table_icon_base]_flip[flip_type][flip_mod]") + I.color = reinf_material.color + I.alpha = 255 * reinf_material.opacity + I.appearance_flags |= RESET_COLOR|RESET_ALPHA + add_overlay(I) + if(additional_reinf_material) + I = image(icon, "[reinf_material.table_icon_reinforced]_flip[flip_type][flip_mod]") + I.color = additional_reinf_material.color + I.alpha = 255 * additional_reinf_material.opacity + I.appearance_flags |= RESET_COLOR|RESET_ALPHA + add_overlay(I) + + if(felted) + add_overlay("carpet_flip[flip_type][flip_mod]") + +/obj/structure/table/on_update_icon() + . = ..() + if(is_flipped) + handle_flipped_icon() + else + handle_normal_icon() /obj/structure/table/proc/blend_with(var/obj/structure/table/other) if(!istype(other) || !istype(material) || !istype(other.material) || material.type != other.material.type) @@ -585,7 +586,8 @@ if(dir != NORTH) layer = ABOVE_HUMAN_LAYER atom_flags &= ~ATOM_FLAG_CLIMBABLE //flipping tables allows them to be used as makeshift barriers - is_flipped = 1 + is_flipped = TRUE + mob_offset = 0 atom_flags |= ATOM_FLAG_CHECKS_BORDER for(var/D in list(turn(direction, 90), turn(direction, -90))) @@ -617,6 +619,7 @@ reset_plane_and_layer() atom_flags |= ATOM_FLAG_CLIMBABLE is_flipped = FALSE + mob_offset = initial(mob_offset) atom_flags &= ~ATOM_FLAG_CHECKS_BORDER for(var/D in list(turn(dir, 90), turn(dir, -90))) var/obj/structure/table/T = locate() in get_step(src.loc,D) @@ -792,6 +795,9 @@ material_alteration = MAT_FLAG_ALTERATION_ALL can_flip = FALSE +/obj/structure/table/end/handle_normal_icon() + icon_state = initial(icon_state) + /obj/structure/table/end/alt icon_state = "end_table_2" @@ -838,6 +844,9 @@ // we don't do frames or anything, just skip right to decon tool_interaction_flags |= TOOL_INTERACTION_DECONSTRUCT +/obj/structure/table/desk/handle_normal_icon() + return // logic is handled in on_update_icon + /obj/structure/table/desk/right icon_state = "desk_right" From e11012aac57394bd645064206cef1b6f720ca68b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 7 Dec 2024 16:20:02 -0500 Subject: [PATCH 126/554] Fix cable uniqueness test output --- code/unit_tests/unique_tests.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/unit_tests/unique_tests.dm b/code/unit_tests/unique_tests.dm index 2d23719ea30..88579d33132 100644 --- a/code/unit_tests/unique_tests.dm +++ b/code/unit_tests/unique_tests.dm @@ -9,7 +9,7 @@ var/list/possible_cable_colours = get_global_cable_colors() for(var/color_name in possible_cable_colours) group_by(names, color_name, index) - group_by(colors, possible_cable_colours[color_name], index) + group_by(colors, possible_cable_colours[color_name], color_name) index++ var/number_of_issues = number_of_issues(names, "Names") From 1a62c5dbcb9d2ec4d893ead791d96aef67f74d6a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 5 Dec 2024 14:53:07 +1100 Subject: [PATCH 127/554] Removing wizard. --- code/__defines/gamemode.dm | 23 +- code/_onclick/hud/screen/screen_abilities.dm | 6 +- .../datums/config/config_types/config_mode.dm | 7 +- code/datums/mind/mind.dm | 1 - code/datums/outfits/wizardry.dm | 6 +- code/datums/supplypacks/nonessent.dm | 8 +- code/datums/trading/traders/ai.dm | 1 - code/datums/trading/traders/goods.dm | 1 - code/datums/trading/traders/misc.dm | 4 +- code/datums/trading/traders/unique.dm | 48 - code/game/antagonist/outsider/wizard.dm | 115 -- .../wizard/servant_items/caretaker.dm | 34 - .../wizard/servant_items/champion.dm | 85 - .../wizard/servant_items/familiar.dm | 15 - .../gamemodes/wizard/servant_items/fiend.dm | 49 - .../wizard/servant_items/infiltrator.dm | 42 - .../wizard/servant_items/overseer.dm | 40 - code/game/gamemodes/wizard/wizard.dm | 10 - code/game/gamemodes/wizard/wizard_props.dm | 21 - code/game/jobs/access_datum.dm | 6 - code/game/objects/effects/landmarks.dm | 12 +- .../objects/items/devices/radio/intercom.dm | 4 - code/game/objects/items/hourglass.dm | 6 +- code/game/objects/items/weapons/scrolls.dm | 50 - code/game/objects/items/weapons/staff.dm | 3 +- code/modules/clothing/_clothing.dm | 1 - code/modules/clothing/head/wizard.dm | 32 + code/modules/clothing/masks/miscellaneous.dm | 10 +- code/modules/clothing/shoes/miscellaneous.dm | 1 - .../clothing/spacesuits/void/wizard.dm | 66 - code/modules/clothing/suits/misc.dm | 5 + code/modules/clothing/suits/wiz_robe.dm | 113 -- code/modules/clothing/suits/wizard.dm | 25 + code/modules/ghosttrap/trap.dm | 12 - code/modules/mob/death.dm | 2 +- .../simple_animal/familiars/familiars.dm | 133 -- code/modules/organs/internal/species/golem.dm | 5 +- .../modules/projectiles/guns/energy/staves.dm | 12 +- code/modules/spells/aoe_turf/aoe_turf.dm | 4 +- code/modules/spells/aoe_turf/blink.dm | 44 - code/modules/spells/aoe_turf/charge.dm | 72 - .../spells/aoe_turf/conjure/conjure.dm | 5 +- .../spells/aoe_turf/conjure/druidic_spells.dm | 113 -- .../spells/aoe_turf/conjure/faithful_hound.dm | 28 - .../spells/aoe_turf/conjure/force_portal.dm | 12 - .../spells/aoe_turf/conjure/forcewall.dm | 48 - code/modules/spells/aoe_turf/conjure/grove.dm | 75 - code/modules/spells/aoe_turf/disable_tech.dm | 33 - code/modules/spells/aoe_turf/drain_blood.dm | 66 - .../spells/aoe_turf/exchange_wounds.dm | 43 - code/modules/spells/aoe_turf/knock.dm | 37 - code/modules/spells/aoe_turf/smoke.dm | 26 - code/modules/spells/aoe_turf/summons.dm | 72 - code/modules/spells/artifacts.dm | 41 - .../spells/artifacts/spellbound_servants.dm | 284 --- code/modules/spells/artifacts/storage.dm | 30 - code/modules/spells/contracts.dm | 142 -- code/modules/spells/general/acid_spray.dm | 26 - code/modules/spells/general/area_teleport.dm | 60 - code/modules/spells/general/camera_vision.dm | 36 - .../modules/spells/general/contract_spells.dm | 68 - code/modules/spells/general/create_air.dm | 24 - code/modules/spells/general/invisibility.dm | 24 - code/modules/spells/general/mark_recall.dm | 88 - .../modules/spells/general/portal_teleport.dm | 67 - code/modules/spells/general/radiant_aura.dm | 21 - code/modules/spells/general/return_master.dm | 23 - code/modules/spells/general/toggle_armor.dm | 121 -- code/modules/spells/hand/blood_shards.dm | 39 - code/modules/spells/hand/burning_grip.dm | 39 - code/modules/spells/hand/entangle.dm | 51 - code/modules/spells/hand/hand.dm | 83 - code/modules/spells/hand/hand_item.dm | 68 - code/modules/spells/hand/slippery_surface.dm | 19 - code/modules/spells/hand/sunwrath.dm | 32 - code/modules/spells/no_clothes.dm | 5 - code/modules/spells/racial_wizard.dm | 81 - code/modules/spells/spell_code.dm | 28 +- code/modules/spells/spell_projectile.dm | 56 - code/modules/spells/spellbook.dm | 322 --- code/modules/spells/spellbook/battlemage.dm | 44 - code/modules/spells/spellbook/cleric.dm | 50 - code/modules/spells/spellbook/druid.dm | 43 - code/modules/spells/spellbook/spatial.dm | 48 - code/modules/spells/spellbook/standard.dm | 54 - code/modules/spells/spellbook/student.dm | 28 - code/modules/spells/targeted/analyze.dm | 19 - code/modules/spells/targeted/blood_boil.dm | 25 - code/modules/spells/targeted/cleric_spells.dm | 248 --- .../spells/targeted/equip/burning_touch.dm | 69 - code/modules/spells/targeted/equip/dyrnwyn.dm | 37 - code/modules/spells/targeted/equip/equip.dm | 38 - .../spells/targeted/equip/holy_relic.dm | 34 - .../spells/targeted/equip/horsemask.dm | 48 - .../spells/targeted/equip/party_hardy.dm | 36 - code/modules/spells/targeted/equip/seed.dm | 21 - code/modules/spells/targeted/equip/shield.dm | 41 - .../modules/spells/targeted/ethereal_jaunt.dm | 2 +- .../spells/targeted/exude_pleasantness.dm | 19 - code/modules/spells/targeted/genetic.dm | 73 - .../spells/targeted/glimpse_of_eternity.dm | 26 - .../spells/targeted/projectile/dumbfire.dm | 13 - .../spells/targeted/projectile/fireball.dm | 66 - .../targeted/projectile/magic_missile.dm | 56 - .../spells/targeted/projectile/passage.dm | 46 - .../spells/targeted/projectile/projectile.dm | 45 - .../spells/targeted/projectile/stuncuff.dm | 47 - code/modules/spells/targeted/shapeshift.dm | 203 -- code/modules/spells/targeted/shatter_mind.dm | 29 - code/modules/spells/targeted/shift.dm | 2 +- code/modules/spells/targeted/subjugate.dm | 35 - code/modules/spells/targeted/swap.dm | 41 - code/modules/spells/targeted/targeted.dm | 45 +- code/modules/spells/targeted/torment.dm | 34 - config/example/configuration.txt | 39 +- maps/antag_spawn/wizard/wizard.dm | 13 - maps/antag_spawn/wizard/wizard_base.dmm | 1747 ----------------- mods/content/corporate/items/stamps.dm | 4 +- mods/content/psionics/_psionics.dme | 1 + .../psionics/datum/antagonists/paramount.dm | 2 +- mods/content/psionics/datum/chems.dm | 8 +- mods/content/psionics/items/clothing.dm | 16 + mods/gamemodes/cult/_cult.dme | 1 - mods/gamemodes/cult/items.dm | 6 +- mods/gamemodes/cult/overrides.dm | 13 - mods/gamemodes/cult/wizard.dm | 47 - .../bayliens/tajaran/machinery/suit_cycler.dm | 3 - mods/species/vox/_vox.dme | 1 - mods/species/vox/datum/antagonism.dm | 4 - mods/species/vox/gear/gun.dm | 24 - nebula.dme | 87 +- 131 files changed, 171 insertions(+), 7080 deletions(-) delete mode 100644 code/game/antagonist/outsider/wizard.dm delete mode 100644 code/game/gamemodes/wizard/servant_items/caretaker.dm delete mode 100644 code/game/gamemodes/wizard/servant_items/champion.dm delete mode 100644 code/game/gamemodes/wizard/servant_items/familiar.dm delete mode 100644 code/game/gamemodes/wizard/servant_items/fiend.dm delete mode 100644 code/game/gamemodes/wizard/servant_items/infiltrator.dm delete mode 100644 code/game/gamemodes/wizard/servant_items/overseer.dm delete mode 100644 code/game/gamemodes/wizard/wizard.dm delete mode 100644 code/game/gamemodes/wizard/wizard_props.dm delete mode 100644 code/game/objects/items/weapons/scrolls.dm create mode 100644 code/modules/clothing/head/wizard.dm delete mode 100644 code/modules/clothing/spacesuits/void/wizard.dm create mode 100644 code/modules/clothing/suits/misc.dm delete mode 100644 code/modules/clothing/suits/wiz_robe.dm create mode 100644 code/modules/clothing/suits/wizard.dm delete mode 100644 code/modules/mob/living/simple_animal/familiars/familiars.dm delete mode 100644 code/modules/spells/aoe_turf/blink.dm delete mode 100644 code/modules/spells/aoe_turf/charge.dm delete mode 100644 code/modules/spells/aoe_turf/conjure/druidic_spells.dm delete mode 100644 code/modules/spells/aoe_turf/conjure/faithful_hound.dm delete mode 100644 code/modules/spells/aoe_turf/conjure/force_portal.dm delete mode 100644 code/modules/spells/aoe_turf/conjure/forcewall.dm delete mode 100644 code/modules/spells/aoe_turf/conjure/grove.dm delete mode 100644 code/modules/spells/aoe_turf/disable_tech.dm delete mode 100644 code/modules/spells/aoe_turf/drain_blood.dm delete mode 100644 code/modules/spells/aoe_turf/exchange_wounds.dm delete mode 100644 code/modules/spells/aoe_turf/knock.dm delete mode 100644 code/modules/spells/aoe_turf/smoke.dm delete mode 100644 code/modules/spells/aoe_turf/summons.dm delete mode 100644 code/modules/spells/artifacts.dm delete mode 100644 code/modules/spells/artifacts/spellbound_servants.dm delete mode 100644 code/modules/spells/artifacts/storage.dm delete mode 100644 code/modules/spells/contracts.dm delete mode 100644 code/modules/spells/general/acid_spray.dm delete mode 100644 code/modules/spells/general/area_teleport.dm delete mode 100644 code/modules/spells/general/camera_vision.dm delete mode 100644 code/modules/spells/general/contract_spells.dm delete mode 100644 code/modules/spells/general/create_air.dm delete mode 100644 code/modules/spells/general/invisibility.dm delete mode 100644 code/modules/spells/general/mark_recall.dm delete mode 100644 code/modules/spells/general/portal_teleport.dm delete mode 100644 code/modules/spells/general/radiant_aura.dm delete mode 100644 code/modules/spells/general/return_master.dm delete mode 100644 code/modules/spells/general/toggle_armor.dm delete mode 100644 code/modules/spells/hand/blood_shards.dm delete mode 100644 code/modules/spells/hand/burning_grip.dm delete mode 100644 code/modules/spells/hand/entangle.dm delete mode 100644 code/modules/spells/hand/hand.dm delete mode 100644 code/modules/spells/hand/hand_item.dm delete mode 100644 code/modules/spells/hand/slippery_surface.dm delete mode 100644 code/modules/spells/hand/sunwrath.dm delete mode 100644 code/modules/spells/no_clothes.dm delete mode 100644 code/modules/spells/racial_wizard.dm delete mode 100644 code/modules/spells/spell_projectile.dm delete mode 100644 code/modules/spells/spellbook.dm delete mode 100644 code/modules/spells/spellbook/battlemage.dm delete mode 100644 code/modules/spells/spellbook/cleric.dm delete mode 100644 code/modules/spells/spellbook/druid.dm delete mode 100644 code/modules/spells/spellbook/spatial.dm delete mode 100644 code/modules/spells/spellbook/standard.dm delete mode 100644 code/modules/spells/spellbook/student.dm delete mode 100644 code/modules/spells/targeted/analyze.dm delete mode 100644 code/modules/spells/targeted/blood_boil.dm delete mode 100644 code/modules/spells/targeted/cleric_spells.dm delete mode 100644 code/modules/spells/targeted/equip/burning_touch.dm delete mode 100644 code/modules/spells/targeted/equip/dyrnwyn.dm delete mode 100644 code/modules/spells/targeted/equip/equip.dm delete mode 100644 code/modules/spells/targeted/equip/holy_relic.dm delete mode 100644 code/modules/spells/targeted/equip/horsemask.dm delete mode 100644 code/modules/spells/targeted/equip/party_hardy.dm delete mode 100644 code/modules/spells/targeted/equip/seed.dm delete mode 100644 code/modules/spells/targeted/equip/shield.dm delete mode 100644 code/modules/spells/targeted/exude_pleasantness.dm delete mode 100644 code/modules/spells/targeted/genetic.dm delete mode 100644 code/modules/spells/targeted/glimpse_of_eternity.dm delete mode 100644 code/modules/spells/targeted/projectile/dumbfire.dm delete mode 100644 code/modules/spells/targeted/projectile/fireball.dm delete mode 100644 code/modules/spells/targeted/projectile/magic_missile.dm delete mode 100644 code/modules/spells/targeted/projectile/passage.dm delete mode 100644 code/modules/spells/targeted/projectile/projectile.dm delete mode 100644 code/modules/spells/targeted/projectile/stuncuff.dm delete mode 100644 code/modules/spells/targeted/shapeshift.dm delete mode 100644 code/modules/spells/targeted/shatter_mind.dm delete mode 100644 code/modules/spells/targeted/subjugate.dm delete mode 100644 code/modules/spells/targeted/swap.dm delete mode 100644 code/modules/spells/targeted/torment.dm delete mode 100644 maps/antag_spawn/wizard/wizard.dm delete mode 100644 maps/antag_spawn/wizard/wizard_base.dmm create mode 100644 mods/content/psionics/items/clothing.dm delete mode 100644 mods/gamemodes/cult/wizard.dm delete mode 100644 mods/species/vox/datum/antagonism.dm diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 9493ae7aa12..94c9d41639a 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -33,26 +33,11 @@ #define DEFAULT_TELECRYSTAL_AMOUNT 130 #define IMPLANT_TELECRYSTAL_AMOUNT(x) (round(x * 0.49)) // If this cost is ever greater than half of DEFAULT_TELECRYSTAL_AMOUNT then it is possible to buy more TC than you spend -///////////////// -////WIZARD ////// -///////////////// +// SPELL FLAGS +#define Z2NOCAST BITFLAG(0) //if this is added, the spell can't be cast at centcomm +#define INCLUDEUSER BITFLAG(1) //does the spell include the caster in its target selection? +#define IGNOREDENSE BITFLAG(2) //are dense turfs ignored in selection? -/* WIZARD SPELL FLAGS */ -#define GHOSTCAST BITFLAG(0) //can a ghost cast it? -#define NEEDSCLOTHES BITFLAG(1) //does it need the wizard garb to cast? Nonwizard spells should not have this -#define NEEDSHUMAN BITFLAG(2) //does it require the caster to be human? -#define Z2NOCAST BITFLAG(3) //if this is added, the spell can't be cast at centcomm -#define NO_SOMATIC BITFLAG(4) //spell will go off if the person is incapacitated or stunned -#define IGNOREPREV BITFLAG(5) //if set, each new target does not overlap with the previous one -//The following flags only affect different types of spell, and therefore overlap -//Targeted spells -#define INCLUDEUSER BITFLAG(6) //does the spell include the caster in its target selection? -#define SELECTABLE BITFLAG(7) //can you select each target for the spell? -#define NOFACTION BITFLAG(8) //Don't do the same as our faction -#define NONONFACTION BITFLAG(9) //Don't do people other than our faction -//AOE spells -#define IGNOREDENSE BITFLAG(10) //are dense turfs ignored in selection? -#define IGNORESPACE BITFLAG(11) //are space turfs ignored in selection? //End split flags #define CONSTRUCT_CHECK BITFLAG(12) //used by construct spells - checks for nullrods #define NO_BUTTON BITFLAG(13) //spell won't show up in the HUD with this diff --git a/code/_onclick/hud/screen/screen_abilities.dm b/code/_onclick/hud/screen/screen_abilities.dm index 03961a96423..414458af058 100644 --- a/code/_onclick/hud/screen/screen_abilities.dm +++ b/code/_onclick/hud/screen/screen_abilities.dm @@ -195,7 +195,6 @@ if(object) object.Click() -// Wizard /obj/screen/ability/spell var/spell/spell var/spell_base @@ -223,10 +222,7 @@ A.SetName(spell.name) if(!spell.override_base) //if it's not set, we do basic checks - if(spell.spell_flags & CONSTRUCT_CHECK) - A.spell_base = "const" //construct spells - else - A.spell_base = "wiz" //wizard spells + A.spell_base = "const" //construct spells else A.spell_base = spell.override_base A.update_charge(1) diff --git a/code/datums/config/config_types/config_mode.dm b/code/datums/config/config_types/config_mode.dm index 7db16b2ca34..975b84ebca9 100644 --- a/code/datums/config/config_types/config_mode.dm +++ b/code/datums/config/config_types/config_mode.dm @@ -6,7 +6,6 @@ /decl/config/lists/mode_allowed, /decl/config/lists/mode_votable, /decl/config/lists/mode_probabilities, - /decl/config/toggle/feature_object_spell_system, /decl/config/toggle/traitor_scaling, /decl/config/toggle/protect_roles_from_antagonist, /decl/config/toggle/continuous_rounds, @@ -78,10 +77,6 @@ var/decl/game_mode/game_mode = all_modes[mode_type] game_mode.probability = max(0, value[game_mode.uid]) -/decl/config/toggle/feature_object_spell_system - uid = "feature_object_spell_system" - desc = "Spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard." - /decl/config/toggle/traitor_scaling uid = "traitor_scaling" desc = "If amount of traitors scales or not." @@ -93,7 +88,7 @@ /decl/config/toggle/continuous_rounds uid = "continuous_rounds" desc = list( - "Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked.", + "Remove the # to make rounds which end instantly to continue until the shuttle is called or the station is nuked.", "Malf and Rev will let the shuttle be called when the antags/protags are dead." ) diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index 355cd25efdc..377c2dced75 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -78,7 +78,6 @@ /datum/mind/proc/handle_mob_deletion(mob/living/deleted_mob) if (current == deleted_mob) - current.spellremove() current = null if (original == deleted_mob) diff --git a/code/datums/outfits/wizardry.dm b/code/datums/outfits/wizardry.dm index a0f1a588195..b3da295036d 100644 --- a/code/datums/outfits/wizardry.dm +++ b/code/datums/outfits/wizardry.dm @@ -2,10 +2,8 @@ uniform = /obj/item/clothing/jumpsuit/lightpurple shoes = /obj/item/clothing/shoes/sandal l_ear = /obj/item/radio/headset - r_pocket = /obj/item/paper/scroll/teleportation hands = list( - /obj/item/staff/crystal, - /obj/item/book/spell + /obj/item/staff/crystal ) back = /obj/item/backpack backpack_contents = list(/obj/item/box = 1) @@ -26,4 +24,4 @@ name = "Wizard - Marisa" head = /obj/item/clothing/head/wizard/marisa suit = /obj/item/clothing/suit/wizrobe/marisa - shoes = /obj/item/clothing/shoes/sandal/marisa + shoes = /obj/item/clothing/shoes/sandal/marisa \ No newline at end of file diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index 6575ca30fd0..cee09fc29b6 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -74,9 +74,9 @@ /decl/hierarchy/supply_pack/nonessent/wizard name = "Costume - Wizard" contains = list(/obj/item/staff/crystal, - /obj/item/clothing/suit/wizrobe/fake, + /obj/item/clothing/suit/wizrobe, /obj/item/clothing/shoes/sandal, - /obj/item/clothing/head/wizard/fake) + /obj/item/clothing/head/wizard/beard) containername = "wizard costume crate" /decl/hierarchy/supply_pack/nonessent/costume @@ -170,9 +170,9 @@ /decl/hierarchy/supply_pack/nonessent/witch name = "Costume - Witch" - contains = list(/obj/item/clothing/suit/wizrobe/marisa/fake, + contains = list(/obj/item/clothing/suit/wizrobe/marisa, /obj/item/clothing/shoes/sandal, - /obj/item/clothing/head/wizard/marisa/fake, + /obj/item/clothing/head/wizard/marisa, /obj/item/staff/broom) containername = "witch costume crate" containertype = /obj/structure/closet diff --git a/code/datums/trading/traders/ai.dm b/code/datums/trading/traders/ai.dm index ca86637d32d..05b15422e1d 100644 --- a/code/datums/trading/traders/ai.dm +++ b/code/datums/trading/traders/ai.dm @@ -37,7 +37,6 @@ They sell generic supplies and ask for generic supplies. ) possible_trading_items = list( /obj/item/bag = TRADER_SUBTYPES_ONLY, - /obj/item/bag/cash/infinite = TRADER_BLACKLIST, /obj/item/backpack = TRADER_ALL, /obj/item/backpack/cultpack = TRADER_BLACKLIST, /obj/item/backpack/holding = TRADER_BLACKLIST, diff --git a/code/datums/trading/traders/goods.dm b/code/datums/trading/traders/goods.dm index d260685de19..81d294268dc 100644 --- a/code/datums/trading/traders/goods.dm +++ b/code/datums/trading/traders/goods.dm @@ -47,7 +47,6 @@ /obj/item/deck = TRADER_SUBTYPES_ONLY, /obj/item/pack = TRADER_SUBTYPES_ONLY, /obj/item/dice = TRADER_ALL, - /obj/item/dice/d20/cursed = TRADER_BLACKLIST, /obj/item/gun/launcher/money = TRADER_THIS_TYPE ) diff --git a/code/datums/trading/traders/misc.dm b/code/datums/trading/traders/misc.dm index 4366e0fede4..dd3e0df898f 100644 --- a/code/datums/trading/traders/misc.dm +++ b/code/datums/trading/traders/misc.dm @@ -167,8 +167,8 @@ /obj/item/clothing/suit/hastur = TRADER_THIS_TYPE, /obj/item/clothing/suit/imperium_monk = TRADER_THIS_TYPE, /obj/item/clothing/suit/judgerobe = TRADER_THIS_TYPE, - /obj/item/clothing/suit/wizrobe/magusred = TRADER_THIS_TYPE, - /obj/item/clothing/suit/wizrobe/magusblue = TRADER_THIS_TYPE, + /obj/item/clothing/suit/wizrobe/magus = TRADER_THIS_TYPE, + /obj/item/clothing/suit/wizrobe/magus/red = TRADER_THIS_TYPE, /obj/item/clothing/costume/gladiator = TRADER_THIS_TYPE, /obj/item/clothing/costume/kilt = TRADER_THIS_TYPE, /obj/item/clothing/costume/redcoat = TRADER_THIS_TYPE, diff --git a/code/datums/trading/traders/unique.dm b/code/datums/trading/traders/unique.dm index d5c98f8e392..e7199504921 100644 --- a/code/datums/trading/traders/unique.dm +++ b/code/datums/trading/traders/unique.dm @@ -90,51 +90,3 @@ TRADER_BRIBE_ACCEPT = "Blub will stay for " + TRADER_TOKEN_TIME + " binutes bonger.", TRADER_BRIBE_REFUSAL = "Blub must go. Blub's beople beed blem." ) - -//probably could stick soem Howl references in here but like, eh. Haven't seen it in years. -/datum/trader/ship/unique/wizard - name = "Sorcerer" - origin = "A moving castle" - possible_origins = list( - "An indistinct location", - "Unknown location", - "The Diamond Sphere", - "Beyond the Veil", - "Deadverse" - ) - - possible_wanted_items = list( - /mob/living/simple_animal/familiar = TRADER_SUBTYPES_ONLY, - /mob/living/simple_animal/familiar/pet = TRADER_BLACKLIST, - /mob/living/simple_animal/hostile/mimic = TRADER_ALL - ) - possible_trading_items = list( - /obj/item/clothing/gloves/wizard = TRADER_THIS_TYPE, - /obj/item/clothing/head/helmet/space/void/wizard = TRADER_THIS_TYPE, - /obj/item/clothing/head/wizard = TRADER_ALL, - /obj/item/clothing/suit/space/void/wizard = TRADER_THIS_TYPE, - /obj/item/toy/figure/wizard = TRADER_THIS_TYPE, - /obj/item/staff = TRADER_ALL, - ) //Probably see about getting some more wizard based shit - - speech = list( - TRADER_HAIL_GENERIC = "Hello! Are you here on pleasure or business?", - TRADER_HAIL_DENY = "I'm sorry, but I REALLY don't want to speak to you.", - TRADER_TRADE_COMPLETE = "Pleasure doing business with you!", - TRADER_NO_MONEY = "Cash? Ha! What's cash to a man like me?", - TRADER_NOT_ENOUGH = "Hm, well I do enjoy what you're offering, I prefer a fair trade.", - TRADER_FOUND_UNWANTED = "What? I want oddities! Don't you understand?", - TRADER_HOW_MUCH = "I want dark things, brooding things... things that go bump in the night. Things that bleed wrong, live wrong, are wrong.", - TRADER_WHAT_WANT = "Have anything from a broodish cult?", - TRADER_COMPLIMENT_DENY = "Like I haven't heard that one before!", - TRADER_COMPLIMENT_ACCEPT = "Haha! Aren't you nice.", - TRADER_INSULT_GOOD = "Naughty naughty.", - TRADER_INSULT_BAD = "Now where do you get off talking to me like that?", - TRADER_BRIBE_ACCEPT = "Well, if you're not pulling the knob on my staff, I can stay for another " + TRADER_TOKEN_TIME + " minutes.", - TRADER_BRIBE_REFUSAL = "A wizard does not depart early or late, but precisely when they intend to. No.", - TRADER_NO_BLACKLISTED = "I cannot accept such a thing. No trade." - ) - -/datum/trader/ship/unique/wizard/New() - speech[TRADER_HAIL_START + SPECIES_GOLEM] = "Interesting... how incredibly interesting... come! Let us do business!" - ..() diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm deleted file mode 100644 index 9aa819de843..00000000000 --- a/code/game/antagonist/outsider/wizard.dm +++ /dev/null @@ -1,115 +0,0 @@ -/decl/special_role/wizard - name = "Wizard" - name_plural = "Wizards" - landmark_id = "wizard" - welcome_text = "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.
In your pockets you will find a teleport scroll. Use it as needed." - flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE - antaghud_indicator = "hudwizard" - default_access = list(access_wizard) - hard_cap = 1 - hard_cap_round = 3 - initial_spawn_req = 1 - initial_spawn_target = 1 - min_player_age = 18 - - faction = "wizard" - base_to_load = "Wizard Base" - -/decl/special_role/wizard/create_objectives(var/datum/mind/wizard) - - if(!..()) - return - - var/kill - var/escape - var/steal - var/hijack - - switch(rand(1,100)) - if(1 to 30) - escape = 1 - kill = 1 - if(31 to 60) - escape = 1 - steal = 1 - if(61 to 99) - kill = 1 - steal = 1 - else - hijack = 1 - - if(kill) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = wizard - kill_objective.find_target() - wizard.objectives |= kill_objective - if(steal) - var/datum/objective/steal/steal_objective = new - steal_objective.owner = wizard - steal_objective.find_target() - wizard.objectives |= steal_objective - if(escape) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = wizard - wizard.objectives |= survive_objective - if(hijack) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = wizard - wizard.objectives |= hijack_objective - return - -/decl/special_role/wizard/update_antag_mob(var/datum/mind/wizard) - ..() - wizard.StoreMemory("Remember: do not forget to prepare your spells.", /decl/memory_options/system) - wizard.current.real_name = "[pick(global.wizard_first)] [pick(global.wizard_second)]" - wizard.current.SetName(wizard.current.real_name) - -/decl/special_role/wizard/equip_role(var/mob/living/human/wizard_mob) - default_outfit = pick(decls_repository.get_decl_paths_of_subtype(/decl/outfit/wizard)) - . = ..() - -/decl/special_role/wizard/print_player_summary() - ..() - for(var/p in current_antagonists) - var/datum/mind/player = p - var/text = "[player.name]'s spells were:" - if(!player.learned_spells || !player.learned_spells.len) - text += "
None!" - else - for(var/s in player.learned_spells) - var/spell/spell = s - text += "
[spell.name] - " - text += "Speed: [spell.spell_levels["speed"]] Power: [spell.spell_levels["power"]]" - text += "
" - to_world(text) - - -//To batch-remove wizard spells. Linked to mind.dm. -/mob/proc/spellremove() - if(!mind || !mind.learned_spells) - return - for(var/spell/spell_to_remove in mind.learned_spells) - remove_spell(spell_to_remove) - -// Does this clothing slot count as wizard garb? (Combines a few checks) -/proc/is_wiz_garb(var/obj/item/clothing/C) - return istype(C) && C.wizard_garb - -/*Checks if the wizard is wearing the proper attire. -Made a proc so this is not repeated 14 (or more) times.*/ -/mob/proc/wearing_wiz_garb() - to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.") - return 0 - -// Humans can wear clothes. -/mob/living/human/wearing_wiz_garb() - if(!is_wiz_garb(get_equipped_item(slot_wear_suit_str)) && (!istype(species.species_hud) || (slot_wear_suit_str in species.species_hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my robe.") - return 0 - if(!is_wiz_garb(get_equipped_item(slot_shoes_str)) && (!istype(species.species_hud) || (slot_shoes_str in species.species_hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my sandals.") - return 0 - if(!is_wiz_garb(get_equipped_item(slot_head_str)) && (!istype(species.species_hud) || (slot_head_str in species.species_hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my hat.") - return 0 - return 1 diff --git a/code/game/gamemodes/wizard/servant_items/caretaker.dm b/code/game/gamemodes/wizard/servant_items/caretaker.dm deleted file mode 100644 index c5adb272efe..00000000000 --- a/code/game/gamemodes/wizard/servant_items/caretaker.dm +++ /dev/null @@ -1,34 +0,0 @@ -/obj/item/clothing/head/caretakerhood - name = "holy hood" - desc = "The hood of a shining white robe, with blue trim. Who would possess this robe and still want to hide themself away?" - icon = 'icons/clothing/head/caretaker.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCK_HEAD_HAIR - -/obj/item/clothing/suit/caretakercloak - name = "holy cloak" - desc = "A shining white and blue robe. For some reason, it reminds you of the holidays." - icon = 'icons/clothing/suits/wizard/servant/caretaker.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - -/obj/item/clothing/shoes/dress/caretakershoes - name = "black leather shoes" - desc = "Dress shoes. These aren't as shiny as usual." - inset_color = COLOR_SKY_BLUE - shine = 30 - armor = list( - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) \ No newline at end of file diff --git a/code/game/gamemodes/wizard/servant_items/champion.dm b/code/game/gamemodes/wizard/servant_items/champion.dm deleted file mode 100644 index 80e04ee1bfd..00000000000 --- a/code/game/gamemodes/wizard/servant_items/champion.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/item/clothing/head/champhelm - name = "champion's crown" - desc = "A spiky, golden crown. It's probably worth more than your bank account." - - icon = 'icons/clothing/head/champion.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, - ARMOR_BULLET = ARMOR_BALLISTIC_AP, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_RESISTANT, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - -/obj/item/clothing/suit/champarmor - name = "champion's armor" - desc = "A mighty suit of silver and gold armor, with a gleaming blue crystal inlaid into its left gaunlet." - icon = 'icons/clothing/suits/wizard/servant/champion.dmi' - siemens_coefficient = 0.5 - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET|SLOT_ARMS|SLOT_HANDS|SLOT_TAIL - armor = list( - ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, - ARMOR_BULLET = ARMOR_BALLISTIC_AP, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_RESISTANT, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/pants/champion - name = "champion's garb" - desc = "Some dark, archaic leggings." - icon = 'icons/clothing/pants/leggings/leggings_champion.dmi' - siemens_coefficient = 0.8 - armor = list( - ARMOR_MELEE = ARMOR_MELEE_MINOR - ) - starting_accessories = list( - /obj/item/clothing/shirt/tunic/blue/champion - ) - -/obj/item/clothing/shoes/jackboots/medievalboots - name = "leather boots" - desc = "Old-fashioned leather boots. Probably not something you want to get kicked with." - material = /decl/material/solid/organic/leather - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR, - ARMOR_BOMB = ARMOR_BOMB_PADDED - ) - artificail_shine = 0 - -/obj/item/sword/excalibur - name = "champion's blade" - desc = "For at his belt hung Excalibur, the finest sword that there was, which sliced through iron as through wood." - icon = 'icons/obj/items/weapon/swords/excalibur.dmi' - attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cleaved", "sundered") - material_alteration = MAT_FLAG_ALTERATION_NONE - -/obj/item/sword/excalibur/on_picked_up(var/mob/living/user) - if(user.mind) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(!wizards.is_antagonist(user.mind) || user.mind.assigned_special_role != "Spellbound Servant") - START_PROCESSING(SSobj, src) - to_chat(user,"\The [src] heats up in your hands, burning you!") - -/obj/item/sword/excalibur/Process() - if(isliving(loc)) - if(ishuman(loc)) - var/mob/living/human/H = loc - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) - E?.take_external_damage(burn=2,used_weapon="stovetop") - else - var/mob/living/M = loc - M.take_damage(2, BURN) - if(prob(2)) - to_chat(loc,"\The [src] is burning you!") - return 1 - -/obj/item/sword/excalibur/dropped() - . = ..() - STOP_PROCESSING(SSobj, src) \ No newline at end of file diff --git a/code/game/gamemodes/wizard/servant_items/familiar.dm b/code/game/gamemodes/wizard/servant_items/familiar.dm deleted file mode 100644 index 05cc8cdf961..00000000000 --- a/code/game/gamemodes/wizard/servant_items/familiar.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/clothing/head/bandana/familiarband - name = "familiar's headband" - desc = "It's a simple headband made of leather." - icon = 'icons/clothing/head/familiar.dmi' - -/obj/item/clothing/pants/familiar - name = "familiar's garb" - desc = "Some rough leather leggings, reinforced here and there. A hasty job." - starting_accessories = list( - /obj/item/clothing/shirt/tunic/green/familiar - ) - -/obj/item/clothing/pants/familiar/Initialize() - . = ..() - LAZYSET(slowdown_per_slot, slot_w_uniform_str, -3) diff --git a/code/game/gamemodes/wizard/servant_items/fiend.dm b/code/game/gamemodes/wizard/servant_items/fiend.dm deleted file mode 100644 index e52606eb62f..00000000000 --- a/code/game/gamemodes/wizard/servant_items/fiend.dm +++ /dev/null @@ -1,49 +0,0 @@ -/obj/item/clothing/head/fiendhood - name = "fiend's hood" - desc = "A dark hood with blood-red trim. Something about the fabric blocks more light than it should." - icon = 'icons/clothing/head/fiend_hood.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCK_HEAD_HAIR - -/obj/item/clothing/suit/fiendcowl - name = "fiend's cowl" - desc = "A charred black duster with red trim. In its fabric, you can see the faint outline of millions of eyes." - icon = 'icons/clothing/suits/wizard/servant/fiend_cowl.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS|SLOT_TAIL - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - -/obj/item/clothing/costume/fiendsuit - name = "black suit" - desc = "A snappy black suit with red trim. The undershirt's stained with something, though..." - icon = 'icons/clothing/suits/suit_fiend.dmi' - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - -/obj/item/clothing/shoes/dress/devilshoes - desc = "Off-colour leather dress shoes. Their footsteps are silent." - inset_color = COLOR_MAROON - item_flags = ITEM_FLAG_SILENT - color = "#2e1e1e" - -/obj/item/clothing/head/fiendhood/fem - name = "fiend's visage" - desc = "To gaze upon this is to gaze into an inferno. Look away, before it looks back of its own accord." - icon = 'icons/clothing/head/fiend_visage.dmi' - flags_inv = HIDEEARS | BLOCK_ALL_HAIR - -/obj/item/clothing/suit/fiendcowl/fem - name = "fiend's robe" - icon = 'icons/clothing/suits/wizard/servant/fiend_robe.dmi' - desc = "A tattered, black and red robe. Nothing is visible through the holes in its fabric, except for a strange, inky blackness. It looks as if it was stitched together with other clothing..." diff --git a/code/game/gamemodes/wizard/servant_items/infiltrator.dm b/code/game/gamemodes/wizard/servant_items/infiltrator.dm deleted file mode 100644 index 846addc5b7c..00000000000 --- a/code/game/gamemodes/wizard/servant_items/infiltrator.dm +++ /dev/null @@ -1,42 +0,0 @@ -/obj/item/clothing/head/infilhat - name = "immaculate fedora" - desc = "Whoever owns this hat means business. Hopefully, it's just good business." - color = COLOR_SILVER - icon = 'icons/clothing/head/detective.dmi' - markings_state_modifier = "band" - markings_color = COLOR_DARK_GRAY - armor = list( - ARMOR_MELEE = ARMOR_MELEE_MINOR, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - -/obj/item/clothing/suit/infilsuit - name = "immaculate suit" - desc = "The clothes of an impeccable diplomat. Or perhaps a businessman. Let's not consider the horrors that might arise if it belongs to a lawyer." - icon = 'icons/clothing/suits/wizard/servant/inf_suit.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_MINOR, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR - ) - -/obj/item/clothing/shoes/dress/infilshoes - name = "black leather shoes" - desc = "Dress shoes. Their footsteps are dead silent." - inset_color = COLOR_INDIGO - item_flags = ITEM_FLAG_SILENT - -/obj/item/clothing/head/infilhat/fem - name = "maid's headband" - desc = "This dainty, frilled thing is apparently meant to go on your head." - icon = 'icons/clothing/head/inf_hat.dmi' - markings_state_modifier = null - -/obj/item/clothing/suit/infilsuit/fem - name = "maid's uniform" - desc = "The uniform of someone you'd expect to see dusting off the Antique Gun's display case." - icon = 'icons/clothing/suits/wizard/servant/inf_dress.dmi' diff --git a/code/game/gamemodes/wizard/servant_items/overseer.dm b/code/game/gamemodes/wizard/servant_items/overseer.dm deleted file mode 100644 index f8676e0440d..00000000000 --- a/code/game/gamemodes/wizard/servant_items/overseer.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/item/clothing/head/overseerhood - name = "grim hood" - desc = "Darker than dark. What... what is this made of?" - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SHIELDED, - ARMOR_BULLET = ARMOR_BALLISTIC_HEAVY, - ARMOR_LASER = ARMOR_LASER_HEAVY, - ARMOR_ENERGY = ARMOR_ENERGY_SHIELDED, - ARMOR_BOMB = ARMOR_BOMB_SHIELDED - ) - icon = 'icons/clothing/head/necromancer.dmi' - item_flags = ITEM_FLAG_AIRTIGHT - max_pressure_protection = FIRESUIT_MAX_PRESSURE - min_pressure_protection = 0 - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCK_HEAD_HAIR - -/obj/item/clothing/suit/straight_jacket/overseercloak - name = "grim cloak" - desc = "The void of space woven into fabric. It's hard to tell where its edges are." - icon = 'icons/clothing/suits/wizard/servant/overseer.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SHIELDED, - ARMOR_BULLET = ARMOR_BALLISTIC_HEAVY, - ARMOR_LASER = ARMOR_LASER_HEAVY, - ARMOR_ENERGY = ARMOR_ENERGY_SHIELDED, - ARMOR_BOMB = ARMOR_BOMB_SHIELDED - ) - item_flags = ITEM_FLAG_AIRTIGHT - max_pressure_protection = FIRESUIT_MAX_PRESSURE - min_pressure_protection = 0 - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET|SLOT_ARMS|SLOT_HANDS|SLOT_TAIL - -//These are the ones that it gets when they toggle it off -/obj/item/clothing/shoes/sandal/grimboots - name = "stained boots" - desc = "These boots are stained with blood so dry that it's turned black..." - color = COLOR_BLACK - shine = 10 - item_flags = ITEM_FLAG_SILENT \ No newline at end of file diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm deleted file mode 100644 index 72792403db1..00000000000 --- a/code/game/gamemodes/wizard/wizard.dm +++ /dev/null @@ -1,10 +0,0 @@ -/decl/game_mode/wizard - name = "Wizard" - round_description = "There is a SPACE WIZARD onboard. You can't let the magician achieve their objectives!" - extended_round_description = "A powerful space wizard has made their way on board. They have a wide variety of powers and spells available to them that makes your own simple moral self tremble with fear and excitement. Ultimately, their purpose is unknown. However, it is up to you and your crew to decide if their powers can be used for good or if their arrival foreshadows devastation." - uid = "wizard" - required_players = 5 - required_enemies = 1 - end_on_antag_death = FALSE - associated_antags = list(/decl/special_role/wizard) - probability = 1 diff --git a/code/game/gamemodes/wizard/wizard_props.dm b/code/game/gamemodes/wizard/wizard_props.dm deleted file mode 100644 index b8b834679db..00000000000 --- a/code/game/gamemodes/wizard/wizard_props.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/structure/talisman_altar - name = "Altar" - desc = "A bloodstained altar dedicated to the worship of some unknown dark entity." - icon = 'icons/obj/cult.dmi' - icon_state = "talismanaltar" - density = TRUE - anchored = TRUE - -/obj/structure/fake_pylon - name = "\improper Pylon" - desc = "A floating crystal that hums with an unearthly energy." - icon = 'icons/obj/structures/pylon.dmi' - icon_state = "pylon" - light_power = 0.5 - light_range = 13 - light_color = "#3e0000" - -// A de-culted version of the cult gateway, for the wizard base map. -/obj/effect/gateway/active/spooky - light_range=5 - light_color="#ff0000" \ No newline at end of file diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index 979f91bd034..0d636922180 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -460,12 +460,6 @@ var/global/const/access_mercenary = "ACCESS_MERCENARY" desc = "Mercenary" access_type = ACCESS_TYPE_ANTAG -var/global/const/access_wizard = "ACCESS_WIZARD" -/datum/access/wizard - id = access_wizard - desc = "Wizard" - access_type = ACCESS_TYPE_ANTAG - /******* * Misc * *******/ diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 7d695e1f75d..e2e87ae2470 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -132,18 +132,18 @@ /obj/abstract/landmark/costume/holiday_priest/make_costumes() new /obj/item/clothing/suit/holidaypriest(loc) -/obj/abstract/landmark/costume/marisawizard/fake/make_costumes() - new /obj/item/clothing/head/wizard/marisa/fake(loc) - new/obj/item/clothing/suit/wizrobe/marisa/fake(loc) +/obj/abstract/landmark/costume/marisawizard/make_costumes() + new /obj/item/clothing/head/wizard/marisa(loc) + new/obj/item/clothing/suit/wizrobe/marisa(loc) /obj/abstract/landmark/costume/cutewitch/make_costumes() new /obj/item/clothing/dress/sun(loc) new /obj/item/clothing/head/witchwig(loc) new /obj/item/staff/broom(loc) -/obj/abstract/landmark/costume/fakewizard/make_costumes() - new /obj/item/clothing/suit/wizrobe/fake(loc) - new /obj/item/clothing/head/wizard/fake(loc) +/obj/abstract/landmark/costume/wizard/make_costumes() + new /obj/item/clothing/suit/wizrobe(loc) + new /obj/item/clothing/head/wizard/beard(loc) new /obj/item/staff/(loc) /obj/abstract/landmark/costume/sexyclown/make_costumes() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 882706ebc6f..0726d380a41 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -25,10 +25,6 @@ START_PROCESSING(SSobj, src) update_icon() -/obj/item/radio/intercom/wizard - name = "enchanted intercom" - desc = "Talk into this while you ponder your orb." - /obj/item/radio/intercom/raider name = "piratical intercom" desc = "Pirate radio, but not in the usual sense of the word." diff --git a/code/game/objects/items/hourglass.dm b/code/game/objects/items/hourglass.dm index f12a51077f5..98bb75f1281 100644 --- a/code/game/objects/items/hourglass.dm +++ b/code/game/objects/items/hourglass.dm @@ -1,7 +1,5 @@ -// I considered just putting this in the fantasy modpack, -// but it's probably better in core code, since at the very least -// the Wizard gamemode might want to use the item or icon for something. -// Also, I think it could just be a neat prop. +// I considered just putting this in the fantasy modpack, but +// it's probably better in core code, since it's a nice prop. /obj/item/hourglass name = "hourglass" icon = 'icons/obj/items/hourglass.dmi' diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm deleted file mode 100644 index 0b513dc546a..00000000000 --- a/code/game/objects/items/weapons/scrolls.dm +++ /dev/null @@ -1,50 +0,0 @@ -/obj/item/paper/scroll/teleportation - name = "scroll of teleportation" - desc = "A scroll for moving around." - origin_tech = @'{"wormholes":4}' - info = {" - Teleportation Scroll:
-
- Comes with four charges! Use them wisely.
- Kind regards,
Wizards Federation

P.S. Don't forget to bring your gear, you'll need it to cast most spells. - "} - var/uses = 4 - -/obj/item/paper/scroll/teleportation/examine(mob/user, distance) - . = ..() - if(distance <= 1) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(wizards.is_antagonist(user.mind)) - to_chat(user, SPAN_NOTICE("\The [src] has [uses] charge\s remaining.")) - -/obj/item/paper/scroll/teleportation/attack_self(mob/user) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if((user.mind && !wizards.is_antagonist(user.mind))) - to_chat(user, SPAN_WARNING("You stare at \the [src], but cannot make sense of the markings!")) - return TRUE - if(alert(user, "Do you wish to teleport using \the [src]? It has [uses] charge\s remaining.", "Scroll of Teleportation", "No", "Yes") == "Yes") - teleportscroll(user) - return TRUE - -/obj/item/paper/scroll/teleportation/proc/teleportscroll(var/mob/user) - if(uses <= 0) - return - - var/area/thearea = input(user, "Select an area to jump to.", "Scroll of Teleportation") as null|anything in wizteleportlocs - if(!thearea || QDELETED(src) || QDELETED(user) || user.get_active_held_item() != src || CanUseTopic(user) != STATUS_INTERACTIVE) - return - - thearea = thearea ? wizteleportlocs[thearea] : thearea - if(!thearea) - return - - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, user.loc) - smoke.attach(user) - smoke.start() - var/turf/end = user.try_teleport(thearea) - if(!end) - to_chat(user, SPAN_WARNING("The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry!")) - return - smoke.start() - src.uses -= 1 diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 41ce83c3430..f355815734b 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -42,9 +42,8 @@ return TRUE return ..() -// TODO: move back into wizard modpack when the timelines converge. /obj/item/staff/crystal - name = "wizard's staff" + name = "crystal staff" icon = 'icons/obj/items/staff_crystal.dmi' /obj/item/staff/crystal/can_make_broom_with(mob/user, obj/item/thing) diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index 4c2a1259995..744bcdb7813 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -9,7 +9,6 @@ icon_state = ICON_STATE_WORLD _base_attack_force = 3 - var/wizard_garb = 0 var/flash_protection = FLASH_PROTECTION_NONE // Sets the item's level of flash protection. var/tint = TINT_NONE // Sets the item's level of visual impairment tint. var/bodytype_equip_flags // Bitfields; if null, checking is skipped. Determine if a given mob can equip this item or not. diff --git a/code/modules/clothing/head/wizard.dm b/code/modules/clothing/head/wizard.dm new file mode 100644 index 00000000000..e4de99269e1 --- /dev/null +++ b/code/modules/clothing/head/wizard.dm @@ -0,0 +1,32 @@ +// Props from wizard mode, preserved as costume pieces. +/obj/item/clothing/head/wizard + name = "wizard hat" + desc = "It has WIZZARD written across it in sequins." + icon = 'icons/clothing/head/wizard/wizard.dmi' + body_parts_covered = 0 + +/obj/item/clothing/head/wizard/red + name = "red wizard hat" + icon = 'icons/clothing/head/wizard/red.dmi' + +/obj/item/clothing/head/wizard/beard + name = "wizard hat" + desc = "It has WIZZARD written across it in sequins. Comes with a cool beard." + icon = 'icons/clothing/head/wizard/fake.dmi' + body_parts_covered = SLOT_HEAD|SLOT_FACE + +/obj/item/clothing/head/wizard/marisa + name = "witch hat" + desc = "Strange-looking hat-wear. Makes you want to cast fireballs." + icon = 'icons/clothing/head/wizard/marisa.dmi' + +/obj/item/clothing/head/wizard/magus + name = "magus helm" + desc = "A mysterious helmet. Hard to see out of." + icon = 'icons/clothing/head/wizard/magus.dmi' + body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + +/obj/item/clothing/head/wizard/cap + name = "gentleman's cap" + desc = "A checkered gray flat cap." + icon = 'icons/clothing/head/flatcap.dmi' diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index e74903d380b..7ceb955904c 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -93,12 +93,16 @@ w_class = ITEM_SIZE_SMALL siemens_coefficient = 0.9 -/obj/item/clothing/mask/horsehead/Initialize() - . = ..() - // The horse mask doesn't cause voice changes by default, the wizard spell changes the flag as necessary +/obj/item/clothing/mask/horsehead/cursed + voicechange = TRUE say_messages = list("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") say_verbs = list("whinnies", "neighs", "says") +/obj/item/clothing/mask/horsehead/cursed/equipped(mob/user, slot) + . = ..() + if(slot == slot_wear_mask_str) + canremove = FALSE + /obj/item/clothing/mask/ai name = "camera MIU" desc = "Allows for direct mental connection to accessible camera channels." diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 9466eb0709a..53579e0dd79 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -84,7 +84,6 @@ icon = 'icons/clothing/feet/sandals.dmi' bodytype_equip_flags = null body_parts_covered = 0 - wizard_garb = 1 can_add_hidden_item = FALSE can_add_cuffs = FALSE diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm deleted file mode 100644 index 48dfc6d852a..00000000000 --- a/code/modules/clothing/spacesuits/void/wizard.dm +++ /dev/null @@ -1,66 +0,0 @@ -//Wizard Rig -/obj/item/clothing/head/helmet/space/void/wizard - name = "gem-encrusted voidsuit helmet" - desc = "A bizarre gem-encrusted helmet that radiates magical energies." - icon = 'icons/clothing/spacesuit/void/wizard/helmet.dmi' - material = /decl/material/solid/gemstone/crystal - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = ARMOR_RAD_SMALL - ) - siemens_coefficient = 0.7 - wizard_garb = 1 - -/obj/item/clothing/suit/space/void/wizard - name = "gem-encrusted voidsuit" - desc = "A bizarre gem-encrusted suit that radiates magical energies." - icon = 'icons/clothing/spacesuit/void/wizard/suit.dmi' - w_class = ITEM_SIZE_LARGE //normally voidsuits are bulky but this one is magic I suppose - material = /decl/material/solid/gemstone/crystal - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = ARMOR_RAD_SMALL - ) - siemens_coefficient = 0.7 - wizard_garb = 1 - flags_inv = HIDESHOES|HIDEJUMPSUIT|HIDETAIL //For gloves. - body_parts_covered = SLOT_UPPER_BODY | SLOT_LOWER_BODY | SLOT_LEGS | SLOT_FEET | SLOT_ARMS | SLOT_TAIL - cold_protection = SLOT_UPPER_BODY | SLOT_LOWER_BODY | SLOT_LEGS | SLOT_FEET | SLOT_ARMS | SLOT_TAIL - -/obj/item/clothing/suit/space/void/wizard/Initialize() - . = ..() - LAZYSET(slowdown_per_slot, slot_wear_suit_str, 1) - -/obj/item/clothing/gloves/wizard - name = "mystical gloves" - desc = "Reinforced, gem-studded gloves that radiate energy. They look like they go along with a matching voidsuit." - color = COLOR_VIOLET - item_flags = ITEM_FLAG_THICKMATERIAL - body_parts_covered = SLOT_HANDS - cold_protection = SLOT_HANDS - min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE - bodytype_equip_flags = null - gender = PLURAL - gas_transfer_coefficient = 0.01 - permeability_coefficient = 0.02 - material = /decl/material/solid/gemstone/crystal - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = ARMOR_RAD_SMALL - ) - siemens_coefficient = 0.7 diff --git a/code/modules/clothing/suits/misc.dm b/code/modules/clothing/suits/misc.dm new file mode 100644 index 00000000000..eb58d81b67e --- /dev/null +++ b/code/modules/clothing/suits/misc.dm @@ -0,0 +1,5 @@ +/obj/item/clothing/suit/gentlecoat + name = "gentleman's coat" + desc = "A heavy-threaded gray tweed jacket." + icon = 'icons/clothing/suits/wizard/gentleman.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm deleted file mode 100644 index 16dd6386ebb..00000000000 --- a/code/modules/clothing/suits/wiz_robe.dm +++ /dev/null @@ -1,113 +0,0 @@ -/obj/item/clothing/head/wizard - name = "wizard hat" - desc = "Strange-looking hat-wear that most certainly belongs to a real magic user." - icon = 'icons/clothing/head/wizard/wizard.dmi' - //Not given any special protective value since the magic robes are full-body protection --NEO - siemens_coefficient = 0.8 - body_parts_covered = 0 - wizard_garb = 1 - -/obj/item/clothing/head/wizard/red - name = "red wizard hat" - desc = "Strange-looking, red, hat-wear that most certainly belongs to a real magic user." - icon = 'icons/clothing/head/wizard/red.dmi' - siemens_coefficient = 0.8 - -/obj/item/clothing/head/wizard/fake - name = "wizard hat" - desc = "It has WIZZARD written across it in sequins. Comes with a cool beard." - icon = 'icons/clothing/head/wizard/fake.dmi' - body_parts_covered = SLOT_HEAD|SLOT_FACE - -/obj/item/clothing/head/wizard/marisa - name = "witch hat" - desc = "Strange-looking hat-wear, makes you want to cast fireballs." - icon = 'icons/clothing/head/wizard/marisa.dmi' - siemens_coefficient = 0.8 - -/obj/item/clothing/head/wizard/magus - name = "magus helm" - desc = "A mysterious helmet that hums with an unearthly power." - icon = 'icons/clothing/head/wizard/magus.dmi' - siemens_coefficient = 0.8 - body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES - -/obj/item/clothing/head/wizard/cap - name = "gentleman's cap" - desc = "A checkered gray flat cap woven together with the rarest of threads." - icon = 'icons/clothing/head/flatcap.dmi' - siemens_coefficient = 0.8 - -/obj/item/clothing/suit/wizrobe - name = "wizard robe" - desc = "A magnificant, gem-lined robe that seems to radiate power." - icon = 'icons/clothing/suits/wizard/wizard.dmi' - gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE - permeability_coefficient = 0.01 - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_MINOR, - ARMOR_RAD = ARMOR_RAD_MINOR - ) - allowed = list(/obj/item/paper/scroll) - siemens_coefficient = 0.8 - wizard_garb = 1 - -/obj/item/clothing/suit/wizrobe/red - name = "red wizard robe" - desc = "A magnificant, red, gem-lined robe that seems to radiate power." - icon = 'icons/clothing/suits/wizard/red.dmi' - -/obj/item/clothing/suit/wizrobe/marisa - name = "witch robe" - desc = "Magic is all about the spell power, ZE!" - icon = 'icons/clothing/suits/wizard/marisa.dmi' - -/obj/item/clothing/suit/wizrobe/magusblue - name = "magus robe" - desc = "A set of armoured robes that seem to radiate a dark power." - icon = 'icons/clothing/suits/wizard/magusblue.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET - -/obj/item/clothing/suit/wizrobe/magusred - name = "magus robe" - desc = "A set of armoured robes that seem to radiate a dark power." - icon = 'icons/clothing/suits/wizard/magusred.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET - -/obj/item/clothing/suit/wizrobe/psypurple - name = "purple robes" - desc = "Heavy, royal purple robes threaded with psychic amplifiers and weird, bulbous lenses. Do not machine wash." - icon = 'icons/clothing/suits/wizard/psy.dmi' - gender = PLURAL - -/obj/item/clothing/suit/wizrobe/gentlecoat - name = "gentleman's coat" - desc = "A heavy threaded tweed gray jacket. For a different sort of Gentleman." - icon = 'icons/clothing/suits/wizard/gentleman.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - -/obj/item/clothing/suit/wizrobe/fake - name = "wizard robe" - desc = "A rather dull, blue robe meant to mimick real wizard robes." - icon = 'icons/clothing/suits/wizard/fake.dmi' - armor = null - siemens_coefficient = 1.0 - -/obj/item/clothing/head/wizard/marisa/fake - name = "witch hat" - desc = "Strange-looking hat-wear, makes you want to cast fireballs." - armor = null - siemens_coefficient = 1.0 - -/obj/item/clothing/suit/wizrobe/marisa/fake - name = "witch robe" - desc = "Magic is all about the spell power, ZE!" - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS - armor = null - siemens_coefficient = 1.0 - diff --git a/code/modules/clothing/suits/wizard.dm b/code/modules/clothing/suits/wizard.dm new file mode 100644 index 00000000000..c8f0208fb4d --- /dev/null +++ b/code/modules/clothing/suits/wizard.dm @@ -0,0 +1,25 @@ +// Props from wizard mode, preserved as costume pieces. +/obj/item/clothing/suit/wizrobe + name = "wizard robe" + desc = "A rather ratty blue robe." + icon = 'icons/clothing/suits/wizard/wizard.dmi' + allowed = list(/obj/item/paper/scroll) + +/obj/item/clothing/suit/wizrobe/red + name = "red wizard robe" + desc = "A rather ratty red robe." + icon = 'icons/clothing/suits/wizard/red.dmi' + +/obj/item/clothing/suit/wizrobe/marisa + name = "witch robe" + desc = "Magic is all about the spell power, ZE!" + icon = 'icons/clothing/suits/wizard/marisa.dmi' + +/obj/item/clothing/suit/wizrobe/magus + name = "magus robe" + desc = "A set of mysterious armoured robes." + icon = 'icons/clothing/suits/wizard/magusblue.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET + +/obj/item/clothing/suit/wizrobe/magus/red + icon = 'icons/clothing/suits/wizard/magusred.dmi' diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index da2c66433b4..1f450a9aadf 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -176,18 +176,6 @@ if(istype(drone)) drone.transfer_personality(candidate.client) -/****************** -* Wizard Familiar * -******************/ -/decl/ghosttrap/wizard_familiar - name = "wizard familiar" - pref_check = "ghost_wizard" - ghost_trap_message = "They are occupying a familiar now." - ban_checks = list(/decl/special_role/wizard) - -/decl/ghosttrap/wizard_familiar/welcome_candidate(var/mob/target) - return 0 - // Stub PAI ghost trap so that PAI shows up in the ghost role list. // Actually invoking this ghost trap as normal will not do anything. /decl/ghosttrap/personal_ai diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 1b7d470abc8..4986952e130 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -51,7 +51,7 @@ spawn_gibber(lastloc) //This is the proc for turning a mob into ash. Mostly a copy of gib code (above). -//Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here. +//Originally created for Disintegrate. I've removed the virus code since it's irrelevant here. //Dusting robots does not eject the brain, so it's a bit more powerful than gib() /N /mob/proc/dust() SHOULD_CALL_PARENT(TRUE) diff --git a/code/modules/mob/living/simple_animal/familiars/familiars.dm b/code/modules/mob/living/simple_animal/familiars/familiars.dm deleted file mode 100644 index 8cefee06d93..00000000000 --- a/code/modules/mob/living/simple_animal/familiars/familiars.dm +++ /dev/null @@ -1,133 +0,0 @@ -/mob/living/simple_animal/familiar - name = "familiar" - desc = "No wizard is complete without a mystical sidekick." - supernatural = 1 - universal_speak = FALSE - universal_understand = TRUE - - min_gas = list(/decl/material/gas/oxygen = 1) - max_gas = null - unsuitable_atmos_damage = 1 - gene_damage = -1 - base_animal_type = /mob/living/simple_animal/familiar - - var/list/wizardy_spells = list() - -/mob/living/simple_animal/familiar/Initialize() - . = ..() - add_language(/decl/language/human/common) - for(var/spell in wizardy_spells) - src.add_spell(new spell, "const_spell_ready") - -/mob/living/simple_animal/familiar/carcinus - name = "carcinus" - desc = "A small crab said to be made of stone and starlight." - icon = 'icons/mob/simple_animal/evilcrab.dmi' - speak_emote = list("chitters","clicks") - max_health = 200 - natural_weapon = /obj/item/natural_weapon/pincers/strong - resistance = 9 - ai = /datum/mob_controller/familiar_crab - -/datum/mob_controller/familiar_crab - can_escape_buckles = TRUE - -/obj/item/natural_weapon/pincers/strong - _base_attack_force = 15 - -/*familiar version of the Pike w/o all the other hostile/carp stuff getting in the way (namely life) -*/ - -/mob/living/simple_animal/familiar/pike - name = "space pike" - desc = "A bigger, more magical cousin of the space carp." - icon = 'icons/mob/simple_animal/spaceshark.dmi' - pixel_x = -16 - offset_overhead_text_x = 16 - - speak_emote = list("gnashes") - max_health = 100 - natural_weapon = /obj/item/natural_weapon/bite - min_gas = null - wizardy_spells = list(/spell/aoe_turf/conjure/forcewall) - ai = /datum/mob_controller/familiar_pike - -/datum/mob_controller/familiar_pike - can_escape_buckles = TRUE - -/mob/living/simple_animal/familiar/pike/Process_Spacemove() - return 1 //No drifting in space for space carp! //original comments do not steal - -/mob/living/simple_animal/familiar/horror - name = "horror" - desc = "Looking at it fills you with dread." - icon = 'icons/mob/simple_animal/horror.dmi' - speak_emote = list("moans", "groans") - response_help_1p = "You think better of touching $TARGET$." - response_help_3p = "$USER$ thinks better of touching $TARGET$." - max_health = 150 - natural_weapon = /obj/item/natural_weapon/horror - wizardy_spells = list(/spell/targeted/torment) - -/obj/item/natural_weapon/horror - name = "foul touch" - _base_attack_force = 10 - atom_damage_type = BURN - attack_verb = list("touched") - -/mob/living/simple_animal/familiar/horror/get_death_message(gibbed) - return "rapidly deteriorates" -/mob/living/simple_animal/familiar/horror/get_self_death_message(gibbed) - return "The bonds tying you to this mortal plane have been severed." - -/mob/living/simple_animal/familiar/horror/death(gibbed) - . = ..() - if(. && !gibbed) - spawn_gibber(loc) - qdel(src) - -/mob/living/simple_animal/familiar/minor_amaros - name = "minor amaros" - desc = "A small fluffy alien creature." - icon = 'icons/mob/simple_animal/amaros.dmi' - speak_emote = list("entones") - mob_size = MOB_SIZE_SMALL - max_health = 25 - wizardy_spells = list( - /spell/targeted/heal_target, - /spell/targeted/heal_target/area - ) - -/mob/living/simple_animal/familiar/pet/mouse - name = "elderly mouse" - desc = "A small rodent. It looks very old." - icon = 'icons/mob/simple_animal/mouse_gray.dmi' - speak_emote = list("squeeks") - holder_type = /obj/item/holder - pass_flags = PASS_FLAG_TABLE - mob_size = MOB_SIZE_MINISCULE - response_harm = "stamps on" - max_health = 15 - natural_weapon = /obj/item/natural_weapon/bite/mouse - wizardy_spells = list(/spell/aoe_turf/smoke) - ai = /datum/mob_controller/familiar_mouse - -/datum/mob_controller/familiar_mouse - can_escape_buckles = TRUE - -/mob/living/simple_animal/familiar/pet/mouse/Initialize() - . = ..() - - verbs += /mob/living/proc/ventcrawl - verbs += /mob/living/proc/hide - -/mob/living/simple_animal/familiar/pet/cat - name = "black cat" - desc = "A pitch black cat. Said to be especially unlucky." - icon = 'icons/mob/simple_animal/cat_black.dmi' - speak_emote = list("meows", "purrs") - holder_type = /obj/item/holder - mob_size = MOB_SIZE_SMALL - max_health = 25 - natural_weapon = /obj/item/natural_weapon/claws/weak - wizardy_spells = list(/spell/targeted/subjugation) diff --git a/code/modules/organs/internal/species/golem.dm b/code/modules/organs/internal/species/golem.dm index 93e368c2e64..cbf569bebab 100644 --- a/code/modules/organs/internal/species/golem.dm +++ b/code/modules/organs/internal/species/golem.dm @@ -1,8 +1,9 @@ /obj/item/organ/internal/brain/golem name = "chem" desc = "A tightly furled roll of paper, covered with indecipherable runes." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/items/paperwork/scroll.dmi' icon_state = "scroll" + color = COLOR_BEIGE /obj/item/organ/internal/brain/golem/can_recover() - return 0 + return FALSE diff --git a/code/modules/projectiles/guns/energy/staves.dm b/code/modules/projectiles/guns/energy/staves.dm index 45ab5f71b6f..965c8f208e0 100644 --- a/code/modules/projectiles/guns/energy/staves.dm +++ b/code/modules/projectiles/guns/energy/staves.dm @@ -13,15 +13,13 @@ self_recharge = 1 charge_meter = 0 has_safety = FALSE - var/required_antag_type = /decl/special_role/wizard + var/required_antag_type /obj/item/gun/energy/staff/special_check(var/mob/user) - if(required_antag_type) - var/decl/special_role/antag = GET_DECL(required_antag_type) - if(user.mind && !antag.is_antagonist(user.mind)) - to_chat(usr, "You focus your mind on \the [src], but nothing happens!") - return 0 - + var/decl/special_role/antag = GET_DECL(required_antag_type) + if(user.mind && (!antag?.is_antagonist(user.mind))) + to_chat(user, SPAN_WARNING("You focus your mind on \the [src], but nothing happens!")) + return FALSE return ..() /obj/item/gun/energy/staff/handle_click_empty(mob/user = null) diff --git a/code/modules/spells/aoe_turf/aoe_turf.dm b/code/modules/spells/aoe_turf/aoe_turf.dm index 46febbfbe5f..0f7a721de80 100644 --- a/code/modules/spells/aoe_turf/aoe_turf.dm +++ b/code/modules/spells/aoe_turf/aoe_turf.dm @@ -1,7 +1,7 @@ /* Aoe turf spells target a ring of tiles around the user This ring has an outer radius (range) and an inner radius (inner_radius) -Aoe turf spells have two useful flags: IGNOREDENSE and IGNORESPACE. These are explained in setup.dm +Aoe turf spells have a useful flag: IGNOREDENSE. It is explained in setup.dm */ /spell/aoe_turf //affects all turfs in view or range (depends) @@ -15,8 +15,6 @@ Aoe turf spells have two useful flags: IGNOREDENSE and IGNORESPACE. These are ex if(!(target in view_or_range(inner_radius, holder, selection_type))) if(target.density && (spell_flags & IGNOREDENSE)) continue - if(isspaceturf(target) && (spell_flags & IGNORESPACE)) - continue targets += target if(!targets.len) //doesn't waste the spell diff --git a/code/modules/spells/aoe_turf/blink.dm b/code/modules/spells/aoe_turf/blink.dm deleted file mode 100644 index 3fd742aec24..00000000000 --- a/code/modules/spells/aoe_turf/blink.dm +++ /dev/null @@ -1,44 +0,0 @@ -/spell/aoe_turf/blink - name = "Blink" - desc = "This spell randomly teleports you a short distance." - feedback = "BL" - school = "conjuration" - charge_max = 20 - spell_flags = Z2NOCAST | IGNOREDENSE | IGNORESPACE - invocation = "none" - invocation_type = SpI_NONE - range = 7 - inner_radius = 1 - - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 4) - cooldown_min = 5 //4 deciseconds reduction per rank - hud_state = "wiz_blink" - cast_sound = 'sound/magic/blink.ogg' - -/spell/aoe_turf/blink/cast(var/list/targets, mob/user) - if(!targets.len) - return - - var/turf/T = pick(targets) - var/turf/starting = get_turf(user) - if(T) - if(user.buckled) - user.buckled = null - user.forceMove(T) - - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(3, 0, starting) - smoke.start() - - smoke = new() - smoke.set_up(3, 0, T) - smoke.start() - - return - -/spell/aoe_turf/blink/empower_spell() - if(!..()) - return 0 - inner_radius += 1 - - return "You've increased the inner range of [src]." \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/charge.dm b/code/modules/spells/aoe_turf/charge.dm deleted file mode 100644 index d9c8f95af90..00000000000 --- a/code/modules/spells/aoe_turf/charge.dm +++ /dev/null @@ -1,72 +0,0 @@ -/spell/aoe_turf/charge - name = "Charge" - desc = "This spell can be used to charge up spent magical artifacts, among other things." - - school = "transmutation" - charge_max = 600 - spell_flags = 0 - invocation = "DIRI CEL" - invocation_type = SpI_WHISPER - range = 0 - cooldown_min = 400 //50 deciseconds reduction per rank - - hud_state = "wiz_charge" - cast_sound = 'sound/magic/charge.ogg' - -/spell/aoe_turf/charge/cast(var/list/targets, mob/user) - for(var/turf/T in targets) - depth_cast(T) - -/spell/aoe_turf/charge/proc/depth_cast(var/list/targets) - for(var/atom/A in targets) - if(A.contents.len) - depth_cast(A.contents) - cast_charge(A) - -/spell/aoe_turf/charge/proc/mob_charge(var/mob/living/M) - if(!M.mind) - return - if(M.mind.learned_spells.len != 0) - for(var/spell/S in M.mind.learned_spells) - if(!istype(S, /spell/aoe_turf/charge)) - S.charge_counter = S.charge_max - to_chat(M, "You feel raw magic flowing through you, it feels good!") - else - to_chat(M, "You feel very strange for a moment, but then it passes.") - return M - -/spell/aoe_turf/charge/proc/cast_charge(var/atom/target) - var/atom/charged_item - - if(isliving(target)) - charged_item = mob_charge(target) - - if(istype(target, /obj/item/grab)) - var/obj/item/grab/grab = target - if(grab.affecting) - var/mob/M = grab.get_affecting_mob() - if(M) - charged_item = mob_charge(M) - - if(istype(target, /obj/item/cell/)) - var/obj/item/cell/C = target - if(prob(80) && C.maxcharge) - C.maxcharge -= 200 - if(C.maxcharge <= 0) //maxcharge of 0! Madness! - C.maxcharge = 0 - C.charge = C.maxcharge - charged_item = C - - if(!charged_item) - return 0 - else - charged_item.visible_message("[charged_item] suddenly sparks with energy!") - return 1 - - -/spell/aoe_turf/charge/blood - name = "Blood Infusion" - desc = "This spell charges things around it using the lifeforce gained by sacrificed blood." - charge_type = Sp_HOLDVAR - holder_var_type = "bruteloss" - holder_var_amount = 30 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/conjure.dm b/code/modules/spells/aoe_turf/conjure/conjure.dm index 9291456f41a..8dd91146310 100644 --- a/code/modules/spells/aoe_turf/conjure/conjure.dm +++ b/code/modules/spells/aoe_turf/conjure/conjure.dm @@ -20,7 +20,7 @@ How they spawn stuff is decided by behaviour vars, which are explained below var/summon_exclusive = 0 //spawn one of everything, instead of random things var/list/newVars = list() //vars of the summoned objects will be replaced with those where they meet - //should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example + //should have format of list("emagged" = 1,"name" = "Justicebot"), for example cast_sound = 'sound/magic/castsummon.ogg' @@ -38,9 +38,6 @@ How they spawn stuff is decided by behaviour vars, which are explained below else summoned_object_type = pick(summon_type) var/turf/spawn_place = pick(targets) - if(spell_flags & IGNOREPREV) - targets -= spawn_place - var/atom/summoned_object if(ispath(summoned_object_type,/turf)) spawn_place.ChangeTurf(summoned_object_type) diff --git a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm deleted file mode 100644 index e6f0b8ea260..00000000000 --- a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm +++ /dev/null @@ -1,113 +0,0 @@ -/spell/aoe_turf/conjure/summon - var/name_summon = 0 - cast_sound = 'sound/weapons/wave.ogg' - -/spell/aoe_turf/conjure/summon/before_cast() - ..() - if(name_summon) - var/newName = sanitize(input("Would you like to name your summon?") as null|text, MAX_NAME_LEN) - if(newName) - newVars["name"] = newName - -/spell/aoe_turf/conjure/summon/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) - animation.icon_state = "shield2" - flick("shield2",animation) - sleep(10) - ..() - - -/spell/aoe_turf/conjure/summon/bats - name = "Summon Space Bats" - desc = "This spell summons a flock of spooky space bats." - feedback = "SB" - - charge_max = 1200 //2 minutes - spell_flags = NEEDSCLOTHES - invocation = "Bla'yo daya!" - invocation_type = SpI_SHOUT - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 3) - cooldown_min = 600 - - range = 1 - - summon_amt = 1 - summon_type = list(/mob/living/simple_animal/hostile/scarybat) - - hud_state = "wiz_bats" - -/spell/aoe_turf/conjure/summon/bats/empower_spell() - if(!..()) - return 0 - - newVars = list("max_health" = 20 + spell_levels[Sp_POWER]*5, "health" = 20 + spell_levels[Sp_POWER]*5, "melee_damage_lower" = 10 + spell_levels[Sp_POWER], "melee_damage_upper" = 10 + spell_levels[Sp_POWER]*2) - - return "Your bats are now stronger." - -/spell/aoe_turf/conjure/summon/bear - name = "Summon Bear" - desc = "This spell summons a permanent bear companion that will follow your orders." - feedback = "BR" - charge_max = 3000 //5 minutes because this is a REALLY powerful spell. May tone it down/up. - spell_flags = NEEDSCLOTHES - invocation = "REA'YO GOR DAYA!" - invocation_type = SpI_SHOUT - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 0, Sp_POWER = 4) - - range = 0 - - name_summon = 1 - - summon_amt = 1 - summon_type = list(/mob/living/simple_animal/hostile/commanded/bear) - newVars = list("max_health" = 15, - "health" = 15, - "melee_damage_lower" = 10, - "melee_damage_upper" = 10, - ) - - hud_state = "wiz_bear" - -/spell/aoe_turf/conjure/summon/bear/apply_vars(atom/summoned_object, mob/caster) - . = ..() - if(isliving(summoned_object)) - var/mob/living/summoned_mob = summoned_object - if(istype(summoned_mob.ai, /datum/mob_controller/aggressive/commanded)) - var/datum/mob_controller/aggressive/commanded/command_ai = summoned_mob.ai - command_ai.master = caster - -/spell/aoe_turf/conjure/summon/bear/empower_spell() - if(!..()) - return 0 - switch(spell_levels[Sp_POWER]) - if(1) - newVars = list("max_health" = 30, - "health" = 30, - "melee_damage_lower" = 15, - "melee_damage_upper" = 15 - ) - return "Your bear has been upgraded from a cub to a whelp." - if(2) - newVars = list("max_health" = 45, - "health" = 45, - "melee_damage_lower" = 20, - "melee_damage_upper" = 20, - "color" = "#d9d9d9" //basically we want them to look different enough that people can recognize it. - ) - return "Your bear has been upgraded from a whelp to an adult." - if(3) - newVars = list("max_health" = 60, - "health" = 60, - "melee_damage_lower" = 25, - "melee_damage_upper" = 25, - "color" = "#8c8c8c" - ) - return "Your bear has been upgraded from an adult to an alpha." - if(4) - newVars = list("max_health" = 75, - "health" = 75, - "melee_damage_lower" = 35, - "melee_damage_upper" = 35, - "resistance" = 3, - "color" = "#0099ff" - ) - return "Your bear is now worshiped as a god amongst bears." \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm b/code/modules/spells/aoe_turf/conjure/faithful_hound.dm deleted file mode 100644 index 4511e6a07f4..00000000000 --- a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm +++ /dev/null @@ -1,28 +0,0 @@ -/spell/aoe_turf/conjure/faithful_hound - name = "Faithful Hound" - desc = "Summon a spectral watchdog with a special password. Anyone without the password is in for a barking and a biting." - feedback = "FH" - - charge_max = 600 - spell_flags = NEEDSCLOTHES - invocation = "Du korilath tangus" - invocation_type = SpI_WHISPER - range = 0 - - summon_amt = 1 - summon_type = list(/mob/living/simple_animal/faithful_hound) - hud_state = "wiz_hound" - - var/temp_password - -/spell/aoe_turf/conjure/faithful_hound/apply_vars(atom/summoned_object, mob/caster) - . = ..() - var/mob/living/simple_animal/faithful_hound/hound = summoned_object - if(istype(hound) && istype(hound.ai)) - hound.ai.add_friend(caster) - hound.ai.memorise(caster, temp_password) - temp_password = null - -/spell/aoe_turf/conjure/faithful_hound/before_cast() - ..() - temp_password = sanitize(input("What password will this beast listen to?") as text, MAX_NAME_LEN) diff --git a/code/modules/spells/aoe_turf/conjure/force_portal.dm b/code/modules/spells/aoe_turf/conjure/force_portal.dm deleted file mode 100644 index 293e176051f..00000000000 --- a/code/modules/spells/aoe_turf/conjure/force_portal.dm +++ /dev/null @@ -1,12 +0,0 @@ -/spell/aoe_turf/conjure/force_portal - name = "Force Portal" - desc = "Create a portal that sucks in anything that touches it and then shoots it all out at the end." - school = "conjuration" - feedback = "FP" - summon_type = list(/obj/effect/force_portal) - charge_max = 200 - spell_flags = NEEDSCLOTHES - range = 0 - cast_sound = null - - hud_state = "wiz_force" diff --git a/code/modules/spells/aoe_turf/conjure/forcewall.dm b/code/modules/spells/aoe_turf/conjure/forcewall.dm deleted file mode 100644 index 1c937f3f6d8..00000000000 --- a/code/modules/spells/aoe_turf/conjure/forcewall.dm +++ /dev/null @@ -1,48 +0,0 @@ -/spell/aoe_turf/conjure/forcewall - name = "Forcewall" - desc = "Create a wall of pure energy at your location." - school = "conjuration" - feedback = "FW" - summon_type = list(/obj/effect/forcefield) - duration = 300 - charge_max = 100 - spell_flags = 0 - range = 0 - cast_sound = 'sound/magic/forcewall.ogg' - - hud_state = "wiz_shield" - -/spell/aoe_turf/conjure/forcewall/mime - name = "Invisible wall" - desc = "Create an invisible wall on your location." - school = "mime" - panel = "Mime" - summon_type = list(/obj/effect/forcefield/mime) - invocation_type = SpI_EMOTE - invocation = "mimes placing their hands on a flat surfacing, and pushing against it." - charge_max = 300 - cast_sound = null - - override_base = "grey" - hud_state = "mime_wall" - -/obj/effect/forcefield - desc = "A space wizard's magic wall." - name = "FORCEWALL" - icon = 'icons/effects/effects.dmi' - icon_state = "m_shield" - anchored = TRUE - opacity = FALSE - density = TRUE - -/obj/effect/forcefield/bullet_act(var/obj/item/projectile/Proj, var/def_zone) - var/turf/T = get_turf(src.loc) - if(T) - for(var/mob/M in T) - Proj.on_hit(M,M.bullet_act(Proj, def_zone)) - return - -/obj/effect/forcefield/mime - icon_state = "empty" - name = "invisible wall" - desc = "You have a bad feeling about this." diff --git a/code/modules/spells/aoe_turf/conjure/grove.dm b/code/modules/spells/aoe_turf/conjure/grove.dm deleted file mode 100644 index 77f68981e9d..00000000000 --- a/code/modules/spells/aoe_turf/conjure/grove.dm +++ /dev/null @@ -1,75 +0,0 @@ -/spell/aoe_turf/conjure/grove - name = "Grove" - desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant." - - spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV - charge_max = 1200 - school = "transmutation" - - range = 1 - cooldown_min = 600 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 1) - - summon_amt = 47 - summon_type = list(/turf/floor/fake_grass) - var/spread = 0 - var/datum/seed/seed - var/seed_type = /datum/seed/merlin_tear - cast_sound = 'sound/magic/repulse.ogg' - -/spell/aoe_turf/conjure/grove/New() - ..() - if(seed_type) - seed = new seed_type() - else - seed = SSplants.create_random_seed(1) - -/spell/aoe_turf/conjure/grove/before_cast() - var/turf/T = get_turf(holder) - var/obj/effect/vine/P = new(T,seed) - P.spread_chance = spread - - -/spell/aoe_turf/conjure/grove/sanctuary - name = "Sanctuary" - desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant." - feedback = "SY" - invocation = "Bo K'Iitan!" - invocation_type = SpI_SHOUT - spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV - cooldown_min = 600 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 1) - - seed_type = /datum/seed/merlin_tear - newVars = list("name" = "sanctuary", "desc" = "This grass makes you feel comfortable. Peaceful.","blessed" = 1) - - hud_state = "wiz_grove" -/spell/aoe_turf/conjure/grove/sanctuary/empower_spell() - if(!..()) - return 0 - - seed.set_trait(TRAIT_SPREAD,2) //make it grow. - spread = 40 - return "Your sanctuary will now grow beyond that of the grassy perimeter." - -/datum/seed/merlin_tear - name = "merlin tears" - product_name = "merlin tears" - display_name = "merlin tears" - chems = list(/decl/material/liquid/brute_meds = list(3,7), /decl/material/liquid/burn_meds = list(3,7), /decl/material/liquid/antitoxins = list(3,7), /decl/material/liquid/regenerator = list(3,7), /decl/material/liquid/neuroannealer = list(1,2), /decl/material/liquid/eyedrops = list(1,2)) - grown_tag = "berries" - -/datum/seed/merlin_tear/New() - ..() - set_trait(TRAIT_PLANT_ICON,"bush5") - set_trait(TRAIT_PRODUCT_ICON,"berry") - set_trait(TRAIT_PRODUCT_COLOUR,"#4d4dff") - set_trait(TRAIT_PLANT_COLOUR, "#ff6600") - set_trait(TRAIT_YIELD,4) - set_trait(TRAIT_MATURATION,6) - set_trait(TRAIT_PRODUCTION,6) - set_trait(TRAIT_POTENCY,10) - set_trait(TRAIT_HARVEST_REPEAT,1) - set_trait(TRAIT_IMMUTABLE,1) //no making op plants pls \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/disable_tech.dm b/code/modules/spells/aoe_turf/disable_tech.dm deleted file mode 100644 index d9912e1c390..00000000000 --- a/code/modules/spells/aoe_turf/disable_tech.dm +++ /dev/null @@ -1,33 +0,0 @@ -/spell/aoe_turf/disable_tech - name = "Disable Tech" - desc = "This spell disables all weapons, cameras and most other technology in range." - feedback = "DT" - charge_max = 400 - spell_flags = NEEDSCLOTHES - invocation = "NEC CANTIO" - invocation_type = SpI_SHOUT - selection_type = "range" - range = 0 - inner_radius = -1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - cooldown_min = 200 //50 deciseconds reduction per rank - - var/emp_heavy = 3 - var/emp_light = 5 - - hud_state = "wiz_tech" - cast_sound = 'sound/magic/disable_tech.ogg' - -/spell/aoe_turf/disable_tech/cast(list/targets) - - for(var/turf/target in targets) - empulse(get_turf(target), emp_heavy, emp_light) - return - -/spell/aoe_turf/disable_tech/empower_spell() - if(!..()) - return 0 - emp_heavy += 2 - emp_light += 2 - - return "You've increased the range of [src]." diff --git a/code/modules/spells/aoe_turf/drain_blood.dm b/code/modules/spells/aoe_turf/drain_blood.dm deleted file mode 100644 index 8ad4ea6b8a2..00000000000 --- a/code/modules/spells/aoe_turf/drain_blood.dm +++ /dev/null @@ -1,66 +0,0 @@ -/spell/aoe_turf/drain_blood - name = "Drain Blood" - desc = "This spell allows the caster to borrow blood from those around them. Sharing is caring!" - feedback = "DB" - school = "transmutation" - charge_max = 600 - invocation = "whispers something darkly" - invocation_type = SpI_EMOTE - range = 3 - inner_radius = 0 - - time_between_channels = 100 - number_of_channels = 3 - cast_sound = 'sound/effects/squelch2.ogg' - hud_state = "const_rune" - -/spell/aoe_turf/drain_blood/cast(var/list/targets, var/mob/user) - for(var/t in targets) - for(var/mob/living/L in t) - if(L.stat == DEAD || L == user) - continue - //Hurt target - if(ishuman(L)) - var/mob/living/human/H = L - H.vessel.remove_any(10) - else - L.take_damage(10) - to_chat(L, "You feel your lifeforce being ripping out of your body!") - - //Do effect - var/obj/item/projectile/beam/blood_effect/effect = new(get_turf(user)) - effect.pixel_x = 0 - effect.pixel_y = 0 - effect.launch(L, "chest") - - //Heal self - if(ishuman(user)) - var/mob/living/human/H = user - var/amount = min(10, H.species.blood_volume - H.vessel.total_volume) - if(amount > 0) - H.adjust_blood(amount) - continue - L.heal_damage(BRUTE, 5, do_update_health = FALSE) - L.heal_damage(BURN, 2.5, do_update_health = FALSE) - L.heal_damage(TOX, 2.5) - -/obj/item/projectile/beam/blood_effect - name = "blood jet" - icon_state = "blood" - damage = 0 - randpixel = 0 - no_attack_log = 1 - muzzle_type = /obj/effect/projectile/blood - tracer_type = /obj/effect/projectile/blood - impact_type = /obj/effect/projectile/blood - -/obj/item/projectile/beam/blood_effect/Bump(var/atom/a, forced=0) - if(a == original) - on_impact(a) - qdel(src) - return 1 - return 0 - - -/obj/effect/projectile/blood - icon_state = "blood" \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/exchange_wounds.dm b/code/modules/spells/aoe_turf/exchange_wounds.dm deleted file mode 100644 index 7293e960d29..00000000000 --- a/code/modules/spells/aoe_turf/exchange_wounds.dm +++ /dev/null @@ -1,43 +0,0 @@ -/spell/aoe_turf/exchange_wounds - name = "Exchange Wounds" - desc = "Allows you to sacrifice your own well-being for that of those around you." - feedback = "EW" - school = "transmutation" - invocation = "Esh Yek Vai!" - invocation_type = SpI_SHOUT - charge_max = 400 - spell_flags = 0 - - var/amt_healed = 0 - var/heal_max = 100 - range = 4 - inner_radius = 0 - number_of_channels = 0 - time_between_channels = 20 - - hud_state = "wiz_exchange" - -/spell/aoe_turf/exchange_wounds/perform() - amt_healed = 0 - ..() - -/spell/aoe_turf/exchange_wounds/cast(var/list/targets, var/mob/living/user) - new /obj/effect/temporary(get_turf(user),10,'icons/effects/effects.dmi',"purple_electricity_constant") - for(var/t in targets) - for(var/mob/living/L in t) - if(L.faction != user.faction) - continue - new /obj/effect/temporary(get_turf(L),10,'icons/effects/effects.dmi',"green_sparkles") - if(L.get_damage(BRUTE) > 5) - L.heal_damage(BRUTE, 5) - user.take_damage(2) - amt_healed += 5 - if(L.get_damage(BURN) > 5) - L.heal_damage(BURN, 5) - user.take_damage(2, BURN) - amt_healed += 5 - -/spell/aoe_turf/exchange_wounds/check_valid_targets() - if(amt_healed > heal_max) - return FALSE - return ..() \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/knock.dm b/code/modules/spells/aoe_turf/knock.dm deleted file mode 100644 index 3cf8614eeaa..00000000000 --- a/code/modules/spells/aoe_turf/knock.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/aoe_turf/knock - name = "Knock" - desc = "This spell opens nearby doors and does not require wizard garb." - feedback = "KN" - school = "transmutation" - charge_max = 100 - spell_flags = 0 - invocation = "Aulie Oxin Fiera." - invocation_type = SpI_WHISPER - range = 3 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1) - cooldown_min = 20 //20 deciseconds reduction per rank - - hud_state = "wiz_knock" - cast_sound = 'sound/magic/knock.ogg' - -/spell/aoe_turf/knock/cast(list/targets) - for(var/turf/T in targets) - for(var/obj/machinery/door/door in T.contents) - spawn(1) - if(istype(door,/obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/AL = door //casting is important - AL.locked = 0 - door.open() - return - - -/spell/aoe_turf/knock/empower_spell() - if(!..()) - return 0 - range *= 2 - - return "You've doubled the range of [src]." - -/spell/aoe_turf/knock/slow - charge_max = 200 - hidden_from_codex = TRUE diff --git a/code/modules/spells/aoe_turf/smoke.dm b/code/modules/spells/aoe_turf/smoke.dm deleted file mode 100644 index f9f0138908f..00000000000 --- a/code/modules/spells/aoe_turf/smoke.dm +++ /dev/null @@ -1,26 +0,0 @@ -/spell/aoe_turf/smoke - name = "Smoke" - desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." - feedback = "SM" - school = "transmutation" - charge_max = 120 - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - range = 1 - inner_radius = -1 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 2) - cooldown_min = 20 //25 deciseconds reduction per rank - - smoke_spread = 2 - smoke_amt = 5 - - hud_state = "wiz_smoke" - cast_sound = 'sound/magic/smoke.ogg' - -/spell/aoe_turf/smoke/empower_spell() - if(!..()) - return 0 - smoke_amt += 2 - - return "[src] will now create more smoke." diff --git a/code/modules/spells/aoe_turf/summons.dm b/code/modules/spells/aoe_turf/summons.dm deleted file mode 100644 index be61819d9ea..00000000000 --- a/code/modules/spells/aoe_turf/summons.dm +++ /dev/null @@ -1,72 +0,0 @@ -/spell/aoe_turf/conjure/summonEdSwarm //test purposes - name = "Dispense Wizard Justice" - desc = "This spell dispenses wizard justice." - - summon_type = list(/mob/living/bot/secbot/ed209) - summon_amt = 10 - range = 3 - newVars = list("emagged" = 1,"name" = "Wizard's Justicebot") - - hud_state = "wiz_ed" - -/spell/aoe_turf/conjure/carp - name = "Summon Carp" - desc = "This spell conjures a simple carp." - - school = "conjuration" - charge_max = 1200 - spell_flags = NEEDSCLOTHES - invocation = "Nouk Fhumm Sacp Risska!" - invocation_type = SpI_SHOUT - range = 1 - cast_sound = 'sound/magic/summon_carp.ogg' - - summon_type = list(/mob/living/simple_animal/hostile/carp) - - hud_state = "wiz_carp" - -/spell/aoe_turf/conjure/creature - name = "Summon Creature Swarm" - desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth" - - school = "conjuration" - charge_max = 1200 - spell_flags = 0 - invocation = "Ia-Ia! Naomesnalia!" - invocation_type = SpI_SHOUT - summon_amt = 10 - range = 3 - - summon_type = list(/mob/living/simple_animal/hostile/creature) - - hud_state = "wiz_creature" - -/spell/aoe_turf/conjure/mirage - name = "Summon Mirage" - desc = "This spell summons a harmless carp mirage for a few seconds." - feedback = "MR" - school = "illusion" - charge_max = 1200 - spell_flags = NEEDSCLOTHES - invocation = "Nouk Fhunhm Sacp Risska!" - invocation_type = SpI_SHOUT - range = 1 - cast_sound = 'sound/magic/summon_carp.ogg' - - duration = 600 - cooldown_min = 600 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 2, Sp_POWER = 3) - - summon_type = list(/mob/living/simple_animal/hostile/carp) - - hud_state = "wiz_carp" - - newVars = list("melee_damage_lower" = 0, "melee_damage_upper" = 0, "break_stuff_probability" = 0) - -/spell/aoe_turf/conjure/mirage/empower_spell() - if(!..()) - return 0 - - summon_amt++ - - return "You now summon [summon_amt] mirages per spellcast." \ No newline at end of file diff --git a/code/modules/spells/artifacts.dm b/code/modules/spells/artifacts.dm deleted file mode 100644 index 2c085ff8e2a..00000000000 --- a/code/modules/spells/artifacts.dm +++ /dev/null @@ -1,41 +0,0 @@ -//////////////////////Scrying orb////////////////////// - -/obj/item/scrying - name = "scrying orb" - desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means." - icon = 'icons/obj/projectiles.dmi' - icon_state = "bluespace" - throw_speed = 3 - throw_range = 7 - atom_damage_type = BURN - hitsound = 'sound/magic/forcewall.ogg' - max_health = ITEM_HEALTH_NO_DAMAGE - _base_attack_force = 10 - -/obj/item/scrying/attack_self(mob/user) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if((user.mind && !wizards.is_antagonist(user.mind))) - to_chat(user, "You stare into the orb and see nothing but your own reflection.") - return - - to_chat(user, "You can see... everything!") // This never actually happens. - visible_message("[user] stares into [src], their eyes glazing over.") - - user.teleop = user.ghostize() - announce_ghost_joinleave(user.teleop, 1, "You feel that they used a powerful artifact to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place with their presence.") - return - - - -/////////////////////////Cursed Dice/////////////////////////// -/obj/item/dice/d20/cursed - desc = "A dice with twenty sides said to have an ill effect on those that are unlucky..." - -/obj/item/dice/d20/cursed/attack_self(mob/user) - ..() - if(isliving(user)) - var/mob/living/M = user - if(icon_state == "[name][sides]") - M.heal_damage(BRUTE, 30) - else if(icon_state == "[name]1") - M.take_damage(30) diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm deleted file mode 100644 index 6477080cfdf..00000000000 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ /dev/null @@ -1,284 +0,0 @@ -/datum/spellbound_type - var/name = "Stuff" - var/desc = "spells n shit" - var/equipment = list() - var/spells = list() - -/datum/spellbound_type/proc/spawn_servant(var/atom/a, var/mob/master, var/mob/user) - set waitfor = 0 - var/mob/living/human/H = new(a) - H.ckey = user.ckey - H.change_appearance(APPEARANCE_GENDER|APPEARANCE_BODY|APPEARANCE_EYE_COLOR|APPEARANCE_HAIR|APPEARANCE_FACIAL_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR_COLOR|APPEARANCE_SKIN) - - var/obj/item/implant/translator/natural/I = new() - I.implant_in_mob(H, BP_HEAD) - if (length(master.languages)) - var/decl/language/lang = master.languages[1] - H.add_language(lang.type) - H.set_default_language(lang.type) - I.languages[lang.name] = 1 - - modify_servant(equip_servant(H), H) - set_antag(H.mind, master) - var/name_choice = sanitize(input(H, "Choose a name. If you leave this blank, it will be defaulted to your current characters.", "Name change") as null|text, MAX_NAME_LEN) - if(name_choice) - H.SetName(name_choice) - H.real_name = name_choice - -/datum/spellbound_type/proc/equip_servant(var/mob/living/human/H) - for(var/stype in spells) - var/spell/S = new stype() - if(S.spell_flags & NEEDSCLOTHES) - S.spell_flags &= ~NEEDSCLOTHES - H.add_spell(S) - . = list() - for(var/etype in equipment) - var/obj/item/I = new etype(get_turf(H)) - if(istype(I, /obj/item/clothing)) - I.canremove = 0 - H.equip_to_slot_if_possible(I,equipment[etype],0,1,1,1) - . += I - -/datum/spellbound_type/proc/set_antag(var/datum/mind/M, var/mob/master) - return - -/datum/spellbound_type/proc/modify_servant(var/list/items, var/mob/living/human/H) - return - -/datum/spellbound_type/apprentice - name = "Apprentice" - desc = "Summon your trusty apprentice, equipped with their very own spellbook." - equipment = list(/obj/item/clothing/head/wizard = slot_head_str, - /obj/item/clothing/jumpsuit/lightpurple = slot_w_uniform_str, - /obj/item/clothing/shoes/sandal = slot_shoes_str, - /obj/item/staff = BP_R_HAND, - /obj/item/book/spell/apprentice = BP_L_HAND, - /obj/item/clothing/suit/wizrobe = slot_wear_suit_str) - spells = list(/spell/noclothes) - -/datum/spellbound_type/apprentice/set_antag(var/datum/mind/M, var/mob/master) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - wizards.add_antagonist_mind(M, 1, "Wizard's Apprentice", "You are an apprentice-type Servant! You're just an ordinary Wizard-To-Be, with no special abilities, but do not need robes to cast spells. Follow your teacher's orders!") - -/datum/spellbound_type/servant - var/spiel = "You don't do anything in particular." - -/datum/spellbound_type/servant/set_antag(var/datum/mind/M, var/mob/master) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - wizards.add_antagonist_mind(M, 1, "Spellbound Servant", "You are a [name]-type Servant! [spiel]") - -/datum/spellbound_type/servant/caretaker - name = "Caretaker" - desc = "A healer, a medic, a shoulder to cry on. This servant will heal you, even from near death." - spiel = "'The last enemy that will be destroyed is death.' You can perceive any injuries with simple sight, and heal them with the Trance spell; potentially even reversing death itself! However, this comes at a price; Trance will become increasingly harder to use as you use it, until you can use it no longer. Be cautious, and aid your Master in any way possible!" - equipment = list(/obj/item/clothing/jumpsuit/caretaker = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/caretakershoes = slot_shoes_str) - spells = list(/spell/toggle_armor/caretaker, - /spell/targeted/heal_target/touch, - /spell/aoe_turf/knock/slow, - /spell/targeted/heal_target/area/slow, - /spell/targeted/analyze, - /spell/targeted/heal_target/trance - ) - -/datum/spellbound_type/servant/champion - name = "Champion" - desc = "A knight in shining armor; a warrior, a protector, and a loyal friend." - spiel = "Your sword and armor are second to none, but you have no unique supernatural powers beyond summoning the sword to your hands. Protect your Master with your life!" - equipment = list( - /obj/item/clothing/pants/champion = slot_w_uniform_str, - /obj/item/clothing/shoes/jackboots/medievalboots = slot_shoes_str - ) - spells = list( - /spell/toggle_armor/champion, - /spell/toggle_armor/excalibur - ) - -/datum/spellbound_type/servant/familiar - name = "Familiar" - desc = "A friend! Or are they a pet? They can transform into animals, and take some particular traits from said creatures." - spiel = "This form of yours is weak in comparison to your transformed form, but that certainly won't pose a problem, considering the fact that you have an alternative. Whatever it is you can turn into, use its powers wisely and serve your Master as well as possible!" - equipment = list( - /obj/item/clothing/head/bandana/familiarband = slot_head_str, - /obj/item/clothing/pants/familiar = slot_w_uniform_str - ) - -/datum/spellbound_type/servant/familiar/modify_servant(var/list/equipment, var/mob/living/human/H) - var/familiar_type - switch(input(H,"Choose your desired animal form:", "Form") as anything in list("Space Pike", "Mouse", "Cat", "Bear")) - if("Space Pike") - H.add_genetic_condition(GENE_COND_NO_BREATH) - H.add_genetic_condition(GENE_COND_SPACE_RESISTANCE) - familiar_type = /mob/living/simple_animal/hostile/carp/pike - if("Mouse") - H.verbs |= /mob/living/proc/ventcrawl - familiar_type = /mob/living/simple_animal/passive/mouse - if("Cat") - H.add_genetic_condition(GENE_COND_RUNNING) - familiar_type = /mob/living/simple_animal/passive/cat - if("Bear") - familiar_type = /mob/living/simple_animal/hostile/bear - var/spell/targeted/shapeshift/familiar/F = new() - F.possible_transformations = list(familiar_type) - H.add_spell(F) - -/datum/spellbound_type/servant/fiend - name = "Fiend" - desc = "A practitioner of dark and evil magics, almost certainly a demon, and possibly a lawyer." - spiel = "The Summoning Ritual has bound you to this world with limited access to your infernal powers; you'll have to be strategic in how you use them. Follow your Master's orders as well as you can!" - spells = list(/spell/targeted/projectile/dumbfire/fireball/firebolt, - /spell/targeted/ethereal_jaunt, - /spell/targeted/torment, - /spell/area_teleport, - /spell/hand/charges/blood_shard - ) - -/datum/spellbound_type/servant/fiend/equip_servant(var/mob/living/human/H) - if(H.gender == MALE) - equipment = list(/obj/item/clothing/costume/fiendsuit = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/devilshoes = slot_shoes_str) - spells += /spell/toggle_armor/fiend - else - equipment = list(/obj/item/clothing/dress/devil = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/devilshoes = slot_shoes_str) - spells += /spell/toggle_armor/fiend/fem - ..() - -/datum/spellbound_type/servant/infiltrator - name = "Infiltrator" - desc = "A spy and a manipulator to the end, capable of hiding in plain sight and falsifying information to your heart's content." - spiel = "On the surface, you are a completely normal person, but is that really all you are? People are so easy to fool, do as your Master says, and do it with style!" - spells = list( - /spell/toggle_armor/infil_items, - /spell/targeted/exude_pleasantness, - /spell/targeted/genetic/blind/hysteria - ) - -/datum/spellbound_type/servant/infiltrator/equip_servant(var/mob/living/human/H) - if(H.gender == MALE) - equipment = list(/obj/item/clothing/pants/slacks/outfit/tie = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) - spells += /spell/toggle_armor/infiltrator - else - equipment = list(/obj/item/clothing/dress/white = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) - spells += /spell/toggle_armor/infiltrator/fem - ..() - -/datum/spellbound_type/servant/overseer - name = "Overseer" - desc = "A ghost, or an imaginary friend; the Overseer is immune to space and can turn invisible at a whim, but has little offensive capabilities." - spiel = "Physicality is not something you are familiar with. Indeed, injuries cannot slow you down, but you can't fight back, either! In addition to this, you can reach into the void and return the soul of a single departed crewmember via the revoke death verb, if so desired; this can even revive your Master, should they fall in combat before you do. Serve them well." - equipment = list( - /obj/item/clothing/pants/casual/blackjeans/outfit = slot_w_uniform_str, - /obj/item/clothing/suit/jacket/hoodie/grim = slot_wear_suit_str, - /obj/item/clothing/shoes/sandal/grimboots = slot_shoes_str, - /obj/item/contract/wizard/xray = BP_L_HAND, - /obj/item/contract/wizard/telepathy = BP_R_HAND - ) - spells = list( - /spell/toggle_armor/overseer, - /spell/targeted/ethereal_jaunt, - /spell/invisibility, - /spell/targeted/revoke - ) - -/datum/spellbound_type/servant/overseer/equip_servant(var/mob/living/human/H) - ..() - H.add_aura(new /obj/aura/regenerating(H)) - -/obj/effect/cleanable/spellbound - name = "strange rune" - desc = "some sort of runic symbol drawn in... crayon?" - icon = 'icons/obj/rune.dmi' - icon_state = "spellbound" - is_spawnable_type = FALSE // invalid without spell_type passed - var/datum/spellbound_type/stype - var/last_called = 0 - -/obj/effect/cleanable/spellbound/Initialize(mapload, var/spell_type) - . = ..(mapload) - stype = new spell_type() - -/obj/effect/cleanable/spellbound/attack_hand(var/mob/user) - SHOULD_CALL_PARENT(FALSE) - if(last_called > world.time) - return TRUE - last_called = world.time + 30 SECONDS - var/decl/ghosttrap/G = GET_DECL(/decl/ghosttrap/wizard_familiar) - for(var/mob/observer/ghost/ghost in global.player_list) - if(G.assess_candidate(ghost,null,FALSE)) - to_chat(ghost, "[SPAN_NOTICE("A wizard is requesting a Spell-Bound Servant!")] (Join)") - return TRUE - -/obj/effect/cleanable/spellbound/CanUseTopic(var/mob) - if(isliving(mob)) - return STATUS_CLOSE - return STATUS_INTERACTIVE - -/obj/effect/cleanable/spellbound/OnTopic(var/mob/user, href_list, state) - if(href_list["master"]) - var/mob/master = locate(href_list["master"]) - stype.spawn_servant(get_turf(src),master,user) - qdel(src) - return TOPIC_HANDLED - -/obj/effect/cleanable/spellbound/Destroy() - qdel(stype) - stype = null - return ..() - -/obj/item/summoning_stone - name = "summoning stone" - desc = "a small non-descript stone of dubious origin." - icon = 'icons/obj/items/summoning_stone.dmi' - icon_state = "stone" - throw_speed = 5 - throw_range = 10 - w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/stone/basalt - -/obj/item/summoning_stone/attack_self(var/mob/user) - if(isAdminLevel(user.z)) - to_chat(user, "You cannot use \the [src] here.") - return - user.set_machine(src) - interact(user) - -/obj/item/summoning_stone/interact(var/mob/user) - var/list/types = subtypesof(/datum/spellbound_type) - /datum/spellbound_type/servant - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(user.mind && !wizards.is_antagonist(user.mind)) - use_type(pick(types),user) - return - var/dat = "

Summoning Stone

Choose a companion to help you.

" - for(var/type in types) - var/datum/spellbound_type/SB = type - dat += "
[initial(SB.name)] - [initial(SB.desc)]" - show_browser(user,dat,"window=summoning") - onclose(user,"summoning") - -/obj/item/summoning_stone/proc/use_type(var/type, var/mob/user) - new /obj/effect/cleanable/spellbound(get_turf(src),type) - if(prob(20)) - var/list/base_areas = maintlocs //Have to do it this way as its a macro - var/list/pareas = base_areas.Copy() - while(pareas.len) - var/a = pick(pareas) - var/area/picked_area = pareas[a] - pareas -= a - var/list/turfs = get_area_turfs(picked_area) - for(var/t in turfs) - var/turf/T = t - if(T.density) - turfs -= T - if(turfs.len) - src.visible_message("\The [src] vanishes!") - src.forceMove(pick(turfs)) - show_browser(user, null, "window=summoning") - qdel(src) - -/obj/item/summoning_stone/OnTopic(user, href_list, state) - if(href_list["type"]) - use_type(href_list["type"],user) - return TOPIC_HANDLED \ No newline at end of file diff --git a/code/modules/spells/artifacts/storage.dm b/code/modules/spells/artifacts/storage.dm deleted file mode 100644 index 4d84cab7d3d..00000000000 --- a/code/modules/spells/artifacts/storage.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/structure/closet/wizard - name = "artifact closet" - desc = "a special lead lined closet used to hold artifacts of immense power." - closet_appearance = /decl/closet_appearance/alien - -/obj/structure/closet/wizard/Initialize() - . = ..() - new /obj/item/parcel(get_turf(src), null, src, "Imported straight from the Wizard Acadamy. Do not lose the contents or suffer a demerit.") - -/obj/structure/closet/wizard/armor - name = "Mastercrafted Armor Set" - desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." - -/obj/structure/closet/wizard/armor/WillContain() - return list( - /obj/item/clothing/shoes/sandal, - /obj/item/clothing/gloves/wizard, - /obj/item/clothing/suit/space/void/wizard, - /obj/item/clothing/head/helmet/space/void/wizard - ) - -/obj/structure/closet/wizard/scrying - name = "Scrying Orb" - desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to reconnoiter with ease. In addition, buying it will permanently grant you x-ray vision." - -/obj/structure/closet/wizard/scrying/WillContain() - return list( - /obj/item/scrying, - /obj/item/contract/wizard/xray, - ) \ No newline at end of file diff --git a/code/modules/spells/contracts.dm b/code/modules/spells/contracts.dm deleted file mode 100644 index 1b6ebf527f7..00000000000 --- a/code/modules/spells/contracts.dm +++ /dev/null @@ -1,142 +0,0 @@ -/obj/item/contract - name = "contract" - desc = "written in the blood of some unfortunate fellow." - icon = 'icons/mob/screen/spells.dmi' - icon_state = "master_open" - material = /decl/material/solid/organic/paper - var/contract_master = null - var/list/contract_spells = list(/spell/contract/reward,/spell/contract/punish,/spell/contract/return_master) - -/obj/item/contract/attack_self(mob/user) - if(contract_master == null) - to_chat(user, "You bind the contract to your soul, making you the recipient of whatever poor fool's soul that decides to contract with you.") - contract_master = user - return - - if(contract_master == user) - to_chat(user, "You can't contract with yourself!") - return - - var/ans = alert(user,"The contract clearly states that signing this contract will bind your soul to \the [contract_master]. Are you sure you want to continue?","[src]","Yes","No") - - if(ans == "Yes") - user.visible_message("\The [user] signs the contract, their body glowing a deep yellow.") - if(!src.contract_effect(user)) - user.visible_message("\The [src] visibly rejects \the [user], erasing their signature from the line.") - return - user.visible_message("\The [src] disappears with a flash of light.") - if(contract_spells.len && isliving(contract_master)) //if it aint text its probably a mob or another user - var/mob/living/M = contract_master - for(var/spell_type in contract_spells) - M.add_spell(new spell_type(user), "const_spell_ready") - log_and_message_admins("signed their soul over to \the [contract_master] using \the [src].", user) - qdel(src) - -/obj/item/contract/proc/contract_effect(mob/user) - to_chat(user, "You've signed your soul over to \the [contract_master] and with that your unbreakable vow of servitude begins.") - return 1 - -/obj/item/contract/apprentice - name = "apprentice wizarding contract" - desc = "a wizarding school contract for those who want to sign their soul for a piece of the magic pie." - color = "#993300" - -/obj/item/contract/apprentice/contract_effect(mob/user) - if(user.mind.assigned_special_role == "Wizard's Apprentice") - to_chat(user, "You are already a wizarding apprentice!") - return 0 - if(user.mind.assigned_special_role == "Spellbound Servant") - to_chat(user, "You are a servant. You have no need of apprenticeship.") - return 0 - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(wizards.add_antagonist_mind(user.mind, 1, "Wizard's Apprentice", "You are an apprentice! Your job is to learn the wizarding arts!")) - to_chat(user, "With the signing of this paper you agree to become \the [contract_master]'s apprentice in the art of wizardry.") - return 1 - return 0 - -/obj/item/contract/wizard //contracts that involve making a deal with the Wizard Acadamy (or NON PLAYERS) - contract_master = "\improper Wizard Academy" - -/obj/item/contract/wizard/xray - name = "xray vision contract" - desc = "This contract is almost see-through..." - color = "#339900" - -/obj/item/contract/wizard/xray/contract_effect(mob/user) - ..() - if (user.add_genetic_condition(GENE_COND_XRAY)) - user.set_sight(user.sight|SEE_MOBS|SEE_OBJS|SEE_TURFS) - user.set_see_in_dark(8) - user.set_see_invisible(SEE_INVISIBLE_LEVEL_TWO) - to_chat(user, "The walls suddenly disappear.") - return 1 - return 0 - -/obj/item/contract/wizard/telepathy - name = "telepathy contract" - desc = "The edges of the contract grow blurry when you look away from them. To be fair, actually reading it gives you a headache." - color = "#fcc605" - -/obj/item/contract/wizard/telepathy/contract_effect(mob/user) - ..() - return user.add_genetic_condition(GENE_COND_REMOTE_TALK) - -/obj/item/contract/boon - name = "boon contract" - desc = "this contract grants you a boon for signing it." - var/path - -/obj/item/contract/boon/Initialize(mapload, var/new_path) - . = ..(mapload) - if(new_path) - path = new_path - var/item_name = "" - if(ispath(path,/obj)) - var/obj/O = path - item_name = initial(O.name) - else if(ispath(path,/spell)) - var/spell/S = path - item_name = initial(S.name) - name = "[item_name] contract" - -/obj/item/contract/boon/contract_effect(mob/user) - ..() - if(user.mind.assigned_special_role == "Spellbound Servant") - to_chat(user, "As a servant you find yourself unable to use this contract.") - return 0 - if(ispath(path,/spell)) - user.add_spell(new path) - return 1 - else if(ispath(path,/obj)) - new path(get_turf(user.loc)) - playsound(get_turf(usr),'sound/magic/charge.ogg',50,1) - return 1 - -/obj/item/contract/boon/wizard - contract_master = "\improper Wizard Academy" - -/obj/item/contract/boon/wizard/fireball - path = /spell/targeted/projectile/dumbfire/fireball - desc = "This contract feels warm to the touch." - -/obj/item/contract/boon/wizard/smoke - path = /spell/aoe_turf/smoke - desc = "This contract smells as dank as they come." - -/obj/item/contract/boon/wizard/forcewall - path = /spell/aoe_turf/conjure/forcewall - contract_master = "\improper Mime Federation" - desc = "This contract has a dedication to mimes everywhere at the top." - -/obj/item/contract/boon/wizard/knock - path = /spell/aoe_turf/knock - desc = "This contract is hard to hold still." - -/obj/item/contract/boon/wizard/horsemask - path = /spell/targeted/equip_item/horsemask - desc = "This contract is more horse than your mind has room for." - -/obj/item/contract/boon/wizard/charge - path = /spell/aoe_turf/charge - desc = "This contract is made of 100% post-consumer wizard." - diff --git a/code/modules/spells/general/acid_spray.dm b/code/modules/spells/general/acid_spray.dm deleted file mode 100644 index 752a17eecb7..00000000000 --- a/code/modules/spells/general/acid_spray.dm +++ /dev/null @@ -1,26 +0,0 @@ -/spell/acid_spray - name = "Acid Spray" - desc = "A common spell used to destroy basically anything in front of the wizard." - school = "conjuration" - feedback = "as" - spell_flags = 0 - charge_max = 600 - - invocation = "Tagopar lethodar!" - invocation_type = SpI_SHOUT - var/reagent_type = /decl/material/liquid/acid/hydrochloric - hud_state = "wiz_acid" - cast_sound = 'sound/magic/disintegrate.ogg' - -/spell/acid_spray/choose_targets() - return list(holder) - -/spell/acid_spray/cast(var/list/targets, var/mob/user) - var/atom/target = targets[1] - var/angle = dir2angle(target.dir) - for(var/mod in list(315, 0, 45)) - var/obj/effect/effect/water/chempuff/chem = new(get_turf(target)) - chem.create_reagents(10) - chem.add_to_reagents(reagent_type,10) - spawn(0) - chem.set_up(get_ranged_target_turf(target, angle2dir(angle+mod), 3)) diff --git a/code/modules/spells/general/area_teleport.dm b/code/modules/spells/general/area_teleport.dm deleted file mode 100644 index 68e20f3d6f9..00000000000 --- a/code/modules/spells/general/area_teleport.dm +++ /dev/null @@ -1,60 +0,0 @@ -/spell/area_teleport - name = "Teleport" - desc = "This spell teleports you to a type of area of your selection." - feedback = "TP" - school = "conjuration" - charge_max = 60 SECONDS - spell_flags = NEEDSCLOTHES - invocation = "Scyar Nila!" - invocation_type = SpI_SHOUT - cooldown_min = 200 //100 deciseconds reduction per rank - - smoke_spread = 1 - smoke_amt = 5 - - var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list - var/invocation_area = 1 //if the invocation appends the selected area - - cast_sound = 'sound/effects/teleport.ogg' - - hud_state = "wiz_tele" - -/spell/area_teleport/before_cast() - return - -/spell/area_teleport/choose_targets() - var/area/thearea - if(!randomise_selection) - thearea = input("Area to teleport to", "Teleport") as null|anything in wizteleportlocs - if(!thearea) - return - else - thearea = pick(wizteleportlocs) - return list(wizteleportlocs[thearea]) - -/spell/area_teleport/cast(area/thearea, mob/user) - playsound(get_turf(user),cast_sound,50,1) - var/turf/end = user.try_teleport(thearea) - - if(!end) - to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") - return - return - -/spell/area_teleport/check_valid_targets(list/targets) - // Teleport should function across z's, so we make sure that happens - // without this check, it only works for teleporting to areas you can see - return islist(targets) && length(targets) - -/spell/area_teleport/after_cast() - return - -/spell/area_teleport/invocation(mob/user, area/chosenarea) - if(!istype(chosenarea)) - return //can't have that, can we - if(!invocation_area || !chosenarea) - ..() - else - invocation += "[uppertext(chosenarea.proper_name)]" - ..() - return diff --git a/code/modules/spells/general/camera_vision.dm b/code/modules/spells/general/camera_vision.dm deleted file mode 100644 index cfd0cfb030e..00000000000 --- a/code/modules/spells/general/camera_vision.dm +++ /dev/null @@ -1,36 +0,0 @@ -/spell/camera_connection - name = "Camera Connection" - desc = "This spell allows the wizard to connect to the local camera network and see what it sees." - - school = "racial" - - invocation_type = SpI_EMOTE - invocation = "emits a beeping sound before standing very, very still." - - charge_max = 600 //1 minute - charge_type = Sp_RECHARGE - - - spell_flags = Z2NOCAST - hud_state = "wiz_IPC" - - var/extension_type = /datum/extension/eye/cameranet - -/spell/camera_connection/New() - ..() - set_extension(src, extension_type) - -/spell/camera_connection/choose_targets() - var/mob/living/L = holder - if(!istype(L) || L.eyeobj) //no using if we already have an eye on. - return null - return list(holder) - -/spell/camera_connection/cast(var/list/targets, mob/user) - var/mob/living/L = targets[1] - - var/datum/extension/eye/cameranet/cn = get_extension(src, /datum/extension/eye/) - if(!cn) - to_chat(user, SPAN_WARNING("There's a flash of sparks as the spell fizzles out!")) - return - cn.look(L) \ No newline at end of file diff --git a/code/modules/spells/general/contract_spells.dm b/code/modules/spells/general/contract_spells.dm deleted file mode 100644 index fa95cd16e23..00000000000 --- a/code/modules/spells/general/contract_spells.dm +++ /dev/null @@ -1,68 +0,0 @@ -//These spells are given to the owner of a contract when a victim signs it. -//As such they are REALLY REALLY powerful (because the victim is rewarded for signing it, and signing contracts is completely voluntary) - -/spell/contract - name = "Contract Spell" - desc = "A spell perfecting the techniques of keeping a servant happy and obedient." - - school = "transmutation" - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - - - var/mob/subject - -/spell/contract/New(var/mob/M) - ..() - subject = M - name += " ([M.real_name])" - -/spell/contract/choose_targets() - return list(subject) - -/spell/contract/cast(mob/target,mob/user) - if(!subject) - to_chat(usr, "This spell was not properly given a target. Contact a coder.") - return null - - if(istype(target,/list)) - var/list/target_list = target - target = target_list[1] - return target - - -/spell/contract/reward - name = "Reward Contractee" - desc = "A spell that makes your contracted victim feel better." - - charge_max = 300 - cooldown_min = 100 - - hud_state = "wiz_jaunt_old" - -/spell/contract/reward/cast(mob/living/target,mob/user) - target = ..(target,user) - if(!target) - return - - to_chat(target, SPAN_BLUE("You feel great!")) - target.ExtinguishMob() - -/spell/contract/punish - name = "Punish Contractee" - desc = "A spell that sets your contracted victim ablaze." - - charge_max = 300 - cooldown_min = 100 - - hud_state = "gen_immolate" - -/spell/contract/punish/cast(mob/living/target,mob/user) - target = ..(target,user) - if(!target) - return - - to_chat(target, "You feel punished!") - target.fire_stacks += 15 - target.IgniteMob() \ No newline at end of file diff --git a/code/modules/spells/general/create_air.dm b/code/modules/spells/general/create_air.dm deleted file mode 100644 index 405e161a54a..00000000000 --- a/code/modules/spells/general/create_air.dm +++ /dev/null @@ -1,24 +0,0 @@ -/spell/create_air - name = "Create Air" - desc = "A much used spell used in the vasteness of space to make it not so killey." - - charge_max = 200 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - number_of_channels = 0 - time_between_channels = 200 - hud_state = "wiz_air" - var/list/air_change = list(/decl/material/gas/oxygen = ONE_ATMOSPHERE) - -/spell/create_air/choose_targets() - var/air = holder.return_air() - if(air) - return list(air) - return null - -/spell/create_air/cast(var/list/targets, var/mob/holder, var/channel_count) - var/datum/gas_mixture/environment = targets[1] - for(var/gas in air_change) - environment.adjust_gas(gas, air_change[gas]) diff --git a/code/modules/spells/general/invisibility.dm b/code/modules/spells/general/invisibility.dm deleted file mode 100644 index 3fbab715efd..00000000000 --- a/code/modules/spells/general/invisibility.dm +++ /dev/null @@ -1,24 +0,0 @@ -/spell/invisibility - name = "invisibility" - desc = "A simple spell of invisibility, for when you really just can't afford a paper bag." - feedback = "IV" - spell_flags = 0 - charge_max = 100 - invocation = "Ror Rim Or!" - invocation_type = SpI_SHOUT - var/on = 0 - hud_state = "invisibility" - -/spell/invisibility/choose_targets() - if(ishuman(holder)) - return holder - -/spell/invisibility/cast(var/mob/living/human/H, var/mob/user) - on = !on - if(on) - if(H.add_cloaking_source(src)) - playsound(get_turf(H), 'sound/effects/teleport.ogg', 90, 1) - H.add_genetic_condition(GENE_COND_CLUMSY) - else if(H.remove_cloaking_source(src)) - playsound(get_turf(H), 'sound/effects/stealthoff.ogg', 90, 1) - H.remove_genetic_condition(GENE_COND_CLUMSY) \ No newline at end of file diff --git a/code/modules/spells/general/mark_recall.dm b/code/modules/spells/general/mark_recall.dm deleted file mode 100644 index 11131e72ece..00000000000 --- a/code/modules/spells/general/mark_recall.dm +++ /dev/null @@ -1,88 +0,0 @@ -/spell/mark_recall - name = "Mark and Recall" - desc = "This spell was created so wizards could get home from the bar without driving. Does not require wizard garb." - feedback = "MK" - school = "conjuration" - charge_max = 600 //1 minutes for how OP this shit is (apparently not as op as I thought) - spell_flags = Z2NOCAST - invocation = "Re-Alki R'natha." - invocation_type = SpI_WHISPER - cooldown_min = 300 - - smoke_amt = 1 - smoke_spread = 5 - - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1) - - cast_sound = 'sound/effects/teleport.ogg' - hud_state = "wiz_mark" - var/mark = null - -/spell/mark_recall/choose_targets() - if(!mark) - return list("magical fairy dust") //because why not - else - return list(mark) - -/spell/mark_recall/cast(var/list/targets,mob/user) - if(!targets.len) - return 0 - var/target = targets[1] - if(istext(target)) - mark = new /obj/effect/cleanable/wizard_mark(get_turf(user),src) - return 1 - if(!istype(target,/obj)) //something went wrong - return 0 - var/turf/T = get_turf(target) - if(!T) - return 0 - user.forceMove(T) - ..() - -/spell/mark_recall/empower_spell() - if(!..()) - return 0 - - spell_flags = NO_SOMATIC - - return "You will always be able to cast this spell, even while unconscious or handcuffed." - -/obj/effect/cleanable/wizard_mark - name = "\improper Mark of the Wizard" - desc = "A strange rune said to be made by wizards. Or its just some shmuck playing with crayons again." - icon = 'icons/obj/rune.dmi' - icon_state = "wizard_mark" - anchored = TRUE - layer = TURF_LAYER - is_spawnable_type = FALSE // invalid without spell passed - var/spell/mark_recall/spell - -/obj/effect/cleanable/wizard_mark/Initialize(mapload,var/mrspell) - . = ..() - spell = mrspell - -/obj/effect/cleanable/wizard_mark/Destroy() - spell.mark = null //dereference pls. - spell = null - return ..() - -/obj/effect/cleanable/wizard_mark/attack_hand(var/mob/user) - if(user != spell.holder) - return ..() - user.visible_message("\The [user] mutters an incantation and \the [src] disappears!") - qdel(src) - return TRUE - -/obj/effect/cleanable/wizard_mark/nullrod_act(mob/user, obj/item/nullrod/rod) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - visible_message("\The [user] dispels \the [src] and it fades away!") - qdel(src) - return TRUE - -/obj/effect/cleanable/wizard_mark/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/book/spell)) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - visible_message("\The [src] fades away!") - qdel(src) - return TRUE - return ..() \ No newline at end of file diff --git a/code/modules/spells/general/portal_teleport.dm b/code/modules/spells/general/portal_teleport.dm deleted file mode 100644 index 1f1ed0ad603..00000000000 --- a/code/modules/spells/general/portal_teleport.dm +++ /dev/null @@ -1,67 +0,0 @@ -/spell/portal_teleport - name = "Create Portal" - desc = "This spell creates a long lasting portal to an area of your selection." - feedback = "TP" - school = "conjuration" - spell_flags = NEEDSCLOTHES - invocation = "Scyar Peranda!" - invocation_type = SpI_SHOUT - charge_max = 30 MINUTES - cooldown_min = 25 MINUTES - - smoke_spread = 1 - smoke_amt = 5 - - var/list/select_areas = list() - - cast_sound = 'sound/effects/teleport.ogg' - - hud_state = "wiz_tele" - -/spell/portal_teleport/before_cast() - return - -/spell/portal_teleport/choose_targets() - var/area/thearea - var/message = alert("Would you like to show station areas?\nNote: it can take up to 5 minutes for the away sites to load in and show up.",, "Yes", "No") - switch(message) - if("Yes") - select_areas = stationlocs - if("No") - select_areas = (stationlocs) ^ (wizportallocs) - - thearea = input("Area to teleport to", "Teleport") as null|anything in select_areas - if(!thearea) return - - return list(select_areas[thearea]) - -/spell/portal_teleport/cast(area/thearea, mob/user) - playsound(get_turf(user),cast_sound,50,1) - var/turf/start = get_turf(user) - var/turf/end = user.try_teleport(thearea) - - if(!end) - to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") - return - - new /obj/effect/portal/wizard(start, end, 35 MINUTES) - new /obj/effect/portal/wizard(end, start, 35 MINUTES) - - return - -/spell/portal_teleport/after_cast() - return - -/spell/portal_teleport/invocation(mob/user, area/chosenarea) - if(!chosenarea || !istype(chosenarea)) - ..() - else - invocation += "[uppertext(chosenarea.proper_name)]" - ..() - return - -/obj/effect/portal/wizard - name = "dark anomaly" - desc = "It pulls on the edges of reality as if trying to draw them in." - icon = 'icons/obj/objects.dmi' - icon_state = "bhole3" diff --git a/code/modules/spells/general/radiant_aura.dm b/code/modules/spells/general/radiant_aura.dm deleted file mode 100644 index 27e85404027..00000000000 --- a/code/modules/spells/general/radiant_aura.dm +++ /dev/null @@ -1,21 +0,0 @@ -/spell/radiant_aura - name = "Radiant aura" - desc = "Form a protective layer of light around you, making you immune to laser fire." - feedback = "ra" - invocation_type = SpI_EMOTE - invocation = "conjures a sphere of fire around themselves." - school = "conjuration" - spell_flags = NEEDSCLOTHES - charge_max = 300 - cooldown_min = 100 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 0) - cast_sound = 'sound/effects/snap.ogg' - duration = 40 - hud_state = "gen_immolate" - -/spell/radiant_aura/choose_targets() - return list(holder) - -/spell/radiant_aura/cast(var/list/targets, var/mob/user) - var/obj/aura/radiant_aura/A = new(user) - QDEL_IN(A,duration) diff --git a/code/modules/spells/general/return_master.dm b/code/modules/spells/general/return_master.dm deleted file mode 100644 index 119cc93804d..00000000000 --- a/code/modules/spells/general/return_master.dm +++ /dev/null @@ -1,23 +0,0 @@ -/spell/contract/return_master - name = "Return to Master" - desc = "Teleport back to your master" - - school = "conjuration" - charge_max = 600 - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - cooldown_min = 200 - - smoke_spread = 1 - smoke_amt = 5 - - hud_state = "wiz_tele" - - -/spell/contract/return_master/cast(mob/target,mob/user) - target = ..(target,user) - if(!target) - return - - user.forceMove(get_turf(target)) \ No newline at end of file diff --git a/code/modules/spells/general/toggle_armor.dm b/code/modules/spells/general/toggle_armor.dm deleted file mode 100644 index 5da3bf537f8..00000000000 --- a/code/modules/spells/general/toggle_armor.dm +++ /dev/null @@ -1,121 +0,0 @@ -/spell/toggle_armor - name = "Toggle Armor" - spell_flags = 0 - charge_max = 10 - school = "Conjuration" - var/list/armor_pieces - var/equip = 0 - hud_state = "const_shell" - -/spell/toggle_armor/New() - if(armor_pieces) - var/list/nlist = list() - for(var/type in armor_pieces) - var/obj/item/I = new type(null) - nlist[I] = armor_pieces[type] - armor_pieces = nlist - return ..() - -/spell/toggle_armor/proc/drop_piece(var/obj/I) - if(ismob(I.loc)) - var/mob/M = I.loc - M.drop_from_inventory(I) - -/spell/toggle_armor/choose_targets() - return list(holder) - -/spell/toggle_armor/cast(var/list/targets, var/mob/user) - equip = !equip - name = "[initial(name)] ([equip ? "off" : "on"])" - if(equip) - for(var/piece in armor_pieces) - var/slot = armor_pieces[piece] - drop_piece(piece) - user.drop_from_inventory(user.get_equipped_item(slot)) - user.equip_to_slot_if_possible(piece,slot,0,1,1,1) - else - for(var/piece in armor_pieces) - var/obj/item/I = piece - drop_piece(piece) - I.forceMove(null) - -/spell/toggle_armor/greytide_worldwide - name = "Greytide Worldwide" - invocation_type = SpI_EMOTE - invocation = "screams incoherently!" - armor_pieces = list(/obj/item/clothing/jumpsuit/grey = slot_w_uniform_str, - /obj/item/clothing/gloves/insulated/cheap = slot_gloves_str, - /obj/item/clothing/mask/gas = slot_wear_mask_str, - /obj/item/clothing/shoes/color/black = slot_shoes_str, - /obj/item/toolbox/mechanical = BP_R_HAND, - /obj/item/chems/spray/extinguisher = BP_L_HAND) - -/spell/toggle_armor/caretaker - name = "Toggle Armor (Caretaker)" - invocation_type = SpI_EMOTE - invocation = "radiates a holy light" - armor_pieces = list(/obj/item/clothing/head/caretakerhood = slot_head_str, - /obj/item/clothing/suit/caretakercloak = slot_wear_suit_str - ) - hud_state = "caretaker" - -/spell/toggle_armor/champion - name = "Toggle Armor (Champion)" - invocation_type = SpI_EMOTE - invocation = "is covered in golden embers for a moment, before they fade" - armor_pieces = list(/obj/item/clothing/head/champhelm = slot_head_str, - /obj/item/clothing/suit/champarmor = slot_wear_suit_str - ) - hud_state = "champion" - -/spell/toggle_armor/excalibur - name = "Toggle Sword" - invocation_type = SpI_EMOTE - invocation = "thrusts /his hand forward, and it is enveloped in golden embers!" - armor_pieces = list(/obj/item/sword/excalibur = BP_R_HAND) - hud_state = "excalibur" - -/spell/toggle_armor/fiend - name = "Toggle Armor (Fiend)" - invocation_type = SpI_EMOTE - invocation = "snaps /his fingers, and /his clothes begin to shift and change" - armor_pieces = list(/obj/item/clothing/head/fiendhood = slot_head_str, - /obj/item/clothing/suit/fiendcowl = slot_wear_suit_str - ) - hud_state = "fiend" - -/spell/toggle_armor/fiend/fem - armor_pieces = list(/obj/item/clothing/head/fiendhood/fem = slot_head_str, - /obj/item/clothing/suit/fiendcowl/fem = slot_wear_suit_str - ) - -/spell/toggle_armor/infiltrator - name = "Toggle Armor (Infiltrator)" - invocation_type = SpI_EMOTE - invocation = "winks. In an instant, /his clothes change dramatically" - armor_pieces = list(/obj/item/clothing/head/infilhat = slot_head_str, - /obj/item/clothing/suit/infilsuit = slot_wear_suit_str - ) - hud_state = "infiltrator" - -/spell/toggle_armor/infiltrator/fem - armor_pieces = list(/obj/item/clothing/head/infilhat/fem = slot_head_str, - /obj/item/clothing/suit/infilsuit/fem = slot_wear_suit_str - ) - -/spell/toggle_armor/infil_items - name = "Toggle Counterfeit Kit" - invocation_type = SpI_EMOTE - invocation = "flicks /his wrists, one at a time" - armor_pieces = list(/obj/item/stamp/chameleon = BP_L_HAND, - /obj/item/pen/chameleon = BP_R_HAND) - hud_state = "forgery" - -/spell/toggle_armor/overseer - name = "Toggle Armor (Overseer)" - invocation_type = SpI_EMOTE - invocation = " is enveloped in shadows, before /his form begins to shift rapidly" - armor_pieces = list(/obj/item/clothing/head/overseerhood = slot_head_str, - /obj/item/clothing/suit/straight_jacket/overseercloak = slot_wear_suit_str - ) - hud_state = "overseer" \ No newline at end of file diff --git a/code/modules/spells/hand/blood_shards.dm b/code/modules/spells/hand/blood_shards.dm deleted file mode 100644 index 0908ee28520..00000000000 --- a/code/modules/spells/hand/blood_shards.dm +++ /dev/null @@ -1,39 +0,0 @@ -/spell/hand/charges/blood_shard - name = "Blood Shards" - desc = "Invoke a corrupted projectile forward that causes an enemy's blood to fly out in painful shards. Anyone hit by this will have their blood explode out of them in a spray of smaller shards. Stores two charges." - spell_flags = 0 - charge_max = 600 - invocation = "opens their hand, which bursts into vicious red light." - invocation_type = SpI_EMOTE - - range = 7 - max_casts = 2 - compatible_targets = list(/atom) - hud_state = "wiz_bshard" - cast_sound = 'sound/magic/demon_attack1.ogg' - -/spell/hand/charges/blood_shard/cast_hand(var/atom/A,var/mob/user) - var/obj/item/projectile/blood_shard/B = new(get_turf(user)) - B.firer = user - B.launch(A, BP_CHEST) - user.visible_message("\The [user] shoots out a deep red shard from their hand!") - return ..() - -/obj/item/projectile/blood_shard - name = "bloodshard" - damage = 25 - icon_state = "blood" - atom_damage_type = BRUTE - damage_flags = 0 - -/obj/item/projectile/blood_shard/on_hit(var/atom/movable/target, var/blocked = 0) - if(..()) - if(ishuman(target)) - var/mob/living/human/H = target - H.vessel.remove_any(30) - H.visible_message("Tiny red shards burst from \the [H]'s skin!") - fragmentate(get_turf(src), 30, 5, list(/obj/item/projectile/bullet/pellet/blood)) - -/obj/item/projectile/bullet/pellet/blood - name = "blood fragment" - damage = 10 \ No newline at end of file diff --git a/code/modules/spells/hand/burning_grip.dm b/code/modules/spells/hand/burning_grip.dm deleted file mode 100644 index 772b4e6aa9c..00000000000 --- a/code/modules/spells/hand/burning_grip.dm +++ /dev/null @@ -1,39 +0,0 @@ -/spell/hand/burning_grip - name = "Burning Grip" - desc = "Cause someone to drop a held object by causing it to heat up intensly." - school = "transmutation" - feedback = "bg" - range = 5 - spell_flags = 0 - invocation_type = SpI_NONE - show_message = " throws sparks from their hands" - spell_delay = 120 - hud_state = "wiz_burn" - cast_sound = 'sound/magic/fireball.ogg' - compatible_targets = list(/mob/living/human) - -/spell/hand/burning_grip/valid_target(var/mob/living/L, var/mob/user) - if(!..()) - return 0 - if(length(L.get_held_items())) - return 0 - return 1 - -/spell/hand/burning_grip/cast_hand(var/mob/living/human/H, var/mob/user) - var/list/targets = list() - for(var/hand_slot in H.get_held_item_slots()) - targets |= hand_slot - - var/obj/O = new /obj/effect/temporary(get_turf(H),3, 'icons/effects/effects.dmi', "fire_goon") - O.alpha = 150 - - for(var/organ in targets) - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, organ) - if(!E) - continue - E.take_external_damage(burn=10, used_weapon = "hot iron") - if(E.can_feel_pain()) - E.check_pain_disarm() - else - E.take_external_damage(burn=6, used_weapon = "hot iron") - to_chat(H, SPAN_WARNING("You notice that your [E] is burned.")) diff --git a/code/modules/spells/hand/entangle.dm b/code/modules/spells/hand/entangle.dm deleted file mode 100644 index 37a4776fe28..00000000000 --- a/code/modules/spells/hand/entangle.dm +++ /dev/null @@ -1,51 +0,0 @@ -/spell/hand/charges/entangle - name = "Entangle" - desc = "This spell creates vines that immediately entangle a nearby victim." - feedback = "ET" - school = "transmutation" - charge_max = 600 - spell_flags = NEEDSCLOTHES | SELECTABLE | IGNOREPREV - invocation = "Bu-Ekel'Inas!" - invocation_type = SpI_SHOUT - range = 3 - max_casts = 1 - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - cooldown_min = 300 - duration = 30 - compatible_targets = list(/mob) - - hud_state = "wiz_entangle" - cast_sound = 'sound/magic/staff_door.ogg' - show_message = " points towards the ground, causing plants to erupt" - var/datum/seed/seed - -/spell/hand/charges/entangle/New() - ..() - seed = new() - seed.set_trait(TRAIT_PLANT_ICON,"flower") - seed.set_trait(TRAIT_PRODUCT_ICON,"flower2") - seed.set_trait(TRAIT_PRODUCT_COLOUR,"#4d4dff") - seed.set_trait(TRAIT_SPREAD,2) - seed.name = "heirlooms" - seed.product_name = "heirloom" - seed.display_name = "vines" - seed.chems = list(/decl/material/liquid/nutriment = list(1,20)) - -/spell/hand/charges/entangle/cast_hand(var/mob/M,var/mob/user) - var/turf/T = get_turf(M) - var/obj/effect/vine/single/P = new(T, seed, null, TRUE) - P.can_buckle = 1 - - P.buckle_mob(M) - M.set_dir(pick(global.cardinal)) - M.visible_message("[P] appear from the floor, spinning around \the [M] tightly!") - return ..() - -/spell/hand/charges/entangle/empower_spell() - if(!..()) - return 0 - - max_casts++ - - return "This spell will now entangle [max_casts] times before running out." \ No newline at end of file diff --git a/code/modules/spells/hand/hand.dm b/code/modules/spells/hand/hand.dm deleted file mode 100644 index 9652cf1cce1..00000000000 --- a/code/modules/spells/hand/hand.dm +++ /dev/null @@ -1,83 +0,0 @@ -/spell/hand - var/min_range = 0 - var/list/compatible_targets = list(/atom) - var/spell_delay = 5 - var/move_delay - var/click_delay - var/hand_state = "spell" - var/obj/item/magic_hand/current_hand - var/show_message - -/spell/hand/choose_targets(mob/user = usr) - return list(user) - -/spell/hand/cast_check(skipcharge = 0,mob/user = usr, var/list/targets) - if(!..()) - return FALSE - if(user.get_active_held_item()) - to_chat(holder, "You need an empty hand to cast this spell.") - return FALSE - return TRUE - -/spell/hand/cast(list/targets, mob/user) - if(current_hand) - cancel_hand() - if(user.get_active_held_item()) - to_chat(user, "You need an empty hand to cast this spell.") - return FALSE - current_hand = new(null, src) - if(!user.put_in_active_hand(current_hand)) - QDEL_NULL(current_hand) - return FALSE - return TRUE - -/spell/hand/proc/cancel_hand() - if(!QDELETED(current_hand)) - QDEL_NULL(current_hand) - -/spell/hand/Destroy() - QDEL_NULL(current_hand) - . = ..() - -/spell/hand/proc/valid_target(var/atom/a,var/mob/user) //we use seperate procs for our target checking for the hand spells. - var/distance = get_dist(a,user) - if((min_range && distance < min_range) || (range && distance > range)) - return FALSE - if(!is_type_in_list(a,compatible_targets)) - return FALSE - return TRUE - -/spell/hand/proc/cast_hand(var/atom/a,var/mob/user) //same for casting. - return TRUE - -/spell/hand/charges - var/casts = 1 - var/max_casts = 1 - -/spell/hand/charges/cast(list/targets, mob/user) - . = ..() - if(.) - casts = max_casts - to_chat(user, "You ready the [name] spell ([casts]/[casts] charges).") - -/spell/hand/charges/cast_hand() - if(..()) - casts-- - to_chat(holder, SPAN_NOTICE("The [name] spell has [casts] out of [max_casts] charges left.")) - cancel_hand() - return TRUE - return FALSE - -/spell/hand/duration - var/hand_timer = null - var/hand_duration = 0 - -/spell/hand/duration/cast(var/list/targets, var/mob/user) - . = ..() - if(.) - hand_timer = addtimer(CALLBACK(src, PROC_REF(cancel_hand)), hand_duration, TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE) - -/spell/hand/duration/cancel_hand() - deltimer(hand_timer) - hand_timer = null - ..() \ No newline at end of file diff --git a/code/modules/spells/hand/hand_item.dm b/code/modules/spells/hand/hand_item.dm deleted file mode 100644 index 6141577f247..00000000000 --- a/code/modules/spells/hand/hand_item.dm +++ /dev/null @@ -1,68 +0,0 @@ -/*much like grab this item is used primarily for the utility it provides. -Basically: I can use it to target things where I click. I can then pass these targets to a spell and target things not using a list. -*/ - -/obj/item/magic_hand - name = "Magic Hand" - icon = 'icons/mob/screen/spells.dmi' - atom_flags = 0 - item_flags = 0 - obj_flags = 0 - simulated = 0 - icon_state = "spell" - max_health = ITEM_HEALTH_NO_DAMAGE - is_spawnable_type = FALSE - obj_flags = OBJ_FLAG_NO_STORAGE - var/next_spell_time = 0 - var/spell/hand/hand_spell - -/obj/item/magic_hand/Initialize(ml, _hand_spell) - . = ..() - hand_spell = _hand_spell - name = "[name] ([hand_spell.name])" - icon_state = hand_spell.hand_state - -// These return values do not look correct... -/obj/item/magic_hand/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(hand_spell && hand_spell.valid_target(target, user)) - fire_spell(target, user) - return FALSE - return TRUE - -/obj/item/magic_hand/proc/fire_spell(var/atom/A, mob/living/user) - if(!hand_spell) //no spell? Die. - user.drop_from_inventory(src) - - if(!hand_spell.valid_target(A,user)) - return - if(world.time < next_spell_time) - to_chat(user, "The spell isn't ready yet!") - return - if(user.check_intent(I_FLAG_HELP)) - to_chat(user, "You decide against casting this spell as your intent is set to help.") - return - - if(hand_spell.show_message) - user.visible_message("\The [user][hand_spell.show_message]") - if(hand_spell.cast_hand(A,user)) - next_spell_time = world.time + hand_spell.spell_delay - if(hand_spell.move_delay) - user.ExtraMoveCooldown(hand_spell.move_delay) - if(hand_spell.click_delay) - user.setClickCooldown(hand_spell.move_delay) - -/obj/item/magic_hand/afterattack(var/atom/A, var/mob/user, var/proximity) - if(hand_spell) - fire_spell(A,user) - -/obj/item/magic_hand/throw_at() //no throwing pls - usr.drop_from_inventory(src) - -/obj/item/magic_hand/dropped() //gets deleted on drop - ..() - qdel(src) - -/obj/item/magic_hand/Destroy() //better save than sorry. - hand_spell.current_hand = null - hand_spell = null - . = ..() \ No newline at end of file diff --git a/code/modules/spells/hand/slippery_surface.dm b/code/modules/spells/hand/slippery_surface.dm deleted file mode 100644 index 3b5fc448d03..00000000000 --- a/code/modules/spells/hand/slippery_surface.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/hand/slippery_surface - name = "Slippery Surface" - desc = "More of a practical joke than an actual spell." - school = "transmutation" - feedback = "su" - range = 5 - spell_flags = 0 - invocation_type = SpI_NONE - show_message = " snaps their fingers." - spell_delay = 50 - hud_state = "gen_ice" - cast_sound = 'sound/magic/summonitems_generic.ogg' - -/spell/hand/slippery_surface/cast_hand(var/atom/a, var/mob/user) - for(var/turf/T in view(1,a)) - if(T.simulated) - T.wet_floor(50) - new /obj/effect/temporary(T, 3, 'icons/effects/effects.dmi', "sonar_ping") - return ..() diff --git a/code/modules/spells/hand/sunwrath.dm b/code/modules/spells/hand/sunwrath.dm deleted file mode 100644 index 63da9a54c61..00000000000 --- a/code/modules/spells/hand/sunwrath.dm +++ /dev/null @@ -1,32 +0,0 @@ -/spell/hand/duration/sunwrath - name = "Sun God's Wrath" - desc = "Your hands become a gateway of fire, shooting hot plasma from your fingertips." - spell_flags = 0 - charge_max = 600 - invocation_type = SpI_SHOUT - invocation = "Herald! Bless me with your anger!" - show_message = " erupts fire from their hands" - school = "Divine" - hand_duration = 100 - spell_delay = 30 - range = 4 - hud_state = "wiz_immolate" - -/spell/hand/duration/sunwrath/cast_hand(var/atom/A, var/mob/user) - var/turf/T = get_turf(user) - var/list/turfs = getline(T,A) - T - for(var/t in turfs) - var/turf/turf = t - if(turf.density || isspaceturf(turf)) - break - new /obj/effect/fake_fire/sunwrath(t) - return 1 - -/obj/effect/fake_fire/sunwrath - firelevel = 2 - last_temperature = 0 - pressure = 3000 - -/obj/effect/fake_fire/sunwrath/Process() //Override, so we burn mobs only - for(var/mob/living/L in loc) - L.FireBurn(firelevel,last_temperature,pressure) \ No newline at end of file diff --git a/code/modules/spells/no_clothes.dm b/code/modules/spells/no_clothes.dm deleted file mode 100644 index 3b850292351..00000000000 --- a/code/modules/spells/no_clothes.dm +++ /dev/null @@ -1,5 +0,0 @@ -/spell/noclothes - name = "No Clothes" - desc = "Learn the ancient art of not wearing fancy robes while casting spells." - feedback = "NC" - spell_flags = NO_BUTTON \ No newline at end of file diff --git a/code/modules/spells/racial_wizard.dm b/code/modules/spells/racial_wizard.dm deleted file mode 100644 index ce5c4e65116..00000000000 --- a/code/modules/spells/racial_wizard.dm +++ /dev/null @@ -1,81 +0,0 @@ -//this file is full of all the racial spells/artifacts/etc that each species has. - -/obj/item/magic_rock - name = "magical rock" - desc = "Legends say that this rock will unlock the true potential of anyone who touches it." - icon = 'icons/obj/wizard.dmi' - icon_state = "magic rock" - w_class = ITEM_SIZE_SMALL - throw_speed = 1 - throw_range = 3 - material = /decl/material/solid/stone/basalt - var/list/potentials = list( - SPECIES_HUMAN = /obj/item/bag/cash/infinite - ) - -/obj/item/magic_rock/attack_self(mob/user) - if(!ishuman(user)) - to_chat(user, "\The [src] can do nothing for such a simple being.") - return - var/mob/living/human/H = user - var/reward = potentials[H.species.get_root_species_name(H)] //we get body type because that lets us ignore subspecies. - if(!reward) - to_chat(user, "\The [src] does not know what to make of you.") - return - for(var/spell/S in user.mind.learned_spells) - if(istype(S,reward)) - to_chat(user, "\The [src] can do no more for you.") - return - var/a = new reward() - if(ispath(reward,/spell)) - H.add_spell(a) - else if(ispath(reward,/obj)) - H.put_in_hands(a) - to_chat(user, "\The [src] crumbles in your hands.") - qdel(src) - -/obj/item/bag/cash/infinite - storage = /datum/storage/bag/cash/infinite - -/obj/item/bag/cash/infinite/WillContain() - return list(/obj/item/cash/c1000) - -/spell/messa_shroud/choose_targets() - return list(get_turf(holder)) - -/spell/messa_shroud/cast(var/list/targets, mob/user) - var/turf/T = targets[1] - - if(!istype(T)) - return - - var/obj/O = new /obj(T) - O.set_light(range, -10, "#ffffff") - - spawn(duration) - qdel(O) - -/mob/observer/eye/freelook/wizard_eye - name_sufix = "Wizard Eye" - -/mob/observer/eye/freelook/wizard_eye/Initialize() - . = ..() //we dont use the Ai one because it has AI specific procs imbedded in it. - visualnet = cameranet - -/mob/living/proc/release_eye() - set name = "Release Vision" - set desc = "Return your sight to your body." - set category = "Abilities" - - verbs -= /mob/living/proc/release_eye //regardless of if we have an eye or not we want to get rid of this verb. - - if(!eyeobj) - return - eyeobj.release(src) - -/mob/observer/eye/freelook/wizard_eye/Destroy() - if(isliving(eyeobj.owner)) - var/mob/living/L = eyeobj.owner - L.release_eye() - qdel(eyeobj) - return ..() \ No newline at end of file diff --git a/code/modules/spells/spell_code.dm b/code/modules/spells/spell_code.dm index 653d2b8cae2..bfcf1f4d8f6 100644 --- a/code/modules/spells/spell_code.dm +++ b/code/modules/spells/spell_code.dm @@ -26,7 +26,7 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var" var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used - var/spell_flags = NEEDSCLOTHES + var/spell_flags = 0 var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell var/invocation_type = SpI_NONE //can be none, whisper, shout, and emote var/range = 7 //the range of the spell; outer radius for aoe spells @@ -241,21 +241,14 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now to_chat(SA, "The null sceptre's power interferes with your own!") return 0 - if(!(spell_flags & GHOSTCAST)) - if(!(spell_flags & NO_SOMATIC)) - var/mob/living/L = user - if(L.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT)) - to_chat(user, "You can't cast spells while incapacitated!") - return 0 - - if(ishuman(user) && !(invocation_type in list(SpI_EMOTE, SpI_NONE)) && user.get_item_blocking_speech()) - to_chat(user, "Mmmf mrrfff!") - return 0 + var/mob/living/L = user + if(L.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT)) + to_chat(user, "You can't cast spells while incapacitated!") + return 0 - var/spell/noclothes/spell = locate() in user.mind.learned_spells - if((spell_flags & NEEDSCLOTHES) && !(spell && istype(spell)))//clothes check - if(!user.wearing_wiz_garb()) - return 0 + if(ishuman(user) && !(invocation_type in list(SpI_EMOTE, SpI_NONE)) && user.get_item_blocking_speech()) + to_chat(user, "Mmmf mrrfff!") + return 0 return 1 @@ -381,10 +374,7 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now if(!user || isnull(user)) return 0 - var/incap_flags = INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING - if(!(spell_flags & (GHOSTCAST))) - incap_flags |= INCAPACITATION_KNOCKOUT - + var/incap_flags = INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT return do_after(user,delay, incapacitation_flags = incap_flags) /proc/view_or_range(distance = world.view , center = usr , type) diff --git a/code/modules/spells/spell_projectile.dm b/code/modules/spells/spell_projectile.dm deleted file mode 100644 index 1599a59d3a7..00000000000 --- a/code/modules/spells/spell_projectile.dm +++ /dev/null @@ -1,56 +0,0 @@ -/obj/item/projectile/spell_projectile - name = "spell" - icon = 'icons/obj/projectiles.dmi' - - nodamage = 1 //Most of the time, anyways - - var/spell/targeted/projectile/carried - - penetrating = 0 - life_span = 10 //set by the duration of the spell - - var/proj_trail = 0 //if it leaves a trail - var/proj_trail_lifespan = 0 //deciseconds - var/proj_trail_icon = 'icons/obj/wizard.dmi' - var/proj_trail_icon_state = "trail" - var/list/trails = new() - -/obj/item/projectile/spell_projectile/Destroy() - for(var/trail in trails) - qdel(trail) - carried = null - return ..() - -/obj/item/projectile/spell_projectile/explosion_act() - SHOULD_CALL_PARENT(FALSE) - return - -/obj/item/projectile/spell_projectile/before_move() - if(proj_trail && src && src.loc) //pretty trails - var/obj/effect/overlay/trail = new /obj/effect/overlay(loc) - trails += trail - trail.icon = proj_trail_icon - trail.icon_state = proj_trail_icon_state - trail.set_density(0) - spawn(proj_trail_lifespan) - trails -= trail - qdel(trail) - -/obj/item/projectile/spell_projectile/proc/prox_cast(var/list/targets) - if(loc) - carried.prox_cast(targets, src) - qdel(src) - return - -/obj/item/projectile/spell_projectile/Bump(var/atom/A, forced=0) - if(loc && carried) - prox_cast(carried.choose_prox_targets(user = carried.holder, spell_holder = src)) - return 1 - -/obj/item/projectile/spell_projectile/on_impact() - if(loc && carried) - prox_cast(carried.choose_prox_targets(user = carried.holder, spell_holder = src)) - return 1 - -/obj/item/projectile/spell_projectile/seeking - name = "seeking spell" diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm deleted file mode 100644 index fa43c3e8d63..00000000000 --- a/code/modules/spells/spellbook.dm +++ /dev/null @@ -1,322 +0,0 @@ -#define NOREVERT 1 -#define LOCKED 2 -#define CAN_MAKE_CONTRACTS 4 -#define INVESTABLE 8 -#define NO_LOCKING 16 - -//spells/spellbooks have a variable for this but as artefacts are literal items they do not. -//so we do this instead. -var/global/list/artefact_feedback = list( - /obj/structure/closet/wizard/armor = "HS", - /obj/item/gun/energy/staff/focus = "MF", - /obj/item/gun/energy/staff/fire = "FS", - /obj/item/summoning_stone = "ST", - /obj/item/magic_rock = "RA", - /obj/item/contract/apprentice = "CP", - /obj/structure/closet/wizard/scrying = "SO", - /obj/item/paper/scroll/teleportation = "TS", - /obj/item/gun/energy/staff = "ST", - /obj/item/gun/energy/staff/animate = "SA", - /obj/item/dice/d20/cursed = "DW" -) - -/obj/item/book/spell - name = "master spell book" - desc = "The legendary book of spells of the wizard." - throw_speed = 1 - throw_range = 5 - w_class = ITEM_SIZE_NORMAL - material = /decl/material/solid/organic/paper - matter = list(/decl/material/solid/organic/leather = MATTER_AMOUNT_REINFORCEMENT) - unique = TRUE - var/uses = 1 - var/temp = null - var/datum/spellbook/spellbook - var/spellbook_type = /datum/spellbook/ //for spawning specific spellbooks. - var/investing_time = 0 //what time we target forr a return on our spell investment. - var/has_sacrificed = 0 //whether we have already got our sacrifice bonus for the current investment. - -/obj/item/book/spell/Initialize() - . = ..() - set_spellbook(spellbook_type) - -/obj/item/book/spell/try_carve() - return FALSE - -/obj/item/book/spell/proc/set_spellbook(var/type) - if(spellbook) - qdel(spellbook) - spellbook = new type() - uses = spellbook.max_uses - name = spellbook.name - desc = spellbook.desc - -/obj/item/book/spell/attack_self(mob/user) - if(!user.mind) - return - if (user.mind.assigned_special_role != /decl/special_role/wizard) - if (user.mind.assigned_special_role != "Wizard's Apprentice") - to_chat(user, "You can't make heads or tails of this book.") - return - if (spellbook.book_flags & LOCKED) - to_chat(user, "Drat! This spellbook's apprentice-proof lock is on!") - return - else if (spellbook.book_flags & LOCKED) - to_chat(user, "You notice the apprentice-proof lock is on. Luckily you are beyond such things.") - interact(user) - -/obj/item/book/spell/proc/make_sacrifice(obj/item/I, mob/user, var/reagent) - if(has_sacrificed) - to_chat(user, SPAN_WARNING("\The [src] is already sated! Wait for a return on your investment before you sacrifice more to it.")) - return - if(reagent) - if(I.reagents?.has_reagent(reagent, 5)) - I.remove_from_reagents(reagent, 5) - else if(LAZYACCESS(I.matter, reagent) >= (SHEET_MATERIAL_AMOUNT * 5)) - qdel(I) - else - if(istype(I,/obj/item/stack)) - var/obj/item/stack/S = I - if(S.amount < S.max_amount) - to_chat(usr, "You must sacrifice [S.max_amount] stacks of [S]!") - return - qdel(I) - to_chat(user, "Your sacrifice was accepted!") - has_sacrificed = 1 - investing_time = max(investing_time - 6000,1) //subtract 10 minutes. Make sure it doesn't act funky at the beginning of the game. - - -/obj/item/book/spell/attackby(obj/item/I, mob/user) - if(investing_time) - for(var/type in spellbook.sacrifice_objects) - if(istype(I,type)) - make_sacrifice(I, user) - return TRUE - - for(var/mat in spellbook.sacrifice_materials) - if(LAZYACCESS(I.matter, mat) > (SHEET_MATERIAL_AMOUNT * 10)) - make_sacrifice(I, user, mat) - return TRUE - - if(I.reagents) - for(var/id in spellbook.sacrifice_reagents) - if(I.reagents.has_reagent(id, 5)) - make_sacrifice(I, user, id) - return TRUE - return ..() - -/obj/item/book/spell/interact(mob/user) - var/dat = null - if(temp) - dat = "[temp]
Return" - else - dat = "

[spellbook.title]

[spellbook.title_desc]
You have [uses] spell slot\s left.

" - dat += "
Requires Wizard Garb
Selectable Target
Spell Charge Type: Recharge, Sacrifice, Charges

" - dat += "
To use a contract, first bind it to your soul, then give it to someone to sign. This will bind their soul to you.

" - for(var/i in 1 to spellbook.spells.len) - var/name = "" //name of target - var/desc = "" //description of target - var/info = "" //additional information - if(ispath(spellbook.spells[i],/datum/spellbook)) - var/datum/spellbook/S = spellbook.spells[i] - name = initial(S.name) - desc = initial(S.book_desc) - info = "[initial(S.max_uses)] Spell Slots" - else if(ispath(spellbook.spells[i],/obj)) - var/obj/O = spellbook.spells[i] - name = "Artefact: [capitalize(initial(O.name))]" //because 99.99% of objects dont have capitals in them and it makes it look weird. - desc = initial(O.desc) - else if(ispath(spellbook.spells[i],/spell)) - var/spell/S = spellbook.spells[i] - name = initial(S.name) - desc = initial(S.desc) - var/testing = initial(S.spell_flags) - if(testing & NEEDSCLOTHES) - info = "W" - var/type = "" - switch(initial(S.charge_type)) - if(Sp_RECHARGE) - type = "R" - if(Sp_HOLDVAR) - type = "S" - if(Sp_CHARGES) - type = "C" - info += "[type]" - dat += "[name]" - if(length(info)) - dat += " ([info])" - dat += " ([spellbook.spells[spellbook.spells[i]]] spell slot[spellbook.spells[spellbook.spells[i]] > 1 ? "s" : "" ])" - if(spellbook.book_flags & CAN_MAKE_CONTRACTS) - dat += " Make Contract" - dat += "
[desc]

" - dat += "
" - dat += "
Re-memorise your spellbook.
" - if(spellbook.book_flags & INVESTABLE) - if(investing_time) - dat += "
Currently investing in a slot...
" - else - dat += "
Invest a Spell Slot
Investing a spellpoint will return two spellpoints back in 15 minutes.
Some say a sacrifice could even shorten the time...
" - if(!(spellbook.book_flags & NOREVERT)) - dat += "
Choose different spellbook.
" - if(!(spellbook.book_flags & NO_LOCKING)) - dat += "
[spellbook.book_flags & LOCKED ? "Unlock" : "Lock"] the spellbook.
" - show_browser(user, dat, "window=spellbook") - -/obj/item/book/spell/CanUseTopic(var/mob/living/human/H) - if(!istype(H)) - return STATUS_CLOSE - - if(H.mind && (spellbook.book_flags & LOCKED) && H.mind.assigned_special_role == "Wizard's Apprentice") //make sure no scrubs get behind the lock - return STATUS_CLOSE - - return ..() - -/obj/item/book/spell/OnTopic(var/mob/living/human/user, href_list) - if(href_list["lock"] && !(spellbook.book_flags & NO_LOCKING)) - if(spellbook.book_flags & LOCKED) - spellbook.book_flags &= ~LOCKED - else - spellbook.book_flags |= LOCKED - . = TOPIC_REFRESH - - else if(href_list["temp"]) - temp = null - . = TOPIC_REFRESH - - else if(href_list["book"]) - if(initial(spellbook.max_uses) != spellbook.max_uses || uses != spellbook.max_uses) - temp = "You've already purchased things using this spellbook!" - else - src.set_spellbook(/datum/spellbook) - temp = "You have reverted back to the Book of Tomes." - . = TOPIC_REFRESH - - else if(href_list["invest"]) - temp = invest() - . = TOPIC_REFRESH - - else if(href_list["path"]) - var/path = locate(href_list["path"]) in spellbook.spells - if(!path) - return TOPIC_HANDLED - if(uses < spellbook.spells[path]) - to_chat(user, "You do not have enough spell slots to purchase this.") - return TOPIC_HANDLED - send_feedback(path) //feedback stuff - if(ispath(path,/datum/spellbook)) - src.set_spellbook(path) - temp = "You have chosen a new spellbook." - else - if(href_list["contract"]) - if(!(spellbook.book_flags & CAN_MAKE_CONTRACTS)) - return //no - uses -= spellbook.spells[path] - spellbook.max_uses -= spellbook.spells[path] //no basksies - var/obj/O = new /obj/item/contract/boon(get_turf(user),path) - temp = "You have purchased \the [O]." - else - if(ispath(path,/spell)) - temp = src.add_spell(user,path) - if(temp) - uses -= spellbook.spells[path] - else - var/obj/O = new path(get_turf(user)) - temp = "You have purchased \a [O]." - uses -= spellbook.spells[path] - spellbook.max_uses -= spellbook.spells[path] - //finally give it a bit of an oomf - playsound(get_turf(user),'sound/effects/phasein.ogg',50,1) - . = TOPIC_REFRESH - - else if(href_list["reset"] && !(spellbook.book_flags & NOREVERT)) - var/area/map_template/wizard_station/A = get_area(user) - if(istype(A)) - uses = spellbook.max_uses - investing_time = 0 - has_sacrificed = 0 - user.spellremove() - temp = "All spells and investments have been removed. You may now memorise a new set of spells." - SSstatistics.add_field_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - else - to_chat(user, "You must be in the wizard academy to re-memorise your spells.") - . = TOPIC_REFRESH - - src.interact(user) - -/obj/item/book/spell/proc/invest() - if(uses < 1) - return "You don't have enough slots to invest!" - if(investing_time) - return "You can only invest one spell slot at a time." - uses-- - START_PROCESSING(SSobj, src) - investing_time = world.time + (15 MINUTES) - return "You invest a spellslot and will recieve two in return in 15 minutes." - -/obj/item/book/spell/Process() - if(investing_time && investing_time <= world.time) - src.visible_message("\The [src] emits a soft chime.") - uses += 2 - if(uses > spellbook.max_uses) - spellbook.max_uses = uses - investing_time = 0 - has_sacrificed = 0 - STOP_PROCESSING(SSobj, src) - return 1 - -/obj/item/book/spell/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/book/spell/proc/send_feedback(var/path) - if(ispath(path,/datum/spellbook)) - var/datum/spellbook/S = path - SSstatistics.add_field_details("wizard_spell_learned","[initial(S.feedback)]") - else if(ispath(path,/spell)) - var/spell/S = path - SSstatistics.add_field_details("wizard_spell_learned","[initial(S.feedback)]") - else if(ispath(path,/obj)) - SSstatistics.add_field_details("wizard_spell_learned","[artefact_feedback[path]]") - - -/obj/item/book/spell/proc/add_spell(var/mob/user, var/spell_path) - for(var/spell/S in user.mind.learned_spells) - if(istype(S,spell_path)) - if(!S.can_improve()) - return - if(S.can_improve(Sp_SPEED) && S.can_improve(Sp_POWER)) - switch(alert(user, "Do you want to upgrade this spell's speed or power?", "Spell upgrade", "Speed", "Power", "Cancel")) - if("Speed") - return S.quicken_spell() - if("Power") - return S.empower_spell() - else - return - else if(S.can_improve(Sp_POWER)) - return S.empower_spell() - else if(S.can_improve(Sp_SPEED)) - return S.quicken_spell() - - var/spell/S = new spell_path() - user.add_spell(S) - return "You learn the spell [S]" - -/datum/spellbook - var/name = "\improper Book of Tomes" - var/desc = "The legendary book of spells of the wizard." - var/book_desc = "Holds information on the various tomes available to a wizard" - var/feedback = "" //doesn't need one. - var/book_flags = NOREVERT - var/max_uses = 1 - var/title = "Book of Tomes" - var/title_desc = "This tome marks down all the available tomes for use. Choose wisely, there are no refunds." - var/list/spells = list(/datum/spellbook/standard = 1, - /datum/spellbook/cleric = 1, - /datum/spellbook/battlemage = 1, - /datum/spellbook/spatial = 1, - /datum/spellbook/druid = 1 - ) //spell's path = cost of spell - - var/list/sacrifice_reagents - var/list/sacrifice_objects - var/list/sacrifice_materials diff --git a/code/modules/spells/spellbook/battlemage.dm b/code/modules/spells/spellbook/battlemage.dm deleted file mode 100644 index 07cebf63d82..00000000000 --- a/code/modules/spells/spellbook/battlemage.dm +++ /dev/null @@ -1,44 +0,0 @@ -//Battlemage is all about mixing physical with the mystical in head to head combat. -//Things like utility and mobility come second. -/datum/spellbook/battlemage - name = "\improper Battlemage's Bible" - feedback = "BM" - desc = "Smells like blood." - book_desc = "Mix physical with the mystical in head to head combat." - title = "The Art of Magical Combat" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list( - /spell/targeted/projectile/dumbfire/passage = 1, - /spell/targeted/equip_item/dyrnwyn = 1, - /spell/targeted/equip_item/shield = 1, - /spell/targeted/projectile/dumbfire/fireball = 1, - /spell/targeted/torment = 1, - /spell/targeted/heal_target = 2, - /spell/aoe_turf/conjure/mirage = 1, - /spell/targeted/shapeshift/corrupt_form = 1, - /spell/radiant_aura = 1, - /spell/noclothes = 1, - /obj/structure/closet/wizard/armor = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/gun/energy/staff/fire = 1, - /obj/item/dice/d20/cursed = 1, - /obj/item/summoning_stone = 2, - /obj/item/magic_rock = 1, - /obj/item/contract/wizard/xray = 1, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_objects = list( - /obj/item/sword, - /obj/item/bladed/axe/fire, - /obj/item/baton, - /obj/item/knife/ritual, - /obj/item/knife/kitchen/cleaver, - /obj/item/knife/folding/combat/balisong, - /obj/item/knife/folding/tacticool, - /obj/item/star - ) diff --git a/code/modules/spells/spellbook/cleric.dm b/code/modules/spells/spellbook/cleric.dm deleted file mode 100644 index 98c5a48f6d5..00000000000 --- a/code/modules/spells/spellbook/cleric.dm +++ /dev/null @@ -1,50 +0,0 @@ -//Cleric is all about healing. Mobility and offense comes at a higher price but not impossible. -/obj/item/book/spell/cleric - spellbook_type = /datum/spellbook/cleric - -/datum/spellbook/cleric - name = "\improper Cleric's Tome" - feedback = "CR" - desc = "For those who do not harm, or at least feel sorry about it." - book_desc = "All about healing. Mobility and offense comes at a higher price but not impossible." - title = "Cleric's Tome of Healing" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 7 - - spells = list( - /spell/targeted/heal_target/major = 1, - /spell/targeted/heal_target/area = 1, - /spell/targeted/heal_target/sacrifice = 1, - /spell/targeted/genetic/blind = 1, - /spell/targeted/shapeshift/baleful_polymorph = 1, - /spell/targeted/projectile/dumbfire/stuncuff = 1, - /spell/targeted/ethereal_jaunt = 2, - /spell/aoe_turf/knock = 1, - /spell/radiant_aura = 1, - /spell/targeted/equip_item/holy_relic = 1, - /spell/aoe_turf/conjure/grove/sanctuary = 1, - /spell/targeted/projectile/dumbfire/fireball = 2, - /spell/area_teleport = 2, - /spell/portal_teleport = 2, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/noclothes = 1, - /obj/item/magic_rock = 1, - /obj/structure/closet/wizard/scrying = 2, - /obj/item/summoning_stone = 2, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_reagents = list( - /decl/material/liquid/adminordrazine - ) - sacrifice_objects = list( - /obj/item/stack/nanopaste, - /obj/item/scanner/health, - /obj/item/scanner/breath, - /obj/item/stack/medical/bandage/advanced, - /obj/item/stack/medical/ointment/advanced, - /obj/item/bodybag/rescue, - /obj/item/defibrillator - ) diff --git a/code/modules/spells/spellbook/druid.dm b/code/modules/spells/spellbook/druid.dm deleted file mode 100644 index 48ee015d349..00000000000 --- a/code/modules/spells/spellbook/druid.dm +++ /dev/null @@ -1,43 +0,0 @@ -//all about the summons, nature, and a bit o' healin. - -/obj/item/book/spell/druid - spellbook_type = /datum/spellbook/druid - -/datum/spellbook/druid - name = "\improper Druid's Leaflet" - feedback = "DL" - desc = "It smells like an air freshener." - book_desc = "Summons, nature, and a bit o' healin." - title = "Druidic Guide on how to be smug about nature" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list( - /spell/targeted/heal_target = 1, - /spell/targeted/heal_target/sacrifice = 1, - /spell/aoe_turf/conjure/mirage = 1, - /spell/aoe_turf/conjure/summon/bats = 1, - /spell/aoe_turf/conjure/summon/bear = 1, - /spell/targeted/equip_item/party_hardy = 1, - /spell/targeted/equip_item/seed = 1, - /spell/targeted/shapeshift/avian = 1, - /spell/aoe_turf/disable_tech = 1, - /spell/hand/charges/entangle = 1, - /spell/aoe_turf/conjure/grove/sanctuary = 1, - /spell/aoe_turf/knock = 1, - /spell/area_teleport = 2, - /spell/portal_teleport = 2, - /spell/noclothes = 1, - /obj/item/magic_rock = 1, - /obj/item/summoning_stone = 2, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - sacrifice_objects = list( - /obj/item/seeds, - /obj/item/wirecutters/clippers, - /obj/item/scanner/plant, - /obj/item/tool/axe/hatchet, - /obj/item/tool/hoe/mini - ) diff --git a/code/modules/spells/spellbook/spatial.dm b/code/modules/spells/spellbook/spatial.dm deleted file mode 100644 index def9a6695d2..00000000000 --- a/code/modules/spells/spellbook/spatial.dm +++ /dev/null @@ -1,48 +0,0 @@ -//all about moving around and mobility and being an annoying shit. - -/obj/item/book/spell/spatial - spellbook_type = /datum/spellbook/spatial - -/datum/spellbook/spatial - name = "\improper Spatial Manual" - feedback = "SP" - desc = "You feel like this might disappear from out of under you." - book_desc = "Movement and teleportation. Run from your problems!" - title = "Manual of Spatial Transportation" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 11 - - spells = list( - /spell/targeted/ethereal_jaunt = 1, - /spell/aoe_turf/blink = 1, - /spell/area_teleport = 1, - /spell/portal_teleport = 1, - /spell/targeted/projectile/dumbfire/passage = 1, - /spell/mark_recall = 1, - /spell/targeted/swap = 1, - /spell/targeted/shapeshift/avian = 1, - /spell/targeted/projectile/magic_missile = 1, - /spell/targeted/heal_target = 1, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/aoe_turf/smoke = 1, - /spell/aoe_turf/conjure/summon/bats = 3, - /spell/noclothes = 1, - /obj/item/dice/d20/cursed = 1, - /obj/structure/closet/wizard/scrying = 2, - /obj/item/paper/scroll/teleportation = 1, - /obj/item/magic_rock = 1, - /obj/item/summoning_stone = 3, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_reagents = list( - /decl/material/liquid/amphetamines - ) - sacrifice_objects = list( - /obj/item/stack/telecrystal - ) - sacrifice_materials = list( - /decl/material/solid/gemstone/diamond - ) \ No newline at end of file diff --git a/code/modules/spells/spellbook/standard.dm b/code/modules/spells/spellbook/standard.dm deleted file mode 100644 index 99e8f27c274..00000000000 --- a/code/modules/spells/spellbook/standard.dm +++ /dev/null @@ -1,54 +0,0 @@ -//the spellbook we know and love. Well, the one we know, at least. - -/obj/item/book/spell/standard - spellbook_type = /datum/spellbook/standard - -/datum/spellbook/standard - name = "\improper Standard Spellbook" - feedback = "SB" - title = "Book of Spells and Artefacts" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_desc = "A general wizard's spellbook. All its spells are easy to use but hard to master." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list( - /spell/targeted/projectile/magic_missile = 1, - /spell/targeted/projectile/dumbfire/fireball = 1, - /spell/aoe_turf/disable_tech = 1, - /spell/aoe_turf/smoke = 1, - /spell/targeted/genetic/blind = 1, - /spell/targeted/subjugation = 1, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/aoe_turf/blink = 1, - /spell/area_teleport = 1, - /spell/targeted/ethereal_jaunt = 1, - /spell/targeted/heal_target = 1, - /spell/aoe_turf/knock = 1, - /spell/noclothes = 2, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/gun/energy/staff/fire = 1, - /obj/item/gun/energy/staff/animate = 1, - /obj/structure/closet/wizard/scrying = 1, - /obj/item/summoning_stone = 2, - /obj/item/magic_rock = 1, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_objects = list( - /obj/item/toolbox, - /obj/item/cane/fancy, - /obj/item/flamethrower, - /obj/item/plastique, - /obj/item/dice, - /obj/item/soap, - /obj/item/flame/candle, - /obj/item/flame/candle/scented/incense, - /obj/item/caution, - /obj/item/towel, - /obj/item/tank/jetpack, - /obj/item/plunger, - /obj/item/megaphone, - /obj/item/deck/cards - ) \ No newline at end of file diff --git a/code/modules/spells/spellbook/student.dm b/code/modules/spells/spellbook/student.dm deleted file mode 100644 index 1c07a5135b1..00000000000 --- a/code/modules/spells/spellbook/student.dm +++ /dev/null @@ -1,28 +0,0 @@ -//wizard's training wheels. Basically. Same shit as in the general one. - -/obj/item/book/spell/student - spellbook_type = /datum/spellbook/student - -/datum/spellbook/student - name = "\improper Student's Spellbook" - feedback = "ST" - desc = "This spell book has a sticker on it that says, 'certified for children 5 and older'." - book_desc = "This spellbook is dedicated to teaching neophytes in the ways of magic." - title = "Book of Spells and Education" - title_desc = "Hello. Congratulations on becoming a wizard. You may be asking yourself: What? A wizard? Already? Of course! Anybody can become a wizard! Learning to be a good one is the hard part.
Without further adue, let us begin by learning the three concepts of wizardry, 'Spell slots', 'Spells', and 'Artifacts'.
Firstly lets try to understand the 'spell slot'. A spell slot is the measurable amount of spells and artifacts one tome can give. Most spells will only take up a singular spell slot, however more powerful spells/artifacts can take up more.
Spells are spells. They can have requirements, such as wizard garb, and most can be upgraded by purchasing additional spell slots for them. Most upgrades fall into two categories, 'Speed' and 'Power'. Speed upgrades decrease the time you have to spend recharging your spell. Power increases the potency of your spells. Spells are also special in that they can be refunded while inside the Wizard Acadamy, so if you want to test a spell out before moving out into the field, feel free to do that in the comfort of our home.
Artifacts, or 'Artefacts' as we call them, are powerful wizard tools or items made specially for wizards everywhere. Extremely potent, they cannot be refunded like spells, and some of them can be used by non-wizards, so be careful!
Knowing these three concepts puts you in a league above most wizards, however knowledge of spells is just as important so we've included a list of spells below made specifically for the beginning wizard. Take all of them, or mix and match, remember being creative is half of being a wizard!" - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 5 - - spells = list( - /spell/aoe_turf/knock = 1, - /spell/targeted/ethereal_jaunt = 1, - /spell/targeted/projectile/magic_missile = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/contract/wizard/xray = 1 - ) - -/datum/spellbook/student/apprentice - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE|NOREVERT|NO_LOCKING - -/obj/item/book/spell/apprentice - spellbook_type = /datum/spellbook/student/apprentice diff --git a/code/modules/spells/targeted/analyze.dm b/code/modules/spells/targeted/analyze.dm deleted file mode 100644 index 705d97399c7..00000000000 --- a/code/modules/spells/targeted/analyze.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/targeted/analyze - name = "Analyze" - desc = "Using your wizardly powers, you can detect the inner destructions of a persons body." - - feedback = "AZ" - school = "illusion" - charge_max = 100 - spell_flags = INCLUDEUSER|SELECTABLE - range = 2 - invocation_type = SpI_WHISPER - invocation = "Fu Yi Fim" - compatible_mobs = list(/mob/living/human) - hud_state = "analyze" - -/spell/targeted/analyze/cast(var/list/targets, var/mob/user) - for(var/a in targets) - var/mob/living/human/H = a - new /obj/effect/temporary(get_turf(a),5, 'icons/effects/effects.dmi', "repel_missiles") - to_chat(user,medical_scan_results(H,1)) \ No newline at end of file diff --git a/code/modules/spells/targeted/blood_boil.dm b/code/modules/spells/targeted/blood_boil.dm deleted file mode 100644 index 4c39b3b4620..00000000000 --- a/code/modules/spells/targeted/blood_boil.dm +++ /dev/null @@ -1,25 +0,0 @@ -/spell/targeted/blood_boil - name = "Blood Boil" - desc = "Allow you to concentrate so deeply on a target that their body temperature increases, eventually setting them on fire." - feedback = "BO" - school = "transmutation" - charge_max = 300 - spell_flags = 0 - invocation_type = SpI_NONE - range = 5 - max_targets = 1 - compatible_mobs = list(/mob/living/human) - - time_between_channels = 50 - number_of_channels = 0 - - hud_state = "wiz_boilblood" - -/spell/targeted/blood_boil/cast(var/list/targets, var/mob/user) - var/mob/living/human/H = targets[1] - H.bodytemperature += 40 - if(prob(10)) - to_chat(H,"\The [user] seems to radiate an uncomfortable amount of heat your direction.") - if(H.bodytemperature > H.get_mob_temperature_threshold(HEAT_LEVEL_3)) //Burst into flames - H.fire_stacks += 50 - H.IgniteMob() \ No newline at end of file diff --git a/code/modules/spells/targeted/cleric_spells.dm b/code/modules/spells/targeted/cleric_spells.dm deleted file mode 100644 index 74061d776dd..00000000000 --- a/code/modules/spells/targeted/cleric_spells.dm +++ /dev/null @@ -1,248 +0,0 @@ -/spell/targeted/heal_target - name = "Cure Light Wounds" - desc = "a rudimentary spell used mainly by wizards to heal papercuts. Does not require wizard garb." - feedback = "CL" - school = "transmutation" - charge_max = 20 SECONDS - spell_flags = INCLUDEUSER | SELECTABLE - invocation = "Di'Nath!" - invocation_type = SpI_SHOUT - range = 2 - max_targets = 1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 2) - - cooldown_reduc = 50 - hud_state = "heal_minor" - cast_sound = 'sound/magic/staff_healing.ogg' - - amt_dam_brute = -15 - amt_dam_fire = -5 - amt_dam_robo = -4 - effect_state = "green_sparkles" - effect_duration = 5 - - // Vars expect a constant at compile time, so we can't use macros for spans here - message = "You feel a pleasant rush of heat move through your body." - -/spell/targeted/heal_target/empower_spell() - if(!..()) - return 0 - amt_dam_brute -= 15 - amt_dam_fire -= 15 - amt_dam_robo -= 7 - return "[src] will now heal more." - -/spell/targeted/heal_target/touch - name = "Healing Touch" - desc = "Heals an adjacent target for a reasonable amount of health." - range = 1 - amt_dam_fire = -7 - amt_dam_brute = -7 - amt_dam_robo = -5 - charge_max = 10 SECONDS - spell_flags = SELECTABLE - invocation = "Di'Na!" - - hud_state = "heal_touch" - -/spell/targeted/heal_target/major - name = "Cure Major Wounds" - desc = "A spell used to fix others that cannot be fixed with regular medicine." - feedback = "CM" - charge_max = 30 SECONDS - spell_flags = INCLUDEUSER | SELECTABLE | NEEDSCLOTHES - invocation = "Borv Di'Nath!" - range = 1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 1) - cooldown_reduc = 100 - hud_state = "heal_major" - - amt_dam_brute = -75 - amt_dam_fire = -50 - amt_dam_robo = -10 - amt_blood = 28 - - message = "Your body feels like a warm, cozy fire." - -/spell/targeted/heal_target/major/empower_spell() - if(!..()) - return 0 - amt_blood = 28 - amt_organ = 5 - amt_brain = -5 - amt_radiation = -25 - amt_dam_tox = -20 - amt_dam_oxy = -14 - amt_dam_brute = -35 - amt_dam_fire = -35 - amt_dam_robo = -15 - - return "[src] heals more, and heals organ damage and radiation." - -/spell/targeted/heal_target/area - name = "Cure Area" - desc = "This spell heals everyone in an area." - feedback = "HA" - charge_max = 1 MINUTE - spell_flags = INCLUDEUSER - invocation = "Nal Di'Nath!" - range = 2 - max_targets = 0 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 1) - cooldown_reduc = 300 - hud_state = "heal_area" - amt_dam_robo = -6 - amt_dam_brute = -25 - amt_dam_fire = -25 - -/spell/targeted/heal_target/area/empower_spell() - if(!..()) - return 0 - amt_dam_brute -= 15 - amt_dam_fire -= 15 - amt_dam_robo -= 4 - range += 2 - - return "[src] now heals more in a wider area." - -/spell/targeted/heal_target/area/slow - charge_max = 2 MINUTES - -/spell/targeted/heal_target/sacrifice - name = "Sacrifice" - desc = "This spell heals immensily. For a price. Does not require wizard garb." - feedback = "SF" - spell_flags = SELECTABLE - invocation = "Ei'Nath Borv Di'Nath!" - charge_type = Sp_HOLDVAR - holder_var_type = "fireloss" - holder_var_amount = 100 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - - amt_dam_brute = -1000 - amt_dam_fire = -1000 - amt_dam_oxy = -100 - amt_dam_tox = -100 - amt_dam_robo = -1000 - amt_blood = 280 - effect_color = "#ff0000" - - hud_state = "gen_dissolve" - cast_sound = 'sound/magic/disintegrate.ogg' - -/spell/targeted/heal_target/sacrifice/empower_spell() - if(!..()) - return 0 - - amt_organ = 25 - amt_brain = -25 - amt_radiation = -100 - - - return "You will now heal organ and brain damage, as well as virtually purge all radiation." - - -/spell/targeted/heal_target/trance - name = "Trance" - desc = "A mighty spell of restoration that briefly forces its target into a deep, dreamless sleep, rapidly repairing their body and soul as their senses are dulled. The users of this mighty art are known for being short lived, slowly devolving into raving madness as the power they once relied on fails them with excessive use." - feedback = "TC" - spell_flags = SELECTABLE - invocation = "Di' Dae Nath!" - charge_max = 2 MINUTES - - amt_dam_brute = -1000 - amt_dam_fire = -1000 - amt_dam_oxy = -100 - amt_dam_tox = -100 - amt_dam_robo = -1000 - hud_state = "trance" - var/obj/effect/effect - -/spell/targeted/heal_target/trance/cast(var/list/targets, var/mob/user) - for(var/t in targets) - var/mob/living/L = t - var/turf/T = get_turf(L) - effect = new /obj/effect/rift(T) - effect.color = "f0e68c" - L.forceMove(effect) - var/time = (L.get_damage(BRUTE) + L.get_damage(BURN)) * 20 - L.status_flags &= GODMODE - to_chat(L,"You will be in stasis for [time/10] second\s.") - addtimer(CALLBACK(src,PROC_REF(cancel_rift)),time) - -/spell/targeted/heal_target/trance/Destroy() - cancel_rift() - return ..() - -/spell/targeted/heal_target/trance/proc/cancel_rift() - if(effect) - var/mob/living/L = locate() in effect - L.status_flags &= ~GODMODE - L.forceMove(get_turf(L)) - apply_spell_damage(L) - charge_max += 300 - QDEL_NULL(effect) - -/obj/effect/rift - name = "rift" - desc = "a tear in space and time." - icon = 'icons/obj/wizard.dmi' - icon_state = "rift" - anchored = TRUE - density = FALSE - -/obj/effect/rift/Destroy() - for(var/o in contents) - var/atom/movable/M = o - M.dropInto(loc) - . = ..() - -/spell/targeted/revoke - name = "Revoke Death" - desc = "Revoke that of death itself. Comes at a cost that may be hard to manage for some." - feedback = "RK" - - spell_flags = SELECTABLE - - charge_type = Sp_CHARGES - charge_max = 1 - invocation = "Di Le Nal Yen Nath!" - invocation_type = SpI_SHOUT - range = 1 - hud_state = "heal_revoke" - -/spell/targeted/revoke/cast(var/list/targets, var/mob/living/user) - if(alert(user, "Are you sure?", "Alert", "Yes", "No") == "Yes" && alert(user, "Are you ABSOLUTELY SURE?", "Alert", "Absolutely!", "No") == "Absolutely!") - var/should_wait = 1 - for(var/t in targets) - var/mob/living/M = t - M.rejuvenate() - if(M.client) //We've got a dude - should_wait = 0 - break //Don't need to check anymore. - if(should_wait) - addtimer(CALLBACK(src,PROC_REF(check_for_revoke),targets), 30 SECONDS) - else - revoke_spells() - - -/spell/targeted/revoke/proc/check_for_revoke(var/list/targets) - for(var/t in targets) - var/mob/M = t - if(M.client) - revoke_spells() - return - charge_counter = charge_max - to_chat(holder,"\The [src] refreshes as it seems it could not bring back the souls of those you healed.") - -/spell/targeted/revoke/proc/revoke_spells() - if(!isliving(holder)) - return - var/mob/living/M = holder - if(M.mind) - for(var/s in M.mind.learned_spells) - if(istype(s, /spell/toggle_armor)) //Can keep the armor n junk. - continue - M.remove_spell(s) - for(var/a in M.auras) - M.remove_aura(a) \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/burning_touch.dm b/code/modules/spells/targeted/equip/burning_touch.dm deleted file mode 100644 index 65ed431693b..00000000000 --- a/code/modules/spells/targeted/equip/burning_touch.dm +++ /dev/null @@ -1,69 +0,0 @@ -/spell/targeted/equip_item/burning_hand - name = "Burning Hand" - desc = "Bathes your hand in fire, giving you all the perks and disadvantages that brings." - feedback = "BH" - school = "conjuration" - invocation = "Horila Kiha!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - range = -1 - duration = 0 - max_targets = 1 - equipped_summons = list("active hand" = /obj/item/burning_hands) - delete_old = 0 - hud_state = "gen_burnhand" - -/obj/item/burning_hands - name = "Burning Hand" - icon = 'icons/mob/screen/grabs.dmi' - icon_state = "grabbed+1" - _base_attack_force = 10 - atom_damage_type = BURN - simulated = 0 - max_health = ITEM_HEALTH_NO_DAMAGE - obj_flags = OBJ_FLAG_NO_STORAGE - var/burn_power = 0 - var/burn_timer - -/obj/item/burning_hands/on_picked_up(var/mob/user) - burn_power = 0 - burn_timer = world.time + 10 SECONDS - START_PROCESSING(SSobj,src) - -/obj/item/burning_hands/get_heat() - return 1000 - -/obj/item/burning_hands/isflamesource() - return TRUE - -/obj/item/burning_hands/Process() - if(world.time < burn_timer) - return - burn_timer = world.time + 5 SECONDS - burn_power++ - set_base_attack_force(get_base_attack_force()+2) - if(!ishuman(src.loc)) - qdel(src) - return - var/mob/living/human/user = src.loc - var/obj/item/organ/external/hand - if(src == user.get_equipped_item(BP_L_HAND)) - hand = GET_EXTERNAL_ORGAN(user, BP_L_HAND) - else if(src == user.get_equipped_item(BP_R_HAND)) - hand = GET_EXTERNAL_ORGAN(user, BP_R_HAND) - if(hand) - hand.take_external_damage(burn = 2 * burn_power) - if(burn_power > 5) - user.fire_stacks += 15 - user.IgniteMob() - user.visible_message("\The [user] bursts into flames!") - user.drop_from_inventory(src) - else - if(burn_power == 5) - to_chat(user, "You begin to lose control of \the [src]'s flames as they rapidly move up your arm...") - else - to_chat(user, "You feel \the [src] grow hotter and hotter!") - -/obj/item/burning_hands/dropped() - ..() - qdel(src) \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/dyrnwyn.dm b/code/modules/spells/targeted/equip/dyrnwyn.dm deleted file mode 100644 index 71d7ace1e4f..00000000000 --- a/code/modules/spells/targeted/equip/dyrnwyn.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/targeted/equip_item/dyrnwyn - name = "Summon Dyrnwyn" - desc = "Summons the legendary sword of Rhydderch Hael, said to draw in flame when held by a worthy man." - feedback = "SD" - charge_type = Sp_HOLDVAR - holder_var_type = "fireloss" - holder_var_amount = 10 - school = "conjuration" - invocation = "Anrhydeddu Fi!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - range = -1 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - duration = 300 //30 seconds - max_targets = 1 - equipped_summons = list("active hand" = /obj/item/sword) - delete_old = FALSE - var/material = /decl/material/solid/metal/gold - - hud_state = "gen_immolate" - - -/spell/targeted/equip_item/dyrnwyn/summon_item(var/new_type) - var/obj/item/sword = new new_type(null,material) - sword.SetName("\improper Dyrnwyn") - sword.atom_damage_type = BURN - sword.hitsound = 'sound/items/welder2.ogg' - LAZYSET(sword.slowdown_per_slot, BP_L_HAND, 1) - LAZYSET(sword.slowdown_per_slot, BP_R_HAND, 1) - return sword - -/spell/targeted/equip_item/dyrnwyn/empower_spell() - if(!..()) - return FALSE - - material = /decl/material/solid/metal/silver - return "Dyrnwyn has been made pure: it is now made of silver." diff --git a/code/modules/spells/targeted/equip/equip.dm b/code/modules/spells/targeted/equip/equip.dm deleted file mode 100644 index 7b0304d9e07..00000000000 --- a/code/modules/spells/targeted/equip/equip.dm +++ /dev/null @@ -1,38 +0,0 @@ -//You can set duration to 0 to have the items last forever - -/spell/targeted/equip_item - cast_sound = 'sound/magic/summonitems_generic.ogg' - var/list/equipped_summons = list() //assoc list of text ids and paths to spawn - var/list/summoned_items = list() //list of items we summoned and will dispose when the spell runs out - var/delete_old = 1 //if the item previously in the slot is deleted - otherwise, it's dropped - -/spell/targeted/equip_item/cast(list/targets, mob/user = usr) - ..() - for(var/mob/living/L in targets) - for(var/slot_id in equipped_summons) - var/to_create = equipped_summons[slot_id] - if(cmptext(slot_id,"active hand")) - slot_id = user.get_active_held_item_slot() - else if(cmptext(slot_id, "off hand")) - slot_id = user.get_empty_hand_slot() - else - slot_id = text2num(slot_id) //because the index is text, we access this instead - var/obj/item/new_item = summon_item(to_create) - var/obj/item/old_item = L.get_equipped_item(slot_id) - if(old_item) - L.drop_from_inventory(old_item) - if(delete_old) - qdel(old_item) - L.equip_to_slot(new_item, slot_id) - new_item.on_picked_up(L) - - if(duration) - summoned_items += new_item //we store it in a list to remove later - - if(duration) - spawn(duration) - for(var/obj/item/to_remove in summoned_items) - qdel(to_remove) - -/spell/targeted/equip_item/proc/summon_item(var/newtype) - return new newtype diff --git a/code/modules/spells/targeted/equip/holy_relic.dm b/code/modules/spells/targeted/equip/holy_relic.dm deleted file mode 100644 index 7c6dadf5da2..00000000000 --- a/code/modules/spells/targeted/equip/holy_relic.dm +++ /dev/null @@ -1,34 +0,0 @@ -/spell/targeted/equip_item/holy_relic - name = "Summon Holy Relic" - desc = "This spell summons a relic of purity into your hand for a short while. The relic will disrupt occult and magical energies - be wary, as this includes your own." - feedback = "SR" - school = "conjuration" - charge_type = Sp_RECHARGE - spell_flags = NEEDSCLOTHES | INCLUDEUSER - invocation = "Yee'Ro Su!" - invocation_type = SpI_SHOUT - range = 0 - max_targets = 1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 1) - charge_max = 60 SECONDS - duration = 25 SECONDS - cooldown_min = 35 SECONDS - delete_old = 0 - compatible_mobs = list(/mob/living/human) - - hud_state = "purge1" - - equipped_summons = list("active hand" = /obj/item/nullrod) - -/spell/targeted/equip_item/holy_relic/cast(list/targets, mob/user = usr) - ..() - for(var/mob/M in targets) - M.visible_message(SPAN_DANGER("A rod of metal appears in \the [M]'s hand!")) - -/spell/targeted/equip_item/holy_relic/empower_spell() - if(!..()) - return 0 - - duration += 50 - - return "The holy relic now lasts for [duration/10] seconds." \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/horsemask.dm b/code/modules/spells/targeted/equip/horsemask.dm deleted file mode 100644 index 31995ba86bd..00000000000 --- a/code/modules/spells/targeted/equip/horsemask.dm +++ /dev/null @@ -1,48 +0,0 @@ -/spell/targeted/equip_item/horsemask - name = "Curse of the Horseman" - desc = "This spell triggers a curse on a target, causing them to wield an unremovable horse head mask. They will speak like a horse! Any masks they are wearing will be disintegrated. This spell does not require robes." - school = "transmutation" - charge_type = Sp_RECHARGE - charge_max = 150 - charge_counter = 0 - spell_flags = 0 - invocation = "Kn'a Ftaghu, Puck'Bthnk!" - invocation_type = SpI_SHOUT - range = 7 - max_targets = 1 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1) - cooldown_min = 30 //30 deciseconds reduction per rank - selection_type = "range" - - compatible_mobs = list(/mob/living/human) - - hud_state = "wiz_horse" - cast_sound = 'sound/magic/horsehead_curse.ogg' - -/spell/targeted/equip_item/horsemask/New() - ..() - equipped_summons = list("[slot_wear_mask_str]" = /obj/item/clothing/mask/horsehead) - -/spell/targeted/equip_item/horsemask/cast(list/targets, mob/user = usr) - ..() - for(var/mob/living/target in targets) - target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place!", \ - "Your face burns up, and shortly after the fire you realise you have the face of a horse!") - target.flash_eyes() - -/spell/targeted/equip_item/horsemask/summon_item(var/new_type) - var/obj/item/new_item = new new_type - new_item.canremove = 0 //curses! - if(istype(new_item, /obj/item/clothing/mask/horsehead)) - var/obj/item/clothing/mask/horsehead/magichead = new_item - magichead.flags_inv = null //so you can still see their face - magichead.voicechange = 1 //NEEEEIIGHH - return new_item - -/spell/targeted/equip_item/horsemask/empower_spell() - if(!..()) - return 0 - - spell_flags = SELECTABLE - - return "You can now select your target with [src]" \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/party_hardy.dm b/code/modules/spells/targeted/equip/party_hardy.dm deleted file mode 100644 index f6f7ba54d07..00000000000 --- a/code/modules/spells/targeted/equip/party_hardy.dm +++ /dev/null @@ -1,36 +0,0 @@ -/spell/targeted/equip_item/party_hardy - name = "Summon Party" - desc = "This spell was invented for the sole purpose of getting crunked at 11am on a Tuesday. Does not require wizard garb." - feedback = "PY" - school = "conjuration" - charge_type = Sp_RECHARGE - charge_max = 900 - cooldown_min = 600 - spell_flags = INCLUDEUSER - invocation = "Llet'Su G'iit Rrkned!" //Let's get wrecked. - invocation_type = SpI_SHOUT - range = 6 - max_targets = 0 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 2) - delete_old = 0 - - hud_state = "wiz_party" - - compatible_mobs = list(/mob/living/human) - equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/small/beer) - -/spell/targeted/equip_item/party_hardy/empower_spell() - if(!..()) - return 0 - switch(spell_levels[Sp_POWER]) - if(1) - equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/small/beer, - "off hand" = /obj/item/food/poppypretzel) - return "The spell will now give everybody a preztel as well." - if(2) - equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/absinthe, - "off hand" = /obj/item/food/poppypretzel, - "[slot_head_str]" = /obj/item/clothing/head/collectable/wizard) - return "Woo! Now everybody gets a cool wizard hat and MORE BOOZE!" - - return 0 \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/seed.dm b/code/modules/spells/targeted/equip/seed.dm deleted file mode 100644 index 2252ec75c8c..00000000000 --- a/code/modules/spells/targeted/equip/seed.dm +++ /dev/null @@ -1,21 +0,0 @@ -/spell/targeted/equip_item/seed - name = "Summon Seed" - desc = "This spell summons a random seed into the hand of the wizard." - feedback = "SE" - delete_old = 0 - - spell_flags = INCLUDEUSER | NEEDSCLOTHES - invocation_type = SpI_WHISPER - invocation = "Ria'li akta." - - equipped_summons = list("active hand" = /obj/item/seeds/random) - compatible_mobs = list(/mob/living/human) - - charge_max = 600 //1 minute - cooldown_min = 200 //20 seconds - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 0) - - range = -1 - max_targets = 1 - - hud_state = "wiz_seed" \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/shield.dm b/code/modules/spells/targeted/equip/shield.dm deleted file mode 100644 index b725196ad3a..00000000000 --- a/code/modules/spells/targeted/equip/shield.dm +++ /dev/null @@ -1,41 +0,0 @@ -/spell/targeted/equip_item/shield - name = "Summon Shield" - desc = "Summons the most holy of shields, the riot shield. Commonly used during wizard riots." - feedback = "SH" - school = "conjuration" - invocation = "Sia helda!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER | NEEDSCLOTHES - range = -1 - max_targets = 1 - - compatible_mobs = list(/mob/living/human) - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 1) - charge_type = Sp_RECHARGE - charge_max = 900 - cooldown_min = 300 - equipped_summons = list("off hand" = /obj/item/shield/) - duration = 300 - delete_old = 0 - var/item_color = "#6666ff" - var/block_chance = 30 - - hud_state = "wiz_shield" - -/spell/targeted/equip_item/shield/summon_item(var/new_type) - var/obj/item/shield/I = new new_type() - I.icon_state = "buckler" - I.color = item_color - I.SetName("Wizard's Shield") - I.base_block_chance = block_chance - return I - -/spell/targeted/equip_item/shield/empower_spell() - if(!..()) - return 0 - - item_color = "#6600ff" - block_chance = 60 - - return "Your summoned shields will now block more often." diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm index e686e7712dc..fdccd1ce64d 100644 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ b/code/modules/spells/targeted/ethereal_jaunt.dm @@ -4,7 +4,7 @@ feedback = "EJ" school = "transmutation" charge_max = 30 SECONDS - spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER + spell_flags = Z2NOCAST | INCLUDEUSER invocation = "none" invocation_type = SpI_NONE range = 0 diff --git a/code/modules/spells/targeted/exude_pleasantness.dm b/code/modules/spells/targeted/exude_pleasantness.dm deleted file mode 100644 index 74ae51237ab..00000000000 --- a/code/modules/spells/targeted/exude_pleasantness.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/targeted/exude_pleasantness - name = "Exhude Pleasantness" - desc = "A simple spell used to make friends with people. Be warned, this spell only has a subtle effect" - feedback = "AP" - school = "Illusion" - spell_flags = INCLUDEUSER - range = 5 - max_targets = 0 - charge_max = 100 - var/list/possible_messages = list("seems pretty trustworthy!", "makes you feel appreciated.", "looks pretty cool.", "feels like the only decent person here!", "makes you feel safe.") - hud_state = "friendly" - -/spell/targeted/exude_pleasantness/cast(var/list/targets, var/mob/user) - for(var/m in targets) - var/mob/living/L = m - if(L.mind && L.mind.assigned_special_role == "Spellbound Servant") - to_chat(m, SPAN_NOTICE("\The [user] seems relatively harmless.")) - else - to_chat(m, FONT_LARGE(SPAN_NOTICE("\The [user] [pick(possible_messages)]"))) \ No newline at end of file diff --git a/code/modules/spells/targeted/genetic.dm b/code/modules/spells/targeted/genetic.dm deleted file mode 100644 index bcc5233b9b6..00000000000 --- a/code/modules/spells/targeted/genetic.dm +++ /dev/null @@ -1,73 +0,0 @@ -/* -Other mutation or disability spells can be found in -code\game\dna\genes\vg_powers.dm -code\game\dna\genes\goon_disabilities.dm -code\game\dna\genes\goon_powers.dm -*/ -/spell/targeted/genetic - name = "Genetic modifier" - desc = "This spell inflicts a set of genetic conditions upon the target." - duration = 10 SECONDS - var/list/genetic_conditions = list() - -/spell/targeted/genetic/cast(list/targets) - ..() - for(var/mob/living/target in targets) - for(var/x in genetic_conditions) - target.add_genetic_condition(x, duration) - -/spell/targeted/genetic/blind - name = "Blind" - desc = "This spell inflicts a target with temporary blindness. Does not require wizard garb." - feedback = "BD" - school = "illusion" - duration = 300 - charge_max = 300 - spell_flags = 0 - invocation = "Sty Kaly." - invocation_type = SpI_WHISPER - message = "Your eyes cry out in pain!" - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 3) - cooldown_min = 50 - range = 7 - max_targets = 0 - amt_eye_blind = 10 - amt_eye_blurry = 20 - hud_state = "wiz_blind" - cast_sound = 'sound/magic/blind.ogg' - genetic_conditions = list(GENE_COND_BLINDED) - -/spell/targeted/genetic/blind/empower_spell() - if(!..()) - return 0 - duration += 10 SECONDS - return "[src] will now blind for a longer period of time." - -/spell/targeted/genetic/blind/hysteria - name = "Hysteria" - desc = "A spell used to make someone look like a blind fool, and also makes them a blind fool." - feedback = "HY" - school = "illusion" - spell_flags = SELECTABLE - charge_max = 600 - invocation_type = SpI_SHOUT - invocation = "Sty Di Kaly!" - amt_dizziness = 10 - hud_state = "hysteria" - -/spell/targeted/genetic/blind/starburst - name = "Starburst" - desc = "Send a jolt of electricity through everyone's nerve center, blinding and stunning them." - feedback = "SB" - school = "transmutation" - invocation = "Tid Caeh Yor!" - spell_flags = NOFACTION - invocation_type = SpI_SHOUT - charge_max = 60 SECONDS - spell_flags = 0 - amt_dizziness = 0 - amt_eye_blurry = 5 - amt_stunned = 1 - effect_state = "electricity_constant" - effect_duration = 5 - hud_state = "wiz_starburst" diff --git a/code/modules/spells/targeted/glimpse_of_eternity.dm b/code/modules/spells/targeted/glimpse_of_eternity.dm deleted file mode 100644 index a4d783245ab..00000000000 --- a/code/modules/spells/targeted/glimpse_of_eternity.dm +++ /dev/null @@ -1,26 +0,0 @@ -/spell/targeted/glimpse_of_eternity - name = "Glimpse of Eternity" - desc = "Show the non-believers what enlightenment truely means." - feedback = "GE" - school = "illusion" - invocation = "Ghe Tar Yet!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - max_targets = 0 - charge_max = 400 - range = 3 - - hud_state = "wiz_glimpse" - -/spell/targeted/glimpse_of_eternity/cast(var/list/targets, var/mob/user) - for(var/t in targets) - var/mob/living/L = t - if(L.faction != user.faction) //Worse for non-allies - SET_STATUS_MAX(L, STAT_BLIND, 5) - SET_STATUS_MAX(L, STAT_STUN, 5) - new /obj/effect/temporary(get_turf(L), 5, 'icons/effects/effects.dmi', "electricity_constant") - else - SET_STATUS_MAX(L, STAT_BLIND, 2) - L.heal_damage(BRUTE, 10, do_update_health = FALSE) - L.heal_damage(BURN, 10) - new /obj/effect/temporary(get_turf(L), 5, 'icons/effects/effects.dmi', "green_sparkles") \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/dumbfire.dm b/code/modules/spells/targeted/projectile/dumbfire.dm deleted file mode 100644 index 491a5f00f99..00000000000 --- a/code/modules/spells/targeted/projectile/dumbfire.dm +++ /dev/null @@ -1,13 +0,0 @@ -/spell/targeted/projectile/dumbfire - selection_type = "range" - -/spell/targeted/projectile/dumbfire/choose_targets(mob/user = usr) - var/list/targets = list() - - var/starting_dir = user.dir //where are we facing at the time of casting? - var/turf/starting_turf = get_turf(user) - var/current_turf = starting_turf - for(var/i = 1; i <= src.range; i++) - current_turf = get_step(current_turf, starting_dir) - targets += current_turf - return targets \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/fireball.dm b/code/modules/spells/targeted/projectile/fireball.dm deleted file mode 100644 index ef65dc885f7..00000000000 --- a/code/modules/spells/targeted/projectile/fireball.dm +++ /dev/null @@ -1,66 +0,0 @@ -/spell/targeted/projectile/dumbfire/fireball - name = "Fireball" - desc = "A classic spell, grants you the ability to throw an exploding ball of flame in any direction. Does not require wizard garb." - feedback = "FB" - proj_type = /obj/item/projectile/spell_projectile/fireball - - school = "conjuration" - charge_max = 10 SECONDS - spell_flags = 0 - invocation = "Oni-Soma!" - invocation_type = SpI_SHOUT - range = 20 - - level_max = list(Sp_TOTAL = 5, Sp_SPEED = 0, Sp_POWER = 5) - - duration = 20 - proj_step_delay = 1 - - amt_dam_brute = 20 - amt_dam_fire = 25 - - var/ex_severe = -1 - var/ex_heavy = 1 - var/ex_light = 2 - var/ex_flash = 5 - - hud_state = "wiz_fireball" - cast_sound = 'sound/magic/fireball.ogg' - -/spell/targeted/projectile/dumbfire/fireball/prox_cast(var/list/targets, spell_holder) - for(var/mob/living/M in targets) - apply_spell_damage(M) - explosion(get_turf(spell_holder), ex_severe, ex_heavy, ex_light, ex_flash) - -/spell/targeted/projectile/dumbfire/fireball/empower_spell() - if(!..()) - return 0 - - if(spell_levels[Sp_POWER]%2 == 1) - ex_severe++ - ex_heavy++ - ex_light++ - ex_flash++ - - return "The spell [src] now has a larger explosion." - -//PROJECTILE - -/obj/item/projectile/spell_projectile/fireball - name = "fireball" - icon_state = "fireball" - -/spell/targeted/projectile/dumbfire/fireball/firebolt - name = "Firebolt" - desc = "A quick-casted fireball. Burns the user, and their enemies, but is much faster to shoot." - feedback = "FO" - charge_type = Sp_HOLDVAR - invocation = "Ignus!" - holder_var_type = "fireloss" - holder_var_amount = 10 - amt_dam_brute = 10 - amt_dam_fire = 15 - ex_heavy = -1 - ex_light = 1 - ex_flash = 3 - hud_state = "firebolt" \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/magic_missile.dm b/code/modules/spells/targeted/projectile/magic_missile.dm deleted file mode 100644 index 1d72399718a..00000000000 --- a/code/modules/spells/targeted/projectile/magic_missile.dm +++ /dev/null @@ -1,56 +0,0 @@ -/spell/targeted/projectile/magic_missile - name = "Magic Missile" - desc = "This spell fires several, slow moving, magic projectiles at nearby targets." - feedback = "MM" - school = "conjuration" - charge_max = 150 - spell_flags = NEEDSCLOTHES - invocation = "Forti Gy-Ama!" - invocation_type = SpI_SHOUT - range = 7 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 3) - cooldown_min = 90 //15 deciseconds reduction per rank - - max_targets = 0 - - proj_type = /obj/item/projectile/spell_projectile/seeking/magic_missile - duration = 10 - proj_step_delay = 5 - - hud_state = "wiz_mm" - cast_sound = 'sound/magic/magic_missile.ogg' - amt_paralysis = 3 - amt_stunned = 3 - - amt_dam_fire = 10 - -/spell/targeted/projectile/magic_missile/prox_cast(var/list/targets, atom/spell_holder) - spell_holder.visible_message("\The [spell_holder] pops with a flash!") - playsound(src, 'sound/magic/mm_hit.ogg', 40) - for(var/mob/living/M in targets) - apply_spell_damage(M) - return - -/spell/targeted/projectile/magic_missile/empower_spell() - if(!..()) - return 0 - - if(spell_levels[Sp_POWER] == level_max[Sp_POWER]) - amt_paralysis += 2 - amt_stunned += 2 - return "[src] will now stun people for a longer duration." - amt_dam_fire += 5 - - return "[src] does more damage now." - - - -//PROJECTILE - -/obj/item/projectile/spell_projectile/seeking/magic_missile - name = "magic missile" - icon_state = "magicm" - - proj_trail = 1 - proj_trail_lifespan = 5 - proj_trail_icon_state = "magicmd" diff --git a/code/modules/spells/targeted/projectile/passage.dm b/code/modules/spells/targeted/projectile/passage.dm deleted file mode 100644 index b99e147bee2..00000000000 --- a/code/modules/spells/targeted/projectile/passage.dm +++ /dev/null @@ -1,46 +0,0 @@ -/spell/targeted/projectile/dumbfire/passage - name = "Passage" - desc = "throw a spell towards an area and teleport to it." - feedback = "PA" - proj_type = /obj/item/projectile/spell_projectile/passage - - - school = "conjuration" - charge_max = 250 - invocation = "A'YASAMA" - invocation_type = SpI_SHOUT - range = 15 - - - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - spell_flags = NEEDSCLOTHES - duration = 15 - - proj_step_delay = 1 - - hud_state = "gen_project" - cast_sound = 'sound/magic/lightning_bolt.ogg' - -/spell/targeted/projectile/dumbfire/passage/prox_cast(var/list/targets, atom/spell_holder) - for(var/mob/living/L in targets) - apply_spell_damage(L) - - var/turf/T = get_turf(spell_holder) - - holder.forceMove(T) - var/datum/effect/effect/system/smoke_spread/S = new /datum/effect/effect/system/smoke_spread() - S.set_up(3,0,T) - S.start() - playsound(src, 'sound/magic/lightningshock.ogg', 50) - -/spell/targeted/projectile/dumbfire/passage/empower_spell() - if(!..()) - return 0 - - amt_stunned += 3 - - return "[src] now stuns those who get hit by it." - -/obj/item/projectile/spell_projectile/passage - name = "spell" - icon_state = "energy2" \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/projectile.dm b/code/modules/spells/targeted/projectile/projectile.dm deleted file mode 100644 index 6df791094be..00000000000 --- a/code/modules/spells/targeted/projectile/projectile.dm +++ /dev/null @@ -1,45 +0,0 @@ -/* -Projectile spells make special projectiles (obj/item/spell_projectile) and fire them at targets -Dumbfire projectile spells fire directly ahead of the user -spell_projectiles call their spell's (carried) prox_cast when they get in range of a target -If the spell_projectile is seeking, it will update its target every process and follow them -*/ - -/spell/targeted/projectile - range = 7 - var/proj_type = /obj/item/projectile/spell_projectile //use these. They are very nice - var/proj_step_delay = 1 //lower = faster - var/cast_prox_range = 1 - -/spell/targeted/projectile/cast(list/targets, mob/user = usr) - for(var/atom/target in targets) - var/obj/item/projectile/projectile = new proj_type(user.loc, user.dir) - - if(!projectile) - return - - if(istype(projectile, /obj/item/projectile/spell_projectile)) - var/obj/item/projectile/spell_projectile/SP = projectile - SP.carried = src //casting is magical - projectile.original = target - projectile.starting = get_turf(user) - projectile.shot_from = user //fired from the user - projectile.current = projectile.original - projectile.yo = target.y - user.y - projectile.xo = target.x - user.x - projectile.life_span = src.duration - projectile.hitscan = !proj_step_delay - projectile.step_delay = proj_step_delay - projectile.launch(target) - return - -/spell/targeted/projectile/proc/choose_prox_targets(mob/user = usr, var/atom/movable/spell_holder) - var/list/targets = list() - for(var/mob/living/M in range(spell_holder, cast_prox_range)) - if(M == user && !(spell_flags & INCLUDEUSER)) - continue - targets += M - return targets - -/spell/targeted/projectile/proc/prox_cast(var/list/targets, var/atom/movable/spell_holder) - return targets \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/stuncuff.dm b/code/modules/spells/targeted/projectile/stuncuff.dm deleted file mode 100644 index 52046381588..00000000000 --- a/code/modules/spells/targeted/projectile/stuncuff.dm +++ /dev/null @@ -1,47 +0,0 @@ -/spell/targeted/projectile/dumbfire/stuncuff - name = "Stun Cuff" - desc = "This spell fires out a small curse that stuns and cuffs the target." - feedback = "SC" - proj_type = /obj/item/projectile/spell_projectile/stuncuff - - charge_type = Sp_CHARGES - charge_max = 6 - charge_counter = 6 - spell_flags = 0 - invocation = "Fu'Reai Diakan!" - invocation_type = SpI_SHOUT - range = 20 - - level_max = list(Sp_TOTAL = 0, Sp_SPEED = 0, Sp_POWER = 0) - - duration = 20 - proj_step_delay = 1 - - amt_stunned = 6 - - hud_state = "wiz_cuff" - cast_sound = 'sound/magic/wandodeath.ogg' - -/spell/targeted/projectile/dumbfire/stuncuff/prox_cast(var/list/targets, spell_holder) - for(var/mob/living/M in targets) - if(ishuman(M)) - var/mob/living/human/H = M - var/obj/item/handcuffs/wizard/cuffs = new() - H.equip_to_slot(cuffs, slot_handcuffed_str) - H.visible_message("Beams of light form around \the [H]'s hands!") - apply_spell_damage(M) - - -/obj/item/handcuffs/wizard - name = "beams of light" - desc = "Undescribable and unpenetrable. Or so they say." - - breakouttime = 300 //30 seconds - -/obj/item/handcuffs/wizard/dropped(var/mob/user) - ..() - qdel(src) - -/obj/item/projectile/spell_projectile/stuncuff - name = "stuncuff" - icon_state = "spell" \ No newline at end of file diff --git a/code/modules/spells/targeted/shapeshift.dm b/code/modules/spells/targeted/shapeshift.dm deleted file mode 100644 index ae5de55a0f7..00000000000 --- a/code/modules/spells/targeted/shapeshift.dm +++ /dev/null @@ -1,203 +0,0 @@ -//basic transformation spell. Should work for most simple_animals - -/spell/targeted/shapeshift - name = "Shapeshift" - desc = "This spell transforms the target into something else for a short while." - - school = "transmutation" - - charge_type = Sp_RECHARGE - charge_max = 600 - - duration = 0 //set to 0 for permanent. - - var/list/possible_transformations = list() - var/list/newVars = list() //what the variables of the new created thing will be. - - cast_sound = 'sound/magic/charge.ogg' - var/revert_sound = 'sound/magic/charge.ogg' //the sound that plays when something gets turned back. - var/share_damage = 1 //do we want the damage we take from our new form to move onto our real one? (Only counts for finite duration) - var/drop_items = 1 //do we want to drop all our items when we transform? - var/toggle = 0 //Can we toggle this? - var/list/transformed_dudes = list() //Who we transformed. Transformed = Transformation. Both mobs. - -/spell/targeted/shapeshift/cast(var/list/targets, mob/user) - for(var/m in targets) - var/mob/living/M = m - if(M.stat == DEAD) - to_chat(user, "[name] can only transform living targets.") - continue - if(M.buckled) - M.buckled.unbuckle_mob() - if(toggle && transformed_dudes.len && stop_transformation(M)) - continue - var/new_mob = pick(possible_transformations) - - var/mob/living/trans = new new_mob(get_turf(M)) - for(var/varName in newVars) //stolen shamelessly from Conjure - if(varName in trans.vars) - trans.vars[varName] = newVars[varName] - //Give them our languages - for(var/decl/language/lang as anything in M.languages) - trans.add_language(lang.type) - - trans.SetName("[trans.name] ([M])") - if(ishuman(M) && drop_items) - for(var/obj/item/I in M.contents) - M.drop_from_inventory(I) - if(M.mind) - M.mind.transfer_to(trans) - else - trans.key = M.key - new /obj/effect/temporary(get_turf(M), 5, 'icons/effects/effects.dmi', "summoning") - - M.forceMove(trans) //move inside the new dude to hide him. - M.status_flags |= GODMODE //dont want him to die or breathe or do ANYTHING - transformed_dudes[trans] = M - events_repository.register(/decl/observ/death, trans,src, TYPE_PROC_REF(/spell/targeted/shapeshift, stop_transformation)) - events_repository.register(/decl/observ/destroyed, trans,src, TYPE_PROC_REF(/spell/targeted/shapeshift, stop_transformation)) - events_repository.register(/decl/observ/destroyed, M, src, TYPE_PROC_REF(/spell/targeted/shapeshift, destroyed_transformer)) - if(duration) - spawn(duration) - stop_transformation(trans) - -/spell/targeted/shapeshift/proc/destroyed_transformer(var/mob/target) //Juuuuust in case - var/mob/current = transformed_dudes[target] - to_chat(current, "You suddenly feel as if this transformation has become permanent...") - remove_target(target) - -/spell/targeted/shapeshift/proc/stop_transformation(var/mob/living/target) - var/mob/living/transformer = transformed_dudes[target] - if(!transformer) - return FALSE - transformer.status_flags &= ~GODMODE - if(share_damage) - var/transformer_max_health = transformer.get_max_health() - var/damage = transformer.set_max_health(transformer_max_health-round(transformer_max_health*(transformer.get_health_ratio()))) - for(var/i in 1 to ceil(damage/10)) - transformer.take_damage(10) - if(target.mind) - target.mind.transfer_to(transformer) - else - transformer.key = target.key - playsound(get_turf(target), revert_sound, 50, 1) - transformer.forceMove(get_turf(target)) - remove_target(target) - qdel(target) - return TRUE - -/spell/targeted/shapeshift/proc/remove_target(var/mob/living/target) - var/mob/current = transformed_dudes[target] - events_repository.unregister(/decl/observ/destroyed, target,src) - events_repository.unregister(/decl/observ/death, current,src) - events_repository.unregister(/decl/observ/destroyed, current,src) - transformed_dudes[target] = null - transformed_dudes -= target - -/spell/targeted/shapeshift/baleful_polymorph - name = "Baleful Polymorth" - desc = "This spell transforms its target into a small, furry animal." - feedback = "BP" - possible_transformations = list( - /mob/living/simple_animal/lizard, - /mob/living/simple_animal/passive/mouse, - /mob/living/simple_animal/passive/mouse/rat, - /mob/living/simple_animal/corgi - ) - - share_damage = 0 - invocation = "Yo'balada!" - invocation_type = SpI_SHOUT - spell_flags = NEEDSCLOTHES | SELECTABLE - range = 3 - duration = 150 //15 seconds. - cooldown_min = 200 //20 seconds - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - - newVars = list("health" = 50, "max_health" = 50) - - hud_state = "wiz_poly" - - -/spell/targeted/shapeshift/baleful_polymorph/empower_spell() - if(!..()) - return 0 - - duration += 50 - - return "Your target will now stay in their polymorphed form for [duration/10] seconds." - -/spell/targeted/shapeshift/avian - name = "Polymorph" - desc = "This spell transforms the wizard into the common parrot." - feedback = "AV" - possible_transformations = list(/mob/living/simple_animal/hostile/parrot) - - drop_items = 0 - share_damage = 0 - invocation = "Poli'crakata!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - range = -1 - duration = 150 - charge_max = 600 - cooldown_min = 300 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 0) - hud_state = "wiz_parrot" - -/spell/targeted/shapeshift/corrupt_form - name = "Corrupt Form" - desc = "This spell shapes the wizard into a terrible, terrible beast." - feedback = "CF" - possible_transformations = list(/mob/living/simple_animal/hostile/revenant) - - invocation = "mutters something dark and twisted as their form begins to twist..." - invocation_type = SpI_EMOTE - spell_flags = INCLUDEUSER - range = -1 - duration = 150 - charge_max = 1200 - cooldown_min = 600 - - drop_items = 0 - share_damage = 0 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 2) - - newVars = list("name" = "corrupted soul") - - hud_state = "wiz_corrupt" - cast_sound = 'sound/magic/disintegrate.ogg' - -/spell/targeted/shapeshift/corrupt_form/empower_spell() - if(!..()) - return 0 - - switch(spell_levels[Sp_POWER]) - if(1) - duration *= 2 - return "You will now stay corrupted for [duration/10] seconds." - if(2) - newVars = list("name" = "\proper corruption incarnate", - "melee_damage_upper" = 25, - "resistance" = 6, - "health" = 125, - "max_health" = 125) - duration = 0 - return "You revel in the corruption. There is no turning back." - -/spell/targeted/shapeshift/familiar - name = "Transform" - desc = "Transform into a familiar form. Literally." - feedback = "FA" - possible_transformations = list() - drop_items = 0 - invocation_type = SpI_EMOTE - invocation = "'s body dissipates into a pale mass of light, then reshapes!" - range = -1 - spell_flags = INCLUDEUSER - duration = 0 - charge_max = 2 MINUTES - toggle = 1 - - hud_state = "wiz_carp" \ No newline at end of file diff --git a/code/modules/spells/targeted/shatter_mind.dm b/code/modules/spells/targeted/shatter_mind.dm deleted file mode 100644 index f84d6765035..00000000000 --- a/code/modules/spells/targeted/shatter_mind.dm +++ /dev/null @@ -1,29 +0,0 @@ -/spell/targeted/shatter - name = "Shatter Mind" - desc = "Assaults the mind of the target with fear of the unknown, shattering their sanity and causing brain damage." - feedback = "SM" - school = "illusion" - charge_max = 300 - spell_flags = 0 - invocation_type = SpI_NONE - range = 5 - max_targets = 1 - compatible_mobs = list(/mob/living/human) - - time_between_channels = 150 - number_of_channels = 0 - - hud_state = "wiz_statue" - -/spell/targeted/shatter/cast(var/list/targets, var/mob/user) - var/mob/living/human/H = targets[1] - if(prob(50)) - sound_to(user, get_sfx("swing_hit")) - if(prob(5)) - to_chat(H, "You feel unhinged.") - H.adjust_hallucination(5,5) - ADJ_STATUS(H, STAT_CONFUSE, 2) - ADJ_STATUS(H, STAT_DIZZY, 2) - if(H.hallucination_power > 50) - H.take_damage(5, BRAIN) - to_chat(H, "You feel your mind tearing apart!") \ No newline at end of file diff --git a/code/modules/spells/targeted/shift.dm b/code/modules/spells/targeted/shift.dm index 2b53b60d244..2bcc684939a 100644 --- a/code/modules/spells/targeted/shift.dm +++ b/code/modules/spells/targeted/shift.dm @@ -21,4 +21,4 @@ flick("phase_shift2",animation) /spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc) - return \ No newline at end of file + return diff --git a/code/modules/spells/targeted/subjugate.dm b/code/modules/spells/targeted/subjugate.dm deleted file mode 100644 index 700dac35b36..00000000000 --- a/code/modules/spells/targeted/subjugate.dm +++ /dev/null @@ -1,35 +0,0 @@ -/spell/targeted/subjugation - name = "Subjugation" - desc = "This spell temporarily subjugates a target's mind and does not require wizard garb." - feedback = "SJ" - school = "illusion" - charge_max = 500 - spell_flags = NOFACTION - invocation = "Dii Oda Baji." - invocation_type = SpI_WHISPER - - message = "You suddenly feel completely overwhelmed!" - - max_targets = 1 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 0, Sp_POWER = 3) - - amt_dizziness = 100 - amt_confused = 100 - amt_stuttering = 100 - - compatible_mobs = list(/mob/living/human) - - hud_state = "wiz_subj" - -/spell/targeted/subjugation/empower_spell() - if(!..()) - return 0 - - if(spell_levels[Sp_POWER] == level_max[Sp_POWER]) - max_targets = 0 - - return "[src] will now effect everyone in the area." - else - max_targets++ - return "[src] will now effect [max_targets] people." \ No newline at end of file diff --git a/code/modules/spells/targeted/swap.dm b/code/modules/spells/targeted/swap.dm deleted file mode 100644 index 150bd903077..00000000000 --- a/code/modules/spells/targeted/swap.dm +++ /dev/null @@ -1,41 +0,0 @@ -/spell/targeted/swap - name = "swap" - desc = "This spell swaps the positions of the wizard and a target. Causes brain damage." - feedback = "SW" - school = "conjuration" - - charge_type = Sp_HOLDVAR - holder_var_type = "brainloss" - holder_var_amount = 10 - - invocation = "Joyo!" - invocation_type = SpI_WHISPER - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 0, Sp_POWER = 2) - - spell_flags = Z2NOCAST - range = 6 - max_targets = 1 - compatible_mobs = list(/mob/living) - - hud_state = "wiz_swap" - - cast_sound = 'sound/magic/mandswap.ogg' - -/spell/targeted/swap/cast(var/list/targets, mob/user) - for(var/mob/T in targets) - var/turf/aT = get_turf(T) - var/turf/bT = get_turf(user) - - T.forceMove(bT) - user.forceMove(aT) - - apply_spell_damage(T) - -/spell/targeted/swap/empower_spell() - if(!..()) - return 0 - - amt_eye_blind += 2 - - return "This spell will now blind the target." diff --git a/code/modules/spells/targeted/targeted.dm b/code/modules/spells/targeted/targeted.dm index 46e6e242b26..733bbf1e540 100644 --- a/code/modules/spells/targeted/targeted.dm +++ b/code/modules/spells/targeted/targeted.dm @@ -3,7 +3,6 @@ Targeted spells (with the exception of dumbfire) select from all the mobs in the Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are explained in setup.dm */ - /spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob var/max_targets = 1 //leave 0 for unlimited targets in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast @@ -62,10 +61,6 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp for(var/mob/living/M in starting_targets) if(!(spell_flags & INCLUDEUSER) && M == user) continue - if((spell_flags & NOFACTION) && user.faction == M.faction) - continue - if((spell_flags & NONONFACTION) && user.faction != M.faction) - continue if(compatible_mobs && compatible_mobs.len) if(!is_type_in_list(M, compatible_mobs)) continue if(compatible_mobs && compatible_mobs.len && !is_type_in_list(M, compatible_mobs)) @@ -73,12 +68,7 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp possible_targets += M if(possible_targets.len) - if(spell_flags & SELECTABLE) //if we are allowed to choose. see setup.dm for details - var/mob/temp_target = input(user, "Choose the target for the spell.", "Targeting") as null|mob in possible_targets - if(temp_target) - targets += temp_target - else - targets += pick(possible_targets) + targets += pick(possible_targets) //Adds a safety check post-input to make sure those targets are actually in range. @@ -98,28 +88,15 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp continue possible_targets += target - if(spell_flags & SELECTABLE) - for(var/i = 1; i<=max_targets, i++) - if(!possible_targets.len) - break - var/mob/M = input(user, "Choose the target for the spell.", "Targeting") as null|mob in possible_targets - if(!M) - break - if(range != -2) - if(!(M in view_or_range(range, holder, selection_type))) - continue - targets += M - possible_targets -= M - else - for(var/i=1,i<=max_targets,i++) - if(!possible_targets.len) - break - if(target_ignore_prev) - var/target = pick(possible_targets) - possible_targets -= target - targets += target - else - targets += pick(possible_targets) + for(var/i=1,i<=max_targets,i++) + if(!possible_targets.len) + break + if(target_ignore_prev) + var/target = pick(possible_targets) + possible_targets -= target + targets += target + else + targets += pick(possible_targets) if(!(spell_flags & INCLUDEUSER) && (user in targets)) targets -= user @@ -172,4 +149,4 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp ADJ_STATUS(target, STAT_STUTTER, amt_stuttering) if(effect_state) var/obj/o = new /obj/effect/temporary(get_turf(target), effect_duration, 'icons/effects/effects.dmi', effect_state) - o.color = effect_color \ No newline at end of file + o.color = effect_color diff --git a/code/modules/spells/targeted/torment.dm b/code/modules/spells/targeted/torment.dm deleted file mode 100644 index e98836699f3..00000000000 --- a/code/modules/spells/targeted/torment.dm +++ /dev/null @@ -1,34 +0,0 @@ -/spell/targeted/torment - name = "Torment" - desc = "Darkness stabs at the bodies of those around you. All within a medium range will suffer significant pain." - feedback = "TM" - school = "illusion" - charge_max = 150 - spell_flags = NOFACTION - invocation = "Rai Di-Kaal!" - invocation_type = SpI_SHOUT - range = 5 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - cooldown_min = 50 - message = "So much pain! All you can hear is screaming!" - - max_targets = 0 - compatible_mobs = list(/mob/living/human) - - var/loss = 30 - - hud_state = "wiz_horse" - cast_sound = 'sound/magic/cowhead_curse.ogg' - -/spell/targeted/torment/cast(var/list/targets, var/mob/user) - user.spawn_gibber() - for(var/mob/living/human/H in targets) - H.take_damage(loss, PAIN) - -/spell/targeted/torment/empower_spell() - if(!..()) - return 0 - - loss += 30 - - return "[src] will now cause more pain." \ No newline at end of file diff --git a/config/example/configuration.txt b/config/example/configuration.txt index 13bfd6b1c6d..2c603dbfd79 100644 --- a/config/example/configuration.txt +++ b/config/example/configuration.txt @@ -345,22 +345,19 @@ ROUNDSTART_LEVEL_GENERATION ## If uncommented, votes can be called to add extra antags to the round. Uncomment to enable. #ALLOW_EXTRA_ANTAGS -## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked. +## Remove the # to make rounds which end instantly continue until the shuttle is called or the station is nuked. ## Malf and Rev will let the shuttle be called when the antags/protags are dead. ## Uncomment to enable. #CONTINUOUS_ROUNDS -## Spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard. Uncomment to enable. -#FEATURE_OBJECT_SPELL_SYSTEM - ## Allowed modes. -#MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","spyvspy","traitor","wizard"] +#MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","spyvspy","traitor"] ## Mode names. -#MODE_NAMES {"calamity":"Calamity","extended":"Extended","mercenary":"Mercenary","wizard":"Wizard","cult":"Cult","heist":"Heist","ninja":"Ninja","revolution":"Revolution","traitor":"Traitor","spyvspy":"Spy v. spy","crossfire":"Crossfire"} +#MODE_NAMES {"calamity":"Calamity","extended":"Extended","mercenary":"Mercenary","cult":"Cult","heist":"Heist","ninja":"Ninja","revolution":"Revolution","traitor":"Traitor","spyvspy":"Spy v. spy","crossfire":"Crossfire"} ## Relative probability of each mode. -#PROBABILITIES {"calamity":0,"extended":1,"mercenary":1,"wizard":1,"cult":1,"heist":0,"ninja":0,"revolution":0,"traitor":0,"spyvspy":0,"crossfire":0} +#PROBABILITIES {"calamity":0,"extended":1,"mercenary":1,"cult":1,"heist":0,"ninja":0,"revolution":0,"traitor":0,"spyvspy":0,"crossfire":0} ## If security is prohibited from being most antagonists. Uncomment to enable. #PROTECT_ROLES_FROM_ANTAGONIST @@ -369,7 +366,7 @@ ROUNDSTART_LEVEL_GENERATION #TRAITOR_SCALING ## A list of modes that should be votable. -#VOTABLE_MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","secret","spyvspy","traitor","wizard"] +#VOTABLE_MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","secret","spyvspy","traitor"] ## # PROTECTED @@ -377,13 +374,13 @@ ROUNDSTART_LEVEL_GENERATION ## ## Password used for authorizing external tools that can apply bans. -#BAN_COMMS_PASSWORD +#BAN_COMMS_PASSWORD ## Password used for authorizing ircbot and other external tools. -#COMMS_PASSWORD +#COMMS_PASSWORD ## Export address where external tools that monitor logins are located. -#LOGIN_EXPORT_ADDR +#LOGIN_EXPORT_ADDR ## # RESOURCES @@ -413,7 +410,7 @@ ROUNDSTART_LEVEL_GENERATION #ABANDON_ALLOWED 1 ## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. -#ADMIN_IRC +#ADMIN_IRC ## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. #ADMIN_LEGACY_SYSTEM 1 @@ -431,7 +428,7 @@ ROUNDSTART_LEVEL_GENERATION #AOOC_ALLOWED 1 ## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. -#BANAPPEALS +#BANAPPEALS ## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. #BAN_LEGACY_SYSTEM 1 @@ -452,7 +449,7 @@ ROUNDSTART_LEVEL_GENERATION #DISABLE_WEBHOOK_EMBEDS ## Discord server permanent invite address. -#DISCORDURL +#DISCORDURL ## Comment to disable the dead OOC channel by default. #DOOC_ALLOWED 1 @@ -473,20 +470,20 @@ ROUNDSTART_LEVEL_GENERATION #FORBID_SINGULO_POSSESSION ## Discussion forum address. -#FORUMURL +#FORUMURL ## Defines world FPS. Defaults to 20. ## Can also accept ticklag values (0.9, 0.5, etc) which will automatically be converted to FPS. #FPS 20 ## GitHub address. -#GITHUBURL +#GITHUBURL ## Determines whether or not people without a registered ckey (i.e. guest-*) can connect to your server. Uncomment to enable. #GUESTS_ALLOWED ## Set a hosted by name for UNIX platforms. -#HOSTEDBY +#HOSTEDBY ## Hub visibility: If you want to be visible on the hub, uncomment the below line and be sure that Dream Daemon is set to visible. This can be changed in-round as well with toggle-hub-visibility if Dream Daemon is set correctly. Uncomment to enable. #HUB_VISIBILITY @@ -495,7 +492,7 @@ ROUNDSTART_LEVEL_GENERATION #IRC_BOT_HOST localhost ## GitHub new issue address. -#ISSUEREPORTURL +#ISSUEREPORTURL ## Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments. #JOBS_HAVE_MINIMAL_ACCESS 1 @@ -554,11 +551,11 @@ ROUNDSTART_LEVEL_GENERATION #RESPAWN_DELAY 30 ## Set a server location for world reboot. Don't include the byond://, just give the address and port. -#SERVER +#SERVER ## Set a server URL for the IRC bot to use; like SERVER, don't include the byond:// ## Unlike SERVER, this one shouldn't break auto-reconnect. -#SERVERURL +#SERVERURL ## Server name: This appears at the top of the screen in-game. #SERVER_NAME Nebula 13 @@ -591,7 +588,7 @@ USEALIENWHITELIST #WAIT_FOR_SIGUSR1_REBOOT ## Wiki address. -#WIKIURL +#WIKIURL ## # VOTING diff --git a/maps/antag_spawn/wizard/wizard.dm b/maps/antag_spawn/wizard/wizard.dm deleted file mode 100644 index 4ca75cd145d..00000000000 --- a/maps/antag_spawn/wizard/wizard.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/map_template/ruin/antag_spawn/wizard - name = "Wizard Base" - suffixes = list("wizard/wizard_base.dmm") - apc_test_exempt_areas = list( - /area/map_template/wizard_station = NO_SCRUBBER|NO_VENT|NO_APC - ) - -/area/map_template/wizard_station - name = "\improper Wizard's Den" - icon_state = "yellow" - requires_power = 0 - dynamic_lighting = FALSE - req_access = list(access_wizard) diff --git a/maps/antag_spawn/wizard/wizard_base.dmm b/maps/antag_spawn/wizard/wizard_base.dmm deleted file mode 100644 index abc19fb4422..00000000000 --- a/maps/antag_spawn/wizard/wizard_base.dmm +++ /dev/null @@ -1,1747 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/space/infinity, -/area/space) -"ab" = ( -/turf/unsimulated/wall, -/area/map_template/wizard_station) -"ac" = ( -/obj/structure/table/wood, -/obj/item/backpack/cultpack, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ad" = ( -/turf/unsimulated/wall/fakeglass/alt{ - dir = 8 - }, -/area/map_template/wizard_station) -"ae" = ( -/turf/unsimulated/wall/fakeglass{ - dir = 4 - }, -/area/map_template/wizard_station) -"af" = ( -/obj/structure/table/wood, -/obj/item/backpack/satchel/grey/withwallet, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ag" = ( -/turf/floor/carpet, -/area/map_template/wizard_station) -"ah" = ( -/obj/structure/undies_wardrobe, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ai" = ( -/turf/unsimulated/wall/fakeglass{ - dir = 8 - }, -/area/map_template/wizard_station) -"aj" = ( -/obj/structure/door/wood, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ak" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - on = 0; - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/chems/drinks/flask/barflask, -/turf/floor/carpet, -/area/map_template/wizard_station) -"al" = ( -/obj/structure/table/wood, -/obj/item/dice, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"am" = ( -/obj/structure/bed/padded, -/obj/item/bedsheet/rd, -/turf/floor/carpet, -/area/map_template/wizard_station) -"an" = ( -/obj/structure/table/wood, -/obj/item/dice/d20, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"ao" = ( -/obj/structure/table/wood, -/obj/item/backpack/satchel/grey/withwallet, -/obj/item/clothing/glasses/eyepatch/monocle, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ap" = ( -/mob/living/human/monkey{ - name = "Murphey" - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aq" = ( -/obj/structure/table/wood, -/obj/item/food/chawanmushi, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"ar" = ( -/obj/structure/table/wood, -/obj/abstract/landmark{ - name = "Teleport-Scroll" - }, -/obj/item/toy/figure/ninja, -/turf/floor/carpet, -/area/map_template/wizard_station) -"as" = ( -/obj/structure/table/wood, -/obj/item/megaphone, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"at" = ( -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"au" = ( -/obj/structure/table/wood, -/obj/item/cash/c1, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"av" = ( -/obj/structure/table/wood, -/obj/machinery/chemical_dispenser/bar_soft/full, -/obj/item/radio/intercom/wizard{ - dir = 8; - pixel_x = 22 - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aw" = ( -/obj/machinery/vending/magivend, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"ax" = ( -/obj/structure/bed/chair/wood/wings{ - dir = 8 - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"ay" = ( -/obj/abstract/landmark/start{ - name = "wizard" - }, -/turf/floor/carpet, -/area/map_template/wizard_station) -"az" = ( -/obj/structure/aliumizer, -/turf/floor/carpet, -/area/map_template/wizard_station) -"aA" = ( -/obj/item/radio/intercom/wizard{ - dir = 8; - pixel_x = 22 - }, -/turf/floor/carpet, -/area/map_template/wizard_station) -"aB" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/obj/effect/decal/cleanable/cobweb, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aC" = ( -/obj/structure/bookcase{ - name = "bookcase (Tactics)" - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aD" = ( -/obj/structure/bookcase, -/obj/item/book/manual/nuclear, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aE" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aF" = ( -/turf/unsimulated/wall/fakeglass{ - dir = 1 - }, -/area/map_template/wizard_station) -"aG" = ( -/turf/unsimulated/floor/water, -/area/map_template/wizard_station) -"aH" = ( -/obj/structure/bookcase, -/obj/item/book/manual/robotics_cyborgs, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aI" = ( -/obj/item/bikehorn/rubberducky, -/turf/unsimulated/floor/water, -/area/map_template/wizard_station) -"aJ" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/obj/machinery/acting/changer/mirror{ - pixel_y = 32 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aK" = ( -/obj/structure/hygiene/toilet{ - pixel_y = 8 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aL" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom/wizard{ - dir = 4; - pixel_x = -22 - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aM" = ( -/obj/structure/closet/coffin, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"aN" = ( -/obj/structure/bed/chair/wood/wings{ - dir = 4 - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aO" = ( -/obj/structure/table/wood, -/obj/item/box/cups, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aP" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/red, -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/head/wizard/red, -/obj/item/staff/crystal/beacon, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aQ" = ( -/obj/structure/table/wood, -/obj/item/bag/cash, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aR" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/marisa, -/obj/item/clothing/shoes/sandal/marisa, -/obj/item/clothing/head/wizard/marisa, -/obj/item/staff/broom, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aS" = ( -/obj/structure/table/wood, -/obj/item/box/candles, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aT" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/magusblue, -/obj/item/clothing/head/wizard/magus, -/obj/item/staff/crystal, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aU" = ( -/obj/structure/closet, -/obj/item/chems/drinks/bottle/pwine, -/obj/item/chems/drinks/bottle/agedwhiskey, -/obj/item/chems/drinks/bottle/cognac, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aV" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aW" = ( -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aX" = ( -/obj/structure/door/iron, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aY" = ( -/obj/structure/table/wood, -/obj/item/box/fancy/donut, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aZ" = ( -/obj/structure/door/wood, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"ba" = ( -/obj/structure/door/silver, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"bb" = ( -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bc" = ( -/turf/unsimulated/wall/fakeglass, -/area/map_template/wizard_station) -"bd" = ( -/obj/item/soap, -/turf/unsimulated/floor/water, -/area/map_template/wizard_station) -"be" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/obj/item/radio/intercom/wizard{ - dir = 1; - pixel_y = -30 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"bf" = ( -/obj/structure/hygiene/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 32 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"bg" = ( -/obj/structure/table/wood, -/obj/item/chems/glass/bowl/mapped/meatball, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"bh" = ( -/obj/structure/closet, -/obj/item/clothing/jumpsuit/psysuit, -/obj/item/clothing/suit/wizrobe/psypurple, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bi" = ( -/turf/unsimulated/wall/fakeglass/alt{ - dir = 1 - }, -/area/map_template/wizard_station) -"bj" = ( -/obj/structure/closet, -/obj/item/clothing/shoes/sandal/marisa{ - desc = "A set of fancy shoes that are as functional as they are comfortable."; - name = "Gentlemans Shoes" - }, -/obj/item/clothing/shirt/button/black, -/obj/item/clothing/suit/jacket/vest/gray, -/obj/item/clothing/suit/wizrobe/gentlecoat, -/obj/item/clothing/head/wizard/cap, -/obj/item/cane/fancy, -/obj/item/radio/intercom/wizard{ - dir = 1; - pixel_y = -30 - }, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bk" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/magusred, -/obj/item/clothing/head/wizard/magus, -/obj/item/staff/crystal/beacon, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bl" = ( -/obj/structure/closet, -/obj/item/briefcase, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bm" = ( -/obj/structure/bookcase, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"bn" = ( -/obj/item/radio/intercom/wizard{ - dir = 1; - pixel_y = -30 - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"bo" = ( -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bp" = ( -/obj/item/radio/intercom/wizard{ - pixel_y = 20 - }, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bq" = ( -/obj/structure/fake_pylon, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"br" = ( -/obj/structure/meat_hook, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bs" = ( -/obj/item/remains/human, -/turf/unsimulated/floor/lava, -/area/map_template/wizard_station) -"bt" = ( -/turf/unsimulated/floor/lava, -/area/map_template/wizard_station) -"bu" = ( -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bv" = ( -/obj/structure/flora/bush/fullgrass, -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bw" = ( -/mob/living/simple_animal/hostile/creature{ - name = "Experiment 35b" - }, -/turf/unsimulated/floor/lava, -/area/map_template/wizard_station) -"bx" = ( -/obj/structure/talisman_altar, -/obj/item/knife/ritual, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"by" = ( -/obj/structure/table/wood, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bz" = ( -/obj/effect/gateway/active/spooky, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bA" = ( -/obj/structure/table/marble, -/obj/item/flashlight/slime, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bB" = ( -/mob/living/simple_animal/hostile/goat{ - name = "Experiment 97d" - }, -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bC" = ( -/obj/structure/flora/bush/grassybush, -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bD" = ( -/obj/structure/flora/pottedplant/unusual, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bE" = ( -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) -"bF" = ( -/obj/effect/overlay/palmtree_r, -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) -"bG" = ( -/mob/living/simple_animal/crab{ - name = "Experiment 68a" - }, -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) -"bH" = ( -/obj/effect/overlay/coconut, -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(6,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(7,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(8,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aF -bi -bc -ab -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aG -aG -bd -ab -aa -aa -aa -aa -aa -aa -aa -ab -bs -bt -bt -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aI -aG -aG -ab -aa -aa -aa -aa -aa -aa -aa -ab -bt -bt -bt -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aJ -aV -be -ab -aa -aa -aa -aa -aa -aa -aa -ab -bt -bw -bt -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(12,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aK -aW -bf -ab -aa -aa -aa -aa -aa -aa -aa -ab -bt -bt -bs -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aX -ab -ab -ab -aa -aa -aa -aa -aa -ab -ab -aF -bi -bc -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aE -aL -at -aw -aD -ab -ab -aa -aa -aa -ab -ab -bq -bo -bx -bo -bq -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(15,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -aB -at -at -at -at -at -bm -ab -aF -bi -bc -ab -aM -bo -bo -bo -bo -bo -bD -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -ai -ak -ar -ac -af -ab -al -at -aN -as -aN -at -aQ -ab -at -at -bn -ab -bo -bo -ai -ab -ai -bo -bo -ai -bE -bE -bE -bH -ab -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -ad -am -ay -ag -ag -aj -at -at -aq -aY -bg -at -at -ba -at -at -at -ba -bo -bo -ad -bz -ad -bo -by -ad -bE -bE -bG -bE -ab -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -ae -ao -az -aA -ah -ab -an -ap -ax -au -ax -at -aS -ab -at -at -at -ab -bp -bo -ae -ab -ae -bo -bo -ae -bE -bF -bE -bE -ab -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -aC -at -at -at -at -at -bm -ab -aF -bi -bc -ab -aM -bo -bo -bo -bo -bo -bD -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aC -aO -at -av -aH -ab -ab -aa -aa -aa -ab -ab -br -bo -bA -bo -br -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aZ -ab -ab -ab -aa -aa -aa -aa -aa -ab -ab -aF -bi -bc -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aP -bb -bh -ab -aa -aa -aa -aa -aa -aa -aa -ab -bu -bu -bC -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aR -bb -bj -ab -aa -aa -aa -aa -aa -aa -aa -ab -bu -bu -bu -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aT -bb -bk -ab -aa -aa -aa -aa -aa -aa -aa -ab -bu -bB -bu -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aU -bb -bl -ab -aa -aa -aa -aa -aa -aa -aa -ab -bv -bu -bu -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aF -bi -bc -ab -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/mods/content/corporate/items/stamps.dm b/mods/content/corporate/items/stamps.dm index cfc6df4dbbf..35b35829728 100644 --- a/mods/content/corporate/items/stamps.dm +++ b/mods/content/corporate/items/stamps.dm @@ -4,7 +4,7 @@ /obj/item/stamp/hop name = "head of personnel's rubber stamp" - icon = 'icons/obj/items/stamps/stamp_xo.dmi' + icon = 'icons/obj/items/stamps/stamp_cap.dmi' /obj/item/stamp/ce name = "chief engineer's rubber stamp" @@ -32,7 +32,7 @@ /obj/item/stamp/ward name = "warden's rubber stamp" - icon = 'icons/obj/items/stamps/stamp_cos.dmi' + icon = 'icons/obj/items/stamps/stamp_brig.dmi' /obj/item/stamp/internalaffairs name = "internal affairs' rubber stamp" diff --git a/mods/content/psionics/_psionics.dme b/mods/content/psionics/_psionics.dme index 7bf5f2f680d..df5544cffe1 100644 --- a/mods/content/psionics/_psionics.dme +++ b/mods/content/psionics/_psionics.dme @@ -17,6 +17,7 @@ #include "items\_items.dm" #include "items\brain.dm" #include "items\cerebro_enhancers.dm" +#include "items\clothing.dm" #include "items\coffee_cup.dm" #include "items\foundation_implanter.dm" #include "items\foundation_labcoat.dm" diff --git a/mods/content/psionics/datum/antagonists/paramount.dm b/mods/content/psionics/datum/antagonists/paramount.dm index 5d4da1a8775..d00ab6c5c97 100644 --- a/mods/content/psionics/datum/antagonists/paramount.dm +++ b/mods/content/psionics/datum/antagonists/paramount.dm @@ -17,7 +17,7 @@ name = "Special Role - Paramount Grandmaster" head = /obj/item/clothing/head/helmet/space/psi_amp uniform = /obj/item/clothing/jumpsuit/psysuit - suit = /obj/item/clothing/suit/wizrobe/psypurple + suit = /obj/item/clothing/suit/paramount shoes = /obj/item/clothing/shoes/jackboots back = /obj/item/backpack/satchel gloves = /obj/item/clothing/gloves/grey diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index c19db16e091..1bc713de0eb 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -1,6 +1,5 @@ /decl/material/liquid/crystal_agent/do_material_check(var/mob/living/M) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - . = (M.get_ability_handler(/datum/ability_handler/psionics) || (M.mind && wizards.is_antagonist(M.mind))) ? /decl/material/nullglass : ..() + . = !!M.get_ability_handler(/datum/ability_handler/psionics) ? /decl/material/nullglass : ..() /decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/M, total_dose) ..() @@ -13,15 +12,12 @@ required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) result_amount = 1 -// TODO: #if defined(GAMEMODE_PACK_CULT) && defined(GAMEMODE_PACK_WIZARD) -// once wizard is modpacked #ifdef GAMEMODE_PACK_CULT /decl/chemical_reaction/synthesis/nullglass/get_alternate_reaction_indicator(var/datum/reagents/holder) var/list/blood_data = REAGENT_DATA(holder, /decl/material/liquid/blood) var/weakref/donor_ref = LAZYACCESS(blood_data, DATA_BLOOD_DONOR) var/mob/living/donor = donor_ref?.resolve() - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - . = (istype(donor) && (!!donor.get_ability_handler(/datum/ability_handler/psionics) || (donor.mind && wizards.is_antagonist(donor.mind)))) + . = istype(donor) && !!donor.get_ability_handler(/datum/ability_handler/psionics) #endif /decl/chemical_reaction/synthesis/nullglass/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) diff --git a/mods/content/psionics/items/clothing.dm b/mods/content/psionics/items/clothing.dm new file mode 100644 index 00000000000..32e5786c244 --- /dev/null +++ b/mods/content/psionics/items/clothing.dm @@ -0,0 +1,16 @@ +/obj/item/clothing/suit/paramount + name = "purple robes" + desc = "Heavy, royal purple robes threaded with psychic amplifiers and weird, bulbous lenses. Do not machine wash." + icon = 'icons/clothing/suits/wizard/psy.dmi' + gender = PLURAL + permeability_coefficient = 0.01 + armor = list( + ARMOR_MELEE = ARMOR_MELEE_RESISTANT, + ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, + ARMOR_LASER = ARMOR_LASER_SMALL, + ARMOR_ENERGY = ARMOR_ENERGY_SMALL, + ARMOR_BOMB = ARMOR_BOMB_PADDED, + ARMOR_BIO = ARMOR_BIO_MINOR, + ARMOR_RAD = ARMOR_RAD_MINOR + ) + siemens_coefficient = 0.8 \ No newline at end of file diff --git a/mods/gamemodes/cult/_cult.dme b/mods/gamemodes/cult/_cult.dme index e35ffed9db6..82d4e19aed5 100644 --- a/mods/gamemodes/cult/_cult.dme +++ b/mods/gamemodes/cult/_cult.dme @@ -21,7 +21,6 @@ #include "special_role.dm" #include "structures.dm" #include "talisman.dm" -#include "wizard.dm" #include "cultify\de-cultify.dm" #include "cultify\defile.dm" #include "cultify\mob.dm" diff --git a/mods/gamemodes/cult/items.dm b/mods/gamemodes/cult/items.dm index 1674cdb92eb..2b2e826617c 100644 --- a/mods/gamemodes/cult/items.dm +++ b/mods/gamemodes/cult/items.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/weapon/swords/cult.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME -// separated into a proc so that subtypes can modify it +// separated into a proc so that modpacks can modify it /obj/item/sword/cultblade/proc/can_use_safely(mob/living/user) return iscultist(user) @@ -21,9 +21,9 @@ affecting = GET_EXTERNAL_ORGAN(H, zone) if(affecting) - to_chat(user, "An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!") + to_chat(user, SPAN_DANGER("An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!")) else - to_chat(user, "An unexplicable force rips through you, tearing the sword from your grasp!") + to_chat(user, SPAN_DANGER("An unexplicable force rips through you, tearing the sword from your grasp!")) //random amount of damage between half of the blade's force and the full force of the blade. var/force = get_attack_force(user) diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm index 874dc92049c..2077c9f0b1e 100644 --- a/mods/gamemodes/cult/overrides.dm +++ b/mods/gamemodes/cult/overrides.dm @@ -14,19 +14,6 @@ else playsound(src, 'sound/effects/ghost2.ogg', 10, 5) -/datum/trader/ship/unique/wizard/New() - possible_wanted_items |= list( - /mob/living/simple_animal/construct = TRADER_SUBTYPES_ONLY, - /obj/item/sword/cultblade = TRADER_THIS_TYPE, - /obj/item/clothing/head/culthood = TRADER_ALL, - /obj/item/clothing/suit/space/cult = TRADER_ALL, - /obj/item/clothing/suit/cultrobes = TRADER_ALL, - /obj/item/clothing/head/helmet/space/cult = TRADER_ALL, - /obj/structure/cult = TRADER_SUBTYPES_ONLY, - /obj/structure/constructshell = TRADER_ALL - ) - ..() - /datum/trader/ship/clothingshop/hatglovesaccessories/New() possible_trading_items[/obj/item/clothing/head/culthood] = TRADER_BLACKLIST_ALL diff --git a/mods/gamemodes/cult/wizard.dm b/mods/gamemodes/cult/wizard.dm deleted file mode 100644 index b29fa023f65..00000000000 --- a/mods/gamemodes/cult/wizard.dm +++ /dev/null @@ -1,47 +0,0 @@ -// #ifdef GAMEMODE_PACK_WIZARD -// todo: add wizard gamemode define check once it's modularized -/decl/modpack/cult/post_initialize() - . = ..() - global.artefact_feedback[/obj/structure/closet/wizard/souls] = "SS" - -/datum/spellbook/standard/New() - spells[/obj/structure/closet/wizard/souls] = 1 - ..() - -/datum/spellbook/druid/New() - spells[/obj/structure/closet/wizard/souls] = 1 - ..() - -/obj/structure/closet/wizard/souls - name = "Soul Shard Belt" - desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot. This also includes the spell Artificer, used to create the shells used in construct creation." - -/obj/structure/closet/wizard/souls/WillContain() - return list( - /obj/item/contract/boon/wizard/artificer, - /obj/item/belt/soulstone/full, - ) - -/datum/storage/belt/soulstone - can_hold = list( - /obj/item/soulstone - ) - -/obj/item/belt/soulstone - name = "soul stone belt" - desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away." - icon = 'icons/clothing/belt/soulstones.dmi' - storage = /datum/storage/belt/soulstone - -/obj/item/belt/soulstone/full/WillContain() - return list(/obj/item/soulstone = max(1, storage?.storage_slots)) - -/obj/item/contract/boon/wizard/artificer - path = /spell/aoe_turf/conjure/construct - desc = "This contract has a passage dedicated to an entity known as 'Nar-Sie'." - -/obj/item/magic_rock - material = /decl/material/solid/stone/cult - -/obj/item/summoning_stone - material = /decl/material/solid/stone/cult \ No newline at end of file diff --git a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm index b6c5366944c..de0b3b76a70 100644 --- a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm +++ b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm @@ -47,8 +47,5 @@ /obj/item/clothing/suit/space/void _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi' -/obj/item/clothing/suit/space/void/wizard - _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi' - /obj/item/clothing/suit/space/void/excavation _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi' diff --git a/mods/species/vox/_vox.dme b/mods/species/vox/_vox.dme index 99bd0717bac..83d61f50f51 100644 --- a/mods/species/vox/_vox.dme +++ b/mods/species/vox/_vox.dme @@ -5,7 +5,6 @@ #include "mobs_vox.dm" #include "organs_vox.dm" #include "datum\accessories.dm" -#include "datum\antagonism.dm" #include "datum\cultures_vox.dm" #include "datum\descriptors_vox.dm" #include "datum\factions_vox.dm" diff --git a/mods/species/vox/datum/antagonism.dm b/mods/species/vox/datum/antagonism.dm deleted file mode 100644 index 4b8c182ee3a..00000000000 --- a/mods/species/vox/datum/antagonism.dm +++ /dev/null @@ -1,4 +0,0 @@ -// Wizard -/obj/item/magic_rock/Initialize(ml, material_key) - LAZYSET(potentials, SPECIES_VOX, /spell/targeted/shapeshift/true_form) - . = ..() diff --git a/mods/species/vox/gear/gun.dm b/mods/species/vox/gear/gun.dm index c4f62db86c9..a2e5706de5d 100644 --- a/mods/species/vox/gear/gun.dm +++ b/mods/species/vox/gear/gun.dm @@ -78,27 +78,3 @@ /decl/material/liquid/sedatives, /decl/material/liquid/paralytics ) - -/spell/targeted/shapeshift/true_form - name = "True Form" - desc = "Pay respect to your heritage. Become what you once were." - - school = "racial" - spell_flags = INCLUDEUSER - invocation_type = SpI_EMOTE - range = -1 - invocation = "begins to grow!" - charge_max = 1200 //2 minutes - duration = 300 //30 seconds - - smoke_amt = 5 - smoke_spread = 1 - - possible_transformations = list(/mob/living/simple_animal/hostile/parrot/space/lesser) - - hud_state = "wiz_vox" - - cast_sound = 'sound/voice/shriek1.ogg' - revert_sound = 'sound/voice/shriek1.ogg' - - drop_items = 0 diff --git a/nebula.dme b/nebula.dme index d286bdf0899..04deff7ede2 100644 --- a/nebula.dme +++ b/nebula.dme @@ -765,7 +765,6 @@ #include "code\game\antagonist\outsider\actors.dm" #include "code\game\antagonist\outsider\ert.dm" #include "code\game\antagonist\outsider\mercenary.dm" -#include "code\game\antagonist\outsider\wizard.dm" #include "code\game\antagonist\station\provocateur.dm" #include "code\game\antagonist\station\thrall.dm" #include "code\game\area\area_abstract.dm" @@ -801,14 +800,6 @@ #include "code\game\gamemodes\objectives\objective_protect.dm" #include "code\game\gamemodes\objectives\objective_rev.dm" #include "code\game\gamemodes\objectives\objective_steal.dm" -#include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\gamemodes\wizard\wizard_props.dm" -#include "code\game\gamemodes\wizard\servant_items\caretaker.dm" -#include "code\game\gamemodes\wizard\servant_items\champion.dm" -#include "code\game\gamemodes\wizard\servant_items\familiar.dm" -#include "code\game\gamemodes\wizard\servant_items\fiend.dm" -#include "code\game\gamemodes\wizard\servant_items\infiltrator.dm" -#include "code\game\gamemodes\wizard\servant_items\overseer.dm" #include "code\game\jobs\_access_defs.dm" #include "code\game\jobs\access.dm" #include "code\game\jobs\access_datum.dm" @@ -1260,7 +1251,6 @@ #include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RPD.dm" #include "code\game\objects\items\weapons\RSF.dm" -#include "code\game\objects\items\weapons\scrolls.dm" #include "code\game\objects\items\weapons\secrets_disk.dm" #include "code\game\objects\items\weapons\shields.dm" #include "code\game\objects\items\weapons\soap.dm" @@ -2007,6 +1997,7 @@ #include "code\modules\clothing\head\misc_special.dm" #include "code\modules\clothing\head\security.dm" #include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\head\wizard.dm" #include "code\modules\clothing\jumpsuits\_jumpsuit.dm" #include "code\modules\clothing\jumpsuits\color.dm" #include "code\modules\clothing\jumpsuits\job.dm" @@ -2097,7 +2088,6 @@ #include "code\modules\clothing\spacesuits\void\misc.dm" #include "code\modules\clothing\spacesuits\void\station.dm" #include "code\modules\clothing\spacesuits\void\void.dm" -#include "code\modules\clothing\spacesuits\void\wizard.dm" #include "code\modules\clothing\suits\_suit.dm" #include "code\modules\clothing\suits\_suit_hood.dm" #include "code\modules\clothing\suits\alien.dm" @@ -2108,6 +2098,7 @@ #include "code\modules\clothing\suits\jobs.dm" #include "code\modules\clothing\suits\labcoat.dm" #include "code\modules\clothing\suits\mantle.dm" +#include "code\modules\clothing\suits\misc.dm" #include "code\modules\clothing\suits\miscellaneous.dm" #include "code\modules\clothing\suits\poncho.dm" #include "code\modules\clothing\suits\robes.dm" @@ -2116,7 +2107,7 @@ #include "code\modules\clothing\suits\straightjacket.dm" #include "code\modules\clothing\suits\toggles.dm" #include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\suits\wizard.dm" #include "code\modules\clothing\suits\armor\_armor.dm" #include "code\modules\clothing\suits\armor\adminbus_and_memes.dm" #include "code\modules\clothing\suits\armor\bulletproof.dm" @@ -3008,7 +2999,6 @@ #include "code\modules\mob\living\simple_animal\aquatic\aquatic_fish.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_sharks.dm" #include "code\modules\mob\living\simple_animal\crow\crow.dm" -#include "code\modules\mob\living\simple_animal\familiars\familiars.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\corgi.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" @@ -3773,84 +3763,14 @@ #include "code\modules\species\station\human_bodytypes.dm" #include "code\modules\species\station\monkey.dm" #include "code\modules\species\station\monkey_bodytypes.dm" -#include "code\modules\spells\artifacts.dm" #include "code\modules\spells\construct_spells.dm" -#include "code\modules\spells\contracts.dm" -#include "code\modules\spells\no_clothes.dm" -#include "code\modules\spells\racial_wizard.dm" #include "code\modules\spells\spell_code.dm" -#include "code\modules\spells\spell_projectile.dm" -#include "code\modules\spells\spellbook.dm" #include "code\modules\spells\spells.dm" #include "code\modules\spells\aoe_turf\aoe_turf.dm" -#include "code\modules\spells\aoe_turf\blink.dm" -#include "code\modules\spells\aoe_turf\charge.dm" -#include "code\modules\spells\aoe_turf\disable_tech.dm" -#include "code\modules\spells\aoe_turf\drain_blood.dm" -#include "code\modules\spells\aoe_turf\exchange_wounds.dm" -#include "code\modules\spells\aoe_turf\knock.dm" -#include "code\modules\spells\aoe_turf\smoke.dm" -#include "code\modules\spells\aoe_turf\summons.dm" #include "code\modules\spells\aoe_turf\conjure\conjure.dm" -#include "code\modules\spells\aoe_turf\conjure\druidic_spells.dm" -#include "code\modules\spells\aoe_turf\conjure\faithful_hound.dm" -#include "code\modules\spells\aoe_turf\conjure\force_portal.dm" -#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" -#include "code\modules\spells\aoe_turf\conjure\grove.dm" -#include "code\modules\spells\artifacts\spellbound_servants.dm" -#include "code\modules\spells\artifacts\storage.dm" -#include "code\modules\spells\general\acid_spray.dm" -#include "code\modules\spells\general\area_teleport.dm" -#include "code\modules\spells\general\camera_vision.dm" -#include "code\modules\spells\general\contract_spells.dm" -#include "code\modules\spells\general\create_air.dm" -#include "code\modules\spells\general\invisibility.dm" -#include "code\modules\spells\general\mark_recall.dm" -#include "code\modules\spells\general\portal_teleport.dm" -#include "code\modules\spells\general\radiant_aura.dm" -#include "code\modules\spells\general\return_master.dm" -#include "code\modules\spells\general\toggle_armor.dm" -#include "code\modules\spells\hand\blood_shards.dm" -#include "code\modules\spells\hand\burning_grip.dm" -#include "code\modules\spells\hand\entangle.dm" -#include "code\modules\spells\hand\hand.dm" -#include "code\modules\spells\hand\hand_item.dm" -#include "code\modules\spells\hand\slippery_surface.dm" -#include "code\modules\spells\hand\sunwrath.dm" -#include "code\modules\spells\spellbook\battlemage.dm" -#include "code\modules\spells\spellbook\cleric.dm" -#include "code\modules\spells\spellbook\druid.dm" -#include "code\modules\spells\spellbook\spatial.dm" -#include "code\modules\spells\spellbook\standard.dm" -#include "code\modules\spells\spellbook\student.dm" -#include "code\modules\spells\targeted\analyze.dm" -#include "code\modules\spells\targeted\blood_boil.dm" -#include "code\modules\spells\targeted\cleric_spells.dm" #include "code\modules\spells\targeted\ethereal_jaunt.dm" -#include "code\modules\spells\targeted\exude_pleasantness.dm" -#include "code\modules\spells\targeted\genetic.dm" -#include "code\modules\spells\targeted\glimpse_of_eternity.dm" -#include "code\modules\spells\targeted\shapeshift.dm" -#include "code\modules\spells\targeted\shatter_mind.dm" #include "code\modules\spells\targeted\shift.dm" -#include "code\modules\spells\targeted\subjugate.dm" -#include "code\modules\spells\targeted\swap.dm" #include "code\modules\spells\targeted\targeted.dm" -#include "code\modules\spells\targeted\torment.dm" -#include "code\modules\spells\targeted\equip\burning_touch.dm" -#include "code\modules\spells\targeted\equip\dyrnwyn.dm" -#include "code\modules\spells\targeted\equip\equip.dm" -#include "code\modules\spells\targeted\equip\holy_relic.dm" -#include "code\modules\spells\targeted\equip\horsemask.dm" -#include "code\modules\spells\targeted\equip\party_hardy.dm" -#include "code\modules\spells\targeted\equip\seed.dm" -#include "code\modules\spells\targeted\equip\shield.dm" -#include "code\modules\spells\targeted\projectile\dumbfire.dm" -#include "code\modules\spells\targeted\projectile\fireball.dm" -#include "code\modules\spells\targeted\projectile\magic_missile.dm" -#include "code\modules\spells\targeted\projectile\passage.dm" -#include "code\modules\spells\targeted\projectile\projectile.dm" -#include "code\modules\spells\targeted\projectile\stuncuff.dm" #include "code\modules\sprite_accessories\_accessory.dm" #include "code\modules\sprite_accessories\_accessory_category.dm" #include "code\modules\sprite_accessories\cosmetics\_accessory_cosmetics.dm" @@ -4126,7 +4046,6 @@ #include "maps\_map_include.dm" #include "maps\antag_spawn\ert\ert.dm" #include "maps\antag_spawn\mercenary\mercenary.dm" -#include "maps\antag_spawn\wizard\wizard.dm" #include "maps\away_sites_testing\away_sites_testing_define.dm" #include "maps\example\example_define.dm" #include "maps\exodus\exodus_define.dm" From 3a46a3b09fdf3338cb2814e2a0fa797683f4fcd9 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 7 Dec 2024 22:04:10 -0500 Subject: [PATCH 128/554] Removes unnecessary pronouns --- code/_onclick/ghost.dm | 3 +++ code/_onclick/other_mobs.dm | 4 ++-- code/game/objects/items/__item.dm | 5 ----- code/modules/mob/living/human/examine.dm | 12 ++++++------ code/modules/mob/living/human/human.dm | 6 +++--- code/modules/mob/living/human/human_verbs.dm | 4 ++-- code/modules/mob/living/silicon/robot/drone/drone.dm | 4 ++-- code/modules/power/lighting.dm | 4 ++-- 8 files changed, 20 insertions(+), 22 deletions(-) diff --git a/code/_onclick/ghost.dm b/code/_onclick/ghost.dm index da5d187674d..7bee520bdb5 100644 --- a/code/_onclick/ghost.dm +++ b/code/_onclick/ghost.dm @@ -45,6 +45,9 @@ return if(user.client && user.client.inquisitive_ghost) user.examinate(src) + return + if(user.client?.holder || user.antagHUD) + storage?.show_to(user) return // --------------------------------------- diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 0e4a32796d5..77c594dd375 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -66,9 +66,9 @@ var/obj/item/organ/external/hand/O = GET_EXTERNAL_ORGAN(src, get_active_held_item_slot()) if(!istype(O)) return FALSE - var/decl/pronouns/G = get_pronouns() + var/decl/pronouns/pronouns = get_pronouns() visible_message( - SPAN_DANGER("\The [src] chews on [G.his] [O.name]"), + SPAN_DANGER("\The [src] chews on [pronouns.his] [O.name]"), SPAN_DANGER("You chew on your [O.name]!") ) admin_attacker_log(src, "chewed on their [O.name]!") diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 69b1449b419..85b58c597ff 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -581,11 +581,6 @@ return ..() -/obj/item/attack_ghost(mob/user) - var/mob/observer/ghost/pronouns = user - if(pronouns.client?.holder || pronouns.antagHUD) - storage?.show_to(user) - /obj/item/proc/talk_into(mob/living/M, message, message_mode, var/verb = "says", var/decl/language/speaking = null) return diff --git a/code/modules/mob/living/human/examine.dm b/code/modules/mob/living/human/examine.dm index db61156edfc..389e209440c 100644 --- a/code/modules/mob/living/human/examine.dm +++ b/code/modules/mob/living/human/examine.dm @@ -268,13 +268,13 @@ return /mob/living/human/getHUDsource(hudtype) - var/obj/item/clothing/glasses/pronouns = get_equipped_item(slot_glasses_str) - if(!istype(pronouns)) + var/obj/item/clothing/glasses/glasses = get_equipped_item(slot_glasses_str) + if(!istype(glasses)) return ..() - if(pronouns.glasses_hud_type & hudtype) - return pronouns - if(pronouns.hud && (pronouns.hud.glasses_hud_type & hudtype)) - return pronouns.hud + if(glasses.glasses_hud_type & hudtype) + return glasses + if(glasses.hud && (glasses.hud.glasses_hud_type & hudtype)) + return glasses.hud /mob/living/silicon/robot/getHUDsource(hudtype) for(var/obj/item/borg/sight/sight in list(module_state_1, module_state_2, module_state_3)) diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 024189fd674..7902a3391e6 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -84,9 +84,9 @@ . = ..() if(statpanel("Status")) - var/obj/item/gps/pronouns = get_active_held_item() - if(istype(pronouns)) - stat("Coordinates:", "[pronouns.get_coordinates()]") + var/obj/item/gps/gps = get_active_held_item() + if(istype(gps)) + stat("Coordinates:", "[gps.get_coordinates()]") stat("Intent:", "[a_intent]") stat("Move Mode:", "[move_intent.name]") diff --git a/code/modules/mob/living/human/human_verbs.dm b/code/modules/mob/living/human/human_verbs.dm index 90c8db6b47a..c8f5f908392 100644 --- a/code/modules/mob/living/human/human_verbs.dm +++ b/code/modules/mob/living/human/human_verbs.dm @@ -97,8 +97,8 @@ target.show_message("You hear a voice that seems to echo around the room: [say]") usr.show_message("You project your mind into [target.real_name]: [say]") log_say("[key_name(usr)] sent a telepathic message to [key_name(target)]: [say]") - for(var/mob/observer/ghost/pronouns in global.player_list) - pronouns.show_message("Telepathic message from [src] to [target]: [say]") + for(var/mob/observer/ghost/ghost in global.player_list) + ghost.show_message("Telepathic message from [src] to [target]: [say]") /mob/living/human/proc/remoteobserve() set name = "Remote View" diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index e8c86f234f8..f9ace0a24f3 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -286,8 +286,8 @@ /mob/living/silicon/robot/drone/proc/request_player() if(too_many_active_drones()) return - var/decl/ghosttrap/pronouns = GET_DECL(/decl/ghosttrap/maintenance_drone) - pronouns.request_player(src, "Someone is attempting to reboot a maintenance drone.", 30 SECONDS) + var/decl/ghosttrap/ghosttrap = GET_DECL(/decl/ghosttrap/maintenance_drone) + ghosttrap.request_player(src, "Someone is attempting to reboot a maintenance drone.", 30 SECONDS) /mob/living/silicon/robot/drone/proc/transfer_personality(var/client/player) if(!player) return diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 76ea4bb5e1e..5e1fccf1934 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -329,8 +329,8 @@ var/prot = FALSE var/mob/living/human/H = user if(istype(H)) - var/obj/item/clothing/gloves/pronouns = H.get_equipped_item(slot_gloves_str) - if(istype(pronouns) && pronouns.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) + var/obj/item/clothing/gloves/gloves = H.get_equipped_item(slot_gloves_str) + if(istype(gloves) && gloves.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) prot = TRUE if(prot > 0 || user.has_genetic_condition(GENE_COND_COLD_RESISTANCE)) From e34ae1bab19275c65936251ca2659e30ba934c44 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 2 Nov 2024 15:05:53 +1100 Subject: [PATCH 129/554] Adding SSpathfinding to handle AStar pathfinding requests. --- .gitignore | 1 + code/__defines/ai.dm | 2 + code/__defines/subsystem-priority.dm | 1 + .../subsystems/mob_ai/auto_movement.dm | 5 +- code/controllers/subsystems/pathfinding.dm | 123 ++++++++++++++ code/datums/ai/_ai.dm | 154 +++--------------- code/datums/ai/_ai_enemies.dm | 35 ++++ code/datums/ai/_ai_friends.dm | 25 +++ code/datums/ai/_ai_memory.dm | 7 + code/datums/ai/_ai_pathfinding.dm | 29 ++++ code/datums/ai/_ai_stance.dm | 39 +++-- code/datums/ai/_ai_targets.dm | 77 +++++++++ code/datums/ai/_ai_wander.dm | 5 + code/datums/ai/aggressive.dm | 104 +++++------- code/datums/ai/beast.dm | 4 +- code/datums/ai/commanded.dm | 10 +- code/datums/movement/automove_controller.dm | 21 ++- code/game/atoms_movable.dm | 3 + code/game/turfs/turf_navigation.dm | 62 +++++++ .../integrated_electronics/subtypes/smart.dm | 46 ++++-- code/modules/mob/living/bot/bot.dm | 101 ++---------- code/modules/mob/living/bot/cleanbot.dm | 9 +- code/modules/mob/living/bot/farmbot.dm | 18 -- code/modules/mob/living/bot/mulebot.dm | 2 +- code/modules/mob/living/living.dm | 5 - .../mob/living/simple_animal/hostile/bear.dm | 4 +- .../hostile/commanded/nanomachines.dm | 4 +- .../hostile/giant_spiders/ai_guard.dm | 2 +- .../simple_animal/hostile/hivebots/megabot.dm | 2 +- .../mob/living/simple_animal/hostile/mimic.dm | 2 +- .../simple_animal/hostile/retaliate/drone.dm | 11 +- .../mob/living/simple_animal/hostile/slug.dm | 13 +- code/modules/mob/mob.dm | 5 + code/modules/mob/mob_automove.dm | 44 ++++- code/procs/{AStar.dm => pathfinding.dm} | 26 ++- nebula.dme | 10 +- 36 files changed, 631 insertions(+), 380 deletions(-) create mode 100644 code/controllers/subsystems/pathfinding.dm create mode 100644 code/datums/ai/_ai_enemies.dm create mode 100644 code/datums/ai/_ai_friends.dm create mode 100644 code/datums/ai/_ai_memory.dm create mode 100644 code/datums/ai/_ai_pathfinding.dm create mode 100644 code/datums/ai/_ai_targets.dm create mode 100644 code/datums/ai/_ai_wander.dm create mode 100644 code/game/turfs/turf_navigation.dm rename code/procs/{AStar.dm => pathfinding.dm} (78%) diff --git a/.gitignore b/.gitignore index 9d2b3ae5aa1..52ee73c3835 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # ignore misc BYOND files Thumbs.db +Thumbs.db:encryptable *.log *.int *.rsc diff --git a/code/__defines/ai.dm b/code/__defines/ai.dm index 2123e2e8839..03fa03fa9e8 100644 --- a/code/__defines/ai.dm +++ b/code/__defines/ai.dm @@ -6,6 +6,8 @@ #define STANCE_ATTACKING /decl/mob_controller_stance/attacking #define STANCE_TIRED /decl/mob_controller_stance/tired #define STANCE_CONTAINED /decl/mob_controller_stance/contained +#define STANCE_BUSY /decl/mob_controller_stance/busy + //basically 'do nothing' #define STANCE_COMMANDED_STOP /decl/mob_controller_stance/commanded/stop //follows a target diff --git a/code/__defines/subsystem-priority.dm b/code/__defines/subsystem-priority.dm index fc69009e88b..cd44840622a 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -39,6 +39,7 @@ #define SS_PRIORITY_GHOST_IMAGES 10 // Updates ghost client images. #define SS_PRIORITY_ZCOPY 10 // Builds appearances for Z-Mimic. #define SS_PRIORITY_PROJECTILES 10 // Projectile processing! +#define SS_PRIORITY_PATHFINDING 10 // Processing pathfinding requests // SS_BACKGROUND #define SS_PRIORITY_OBJECTS 100 // processing_objects processing. diff --git a/code/controllers/subsystems/mob_ai/auto_movement.dm b/code/controllers/subsystems/mob_ai/auto_movement.dm index 7e2990c1cb8..843f37ab2d0 100644 --- a/code/controllers/subsystems/mob_ai/auto_movement.dm +++ b/code/controllers/subsystems/mob_ai/auto_movement.dm @@ -51,5 +51,8 @@ SUBSYSTEM_DEF(automove) if(controller.handle_mover(mover, moving_metadata[mover]) == PROCESS_KILL && !QDELETED(mover)) mover.stop_automove() if(MC_TICK_CHECK) - processing_atoms.Cut(1, i+1) + if(i >= length(processing_atoms)) + processing_atoms.Cut() + else + processing_atoms.Cut(1, i+1) return diff --git a/code/controllers/subsystems/pathfinding.dm b/code/controllers/subsystems/pathfinding.dm new file mode 100644 index 00000000000..d6e63f4191f --- /dev/null +++ b/code/controllers/subsystems/pathfinding.dm @@ -0,0 +1,123 @@ +SUBSYSTEM_DEF(pathfinding) + name = "Pathfinding" + priority = SS_PRIORITY_PATHFINDING + init_order = SS_INIT_MISC_LATE + wait = 1 + + var/list/pending = list() + var/list/processing = list() + var/list/mover_metadata = list() + + VAR_PRIVATE/static/_default_adjacency_call = TYPE_PROC_REF(/turf, CardinalTurfsWithAccess) + VAR_PRIVATE/static/_default_distance_call = TYPE_PROC_REF(/turf, Distance) + +/atom/movable + var/waiting_for_path + +/atom/movable/proc/path_found(list/path) + SHOULD_CALL_PARENT(TRUE) + waiting_for_path = null + +/atom/movable/proc/path_not_found() + SHOULD_CALL_PARENT(TRUE) + waiting_for_path = null + +/datum/controller/subsystem/pathfinding/proc/dequeue_mover(atom/movable/mover, include_processing = TRUE) + if(!istype(mover)) + return + mover.waiting_for_path = null + pending -= mover + mover_metadata -= mover + if(include_processing) + processing -= mover + +// Hook to allow legacy use of AStar* to reuse the callback refs +/datum/controller/subsystem/pathfinding/proc/find_path_immediate(start, end, max_nodes, max_node_depth = 30, min_target_dist = 0, min_node_dist, id, datum/exclude, check_tick = FALSE) + return find_path_astar(start, end, _default_adjacency_call, _default_distance_call, max_nodes, max_node_depth, min_target_dist, min_node_dist, id, exclude, check_tick) + +/datum/controller/subsystem/pathfinding/proc/enqueue_mover(atom/movable/mover, atom/target, datum/pathfinding_metadata/metadata) + if(!istype(mover) || mover.waiting_for_path) + return FALSE + if(!istype(target)) + return FALSE + pending |= mover + pending[mover] = target + if(istype(metadata)) + mover_metadata[mover] = metadata + mover.waiting_for_path = world.time + return TRUE + +/datum/controller/subsystem/pathfinding/stat_entry(msg) + . = ..("Q:[length(pending)] P:[length(processing)]") + +/datum/controller/subsystem/pathfinding/fire(resumed) + + if(!resumed) + processing = pending?.Copy() + + var/atom/movable/mover + var/atom/target + var/datum/pathfinding_metadata/metadata + var/i = 0 + + while(i < processing.len) + + i++ + mover = processing[i] + target = processing[mover] + metadata = mover_metadata[mover] + dequeue_mover(mover, include_processing = FALSE) + + if(!QDELETED(mover) && !QDELETED(target)) + try_find_path(mover, target, metadata) + + if (MC_TICK_CHECK) + processing.Cut(1, i+1) + return + + processing.Cut() + +/datum/controller/subsystem/pathfinding/proc/try_find_path(atom/movable/mover, atom/target, datum/pathfinding_metadata/metadata, adjacency_call = _default_adjacency_call, distance_call = _default_distance_call) + + var/started_pathing = world.time + mover.waiting_for_path = started_pathing + + var/list/path = find_path_astar( + get_turf(mover), + target, + adjacency_call, + distance_call, + (metadata?.max_nodes || null), + (metadata?.max_node_depth || 250), + metadata?.min_target_dist, + metadata?.min_node_depth, + (metadata?.id || mover.GetIdCard()), + metadata?.obstacle, + check_tick = TRUE + ) + if(mover.waiting_for_path == started_pathing) + if(length(path)) + mover.path_found(path) + else + mover.path_not_found() + +/datum/pathfinding_metadata + var/max_nodes = null + var/max_node_depth = 250 + var/atom/id = null + var/min_target_dist = null + var/min_node_depth = null + var/obstacle = null + +/datum/pathfinding_metadata/New(_max_nodes, _max_node_depth, _id, _min_target_dist, _min_node_depth, _obstacle) + + id = _id + obstacle = _obstacle + max_nodes = _max_nodes + + if(!isnull(_max_node_depth)) + max_node_depth = _max_node_depth + if(!isnull(_min_target_dist)) + min_target_dist = _min_target_dist + if(!isnull(_min_node_depth)) + min_node_depth = _min_node_depth diff --git a/code/datums/ai/_ai.dm b/code/datums/ai/_ai.dm index 6e40fd7ab35..9c943dadb4f 100644 --- a/code/datums/ai/_ai.dm +++ b/code/datums/ai/_ai.dm @@ -62,6 +62,23 @@ /// Aggressive AI var; defined here for reference without casting. var/try_destroy_surroundings = FALSE + /// Reference to the atom we are targetting. + var/weakref/target_ref + + /// Current path for A* pathfinding. + var/list/executing_path + /// A counter for times we have failed to progress along our path. + var/path_frustration = 0 + /// A list of any obstacles we should path around in future. + var/list/path_obstacles = null + + /// Radius of target scan area when looking for valid targets. Set to 0 to disable target scanning. + var/target_scan_distance = 0 + /// Time tracker for next target scan. + var/next_target_scan_time + /// How long minimum between scans. + var/target_scan_delay = 1 SECOND + /datum/mob_controller/New(var/mob/living/target_body) body = target_body if(expected_type && !istype(body, expected_type)) @@ -71,6 +88,7 @@ /datum/mob_controller/Destroy() LAZYCLEARLIST(_friends) LAZYCLEARLIST(_enemies) + set_target(null) if(is_processing) STOP_PROCESSING(SSmob_ai, src) if(body) @@ -79,12 +97,6 @@ body = null . = ..() -/datum/mob_controller/proc/get_automove_target(datum/automove_metadata/metadata) - return null - -/datum/mob_controller/proc/can_do_automated_move(variant_move_delay) - return body && !body.client - /datum/mob_controller/proc/can_process() if(!body || !body.loc || ((body.client || body.mind) && !(body.status_flags & ENABLE_AI))) return FALSE @@ -111,13 +123,13 @@ // This is the place to actually do work in the AI. /datum/mob_controller/proc/do_process() SHOULD_CALL_PARENT(TRUE) - if(!QDELETED(body) && !QDELETED(src)) + if(get_stance() != STANCE_BUSY && !QDELETED(body) && !QDELETED(src)) if(!body.stat) try_unbuckle() try_wander() try_bark() // Recheck in case we walked into lava or something during wandering. - return !QDELETED(body) && !QDELETED(src) + return get_stance() != STANCE_BUSY && !QDELETED(body) && !QDELETED(src) return TRUE return FALSE @@ -132,16 +144,6 @@ else if(prob(25)) body.visible_message(SPAN_WARNING("\The [body] struggles against \the [body.buckled]!")) - -/datum/mob_controller/proc/get_activity() - return current_activity - -/datum/mob_controller/proc/set_activity(new_activity) - if(current_activity != new_activity) - current_activity = new_activity - return TRUE - return FALSE - // The mob will periodically sit up or step 1 tile in a random direction. /datum/mob_controller/proc/try_wander() //Movement @@ -185,133 +187,17 @@ else if(ispath(do_emote, /decl/emote)) body.emote(do_emote) -/datum/mob_controller/proc/get_target() - return null - -/datum/mob_controller/proc/set_target(atom/new_target) - return - -/datum/mob_controller/proc/find_target() - return - -/datum/mob_controller/proc/valid_target(var/atom/A) - return - -/datum/mob_controller/proc/move_to_target(var/move_only = FALSE) - return - -/datum/mob_controller/proc/stop_wandering() - stop_wander = TRUE - -/datum/mob_controller/proc/resume_wandering() - stop_wander = FALSE - -/datum/mob_controller/proc/set_stance(new_stance) - if(stance != new_stance) - stance = new_stance - return TRUE - return FALSE - -/datum/mob_controller/proc/get_stance() - return stance - -/datum/mob_controller/proc/list_targets(var/dist = 7) - return - -/datum/mob_controller/proc/open_fire() - return - -/datum/mob_controller/proc/startle() - if(QDELETED(body) || body.stat != UNCONSCIOUS) - return - body.set_stat(CONSCIOUS) - if(body.current_posture?.prone) - body.set_posture(/decl/posture/standing) - -/datum/mob_controller/proc/retaliate(atom/source) - SHOULD_CALL_PARENT(TRUE) - if(!istype(body) || body.stat == DEAD) - return FALSE - startle() - if(isliving(source)) - remove_friend(source) - return TRUE - /datum/mob_controller/proc/destroy_surroundings() return -/datum/mob_controller/proc/lose_target() - return - -/datum/mob_controller/proc/lost_target() - return - /datum/mob_controller/proc/handle_death(gibbed) return -/datum/mob_controller/proc/pacify(mob/user) - lose_target() - add_friend(user) - -// General-purpose memorise proc, used by /commanded -/datum/mob_controller/proc/memorise(mob/speaker, message) - return - -// General-purpose memory checking proc, used by /faithful_hound -/datum/mob_controller/proc/check_memory(mob/speaker, message) - return FALSE - /// General-purpose scooping reaction proc, used by /passive. /// Returns TRUE if the scoop should proceed, FALSE if it should be canceled. /datum/mob_controller/proc/scooped_by(mob/initiator) return TRUE -// Enemy tracking - used on /aggressive -/datum/mob_controller/proc/get_enemies() - return _enemies - -/datum/mob_controller/proc/add_enemy(mob/enemy) - if(istype(enemy)) - LAZYDISTINCTADD(_enemies, weakref(enemy)) - -/datum/mob_controller/proc/add_enemies(list/enemies) - for(var/thing in enemies) - if(ismob(thing)) - add_friend(thing) - else if(istype(thing, /weakref)) - LAZYDISTINCTADD(_enemies, thing) - -/datum/mob_controller/proc/remove_enemy(mob/enemy) - LAZYREMOVE(_enemies, weakref(enemy)) - -/datum/mob_controller/proc/set_enemies(list/new_enemies) - _enemies = new_enemies - -/datum/mob_controller/proc/is_enemy(mob/enemy) - . = istype(enemy) && LAZYLEN(_enemies) && (weakref(enemy) in _enemies) - -/datum/mob_controller/proc/clear_enemies() - LAZYCLEARLIST(_enemies) - -// Friend tracking - used on /aggressive. -/datum/mob_controller/proc/get_friends() - return _friends - -/datum/mob_controller/proc/add_friend(mob/friend) - if(istype(friend)) - LAZYDISTINCTADD(_friends, weakref(friend)) - return TRUE - return FALSE - -/datum/mob_controller/proc/remove_friend(mob/friend) - LAZYREMOVE(_friends, weakref(friend)) - -/datum/mob_controller/proc/set_friends(list/new_friends) - _friends = new_friends - -/datum/mob_controller/proc/is_friend(mob/friend) - . = istype(friend) && LAZYLEN(_friends) && (weakref(friend) in _friends) - // By default, randomize the target area a bit to make armor/combat // a bit more dynamic (and avoid constant organ damage to the chest) /datum/mob_controller/proc/update_target_zone() diff --git a/code/datums/ai/_ai_enemies.dm b/code/datums/ai/_ai_enemies.dm new file mode 100644 index 00000000000..cbb7ddf4644 --- /dev/null +++ b/code/datums/ai/_ai_enemies.dm @@ -0,0 +1,35 @@ +// Enemy tracking - used on /aggressive +/datum/mob_controller/proc/get_enemies() + return _enemies + +/datum/mob_controller/proc/add_enemy(mob/enemy) + if(istype(enemy)) + LAZYDISTINCTADD(_enemies, weakref(enemy)) + +/datum/mob_controller/proc/add_enemies(list/enemies) + for(var/thing in enemies) + if(ismob(thing)) + add_friend(thing) + else if(istype(thing, /weakref)) + LAZYDISTINCTADD(_enemies, thing) + +/datum/mob_controller/proc/remove_enemy(mob/enemy) + LAZYREMOVE(_enemies, weakref(enemy)) + +/datum/mob_controller/proc/set_enemies(list/new_enemies) + _enemies = new_enemies + +/datum/mob_controller/proc/is_enemy(mob/enemy) + . = istype(enemy) && LAZYLEN(_enemies) && (weakref(enemy) in _enemies) + +/datum/mob_controller/proc/clear_enemies() + LAZYCLEARLIST(_enemies) + +/datum/mob_controller/proc/retaliate(atom/source) + SHOULD_CALL_PARENT(TRUE) + if(!istype(body) || body.stat == DEAD) + return FALSE + startle() + if(isliving(source)) + remove_friend(source) + return TRUE diff --git a/code/datums/ai/_ai_friends.dm b/code/datums/ai/_ai_friends.dm new file mode 100644 index 00000000000..3cab9046fce --- /dev/null +++ b/code/datums/ai/_ai_friends.dm @@ -0,0 +1,25 @@ +/datum/mob_controller/proc/pacify(mob/user) + lose_target() + add_friend(user) + +// Friend tracking - used on /aggressive. +/datum/mob_controller/proc/get_friends() + return _friends + +/datum/mob_controller/proc/add_friend(mob/friend) + if(istype(friend)) + LAZYDISTINCTADD(_friends, weakref(friend)) + return TRUE + return FALSE + +/datum/mob_controller/proc/remove_friend(mob/friend) + LAZYREMOVE(_friends, weakref(friend)) + +/datum/mob_controller/proc/set_friends(list/new_friends) + _friends = new_friends + +/datum/mob_controller/proc/is_friend(mob/friend) + . = istype(friend) && LAZYLEN(_friends) && (weakref(friend) in _friends) + +/datum/mob_controller/proc/clear_friends() + LAZYCLEARLIST(_friends) diff --git a/code/datums/ai/_ai_memory.dm b/code/datums/ai/_ai_memory.dm new file mode 100644 index 00000000000..f837a58cb8c --- /dev/null +++ b/code/datums/ai/_ai_memory.dm @@ -0,0 +1,7 @@ +// General-purpose memorise proc, used by /commanded +/datum/mob_controller/proc/memorise(mob/speaker, message) + return + +// General-purpose memory checking proc, used by /faithful_hound +/datum/mob_controller/proc/check_memory(mob/speaker, message) + return FALSE diff --git a/code/datums/ai/_ai_pathfinding.dm b/code/datums/ai/_ai_pathfinding.dm new file mode 100644 index 00000000000..e01abaa05ce --- /dev/null +++ b/code/datums/ai/_ai_pathfinding.dm @@ -0,0 +1,29 @@ +/datum/mob_controller/proc/can_do_automated_move(variant_move_delay) + return body && !body.client + +/datum/mob_controller/proc/clear_paths() + clear_path() + +/datum/mob_controller/proc/clear_path() + executing_path = null + body?.stop_automove() + +/datum/mob_controller/proc/get_automove_target(datum/automove_metadata/metadata) + var/turf/move_target = (islist(executing_path) && length(executing_path)) ? executing_path[1] : null + if(!istype(move_target) || QDELETED(move_target)) + clear_path() + return null + return move_target + +/datum/mob_controller/proc/handle_post_automoved(atom/old_loc) + if(!islist(executing_path) || length(executing_path) <= 0) + return + var/turf/body_turf = get_turf(body) + if(!istype(body_turf)) + return + if(executing_path[1] != body_turf) + return + if(length(executing_path) > 1) + executing_path.Cut(1, 2) + else + clear_path() diff --git a/code/datums/ai/_ai_stance.dm b/code/datums/ai/_ai_stance.dm index ca018169811..be3b11f94a7 100644 --- a/code/datums/ai/_ai_stance.dm +++ b/code/datums/ai/_ai_stance.dm @@ -1,30 +1,43 @@ // Stub type for future expansion/logic encapsulation. /decl/mob_controller_stance abstract_type = /decl/mob_controller_stance - /decl/mob_controller_stance/none - /decl/mob_controller_stance/idle - /decl/mob_controller_stance/alert - /decl/mob_controller_stance/attack - /decl/mob_controller_stance/attacking - /decl/mob_controller_stance/tired - /decl/mob_controller_stance/contained - /decl/mob_controller_stance/commanded abstract_type = /decl/mob_controller_stance/commanded - /decl/mob_controller_stance/commanded/stop - /decl/mob_controller_stance/commanded/follow - /decl/mob_controller_stance/commanded/misc - /decl/mob_controller_stance/commanded/heal - /decl/mob_controller_stance/commanded/healing +/decl/mob_controller_stance/busy + +/datum/mob_controller/proc/get_activity() + return current_activity + +/datum/mob_controller/proc/set_activity(new_activity) + if(current_activity != new_activity) + current_activity = new_activity + return TRUE + return FALSE + +/datum/mob_controller/proc/set_stance(new_stance) + if(stance != new_stance) + stance = new_stance + return TRUE + return FALSE + +/datum/mob_controller/proc/get_stance() + return stance + +/datum/mob_controller/proc/startle() + if(QDELETED(body) || body.stat != UNCONSCIOUS) + return + body.set_stat(CONSCIOUS) + if(body.current_posture?.prone) + body.set_posture(/decl/posture/standing) diff --git a/code/datums/ai/_ai_targets.dm b/code/datums/ai/_ai_targets.dm new file mode 100644 index 00000000000..49c5acedb09 --- /dev/null +++ b/code/datums/ai/_ai_targets.dm @@ -0,0 +1,77 @@ +/datum/mob_controller/proc/get_target() + if(isnull(target_ref)) + return null + var/atom/target = target_ref?.resolve() + if(!istype(target) || QDELETED(target)) + set_target(null) + return null + return target + +/datum/mob_controller/proc/set_target(atom/new_target) + var/weakref/new_target_ref = weakref(new_target) + if(target_ref != new_target_ref) + target_ref = new_target_ref + return TRUE + return FALSE + +/datum/mob_controller/proc/find_target() + SHOULD_CALL_PARENT(TRUE) + next_target_scan_time = world.time + target_scan_delay + +/datum/mob_controller/proc/valid_target(var/atom/A) + if(!istype(A)) + return FALSE + if(!A.simulated) + return FALSE + if(A == body) + return FALSE + if(A.invisibility > body.see_invisible) + return FALSE + if(LAZYLEN(_friends) && ismob(A) && (weakref(A) in _friends)) + return FALSE + if(!A.loc) + return FALSE + return TRUE + +/datum/mob_controller/proc/lose_target() + path_frustration = 0 + path_obstacles = null + set_target(null) + lost_target() + +/datum/mob_controller/proc/lost_target() + set_stance(STANCE_IDLE) + body.stop_automove() + +/datum/mob_controller/proc/list_targets() + // By default, we only target designated enemies. + var/list/enemies = get_enemies() + if(!LAZYLEN(enemies)) + return + var/list/possible_targets = get_raw_target_list() + if(!length(possible_targets)) + return + for(var/weakref/enemy in enemies) // Remove all entries that aren't in enemies + var/M = enemy.resolve() + if(M in possible_targets) + LAZYDISTINCTADD(., M) + +/datum/mob_controller/proc/do_target_scan() + . = target_scan_distance > 0 && world.time >= next_target_scan_time + +/datum/mob_controller/proc/move_to_target(var/move_only = FALSE) + return + +/datum/mob_controller/proc/get_raw_target_list() + if(target_scan_distance) + return hearers(body, target_scan_distance)-body + return null + +/datum/mob_controller/proc/get_valid_targets() + . = list() + for(var/target in list_targets(target_scan_distance)) + if(valid_target(target)) + . += target + +/datum/mob_controller/proc/handle_ranged_target(atom/ranged_target) + return FALSE diff --git a/code/datums/ai/_ai_wander.dm b/code/datums/ai/_ai_wander.dm new file mode 100644 index 00000000000..705d3fdcef1 --- /dev/null +++ b/code/datums/ai/_ai_wander.dm @@ -0,0 +1,5 @@ +/datum/mob_controller/proc/stop_wandering() + stop_wander = TRUE + +/datum/mob_controller/proc/resume_wandering() + stop_wander = FALSE diff --git a/code/datums/ai/aggressive.dm b/code/datums/ai/aggressive.dm index 62316d4d197..e50d4e124ae 100644 --- a/code/datums/ai/aggressive.dm +++ b/code/datums/ai/aggressive.dm @@ -2,36 +2,17 @@ stance = STANCE_IDLE stop_wander_when_pulled = FALSE try_destroy_surroundings = TRUE + target_scan_distance = 10 + var/attack_same_faction = FALSE var/only_attack_enemies = FALSE var/break_stuff_probability = 10 - var/weakref/target_ref /datum/mob_controller/aggressive/New() ..() if(isliving(body) && !QDELETED(body) && !QDELETED(src)) body.set_intent(I_FLAG_HARM) -/datum/mob_controller/aggressive/set_target(atom/new_target) - var/weakref/new_target_ref = weakref(new_target) - if(target_ref != new_target_ref) - target_ref = new_target_ref - return TRUE - return FALSE - -/datum/mob_controller/aggressive/get_target() - if(isnull(target_ref)) - return null - var/atom/target = target_ref?.resolve() - if(!istype(target) || QDELETED(target)) - set_target(null) - return null - return target - -/datum/mob_controller/aggressive/Destroy() - set_target(null) - return ..() - /datum/mob_controller/aggressive/do_process() if(!(. = ..())) @@ -42,24 +23,36 @@ set_stance(get_target() ? STANCE_ATTACK : STANCE_IDLE) return + if(isnull(stance)) + set_stance(get_target() ? STANCE_ATTACK : STANCE_IDLE) + if(isturf(body.loc) && !body.buckled) switch(stance) if(STANCE_IDLE) - set_target(find_target()) - set_stance(STANCE_ATTACK) + if(do_target_scan()) + set_target(find_target()) + if(get_target()) + set_stance(STANCE_ATTACK) if(STANCE_ATTACK) - body.face_atom(get_target()) - if(try_destroy_surroundings) - destroy_surroundings() - move_to_target() + + if(get_target()) + body.face_atom(get_target()) + if(try_destroy_surroundings) + destroy_surroundings() + move_to_target() + else + set_stance(STANCE_IDLE) if(STANCE_ATTACKING) - body.face_atom(get_target()) - if(try_destroy_surroundings) - destroy_surroundings() - handle_attacking_target() + if(get_target()) + body.face_atom(get_target()) + if(try_destroy_surroundings) + destroy_surroundings() + handle_attacking_target() + else + set_stance(STANCE_IDLE) if(STANCE_CONTAINED) //we aren't inside something so just switch set_stance(STANCE_IDLE) @@ -79,7 +72,7 @@ /datum/mob_controller/aggressive/proc/handle_attacking_target() stop_wandering() var/atom/target = get_target() - if(!istype(target) || !attackable(target) || !(target in list_targets(10))) // consider replacing this list_targets() call with a distance or LOS check + if(!istype(target) || !attackable(target) || !(target in get_raw_target_list())) lose_target() return FALSE if (ishuman(target)) @@ -209,51 +202,40 @@ return stop_wandering() var/atom/target = get_target() - if(!istype(target) || !attackable(target) || !(target in list_targets(10))) + if(!istype(target) || !attackable(target) || !(target in get_raw_target_list())) lose_target() return if(body.has_ranged_attack() && get_dist(body, target) <= body.get_ranged_attack_distance() && !move_only) body.stop_automove() - open_fire() + handle_ranged_target(target) return set_stance(STANCE_ATTACKING) body.start_automove(target) -/datum/mob_controller/aggressive/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/list_targets() // Base hostile mobs will just destroy everything in view. // Mobs with an enemy list will filter the view by their enemies. if(!only_attack_enemies) - return hearers(body, dist)-body - var/list/enemies = get_enemies() - if(!LAZYLEN(enemies)) - return - var/list/possible_targets = hearers(body, dist)-body - if(!length(possible_targets)) - return - for(var/weakref/enemy in enemies) // Remove all entries that aren't in enemies - var/M = enemy.resolve() - if(M in possible_targets) - LAZYDISTINCTADD(., M) + return get_raw_target_list() + return ..() /datum/mob_controller/aggressive/find_target() + . = ..() if(!body.can_act() || !body.faction) return null resume_wandering() - for(var/atom/A in list_targets(10)) - if(valid_target(A)) - set_stance(STANCE_ATTACK) - body.face_atom(A) - return A + for(var/atom/A in get_valid_targets()) + set_stance(STANCE_ATTACK) + body.face_atom(A) + return A /datum/mob_controller/aggressive/valid_target(var/atom/A) - if(A == body) + if(!..()) return FALSE if(ismob(A)) var/mob/M = A if(M.faction == body.faction && !attack_same_faction) return FALSE - else if(weakref(M) in get_friends()) - return FALSE if(M.stat) return FALSE if(ishuman(M)) @@ -262,20 +244,12 @@ return FALSE return TRUE -/datum/mob_controller/aggressive/open_fire() - if(!body.can_act()) +/datum/mob_controller/aggressive/handle_ranged_target(atom/ranged_target) + if(!body.can_act() || !ranged_target) return FALSE - body.handle_ranged_attack(get_target()) + body.handle_ranged_attack(ranged_target) return TRUE -/datum/mob_controller/aggressive/lose_target() - set_target(null) - lost_target() - -/datum/mob_controller/aggressive/lost_target() - set_stance(STANCE_IDLE) - body.stop_automove() - /datum/mob_controller/aggressive/pacify(mob/user) ..() attack_same_faction = FALSE diff --git a/code/datums/ai/beast.dm b/code/datums/ai/beast.dm index 91ad1fec7a5..9090698f55a 100644 --- a/code/datums/ai/beast.dm +++ b/code/datums/ai/beast.dm @@ -36,7 +36,7 @@ qdel(S) break -/datum/mob_controller/aggressive/beast/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/beast/list_targets() . = ..() if(!length(.)) if(LAZYLEN(prey)) @@ -46,6 +46,6 @@ if(M) . |= M else if(body.get_nutrition() < body.get_max_nutrition() * 0.75) //time to look for some food - for(var/mob/living/L in view(body, dist)) + for(var/mob/living/L in get_raw_target_list()) if(attack_same_faction || L.faction != body.faction) LAZYDISTINCTADD(prey, weakref(L)) diff --git a/code/datums/ai/commanded.dm b/code/datums/ai/commanded.dm index e4452782a84..c9e1e7f8e97 100644 --- a/code/datums/ai/commanded.dm +++ b/code/datums/ai/commanded.dm @@ -85,8 +85,8 @@ var/list/targets = get_targets_by_name(message) if(LAZYLEN(targets) != 1) //CONFUSED. WHO DO I FOLLOW? return 0 - var/weakref/target_ref = targets[1] - set_target(target_ref.resolve()) //YEAH GOOD IDEA + var/weakref/single_target_ref = targets[1] + set_target(single_target_ref.resolve()) //YEAH GOOD IDEA set_stance(STANCE_COMMANDED_FOLLOW) //GOT SOMEBODY. BETTER FOLLOW EM. return 1 @@ -98,7 +98,7 @@ return stop_wandering() var/atom/target = get_target() - if(istype(target) && (target in list_targets(10))) + if(istype(target) && (target in get_raw_target_list())) body.start_automove(target) /datum/mob_controller/aggressive/commanded/proc/commanded_stop() //basically a proc that runs whenever we are asked to stay put. Probably going to remain unused. @@ -125,12 +125,14 @@ LAZYADD(., weakref(M)) /datum/mob_controller/aggressive/commanded/find_target() + SHOULD_CALL_PARENT(FALSE) + next_target_scan_time = world.time + target_scan_delay if(!LAZYLEN(_allowed_targets)) return null var/mode = "specific" if(LAZYACCESS(_allowed_targets, 1) == "everyone") //we have been given the golden gift of murdering everything. Except our master, of course. And our friends. So just mostly everyone. mode = "everyone" - for(var/atom/A in list_targets(10)) + for(var/atom/A in get_raw_target_list()) if(A == src) continue if(isliving(A)) diff --git a/code/datums/movement/automove_controller.dm b/code/datums/movement/automove_controller.dm index 08dae443f35..b413d999849 100644 --- a/code/datums/movement/automove_controller.dm +++ b/code/datums/movement/automove_controller.dm @@ -1,7 +1,8 @@ /// Implements automove logic; can be overridden on mob procs if you want to vary the logic from the below. /decl/automove_controller - var/completion_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom reaches its target. - var/failure_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom fails to move. + var/completion_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom reaches its target. + var/failure_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom fails to move. + var/try_avoid_obstacles = TRUE // Will try to move 90 degrees around an obstacle. /decl/automove_controller/proc/handle_mover(atom/movable/mover, datum/automove_metadata/metadata) @@ -49,14 +50,16 @@ return TRUE // no idea how we would get into this position if(mover.SelfMove(target_dir) && (old_loc != mover.loc)) - return TRUE + mover.handle_post_automoved(old_loc) + return (mover.get_automove_target() == mover.loc) // We may have transitioned to the next step in a path. - // Try to move around any obstacle. - var/static/list/_alt_dir_rot = list(45, -45) - for(var/alt_dir in shuffle(_alt_dir_rot)) - mover.reset_movement_delay() - if(mover.SelfMove(turn(target_dir, alt_dir)) && (old_loc != mover.loc)) - return TRUE + if(try_avoid_obstacles) + // Try to move around any obstacle. + var/static/list/_alt_dir_rot = list(45, -45) + for(var/alt_dir in shuffle(_alt_dir_rot)) + mover.reset_movement_delay() + if(mover.SelfMove(turn(target_dir, alt_dir)) && (old_loc != mover.loc)) + return TRUE mover.failed_automove() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index d2be93779da..0c98725538c 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -581,6 +581,9 @@ if(!.) // If we're under or inside shelter, use the z-level rain (for ambience) . = SSweather.weather_by_z[my_turf.z] +/atom/movable/proc/handle_post_automoved(atom/old_loc) + return + /atom/movable/take_vaporized_reagent(reagent, amount) if(ATOM_IS_OPEN_CONTAINER(src)) return loc?.take_vaporized_reagent(reagent, amount) diff --git a/code/game/turfs/turf_navigation.dm b/code/game/turfs/turf_navigation.dm new file mode 100644 index 00000000000..9085f6b99d9 --- /dev/null +++ b/code/game/turfs/turf_navigation.dm @@ -0,0 +1,62 @@ +/******************************************************************/ +// Navigation procs +// Used for A-star pathfinding + +// Returns the surrounding cardinal turfs with open links +// Including through doors openable with the ID +/turf/proc/CardinalTurfsWithAccess(var/obj/item/card/id/ID) + var/L[] = new() + + for(var/d in global.cardinal) + var/turf/T = get_step(src, d) + if(istype(T) && !T.density && T.simulated && !LinkBlockedWithAccess(src, T, ID)) + L.Add(T) + return L + + +// Returns true if a link between A and B is blocked +// Movement through doors allowed if ID has access +/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/card/id/ID) + + if(A == null || B == null) return 1 + var/adir = get_dir(A,B) + var/rdir = get_dir(B,A) + if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal + var/iStep = get_step(A,adir&(NORTH|SOUTH)) + if(!LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID)) + return 0 + + var/pStep = get_step(A,adir&(EAST|WEST)) + if(!LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID)) + return 0 + return 1 + + if(DirBlockedWithAccess(A,adir, ID)) + return 1 + + if(DirBlockedWithAccess(B,rdir, ID)) + return 1 + + for(var/obj/O in B) + if(O.density && !istype(O, /obj/machinery/door) && !(O.atom_flags & ATOM_FLAG_CHECKS_BORDER)) + return 1 + + return 0 + +// Returns true if direction is blocked from loc +// Checks doors against access with given ID +/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/card/id/ID) + for(var/obj/structure/window/D in loc) + if(!D.density) continue + if(D.dir == SOUTHWEST) return 1 + if(D.dir == dir) return 1 + + for(var/obj/machinery/door/D in loc) + if(!D.density) continue + if(istype(D, /obj/machinery/door/window)) + if( dir & D.dir ) return !D.check_access(ID) + + //if((dir & SOUTH) && (D.dir & (EAST|WEST))) return !D.check_access(ID) + //if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return !D.check_access(ID) + else return !D.check_access(ID) // it's a real, air blocking door + return 0 diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index 25f9dca52a4..f92af368dcd 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -96,6 +96,10 @@ return ..() /obj/item/integrated_circuit/smart/advanced_pathfinder/do_work() + + if(waiting_for_path) + return + if(!assembly) activate_pin(3) return @@ -119,20 +123,30 @@ if(Pl&&islist(Pl)) idc.access = Pl var/turf/a_loc = get_turf(assembly) - var/list/P = AStar(a_loc, locate(get_pin_data(IC_INPUT, 1), get_pin_data(IC_INPUT, 2), a_loc.z), TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, 200, id=idc, exclude=get_turf(get_pin_data_as_type(IC_INPUT, 3, /atom))) + SSpathfinding.enqueue_mover( + src, + locate(get_pin_data(IC_INPUT, 1), get_pin_data(IC_INPUT, 2), a_loc.z), + new /datum/pathfinding_metadata( + _max_node_depth = 200, + _id = idc, + _obstacle = get_turf(get_pin_data_as_type(IC_INPUT, 3, /atom)) + ) + ) - if(!P) - activate_pin(3) - return - else - var/list/Xn = new/list(P.len) - var/list/Yn = new/list(P.len) - var/turf/T - for(var/i =1 to P.len) - T=P[i] - Xn[i] = T.x - Yn[i] = T.y - set_pin_data(IC_OUTPUT, 1, Xn) - set_pin_data(IC_OUTPUT, 2, Yn) - push_data() - activate_pin(2) +/obj/item/integrated_circuit/smart/advanced_pathfinder/path_not_found() + ..() + activate_pin(3) + +/obj/item/integrated_circuit/smart/advanced_pathfinder/path_found(list/path) + ..() + var/list/Xn = new/list(path.len) + var/list/Yn = new/list(path.len) + var/turf/T + for(var/i = 1 to path.len) + T=path[i] + Xn[i] = T.x + Yn[i] = T.y + set_pin_data(IC_OUTPUT, 1, Xn) + set_pin_data(IC_OUTPUT, 2, Yn) + push_data() + activate_pin(2) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index fab8219c169..cfe9577d41c 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -242,7 +242,7 @@ resetTarget() lookForTargets() if(will_patrol && !LAZYLEN(grabbed_by) && !target) - if(patrol_path && patrol_path.len) + if(length(patrol_path)) for(var/i = 1 to patrol_speed) sleep(20 / (patrol_speed + 1)) handlePatrol() @@ -266,7 +266,7 @@ if(!target || !target.loc) return if(get_dist(src, target) > min_target_dist) - if(!target_path.len || get_turf(target) != target_path[target_path.len]) + if(!length(target_path) || get_turf(target) != target_path[target_path.len]) calcTargetPath() if(makeStep(target_path)) frustration = 0 @@ -297,9 +297,9 @@ return /mob/living/bot/proc/startPatrol() - var/turf/T = getPatrolTurf() - if(T) - patrol_path = AStar(get_turf(loc), T, TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, max_patrol_dist, id = botcard, exclude = obstacle) + var/turf/target_turf = getPatrolTurf() + if(target_turf) + patrol_path = SSpathfinding.find_path_immediate(start = get_turf(loc), end = target_turf, max_node_depth = max_patrol_dist, id = botcard, exclude = obstacle, check_tick = TRUE) if(!patrol_path) patrol_path = list() obstacle = null @@ -331,23 +331,22 @@ return /mob/living/bot/proc/calcTargetPath() - target_path = AStar(get_turf(loc), get_turf(target), TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, max_target_dist, id = botcard, exclude = obstacle) - if(!target_path) - if(target && target.loc) - ignore_list |= target - resetTarget() - obstacle = null - return + target_path = SSpathfinding.find_path_immediate(start = get_turf(loc), end = get_turf(target), max_node_depth = max_target_dist, min_target_dist = min_target_dist, id = botcard, exclude = obstacle, check_tick = TRUE) + if(length(target_path)) + return + if(target?.loc) + ignore_list |= target + resetTarget() + obstacle = null /mob/living/bot/proc/makeStep(var/list/path) - if(!path.len) - return 0 - var/turf/T = path[1] - if(get_turf(src) == T) - path -= T + if(!length(path)) + return FALSE + var/turf/target_turf = path[1] + if(get_turf(src) == target_turf) + path -= target_turf return makeStep(path) - - return step_towards(src, T) + return step_towards(src, target_turf) /mob/living/bot/proc/resetTarget() target = null @@ -371,70 +370,6 @@ set_light(0) update_icon() -/******************************************************************/ -// Navigation procs -// Used for A-star pathfinding - - -// Returns the surrounding cardinal turfs with open links -// Including through doors openable with the ID -/turf/proc/CardinalTurfsWithAccess(var/obj/item/card/id/ID) - var/L[] = new() - - for(var/d in global.cardinal) - var/turf/T = get_step(src, d) - if(istype(T) && !T.density && T.simulated && !LinkBlockedWithAccess(src, T, ID)) - L.Add(T) - return L - - -// Returns true if a link between A and B is blocked -// Movement through doors allowed if ID has access -/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/card/id/ID) - - if(A == null || B == null) return 1 - var/adir = get_dir(A,B) - var/rdir = get_dir(B,A) - if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal - var/iStep = get_step(A,adir&(NORTH|SOUTH)) - if(!LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID)) - return 0 - - var/pStep = get_step(A,adir&(EAST|WEST)) - if(!LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID)) - return 0 - return 1 - - if(DirBlockedWithAccess(A,adir, ID)) - return 1 - - if(DirBlockedWithAccess(B,rdir, ID)) - return 1 - - for(var/obj/O in B) - if(O.density && !istype(O, /obj/machinery/door) && !(O.atom_flags & ATOM_FLAG_CHECKS_BORDER)) - return 1 - - return 0 - -// Returns true if direction is blocked from loc -// Checks doors against access with given ID -/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/card/id/ID) - for(var/obj/structure/window/D in loc) - if(!D.density) continue - if(D.dir == SOUTHWEST) return 1 - if(D.dir == dir) return 1 - - for(var/obj/machinery/door/D in loc) - if(!D.density) continue - if(istype(D, /obj/machinery/door/window)) - if( dir & D.dir ) return !D.check_access(ID) - - //if((dir & SOUTH) && (D.dir & (EAST|WEST))) return !D.check_access(ID) - //if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return !D.check_access(ID) - else return !D.check_access(ID) // it's a real, air blocking door - return 0 - /mob/living/bot/GetIdCards(list/exceptions) . = ..() if(istype(botcard) && !is_type_in_list(botcard, exceptions)) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index e989ba53b32..0381d5de33f 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -43,11 +43,14 @@ /mob/living/bot/cleanbot/confirmTarget(var/obj/effect/decal/cleanable/D) if(!..()) - return 0 + return FALSE + if(istype(D, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = D + return dirt.dirt_amount >= 25 for(var/T in target_types) if(istype(D, T)) - return 1 - return 0 + return TRUE + return FALSE /mob/living/bot/cleanbot/handleAdjacentTarget() if(get_turf(target) == src.loc) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 86a8a941189..0e027aa687b 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -123,24 +123,6 @@ target = source return -/mob/living/bot/farmbot/calcTargetPath() // We need to land NEXT to the tray, because the tray itself is impassable - for(var/trayDir in list(NORTH, SOUTH, EAST, WEST)) - target_path = AStar(get_turf(loc), get_step(get_turf(target), trayDir), TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, max_target_dist, id = botcard) - if(target_path) - break - if(!target_path) - ignore_list |= target - target = null - target_path = list() - return - -/mob/living/bot/farmbot/stepToTarget() // Same reason - var/turf/T = get_turf(target) - if(!target_path.len || !T.Adjacent(target_path[target_path.len])) - calcTargetPath() - makeStep(target_path) - return - /mob/living/bot/farmbot/UnarmedAttack(var/atom/A, var/proximity) . = ..() if(.) diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index bb9cf31e58e..437ef616451 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -183,7 +183,7 @@ /mob/living/bot/mulebot/calcTargetPath() ..() - if(!target_path.len && target != home) // I presume that target is not null + if(!length(target_path) && target != home) // I presume that target is not null resetTarget() target = home targetName = "Home" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4ca6afa7545..49300a21f14 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1359,11 +1359,6 @@ default behaviour is: return FALSE return TRUE -//gets name from ID or PDA itself, ID inside PDA doesn't matter -//Useful when player is being seen by other mobs -/mob/living/proc/get_id_name(if_no_id = "Unknown") - return GetIdCard(exceptions = list(/obj/item/holder))?.registered_name || if_no_id - /mob/living/get_default_temperature_threshold(threshold) if(isSynthetic()) switch(threshold) diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index c32b39b1a42..2f79162b6c9 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -64,7 +64,7 @@ stop_wandering() stance_step++ if(stance_step >= 20) - if(target && (target in list_targets(10))) + if(target && (target in get_raw_target_list())) set_stance(STANCE_ATTACK) //If the mob he was chasing is still nearby, resume the attack, otherwise go idle. else set_stance(STANCE_IDLE) @@ -72,7 +72,7 @@ if(STANCE_ALERT) stop_wandering() var/found_mob = 0 - if(target && (target in list_targets(10))) + if(target && (target in get_raw_target_list())) if(!attackable(target)) stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again. stance_step++ diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm index f504d63398e..1145b90b6e8 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -52,8 +52,8 @@ if(LAZYLEN(targets) != 1) body.say("ERROR. TARGET COULD NOT BE PARSED.") return 0 - var/weakref/target_ref = targets[1] - set_target(target_ref.resolve()) + var/weakref/single_target_ref = targets[1] + set_target(single_target_ref.resolve()) set_stance(STANCE_COMMANDED_HEAL) return 1 if(findtext(text,"emergency protocol")) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm b/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm index be65f62f707..b828ae9e7b0 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm @@ -23,7 +23,7 @@ paired_nurse = null /datum/mob_controller/aggressive/giant_spider/guard/proc/find_nurse() - for(var/mob/living/simple_animal/hostile/giant_spider/nurse/nurse in list_targets(10)) + for(var/mob/living/simple_animal/hostile/giant_spider/nurse/nurse in get_raw_target_list()) if(nurse.stat || !istype(nurse.ai, /datum/mob_controller/aggressive/giant_spider/nurse)) continue var/datum/mob_controller/aggressive/giant_spider/nurse/nurse_ai = nurse.ai diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm index 091230eca45..ead786ab340 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm @@ -26,7 +26,7 @@ /datum/mob_controller/aggressive/megahivebot can_escape_buckles = TRUE -/datum/mob_controller/aggressive/megahivebot/open_fire() +/datum/mob_controller/aggressive/megahivebot/handle_ranged_target(atom/ranged_target) var/mob/living/simple_animal/hostile/hivebot/mega/megabot = body if(!istype(megabot)) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index c2e2b3c5a18..88defeeaf28 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -45,7 +45,7 @@ var/global/list/protected_objects = list( var/awake = TRUE // Return a list of targets that isn't the creator -/datum/mob_controller/aggressive/mimic/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/mimic/get_valid_targets() var/mob/living/simple_animal/hostile/mimic/mimic = body . = istype(mimic) && mimic.awake && ..() if(length(.) && mimic.creator) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 498adac96b3..e3f5b4fe9ff 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -54,8 +54,15 @@ /mob/living/simple_animal/hostile/malf_drone/has_ranged_attack() return TRUE -/datum/mob_controller/aggressive/malf_drone/list_targets(var/dist = 7) - . = ..(hostile_drone ? hostile_range : dist) +/datum/mob_controller/aggressive/malf_drone/get_raw_target_list() + if(hostile_drone) + target_scan_distance = hostile_range + else + target_scan_distance = initial(target_scan_distance) + . = ..() + +/datum/mob_controller/aggressive/malf_drone/get_valid_targets() + . = ..() for(var/mob/M in .) if(istype(M, body.type)) . -= M diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 8384fc93a6c..4218f9176bf 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -23,13 +23,14 @@ try_destroy_surroundings = FALSE can_escape_buckles = TRUE -/datum/mob_controller/aggressive/slug/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/slug/valid_target(atom/A) . = ..() - var/mob/living/simple_animal/hostile/slug/slug = body - if(istype(slug)) - for(var/mob/living/M in .) - if(slug.check_friendly_species(M)) - . -= M + if(.) + if(!ismob(A)) + return FALSE + var/mob/living/simple_animal/hostile/slug/slug = body + if(slug.check_friendly_species(A)) + return FALSE /mob/living/simple_animal/hostile/slug/proc/check_friendly_species(var/mob/living/M) return istype(M) && M.faction == faction diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index edf74c14dd0..35df33c80fa 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1395,5 +1395,10 @@ /mob/proc/handle_footsteps() return +//gets name from ID or PDA itself, ID inside PDA doesn't matter +//Useful when player is being seen by other mobs +/mob/proc/get_id_name(if_no_id = "Unknown") + return GetIdCard(exceptions = list(/obj/item/holder))?.registered_name || if_no_id + /mob/proc/can_twohand_item(obj/item/item) return FALSE diff --git a/code/modules/mob/mob_automove.dm b/code/modules/mob/mob_automove.dm index ff8d1a6d7ba..f552d4f7c1e 100644 --- a/code/modules/mob/mob_automove.dm +++ b/code/modules/mob/mob_automove.dm @@ -6,18 +6,60 @@ _automove_target = null return ..() +/mob/path_found(list/path) + ..() + if(islist(path) && length(path) > 1) + path.Cut(1, 2) // Remove the first turf since it's going to be our origin. + if(length(path)) + start_automove(path) + +/mob/path_not_found() + ..() + stop_automove() + /// Called by get_movement_delay() to override the current move intent, in cases where an automove has a delay override. /mob/proc/get_automove_delay() var/datum/automove_metadata/metadata = SSautomove.moving_metadata[src] return metadata?.move_delay +/mob/failed_automove() + ..() + stop_automove() + _automove_target = null + return FALSE + /mob/start_automove(target, movement_type, datum/automove_metadata/metadata) _automove_target = target return ..() // The AI datum may decide to track a target instead of using the mob reference. /mob/get_automove_target(datum/automove_metadata/metadata) - . = (istype(ai) && ai.get_automove_target()) || _automove_target || ..() + . = _automove_target || (istype(ai) && ai.get_automove_target()) || ..() + if(islist(.)) + var/list/path = . + while(length(path) && path[1] == get_turf(src)) + path.Cut(1,2) + if(length(path)) + return path[1] + return null + +/mob/handle_post_automoved(atom/old_loc) + if(istype(ai)) + ai.handle_post_automoved(old_loc) + return + if(!islist(_automove_target) || length(_automove_target) <= 0) + return + var/turf/body_turf = get_turf(src) + if(!istype(body_turf)) + return + var/list/_automove_target_list = _automove_target + if(_automove_target_list[1] != body_turf) + return + if(length(_automove_target_list) > 1) + _automove_target_list.Cut(1, 2) + else + _automove_target_list = null + stop_automove() // We do some early checking here to avoid doing the same checks repeatedly by calling SelfMove(). /mob/can_do_automated_move(variant_move_delay) diff --git a/code/procs/AStar.dm b/code/procs/pathfinding.dm similarity index 78% rename from code/procs/AStar.dm rename to code/procs/pathfinding.dm index 01e4213f805..7732761b8d3 100644 --- a/code/procs/AStar.dm +++ b/code/procs/pathfinding.dm @@ -5,14 +5,14 @@ A Star pathfinding algorithm Returns a list of tiles forming a path from A to B, taking dense objects as well as walls, and the orientation of windows along the route into account. Use: -your_list = AStar(start location, end location, adjacent turf proc, distance proc) +your_list = find_path_astar(start location, end location, adjacent turf proc, distance proc) For the adjacent turf proc i wrote: /turf/proc/AdjacentTurfs And for the distance one i wrote: /turf/proc/Distance So an example use might be: -src.path_list = AStar(src.loc, target.loc, TYPE_PROC_REF(/turf, AdjacentTurfs), TYPE_PROC_REF(/turf, Distance)) +src.path_list = find_path_astar(src.loc, target.loc, TYPE_PROC_REF(/turf, AdjacentTurfs), TYPE_PROC_REF(/turf, Distance)) Note: The path is returned starting at the END node, so i wrote reverselist to reverse it for ease of use. @@ -60,7 +60,12 @@ length to avoid portals or something i guess?? Not that they're counted right no /proc/PathWeightCompare(PathNode/a, PathNode/b) return a.estimated_cost - b.estimated_cost -/proc/AStar(var/start, var/end, adjacent, dist, var/max_nodes, var/max_node_depth = 30, var/min_target_dist = 0, var/min_node_dist, var/id, var/datum/exclude) +/proc/find_path_astar_async(start, end, adjacent, dist, max_nodes, max_node_depth = 30, min_target_dist = 0, min_node_dist, id, datum/exclude) + set waitfor = FALSE + return find_path_astar(start, end, adjacent, dist, max_nodes, max_node_depth, min_target_dist, min_node_dist, id, exclude, check_tick = TRUE) + +/proc/find_path_astar(start, end, adjacent, dist, max_nodes, max_node_depth = 30, min_target_dist = 0, min_node_dist, id, datum/exclude, check_tick = FALSE) + var/datum/priority_queue/open = new /datum/priority_queue(/proc/PathWeightCompare) var/list/closed = list() var/list/path @@ -85,13 +90,11 @@ length to avoid portals or something i guess?? Not that they're counted right no path[index--] = current.position break - if(min_node_dist && max_node_depth) - if(call(current.position, min_node_dist)(end) + current.nodes_traversed >= max_node_depth) - continue + if(min_node_dist && max_node_depth && (call(current.position, min_node_dist)(end) + current.nodes_traversed >= max_node_depth)) + continue - if(max_node_depth) - if(current.nodes_traversed >= max_node_depth) - continue + if(max_node_depth && current.nodes_traversed >= max_node_depth) + continue for(var/datum/datum in call(current.position, adjacent)(id)) if(datum == exclude) @@ -115,4 +118,9 @@ length to avoid portals or something i guess?? Not that they're counted right no if(max_nodes && open.Length() > max_nodes) open.Remove(open.Length()) + if(check_tick) + CHECK_TICK + if(check_tick) + CHECK_TICK + return path diff --git a/nebula.dme b/nebula.dme index d286bdf0899..4ea2a638823 100644 --- a/nebula.dme +++ b/nebula.dme @@ -283,6 +283,7 @@ #include "code\controllers\subsystems\mapping.dm" #include "code\controllers\subsystems\misc_late.dm" #include "code\controllers\subsystems\overlays.dm" +#include "code\controllers\subsystems\pathfinding.dm" #include "code\controllers\subsystems\plants.dm" #include "code\controllers\subsystems\radiation.dm" #include "code\controllers\subsystems\shuttle.dm" @@ -357,7 +358,13 @@ #include "code\datums\type_cloning.dm" #include "code\datums\weakref.dm" #include "code\datums\ai\_ai.dm" +#include "code\datums\ai\_ai_enemies.dm" +#include "code\datums\ai\_ai_friends.dm" +#include "code\datums\ai\_ai_memory.dm" +#include "code\datums\ai\_ai_pathfinding.dm" #include "code\datums\ai\_ai_stance.dm" +#include "code\datums\ai\_ai_targets.dm" +#include "code\datums\ai\_ai_wander.dm" #include "code\datums\ai\aggressive.dm" #include "code\datums\ai\beast.dm" #include "code\datums\ai\commanded.dm" @@ -1574,6 +1581,7 @@ #include "code\game\turfs\turf_footsteps.dm" #include "code\game\turfs\turf_height.dm" #include "code\game\turfs\turf_material.dm" +#include "code\game\turfs\turf_navigation.dm" #include "code\game\turfs\turf_ramps.dm" #include "code\game\turfs\unsimulated.dm" #include "code\game\turfs\flooring\_flooring.dm" @@ -4070,9 +4078,9 @@ #include "code\modules\ZAS\Variable Settings.dm" #include "code\modules\ZAS\Zone.dm" #include "code\procs\announce.dm" -#include "code\procs\AStar.dm" #include "code\procs\dbcore.dm" #include "code\procs\hud.dm" +#include "code\procs\pathfinding.dm" #include "code\procs\radio.dm" #include "code\unit_tests\_defines.dm" #include "code\unit_tests\_includes.dm" From c1e1e68dff6b8e915648310e1c51401896ad1abc Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 7 Dec 2024 14:56:13 +1100 Subject: [PATCH 130/554] Adds a grandfather clock. --- .../objects/structures/grandfather_clock.dm | 63 ++++++++++++++++++ icons/obj/structures/grandfather_clock.dmi | Bin 0 -> 721 bytes nebula.dme | 1 + 3 files changed, 64 insertions(+) create mode 100644 code/game/objects/structures/grandfather_clock.dm create mode 100644 icons/obj/structures/grandfather_clock.dmi diff --git a/code/game/objects/structures/grandfather_clock.dm b/code/game/objects/structures/grandfather_clock.dm new file mode 100644 index 00000000000..b1dadeb884a --- /dev/null +++ b/code/game/objects/structures/grandfather_clock.dm @@ -0,0 +1,63 @@ +// TODO: buildable with artifice? +// TODO: looping 2 second tick tock sound, somehow aligned with pendulum (may not be possible in DM) +/obj/structure/grandfather_clock + name = "grandfather clock" + desc = "A tall, stately timepiece." + icon = 'icons/obj/structures/grandfather_clock.dmi' + icon_state = ICON_STATE_WORLD + density = TRUE + material = /decl/material/solid/organic/wood/mahogany + var/face_color = "#f0edc7" + var/last_time + var/decl/material/clockwork_mat = /decl/material/solid/metal/brass + +/obj/structure/grandfather_clock/Initialize(ml, _mat, _reinf_mat) + if(ispath(clockwork_mat)) + clockwork_mat = GET_DECL(clockwork_mat) + . = ..() + START_PROCESSING(SSobj, src) + update_icon() + +/obj/structure/grandfather_clock/examine(mob/user, distance, infix, suffix) + . = ..() + // TODO: check literacy? + if(isnull(last_time)) + last_time = stationtime2text() + to_chat(user, SPAN_NOTICE("The face of \the [src] reads [last_time].")) + +// TODO: don't magically make the time update when swinging is restarted +// TODO: alt interaction to interfere with the clock? +/obj/structure/grandfather_clock/attack_hand(mob/user) + . = ..() + if(!.) + if(is_processing) + STOP_PROCESSING(SSobj, src) + user.visible_message(SPAN_NOTICE("\The [user] reaches into \the [src] and stops the pendulum.")) + else + START_PROCESSING(SSobj, src) + user.visible_message(SPAN_NOTICE("\The [user] reaches into \the [src] and sets the pendulum swinging.")) + update_icon() + return TRUE + +/obj/structure/grandfather_clock/Process() + ..() + var/new_time = stationtime2text() + if(new_time != last_time) + last_time = new_time + update_icon() + +/obj/structure/grandfather_clock/on_update_icon() + . = ..() + if(isnull(last_time)) + last_time = stationtime2text() + if(face_color) + add_overlay(overlay_image(icon, "[icon_state]-face", face_color, RESET_COLOR)) + if(!clockwork_mat) + return + if(is_processing) + add_overlay(overlay_image(icon, "[icon_state]-pendulum-swing", clockwork_mat.color, RESET_COLOR)) + else + add_overlay(overlay_image(icon, "[icon_state]-pendulum", clockwork_mat.color, RESET_COLOR)) + var/list/time_stats = splittext(last_time, ":") + add_overlay(overlay_image(icon, "[icon_state]-hour[round(((text2num(time_stats[1]) / 24) * 360) / 45) * 45]"), clockwork_mat.color, RESET_COLOR) + add_overlay(overlay_image(icon, "[icon_state]-minute[round(((text2num(time_stats[2]) / 60) * 360) / 45) * 45]"), clockwork_mat.color, RESET_COLOR) diff --git a/icons/obj/structures/grandfather_clock.dmi b/icons/obj/structures/grandfather_clock.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cbef65c5ac440ee9343dc9001a6fdbbf2aac640a GIT binary patch literal 721 zcmV;?0xtcDP)fFDZ*Bkp zc$}4!F%E+u6hLP<1<_R-MVs28OQUHV>K#l$AyI4qYkK>V;?ktUXX1bIc*9GG$+fw) z9jWgvesOK&qR54mhYX`lGArCtP>ckZqp*H4wzu4k(YEM`MHn%ujoWjK2Hnrx&%abU z^bZb1#j@%wfGv*!@Hxbs7a{7r3UN~!;-;q%cacNgvsA0)P`9VSy*&;t?s0hYod;L< zJiPnPgUfp!-u}rITc>pn#8b0LHU588xm!NY*do4}q!>>xW>80`dNb@L&pblN*=<-Lx#u5(REc_Z2QH$z$c((T~%o zK;y?l1#W})!>2%u?P^7XTP$AKq`i&4{S=7t>ckR(B(|IRyn|xa+xedX`&&f+9W*|K zW6uPrXJclnfHTHX1>_(rF!nvwf&1?J`Od3fyQc%91?PhIv*THC?)g{26c~*$SEfKb zp?F3-fv16JfhX`X;QfOp(7hZOOB3kd@C1Yqhmg$Kdk1fut9OAo*Z=p0>yv>6FIZe4 zgb+dqA%yr9_G7tpJg6E2G3K}9`kGmvy#@4~++i_wNhpL6LI@#*5aLMA Date: Mon, 9 Dec 2024 10:19:51 +1100 Subject: [PATCH 131/554] Fixing issues with ammo magazine contents init. --- code/modules/projectiles/ammunition.dm | 1 + code/modules/projectiles/ammunition/boxes.dm | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index a26611bd894..f163d0f64c7 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -167,6 +167,7 @@ return for(var/i in 1 to initial_ammo) stored_ammo += new ammo_type(src) + contents_initialized = TRUE /obj/item/ammo_magazine/proc/get_stored_ammo_count() . = length(stored_ammo) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 43f6f7fb6c1..962cdda3676 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -18,14 +18,16 @@ /obj/item/ammo_magazine/speedloader/on_update_icon() . = ..() - if(!length(stored_ammo)) + var/ammo_count = get_stored_ammo_count() + if(!ammo_count) return + create_initial_contents() // Not ideal, but we need instances for the icon gen. switch(icon_state) if("world") var/ammo_state = "world-some" - if(length(stored_ammo) == 1) + if(ammo_count == 1) ammo_state = "world-one" - else if(length(stored_ammo) == max_ammo) + else if(ammo_count == max_ammo) ammo_state = "world-full" var/obj/item/ammo_casing/A = stored_ammo[1] add_overlay(overlay_image(icon, ammo_state, A.color, RESET_COLOR)) From 1a9c1db9c20f1bae4b3ae70965ab7fd56d424437 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 9 Dec 2024 10:25:25 +1100 Subject: [PATCH 132/554] Synthetics do not get hungry or thirsty. --- code/modules/mob/living/life.dm | 2 +- code/modules/mob/living/living.dm | 4 ++-- code/modules/mob/living/silicon/silicon.dm | 9 --------- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index e73ef41b016..f81a0412fcc 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -121,7 +121,7 @@ return TRUE /mob/living/proc/experiences_hunger_and_thirst() - return TRUE + return !isSynthetic() // Doesn't really apply to robots. Maybe unify this with cells in the future. /mob/living/proc/get_hunger_factor() var/decl/species/my_species = get_species() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4796744c441..6889922700e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -920,7 +920,7 @@ default behaviour is: nutrition = clamp(amt, 0, get_max_nutrition()) /mob/living/proc/get_nutrition() - return nutrition + return isSynthetic() ? get_max_nutrition() : nutrition /mob/living/proc/adjust_nutrition(var/amt) set_nutrition(get_nutrition() + amt) @@ -929,7 +929,7 @@ default behaviour is: return 500 /mob/living/proc/get_hydration(var/amt) - return hydration + return isSynthetic() ? get_max_hydration() : hydration /mob/living/proc/set_hydration(var/amt) hydration = clamp(amt, 0, get_max_hydration()) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index ebcd89aaf52..21a5b1be638 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -71,15 +71,6 @@ /mob/living/silicon/get_dexterity(silent) return dexterity -/mob/living/silicon/experiences_hunger_and_thirst() - return FALSE // Doesn't really apply to robots. Maybe unify this with cells in the future. - -/mob/living/silicon/get_nutrition() - return get_max_nutrition() - -/mob/living/silicon/get_hydration() - return get_max_hydration() - /mob/living/silicon/fully_replace_character_name(new_name) ..() create_or_update_account(new_name) From ef86cd4fe6d769ceaa7e9e5323b3b659a75006b3 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 7 Dec 2024 11:18:14 +1100 Subject: [PATCH 133/554] Various clothing and equipment tweaks for Karzerfeste. --- code/datums/outfits/outfit.dm | 173 +++++++++++------- code/modules/clothing/neck/jewelry.dm | 3 + code/modules/clothing/suits/armor/_armor.dm | 9 +- .../clothing/suits/armor/forged/brigandine.dm | 1 + code/modules/clothing/suits/hooded_cloak.dm | 3 +- code/modules/clothing/suits/mantle.dm | 7 +- code/modules/clothing/suits/robes.dm | 7 + code/modules/tools/subtypes/axes.dm | 3 + code/modules/tools/subtypes/pickaxes.dm | 4 + icons/clothing/suits/sleeved_robe.dmi | Bin 0 -> 1083 bytes maps/shaded_hills/outfits/_outfits.dm | 7 +- mods/content/fantasy/_fantasy.dme | 1 + mods/content/fantasy/datum/outfits.dm | 15 +- .../content/fantasy/icons/clothing/jerkin.dmi | Bin 1075 -> 1100 bytes .../fantasy/icons/clothing/trousers.dmi | Bin 939 -> 948 bytes .../fantasy/items/clothing/_loadout.dm | 21 +++ .../fantasy/items/clothing/_recipes.dm | 2 +- mods/content/fantasy/items/clothing/armor.dm | 2 +- mods/content/fantasy/items/clothing/cloak.dm | 17 ++ mods/content/fantasy/items/clothing/jerkin.dm | 12 ++ .../fantasy/items/clothing/trousers.dm | 9 +- 21 files changed, 205 insertions(+), 91 deletions(-) create mode 100644 icons/clothing/suits/sleeved_robe.dmi create mode 100644 mods/content/fantasy/items/clothing/cloak.dm diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 572306145f5..c3728f48a2a 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -1,24 +1,26 @@ /decl/outfit abstract_type = /decl/outfit - var/name = "Naked" - var/uniform = null - var/suit = null - var/back = null - var/belt = null - var/gloves = null - var/shoes = null - var/head = null - var/mask = null - var/l_ear = null - var/r_ear = null - var/glasses = null - var/id = null - var/l_pocket = null - var/r_pocket = null + var/name = "Naked And Afraid" + var/uniform = null + var/suit = null + var/back = null + var/belt = null + var/gloves = null + var/shoes = null + var/head = null + var/mask = null + var/l_ear = null + var/r_ear = null + var/glasses = null + var/id = null + var/l_pocket = null + var/r_pocket = null var/suit_store = null - var/holster = null + var/holster = null + /// Linear list of types. Will attempt to place items in hands. var/list/hands - var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format + //. An associative list in list(path=count,otherpath=count) format. Will attempt to place items in storage. + var/list/backpack_contents var/id_type var/id_desc @@ -36,16 +38,21 @@ . = ..() backpack_overrides = backpack_overrides || list() -// This proc is structured slightly strangely because I will be adding pants to it. +// Used for slightly cleaner code around multi-equip records. +/decl/outfit/proc/resolve_equip_to_list(check_type) + if(islist(check_type)) + return check_type + if(ispath(check_type)) + return list(check_type) + return null + /decl/outfit/validate() . = ..() for(var/check_type in list(uniform, suit, back, belt, gloves, shoes, head, mask, l_ear, r_ear, glasses, id, l_pocket, r_pocket, suit_store, pda_type, id_type)) - var/obj/item/thing = check_type - if(isnull(thing)) - continue - if(TYPE_IS_ABSTRACT(thing)) - . += "equipment includes abstract type '[thing]'" + for(var/obj/item/thing as anything in resolve_equip_to_list(check_type)) + if(TYPE_IS_ABSTRACT(thing)) + . += "equipment includes abstract type '[thing]'" for(var/check_type in hands) var/obj/item/thing = check_type @@ -62,18 +69,27 @@ . += "backpack includes abstract type '[thing]'" if(uniform && (outfit_flags & OUTFIT_HAS_VITALS_SENSOR)) - if(!ispath(uniform, /obj/item/clothing)) - . += "outfit is flagged for sensors, but uniform cannot take accessories" - var/succeeded = FALSE - var/obj/item/sensor = new /obj/item/clothing/sensor/vitals - if(uniform) - var/obj/item/clothing/wear_uniform = new uniform // sadly we need to read a list - if(wear_uniform.can_attach_accessory(sensor)) - succeeded = TRUE - qdel(wear_uniform) - if(!succeeded) - . += "outfit is flagged for sensors, but uniform does not accept sensors" - qdel(sensor) + var/list/uniforms = resolve_equip_to_list(uniform) + if(!length(uniforms)) + . += "outfit is flagged for sensors, but has no uniform" + else + var/succeeded = FALSE + var/obj/item/sensor = new /obj/item/clothing/sensor/vitals + for(var/thing in uniforms) + if(!ispath(thing, /obj/item/clothing)) + . += "outfit is flagged for sensors, but uniform [thing] cannot take accessories" + if(thing) + var/obj/item/clothing/wear_uniform = new thing // sadly we need to read a list + if(wear_uniform.can_attach_accessory(sensor)) + succeeded = TRUE + if(!QDELETED(wear_uniform)) + qdel(wear_uniform) + if(succeeded) + break + if(!QDELETED(sensor)) + qdel(sensor) + if(!succeeded) + . += "outfit is flagged for sensors, but uniform does not accept sensors" /decl/outfit/proc/pre_equip(mob/living/wearer) if(outfit_flags & OUTFIT_RESET_EQUIPMENT) @@ -91,8 +107,8 @@ equip_base(wearer, equip_adjustments) equip_id(wearer, assignment, equip_adjustments, job, rank) for(var/path in backpack_contents) - var/number = backpack_contents[path] - for(var/i=0,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 diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 9d7f449a9f5..7815b308a50 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -34,10 +34,26 @@ slot = slot_w_uniform_str uid = "gear_fantasy_loincloth" +/decl/loadout_option/fantasy/uniform/shirt + name = "shirt" + path = /obj/item/clothing/shirt/crafted + uid = "gear_fantasy_shirt" + available_materials = list( + /decl/material/solid/organic/cloth, + /decl/material/solid/organic/cloth/wool, + /decl/material/solid/organic/cloth/hemp, + /decl/material/solid/organic/cloth/linen + ) + /decl/loadout_option/fantasy/uniform/jerkin name = "jerkin" path = /obj/item/clothing/shirt/jerkin uid = "gear_fantasy_jerkin" + available_materials = list( + /decl/material/solid/organic/leather, + /decl/material/solid/organic/skin/feathers, + /decl/material/solid/organic/skin/fur + ) /decl/loadout_option/fantasy/uniform/tunic name = "tunic" @@ -102,6 +118,11 @@ path = /obj/item/clothing/suit/hooded_cloak uid = "gear_fantasy_cloak_hooded" +/decl/loadout_option/fantasy/suit/winter_cloak + name = "cloak, winter" + path = /obj/item/clothing/suit/hooded_cloak/winter + uid = "gear_fantasy_cloak_hooded_winter" + /decl/loadout_option/fantasy/suit/poncho name = "poncho" path = /obj/item/clothing/suit/poncho/colored diff --git a/mods/content/fantasy/items/clothing/_recipes.dm b/mods/content/fantasy/items/clothing/_recipes.dm index 219a875f5bd..99942d8918e 100644 --- a/mods/content/fantasy/items/clothing/_recipes.dm +++ b/mods/content/fantasy/items/clothing/_recipes.dm @@ -1,5 +1,5 @@ /decl/stack_recipe/textiles/jerkin - result_type = /obj/item/clothing/shirt/jerkin + result_type = /obj/item/clothing/shirt/crafted category = "clothing" /decl/stack_recipe/textiles/gown diff --git a/mods/content/fantasy/items/clothing/armor.dm b/mods/content/fantasy/items/clothing/armor.dm index fd475c07f32..22651d3243d 100644 --- a/mods/content/fantasy/items/clothing/armor.dm +++ b/mods/content/fantasy/items/clothing/armor.dm @@ -1,3 +1,3 @@ // Override of the base item to add lore to the desc. /obj/item/clothing/suit/armor/forged/banded - desc = "A suit of overlapping armoured plates that covers the upper and lower body. Favoured by the Aegis and many Splinter Kingdoms." + desc = "A suit of overlapping armoured plates that covers the upper and lower body. Historically favoured by the Aegis and loyally adopted by many Splinter Kingdoms." diff --git a/mods/content/fantasy/items/clothing/cloak.dm b/mods/content/fantasy/items/clothing/cloak.dm new file mode 100644 index 00000000000..f61d886efe5 --- /dev/null +++ b/mods/content/fantasy/items/clothing/cloak.dm @@ -0,0 +1,17 @@ +// TODO: big fuckoff fur collar icons +/obj/item/clothing/head/hood/cloak/winter + min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE + material = /decl/material/solid/organic/cloth/wool + +/obj/item/clothing/suit/hooded_cloak/winter + cold_protection = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS|SLOT_HANDS|SLOT_FEET + min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE + hood = /obj/item/clothing/head/hood/cloak/winter + protects_against_weather = TRUE + material = /decl/material/solid/organic/cloth/wool + +/obj/item/clothing/suit/robe/sleeved/shrine + material = /decl/material/solid/organic/cloth/linen + paint_color = COLOR_DARK_RED + markings_color = COLOR_OFF_WHITE + markings_state_modifier = "_sleeves" diff --git a/mods/content/fantasy/items/clothing/jerkin.dm b/mods/content/fantasy/items/clothing/jerkin.dm index dc437db931d..942a871a81c 100644 --- a/mods/content/fantasy/items/clothing/jerkin.dm +++ b/mods/content/fantasy/items/clothing/jerkin.dm @@ -5,3 +5,15 @@ _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/leather + +/obj/item/clothing/shirt/crafted + desc = "A simple shirt, worn on the upper body." + icon = 'mods/content/fantasy/icons/clothing/jerkin.dmi' // TODO state with sleeves + sprite_sheets = list(BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi') + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/item/clothing/shirt/crafted/wool + material = /decl/material/solid/organic/cloth/wool + +/obj/item/clothing/shirt/crafted/linen + material = /decl/material/solid/organic/cloth/linen diff --git a/mods/content/fantasy/items/clothing/trousers.dm b/mods/content/fantasy/items/clothing/trousers.dm index cbe30375bff..4fac34236e9 100644 --- a/mods/content/fantasy/items/clothing/trousers.dm +++ b/mods/content/fantasy/items/clothing/trousers.dm @@ -7,12 +7,9 @@ color = /decl/material/solid/organic/leather::color _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/trousers_hnoll.dmi' -/obj/item/clothing/pants/trousers/jerkin/Initialize() - . = ..() - var/obj/item/clothing/shirt/jerkin/jerkin = new - attach_accessory(null, jerkin) - if(!(jerkin in accessories)) - qdel(jerkin) +/obj/item/clothing/pants/trousers/linen + material = /decl/material/solid/organic/cloth/linen + color = /decl/material/solid/organic/cloth/linen::color /obj/item/clothing/pants/trousers/braies name = "braies" From 5bf0757d2fa0e1ddd73f7b3bd8738228b21c3746 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 7 Dec 2024 14:01:37 +1100 Subject: [PATCH 134/554] Adding several low tech armor/weapon props. --- code/datums/weakref.dm | 7 +- code/game/objects/structures/armor_stand.dm | 75 ++++++++++++++++++ .../objects/structures/training_dummies.dm | 30 +++++++ .../crafting/stack_recipes/recipes_planks.dm | 4 + icons/obj/structures/archery_butt.dmi | Bin 0 -> 450 bytes icons/obj/structures/armor_stand.dmi | Bin 0 -> 278 bytes icons/obj/structures/training_dummy.dmi | Bin 0 -> 429 bytes nebula.dme | 2 + 8 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 code/game/objects/structures/armor_stand.dm create mode 100644 code/game/objects/structures/training_dummies.dm create mode 100644 icons/obj/structures/archery_butt.dmi create mode 100644 icons/obj/structures/armor_stand.dmi create mode 100644 icons/obj/structures/training_dummy.dmi diff --git a/code/datums/weakref.dm b/code/datums/weakref.dm index a613528d27c..ab0ecb9c6e2 100644 --- a/code/datums/weakref.dm +++ b/code/datums/weakref.dm @@ -15,14 +15,15 @@ /weakref var/ref + var/name // Useful for input() on lists of weakrefs. // Handy info for debugging - var/tmp/ref_name + var/tmp/name var/tmp/ref_type /weakref/New(datum/D) ref = "\ref[D]" - ref_name = "[D]" + name = "[D]" ref_type = D.type /weakref/Destroy() @@ -38,7 +39,7 @@ return null /weakref/get_log_info_line() - return "[ref_name] ([ref_type]) ([ref]) (WEAKREF)" + return "[name] ([ref_type]) ([ref]) (WEAKREF)" /weakref/CanClone() return FALSE //Pass weakref as references since they're unique per atom instance \ No newline at end of file diff --git a/code/game/objects/structures/armor_stand.dm b/code/game/objects/structures/armor_stand.dm new file mode 100644 index 00000000000..96b52bc8266 --- /dev/null +++ b/code/game/objects/structures/armor_stand.dm @@ -0,0 +1,75 @@ +/obj/structure/armor_stand + name = "armor stand" + desc = "A simple stand used to hold armor and helmets for display." + icon = 'icons/obj/structures/armor_stand.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + density = TRUE + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + var/list/slots_to_gear = list( + (slot_wear_suit_str) = null, + (slot_head_str) = null, + (slot_belt_str) = null, + (slot_shoes_str) = null, + (slot_gloves_str) = null + ) + var/list/gear_to_slot + +/obj/structure/armor_stand/Exited(atom/movable/AM, atom/new_loc) + . = ..() + var/weakref/atom_ref = weakref(AM) + if(atom_ref in gear_to_slot) + var/slot = gear_to_slot[atom_ref] + slots_to_gear[slot] = null + LAZYREMOVE(gear_to_slot, atom_ref) + update_icon() + +/obj/structure/armor_stand/Destroy() + slots_to_gear.Cut() + LAZYCLEARLIST(gear_to_slot) + . = ..() + +/obj/structure/armor_stand/attack_hand(mob/user) + . = ..() + if(. || !LAZYLEN(gear_to_slot)) + return + if(LAZYLEN(gear_to_slot) == 1) + var/weakref/removed_item_ref = gear_to_slot[1] + else + removed_item_ref = input(user, "Which piece of equipment would you like to remove?", "Armor Stand") as null|anything in gear_to_slot + if(!CanPhysicallyInteract(user) || QDELETED(src) || QDELETED(user) || !(removed_item_ref in gear_to_slot)) + return TRUE + var/obj/item/removed_item = removed_item_ref?.resolve() + if(istype(removed_item) && !QDELETED(removed_item) && removed_item.loc == src) + removed_item.dropInto(loc) + user.put_in_hands(removed_item) + return TRUE + +/obj/structure/armor_stand/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/clothing)) + var/obj/item/clothing/clothes = used_item + if(!(clothes.fallback_slot in slots_to_gear)) + to_chat(user, SPAN_WARNING("\The [src] cannot hold \the [used_item].")) + else if(slots_to_gear[clothes.fallback_slot]) + var/weakref/atom_ref = slots_to_gear[clothes.fallback_slot] + to_chat(user, SPAN_WARNING("\The [src] is already holding \the [atom_ref.resolve()].")) + else if(user.try_unequip(clothes, src)) + var/weakref/atom_ref = weakref(clothes) + slots_to_gear[clothes.fallback_slot] = atom_ref + LAZYSET(gear_to_slot, atom_ref, clothes.fallback_slot) + to_chat(user, SPAN_NOTICE("You hang \the [clothes] from \the [src].")) + update_icon() + return TRUE + return ..() + +/obj/structure/armor_stand/on_update_icon() + . = ..() + for(var/slot in slots_to_gear) + var/weakref/atom_ref = slots_to_gear[slot] + var/obj/item/thing = atom_ref?.resolve() + if(istype(thing)) + var/image/mob_overlay = thing.get_mob_overlay(null, slot) + mob_overlay.appearance_flags |= RESET_COLOR + add_overlay(mob_overlay) + compile_overlays() diff --git a/code/game/objects/structures/training_dummies.dm b/code/game/objects/structures/training_dummies.dm new file mode 100644 index 00000000000..ed0e7fc0d94 --- /dev/null +++ b/code/game/objects/structures/training_dummies.dm @@ -0,0 +1,30 @@ +// TODO: skill check on melee/ranged hit to show bullseye/heart shot/etc +// TODO: craft the base frame, add cloth/dry grass to replace dummy, remove dummy on damage. +// TODO: add a modern-style version, merge with and replace the magnet dummies? + +/obj/structure/training_dummy + name = "training dummy" + desc = "A simple stand used to prop up a training dummy for practice." + icon = 'icons/obj/structures/training_dummy.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + density = TRUE + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + var/decl/material/dummy_mat = /decl/material/solid/organic/plantmatter/grass/dry + +/obj/structure/training_dummy/Initialize(ml, _mat, _reinf_mat) + if(ispath(dummy_mat)) + dummy_mat = GET_DECL(dummy_mat) + . = ..() + update_icon() + +/obj/structure/training_dummy/on_update_icon() + . = ..() + if(dummy_mat) + add_overlay(overlay_image(icon, "[icon_state]-dummy", dummy_mat.color, RESET_COLOR)) + +/obj/structure/training_dummy/archery + name = "archery butt" + desc = "A heavy circular target used for practicing archery." + icon = 'icons/obj/structures/archery_butt.dmi' diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index f58f931cf5b..de760228f25 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -227,3 +227,7 @@ result_type = /obj/structure/divider difficulty = MAT_VALUE_HARD_DIY +/decl/stack_recipe/planks/furniture/armor_stand + result_type = /obj/structure/armor_stand + difficulty = MAT_VALUE_NORMAL_DIY + diff --git a/icons/obj/structures/archery_butt.dmi b/icons/obj/structures/archery_butt.dmi new file mode 100644 index 0000000000000000000000000000000000000000..45bbb36c105fbcec1583a324f7fb80fb68061e3b GIT binary patch literal 450 zcmV;z0X_bSP)p8x;fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq3Xb=H^!7Qmd@s>gNJ>0stc0CsMiP z?$Q7N0N+VOK~y-6)sjgL!ypVrLx+6~K0t{$Kv6DGqjcXzx&KuP!47H~s!Cb)Z!F=b z?*Vt+p9uOA75ok;kjJdyQsQA)@@5=;C8k@6r)kN108@z|fa3?_^)y-I1t0;CAH22z z+L{F*n1u`|wAn$E)SxiTats_bW(TrY0q$|ulL4@l9Z<{I>mIzd*+Fa508$EEfP^&w z#N?jp5VZkBqJ6;k66+?RZn6xnWX!$^@S+$Pf~?x{LCC7Pg&1VjE^?RrSxrEd?`|JV sB9cQrxldqqv>U*?_5<-z;yG?4Urd%W0d9rr*#H0l07*qoM6N<$g8g&BtN;K2 literal 0 HcmV?d00001 diff --git a/icons/obj/structures/armor_stand.dmi b/icons/obj/structures/armor_stand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0431f7f626cc5d7b2d58d74dbb040a759f0f10c1 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*8>L*96ES1HL0wtYo4cj z%%A49M}Sg{B|(0{3=Yq3qyagZRUr{2E~&-IMVSR9nfZAP3>9;N!wQN@zkdlX`1tjS zmbb3fxija3H-s8oG=A_%=e&>RNrs}H-W?XkLB^Mjy%gp=nsj7Rh(hp6oBbN?&t;ucLK6TI-eUFu literal 0 HcmV?d00001 diff --git a/icons/obj/structures/training_dummy.dmi b/icons/obj/structures/training_dummy.dmi new file mode 100644 index 0000000000000000000000000000000000000000..54cf40de1c9347e605aa2f23069c6ff6f270a8a1 GIT binary patch literal 429 zcmV;e0aE^nP)Z8+u;BJ00DGTPE!Ct=GbNc0047(R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq3Xb=H^!7Qmd@s>gNJ>0stc0CsMiP z?$Q7N0Ln>3K~y-6#gj1(gD?z5i4^wIngbLr&|b9Rhx Xr^Y7VG6Jm+00000NkvXXu0mjfJaM&C literal 0 HcmV?d00001 diff --git a/nebula.dme b/nebula.dme index c635f6a0755..3a5a07def65 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1427,6 +1427,7 @@ #include "code\game\objects\structures\_structure_icon.dm" #include "code\game\objects\structures\_structure_materials.dm" #include "code\game\objects\structures\ai_decoy.dm" +#include "code\game\objects\structures\armor_stand.dm" #include "code\game\objects\structures\barricade.dm" #include "code\game\objects\structures\barsign.dm" #include "code\game\objects\structures\bedsheet_bin.dm" @@ -1493,6 +1494,7 @@ #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\target_stake.dm" #include "code\game\objects\structures\town_bell.dm" +#include "code\game\objects\structures\training_dummies.dm" #include "code\game\objects\structures\transit_tubes.dm" #include "code\game\objects\structures\under_wardrobe.dm" #include "code\game\objects\structures\wall_frame.dm" From 91220810eef3ece20f9c484c506e070c1bed640d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 9 Dec 2024 17:31:29 +1100 Subject: [PATCH 135/554] Cleaning up/rewriting target dummies. --- code/__defines/structures.dm | 5 +- code/datums/trading/traders/ai.dm | 44 +- code/datums/weakref.dm | 13 +- code/game/atoms_movable.dm | 3 + code/game/machinery/magnet.dm | 391 ------------------ code/game/objects/items/shooting_range.dm | 142 ------- code/game/objects/items/training_dummy.dm | 176 ++++++++ code/game/objects/objs.dm | 1 - code/game/objects/structures/__structure.dm | 7 + code/game/objects/structures/armor_stand.dm | 3 +- code/game/objects/structures/doors/_door.dm | 26 +- code/game/objects/structures/target_stake.dm | 134 ++++-- .../objects/structures/training_dummies.dm | 30 -- .../crafting/stack_recipes/recipes_grass.dm | 3 + .../crafting/stack_recipes/recipes_planks.dm | 3 + .../crafting/stack_recipes/recipes_steel.dm | 8 + icons/obj/items/training_dummies/alien.dmi | Bin 0 -> 377 bytes icons/obj/items/training_dummies/archery.dmi | Bin 0 -> 352 bytes icons/obj/items/training_dummies/damage.dmi | Bin 0 -> 767 bytes icons/obj/items/training_dummies/standard.dmi | Bin 0 -> 338 bytes icons/obj/items/training_dummies/straw.dmi | Bin 0 -> 358 bytes .../obj/items/training_dummies/syndicate.dmi | Bin 0 -> 368 bytes icons/obj/objects.dmi | Bin 127225 -> 125130 bytes icons/obj/structures/archery_butt.dmi | Bin 450 -> 0 bytes .../structures/target_stakes/archery_butt.dmi | Bin 0 -> 317 bytes .../structures/target_stakes/target_stake.dmi | Bin 0 -> 301 bytes icons/obj/structures/training_dummy.dmi | Bin 429 -> 0 bytes maps/exodus/exodus-2.dmm | 12 +- maps/ministation/ministation-1.dmm | 20 +- maps/ministation/ministation-2.dmm | 2 +- .../government/away_sites/icarus/icarus-1.dmm | 2 +- nebula.dme | 4 +- tools/map_migrations/4615_target_stakes.txt | 2 + 33 files changed, 359 insertions(+), 672 deletions(-) delete mode 100644 code/game/machinery/magnet.dm delete mode 100644 code/game/objects/items/shooting_range.dm create mode 100644 code/game/objects/items/training_dummy.dm delete mode 100644 code/game/objects/structures/training_dummies.dm create mode 100644 icons/obj/items/training_dummies/alien.dmi create mode 100644 icons/obj/items/training_dummies/archery.dmi create mode 100644 icons/obj/items/training_dummies/damage.dmi create mode 100644 icons/obj/items/training_dummies/standard.dmi create mode 100644 icons/obj/items/training_dummies/straw.dmi create mode 100644 icons/obj/items/training_dummies/syndicate.dmi delete mode 100644 icons/obj/structures/archery_butt.dmi create mode 100644 icons/obj/structures/target_stakes/archery_butt.dmi create mode 100644 icons/obj/structures/target_stakes/target_stake.dmi delete mode 100644 icons/obj/structures/training_dummy.dmi create mode 100644 tools/map_migrations/4615_target_stakes.txt diff --git a/code/__defines/structures.dm b/code/__defines/structures.dm index f91ed7aed08..39849cecebc 100644 --- a/code/__defines/structures.dm +++ b/code/__defines/structures.dm @@ -1 +1,4 @@ -#define STRUCTURE_FLAG_SURFACE BITFLAG(0) \ No newline at end of file +// Structure counts as a surface for the purposes of placing items on. +#define STRUCTURE_FLAG_SURFACE BITFLAG(0) +// Structure takes damage from thrown objects colliding with it. +#define STRUCTURE_FLAG_THROWN_DAMAGE BITFLAG(1) \ No newline at end of file diff --git a/code/datums/trading/traders/ai.dm b/code/datums/trading/traders/ai.dm index ca86637d32d..5c7866db044 100644 --- a/code/datums/trading/traders/ai.dm +++ b/code/datums/trading/traders/ai.dm @@ -98,25 +98,27 @@ They sell generic supplies and ask for generic supplies. origin = "Manifacturing Beacon" possible_trading_items = list( - /obj/structure/aicore = TRADER_THIS_TYPE, - /obj/structure/girder = TRADER_THIS_TYPE, - /obj/structure/grille = TRADER_THIS_TYPE, - /obj/structure/mopbucket = TRADER_THIS_TYPE, - /obj/structure/ore_box = TRADER_THIS_TYPE, - /obj/structure/coatrack = TRADER_THIS_TYPE, - /obj/structure/bookcase = TRADER_THIS_TYPE, - /obj/item/bee_pack = TRADER_THIS_TYPE, - /obj/item/bee_smoker = TRADER_THIS_TYPE, - /obj/item/beehive_assembly = TRADER_THIS_TYPE, - /obj/item/glass_jar = TRADER_THIS_TYPE, - /obj/item/honey_frame = TRADER_THIS_TYPE, - /obj/item/target = TRADER_ALL, - /obj/structure/tank_rack = TRADER_SUBTYPES_ONLY, - /obj/structure/filing_cabinet = TRADER_THIS_TYPE, - /obj/structure/safe = TRADER_THIS_TYPE, - /obj/structure/plushie = TRADER_SUBTYPES_ONLY, - /obj/structure/sign = TRADER_SUBTYPES_ONLY, - /obj/structure/sign/double = TRADER_BLACKLIST_ALL, - /obj/structure/sign/plaque/golden = TRADER_BLACKLIST_ALL, - /obj/structure/sign/poster = TRADER_BLACKLIST + /obj/structure/aicore = TRADER_THIS_TYPE, + /obj/structure/girder = TRADER_THIS_TYPE, + /obj/structure/grille = TRADER_THIS_TYPE, + /obj/structure/mopbucket = TRADER_THIS_TYPE, + /obj/structure/ore_box = TRADER_THIS_TYPE, + /obj/structure/coatrack = TRADER_THIS_TYPE, + /obj/structure/bookcase = TRADER_THIS_TYPE, + /obj/item/bee_pack = TRADER_THIS_TYPE, + /obj/item/bee_smoker = TRADER_THIS_TYPE, + /obj/item/beehive_assembly = TRADER_THIS_TYPE, + /obj/item/glass_jar = TRADER_THIS_TYPE, + /obj/item/honey_frame = TRADER_THIS_TYPE, + /obj/item/training_dummy = TRADER_THIS_TYPE, + /obj/item/training_dummy/syndicate = TRADER_THIS_TYPE, + /obj/item/training_dummy/alien = TRADER_THIS_TYPE, + /obj/structure/tank_rack = TRADER_SUBTYPES_ONLY, + /obj/structure/filing_cabinet = TRADER_THIS_TYPE, + /obj/structure/safe = TRADER_THIS_TYPE, + /obj/structure/plushie = TRADER_SUBTYPES_ONLY, + /obj/structure/sign = TRADER_SUBTYPES_ONLY, + /obj/structure/sign/double = TRADER_BLACKLIST_ALL, + /obj/structure/sign/plaque/golden = TRADER_BLACKLIST_ALL, + /obj/structure/sign/poster = TRADER_BLACKLIST ) \ No newline at end of file diff --git a/code/datums/weakref.dm b/code/datums/weakref.dm index ab0ecb9c6e2..ce8a7fa4ba6 100644 --- a/code/datums/weakref.dm +++ b/code/datums/weakref.dm @@ -14,16 +14,13 @@ return D.weakref /weakref - var/ref - var/name // Useful for input() on lists of weakrefs. - - // Handy info for debugging - var/tmp/name - var/tmp/ref_type + var/ref //- Actual datum ref. + var/name //- Useful for input() on lists of weakrefs. + var/tmp/ref_type //- Handy info for debugging /weakref/New(datum/D) - ref = "\ref[D]" - name = "[D]" + ref = "\ref[D]" + name = "[D]" ref_type = D.type /weakref/Destroy() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index d2be93779da..674a0c21f38 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -40,6 +40,9 @@ // Marker for alpha mask update process. null == never update, TRUE == currently updating, FALSE == finished updating. var/updating_turf_alpha_mask = null + // Damage type from using or throwing this atom. + var/atom_damage_type = BRUTE + // This proc determines if the instance is preserved when the process() despawn of crypods occurs. /atom/movable/proc/preserve_in_cryopod(var/obj/machinery/cryopod/pod) return FALSE diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm deleted file mode 100644 index 87285e91403..00000000000 --- a/code/game/machinery/magnet.dm +++ /dev/null @@ -1,391 +0,0 @@ -// Magnetic attractor, creates variable magnetic fields and attraction. -// Can also be used to emit electron/proton beams to create a center of magnetism on another tile - -// tl;dr: it's magnets lol -// This was created for firing ranges, but I suppose this could have other applications - Doohl - -var/global/list/magnetic_modules = list() - -/obj/machinery/magnetic_module - - icon = 'icons/obj/objects.dmi' - icon_state = "floor_magnet-f" - name = "Electromagnetic Generator" - desc = "A device that uses powernet to create points of magnetic energy." - level = LEVEL_BELOW_PLATING - layer = ABOVE_WIRE_LAYER - anchored = TRUE - idle_power_usage = 50 - - var/freq = 1449 // radio frequency - var/electricity_level = 1 // intensity of the magnetic pull - var/magnetic_field = 1 // the range of magnetic attraction - var/code = 0 // frequency code, they should be different unless you have a group of magnets working together or something - var/turf/center // the center of magnetic attraction - var/on = 0 - var/pulling = 0 - - // x, y modifiers to the center turf; (0, 0) is centered on the magnet, whereas (1, -1) is one tile right, one tile down - var/center_x = 0 - var/center_y = 0 - var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer - -/obj/machinery/magnetic_module/Initialize() - . = ..() - global.magnetic_modules += src - var/turf/T = loc - if(!T) - return INITIALIZE_HINT_QDEL - hide(!T.is_plating()) - center = T - - if(radio_controller) - radio_controller.add_object(src, freq, RADIO_MAGNETS) - - magnetic_process() - - // update the invisibility and icon -/obj/machinery/magnetic_module/hide(var/intact) - set_invisibility(intact ? 101 : 0) - update_icon() - - // update the icon_state -/obj/machinery/magnetic_module/on_update_icon() - var/state="floor_magnet" - var/onstate="" - if(!on) - onstate="0" - - if(invisibility) - icon_state = "[state][onstate]-f" // if invisible, set icon to faded version - // in case of being revealed by T-scanner - else - icon_state = "[state][onstate]" - -/obj/machinery/magnetic_module/receive_signal(datum/signal/signal) - - var/command = signal.data["command"] - var/modifier = signal.data["modifier"] - var/signal_code = signal.data["code"] - if(command && (signal_code == code)) - - Cmd(command, modifier) - - - -/obj/machinery/magnetic_module/proc/Cmd(var/command, var/modifier) - - if(command) - switch(command) - if("set-electriclevel") - if(modifier) electricity_level = modifier - if("set-magneticfield") - if(modifier) magnetic_field = modifier - - if("add-elec") - electricity_level++ - if(electricity_level > 12) - electricity_level = 12 - if("sub-elec") - electricity_level-- - if(electricity_level <= 0) - electricity_level = 1 - if("add-mag") - magnetic_field++ - if(magnetic_field > 4) - magnetic_field = 4 - if("sub-mag") - magnetic_field-- - if(magnetic_field <= 0) - magnetic_field = 1 - - if("set-x") - if(modifier) center_x = modifier - if("set-y") - if(modifier) center_y = modifier - - if("N") // NORTH - center_y++ - if("S") // SOUTH - center_y-- - if("E") // EAST - center_x++ - if("W") // WEST - center_x-- - if("C") // CENTER - center_x = 0 - center_y = 0 - if("R") // RANDOM - center_x = rand(-max_dist, max_dist) - center_y = rand(-max_dist, max_dist) - - if("set-code") - if(modifier) code = modifier - if("toggle-power") - on = !on - - if(on) - spawn() - magnetic_process() - - - -/obj/machinery/magnetic_module/Process() - if(stat & NOPOWER) - on = 0 - - // Sanity checks: - if(electricity_level <= 0) - electricity_level = 1 - if(magnetic_field <= 0) - magnetic_field = 1 - - - // Limitations: - if(abs(center_x) > max_dist) - center_x = max_dist - if(abs(center_y) > max_dist) - center_y = max_dist - if(magnetic_field > 4) - magnetic_field = 4 - if(electricity_level > 12) - electricity_level = 12 - - // Update power usage: - if(on) - update_use_power(POWER_USE_ACTIVE) - change_power_consumption(electricity_level*15, POWER_USE_ACTIVE) - else - update_use_power(POWER_USE_IDLE) - -/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the pulling - set waitfor = FALSE - if(pulling) return - while(on) - - pulling = 1 - center = locate(x+center_x, y+center_y, z) - if(center) - for(var/obj/M in orange(magnetic_field, center)) - if(!M.anchored && (M.obj_flags & OBJ_FLAG_CONDUCTIBLE)) - step_towards(M, center) - - for(var/mob/living/silicon/S in orange(magnetic_field, center)) - if(isAI(S)) continue - step_towards(S, center) - - use_power_oneoff(electricity_level * 5) - sleep(13 - electricity_level) - - pulling = 0 - -/obj/machinery/magnetic_module/Destroy() - if(radio_controller) - radio_controller.remove_object(src, freq) - global.magnetic_modules -= src - return ..() - -/obj/machinery/magnetic_controller // TODO: IMPLEMENT OR REMOVE - name = "magnetic control console" - icon = 'icons/obj/airlock_machines.dmi' // uses an airlock machine icon, THINK GREEN HELP THE ENVIRONMENT - RECYCLING! - icon_state = "airlock_control_off" - density = TRUE - anchored = TRUE - idle_power_usage = 45 - var/frequency = 1449 - var/code = 0 - var/list/magnets = list() - var/title = "Magnetic Control Console" - var/autolink = 0 // if set to 1, can't probe for other magnets! - - var/pathpos = 1 // position in the path - var/path = "NULL" // text path of the magnet - var/speed = 1 // lowest = 1, highest = 10 - var/list/rpath = list() // real path of the magnet, used in iterator - - var/moving = 0 // 1 if scheduled to loop - var/looping = 0 // 1 if looping - - var/datum/radio_frequency/radio_connection - - -/obj/machinery/magnetic_controller/Initialize() - . = ..() - if(autolink) - for(var/obj/machinery/magnetic_module/M in global.magnetic_modules) - if(M.freq == frequency && M.code == code) - magnets.Add(M) - - if(radio_controller) - radio_connection = radio_controller.add_object(src, frequency, RADIO_MAGNETS) - - if(path) // check for default path - filter_path() // renders rpath - - -/obj/machinery/magnetic_controller/Process() - if(magnets.len == 0 && autolink) - for(var/obj/machinery/magnetic_module/M in global.magnetic_modules) - if(M.freq == frequency && M.code == code) - magnets.Add(M) - -/obj/machinery/magnetic_controller/interface_interact(user) - interact(user) - return TRUE - -/obj/machinery/magnetic_controller/interact(mob/user) - if(stat & (BROKEN|NOPOWER)) - return - user.set_machine(src) - var/dat = "[title]

" - if(!autolink) - dat += {" - Frequency: [frequency]
- Code: [code]
- Probe Generators
- "} - - if(magnets.len >= 1) - - dat += "Magnets confirmed:
" - var/i = 0 - for(var/obj/machinery/magnetic_module/M in magnets) - i++ - dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
" - - dat += "
Speed: - [speed] +
" - dat += "Path: {[path]}
" - dat += "Moving: [moving ? "Enabled":"Disabled"]" - - - show_browser(user, dat, "window=magnet;size=400x500") - onclose(user, "magnet") - -/obj/machinery/magnetic_controller/Topic(href, href_list) - if(..()) - return 1 - if(stat & (BROKEN|NOPOWER)) - return - usr.set_machine(src) - - if(href_list["radio-op"]) - - // Prepare signal beforehand, because this is a radio operation - var/datum/signal/signal = new - signal.source = src - signal.frequency = frequency - signal.data["code"] = code - - // Apply any necessary commands - switch(href_list["radio-op"]) - if("togglepower") - signal.data["command"] = "toggle-power" - - if("minuselec") - signal.data["command"] = "sub-elec" - if("pluselec") - signal.data["command"] = "add-elec" - - if("minusmag") - signal.data["command"] = "sub-mag" - if("plusmag") - signal.data["command"] = "add-mag" - - - // Broadcast the signal - - radio_connection.post_signal(src, signal, radio_filter = RADIO_MAGNETS) - - spawn(1) - updateUsrDialog() // pretty sure this increases responsiveness - - if(href_list["operation"]) - switch(href_list["operation"]) - if("plusspeed") - speed ++ - if(speed > 10) - speed = 10 - if("minusspeed") - speed -- - if(speed <= 0) - speed = 1 - if("setpath") - var/newpath = sanitize(input(usr, "Please define a new path!",,path) as text|null) - if(newpath && newpath != "") - moving = 0 // stop moving - path = newpath - pathpos = 1 // reset position - filter_path() // renders rpath - - if("togglemoving") - moving = !moving - if(moving) - spawn() MagnetMove() - - - updateUsrDialog() - -/obj/machinery/magnetic_controller/proc/MagnetMove() - if(looping) return - - while(moving && rpath.len >= 1) - - if(stat & (BROKEN|NOPOWER)) - break - - looping = 1 - - // Prepare the radio signal - var/datum/signal/signal = new - signal.source = src - signal.frequency = frequency - signal.data["code"] = code - - if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list! - pathpos = 1 - - var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive - - if(!(nextmove in list("N","S","E","W","C","R"))) - // N, S, E, W are directional - // C is center - // R is random (in magnetic field's bounds) - qdel(signal) - break // break the loop if the character located is invalid - - signal.data["command"] = nextmove - - - pathpos++ // increase iterator - - // Broadcast the signal - spawn() - radio_connection.post_signal(src, signal, radio_filter = RADIO_MAGNETS) - - if(speed == 10) - sleep(1) - else - sleep(12-speed) - - looping = 0 - - -/obj/machinery/magnetic_controller/proc/filter_path() - // Generates the rpath variable using the path string, think of this as "string2list" - // Doesn't use params2list() because of the akward way it stacks entities - rpath = list() // clear rpath - var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length - - for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path - - var/nextchar = copytext(path, i, i+1) // find next character - - if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore - rpath += copytext(path, i, i+1) // else, add to list - - // there doesn't HAVE to be separators but it makes paths syntatically visible - -/obj/machinery/magnetic_controller/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) - return ..() \ No newline at end of file diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm deleted file mode 100644 index 18dce99c9e5..00000000000 --- a/code/game/objects/items/shooting_range.dm +++ /dev/null @@ -1,142 +0,0 @@ -// Targets, the things that actually get shot! -/obj/item/target - name = "shooting target" - desc = "A shooting target." - icon = 'icons/obj/objects.dmi' - icon_state = "target_h" - density = FALSE - material = /decl/material/solid/organic/plastic - var/obj/structure/target_stake/stake - var/hp = 1800 - var/icon/virtualIcon - var/list/bulletholes = list() - -/obj/item/target/Destroy() - . = ..() - if (stake) - stake.set_target(null) - -/obj/item/target/attackby(var/obj/item/W, var/mob/user) - if(IS_WELDER(W)) - var/obj/item/weldingtool/WT = W - if(WT.weld(0, user)) - overlays.Cut() - bulletholes.Cut() - hp = initial(hp) - to_chat(user, "You slice off [src]'s uneven chunks of aluminium and scorch marks.") - return TRUE - return ..() - -/obj/item/target/attack_hand(var/mob/user) - // taking pinned targets off! - if(!stake || !user.check_dexterity(DEXTERITY_HOLD_ITEM)) - return ..() - return stake.attack_hand(user) - -/obj/item/target/syndicate - icon_state = "target_s" - desc = "A shooting target that looks like a hostile agent." - hp = 2600 // i guess syndie targets are sturdier? -/obj/item/target/alien - icon_state = "target_q" - desc = "A shooting target with a threatening silhouette." - hp = 2350 // alium onest too kinda - -/obj/item/target/bullet_act(var/obj/item/projectile/Proj) - var/p_x = Proj.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset Proj.p_x!" - var/p_y = Proj.p_y + pick(0,0,0,0,0,-1,1) - var/decaltype = 1 // 1 - scorch, 2 - bullet - - if(istype(/obj/item/projectile/bullet, Proj)) - decaltype = 2 - - - virtualIcon = new(icon, icon_state) - - if( virtualIcon.GetPixel(p_x, p_y) ) // if the located pixel isn't blank (null) - - hp -= Proj.damage - if(hp <= 0) - visible_message(SPAN_WARNING("\The [src] breaks into tiny pieces and collapses!")) - qdel(src) - - // Create a temporary object to represent the damage - var/obj/bmark = new - bmark.pixel_x = p_x - bmark.pixel_y = p_y - bmark.icon = 'icons/effects/effects.dmi' - bmark.layer = ABOVE_OBJ_LAYER - bmark.icon_state = "scorch" - - if(decaltype == 1) - // Energy weapons are hot. they scorch! - - // offset correction - bmark.pixel_x-- - bmark.pixel_y-- - - if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/beam/practice)) - bmark.icon_state = "scorch" - bmark.set_dir(pick(NORTH,SOUTH,EAST,WEST)) // random scorch design - - - else - bmark.icon_state = "light_scorch" - else - - // Bullets are hard. They make dents! - bmark.icon_state = "dent" - - if(Proj.damage >= 10 && bulletholes.len <= 35) // maximum of 35 bullet holes - if(decaltype == 2) // bullet - if(prob(Proj.damage+30)) // bullets make holes more commonly! - new/datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) // create new bullet hole - else // Lasers! - if(prob(Proj.damage-10)) // lasers make holes less commonly - new/datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) // create new bullet hole - - // draw bullet holes - for(var/datum/bullethole/B in bulletholes) - - virtualIcon.DrawBox(null, B.b1x1, B.b1y, B.b1x2, B.b1y) // horizontal line, left to right - virtualIcon.DrawBox(null, B.b2x, B.b2y1, B.b2x, B.b2y2) // vertical line, top to bottom - - overlays += bmark // add the decal - - icon = virtualIcon // apply bulletholes over decals - - return - - return PROJECTILE_CONTINUE // the bullet/projectile goes through the target! - - -// Small memory holder entity for transparent bullet holes -/datum/bullethole - // First box - var/b1x1 = 0 - var/b1x2 = 0 - var/b1y = 0 - - // Second box - var/b2x = 0 - var/b2y1 = 0 - var/b2y2 = 0 - -/datum/bullethole/New(var/obj/item/target/Target, var/pixel_x = 0, var/pixel_y = 0) - if(!Target) return - - // Randomize the first box - b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4) - b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4) - b1y = pixel_y - if(prob(35)) - b1y += rand(-4,4) - - // Randomize the second box - b2x = pixel_x - if(prob(35)) - b2x += rand(-4,4) - b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4) - b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4) - - Target.bulletholes.Add(src) \ No newline at end of file diff --git a/code/game/objects/items/training_dummy.dm b/code/game/objects/items/training_dummy.dm new file mode 100644 index 00000000000..d870699ddd1 --- /dev/null +++ b/code/game/objects/items/training_dummy.dm @@ -0,0 +1,176 @@ +// Used in conjunction with /obj/structure/target_stake. +/obj/item/training_dummy + name = "shooting target" + desc = "A shooting target." + icon = 'icons/obj/items/training_dummies/standard.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/metal/aluminium + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + max_health = 1800 + appearance_flags = KEEP_TOGETHER // Needed for BLEND_INSET_OVERLAY on the decals. + + // Burn/bullet hole/dent decals to apply to our icon. + var/list/decals + var/const/MAX_DECALS = 250 + + // Very crude bounding box; we do pixel-precise checking within these ranges. + var/decal_min_x = 7 + var/decal_min_y = 3 + var/decal_range_x = 17 + var/decal_range_y = 25 + +/obj/item/training_dummy/proc/get_damage_decal_icon() + return 'icons/obj/items/training_dummies/damage.dmi' + +// Can't repair cloth, straw or plastic targets currently. +/obj/item/training_dummy/proc/can_repair_with(obj/item/thing) + return IS_WELDER(thing) && istype(material, /decl/material/solid/metal) + +/obj/item/training_dummy/proc/perform_repair(mob/user, obj/item/tool) + var/obj/item/weldingtool/welder = tool + if(!istype(welder) || !welder.isOn()) + to_chat(user, SPAN_WARNING("Turn \the [welder] on first.")) + return FALSE + return tool.do_tool_interaction(TOOL_WELDER, user, src, 2 SECONDS) + +/obj/item/training_dummy/proc/repair_target_dummy(obj/item/used_item, mob/user) + + if(!can_repair_with(used_item)) + return FALSE + + var/max_health = get_max_health() + if(current_health >= max_health) + to_chat(user, SPAN_NOTICE("\The [src] doesn't need repairs.")) + return TRUE + + if(perform_repair(user, used_item)) + current_health += rand(100,200) // They have a lot of HP. + if(LAZYLEN(decals)) + if(current_health >= get_max_health()) + current_health = get_max_health() + LAZYCLEARLIST(decals) + else + var/remove_decal = pick(decals) + LAZYREMOVE(decals, remove_decal) + update_icon() + return TRUE + + return FALSE + +/obj/item/training_dummy/attackby(obj/item/used_item, mob/user) + if(repair_target_dummy(used_item, user)) + return TRUE + return ..() + +/obj/item/training_dummy/take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) + + var/old_health = current_health + . = ..() + if(QDELETED(src) || old_health == current_health) + return + + if(damage <= 0) + update_icon() + return + + if(LAZYLEN(decals) >= MAX_DECALS) + return + + var/decal_icon = get_damage_decal_icon() + if(!decal_icon) + return + + var/decal_state + if(damage_type == BURN) + if(damage < 10) + decal_state = "light_scorch" + else + decal_state = "scorch" + else if(damage_type == BRUTE) + if(damage < 10) + decal_state = "dent" + else + decal_state = "bhole" + else + return + + var/image/new_decal = image(decal_icon, decal_state) + new_decal.blend_mode = BLEND_INSET_OVERLAY + new_decal = apply_decal_offsets(new_decal) + if(new_decal) + LAZYADD(decals, new_decal) + update_icon() + +/obj/item/training_dummy/proc/apply_decal_offsets(image/decal) + + // Static list cache for this broke immediately, so seems like we need a fresh icon every time. + // At least it isn't being assigned anywhere so shouldn't cause network overhead. + var/icon/check_icon = icon(icon, icon_state) + if(!check_icon) + return + + var/use_pixel_x + var/use_pixel_y + var/sanity = 100 + while(sanity) + sanity-- + use_pixel_x = decal_min_x + rand(decal_range_x) + use_pixel_y = decal_min_y + rand(decal_range_y) + var/check_pixel = check_icon.GetPixel(use_pixel_x, use_pixel_y) + // Pixel has a colour and no alpha component; we are good. + if(istext(check_pixel) && length(check_pixel) == 7) + break + + if(!sanity || !isnum(use_pixel_x) || use_pixel_x < 0 || !isnum(use_pixel_y) || use_pixel_y < 0) + return + + decal.pixel_x = use_pixel_x + decal.pixel_y = use_pixel_y + return decal + +/obj/item/training_dummy/on_update_icon() + . = ..() + if(LAZYLEN(decals)) + if(current_health >= get_max_health()) + LAZYCLEARLIST(decals) + else + set_overlays(decals.Copy()) + if(istype(loc, /obj/structure/target_stake)) + compile_overlays() // We need to update our loc immediately. + loc.update_icon() + +/obj/item/training_dummy/syndicate + icon = 'icons/obj/items/training_dummies/syndicate.dmi' + desc = "A shooting target that looks like a hostile agent." + decal_min_x = 7 + decal_min_y = 2 + decal_range_x = 18 + decal_range_y = 30 + +/obj/item/training_dummy/alien + icon = 'icons/obj/items/training_dummies/alien.dmi' + desc = "A shooting target with a threatening silhouette." + decal_min_x = 7 + decal_min_y = 2 + decal_range_x = 18 + decal_range_y = 30 + +/obj/item/training_dummy/straw + name = "training dummy" + icon = 'icons/obj/items/training_dummies/straw.dmi' + desc = "A roughly humanoid shape used for melee practice." + material = /decl/material/solid/organic/plantmatter/grass/dry + material_alteration = MAT_FLAG_ALTERATION_ALL + decal_min_x = 8 + decal_min_y = 12 + decal_range_x = 16 + decal_range_y = 17 + +/obj/item/training_dummy/straw/archery + name = "archery butt" + icon = 'icons/obj/items/training_dummies/archery.dmi' + desc = "A thick circular mat used for archery practice." + decal_min_x = 7 + decal_min_y = 5 + decal_range_x = 19 + decal_range_y = 21 diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index b9966cf27e9..f1838fcfa06 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -17,7 +17,6 @@ var/sharp = 0 // whether this object cuts var/edge = 0 // whether this object is more likely to dismember var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! - var/atom_damage_type = BRUTE var/armor_penetration = 0 var/anchor_fall = FALSE var/holographic = 0 //if the obj is a holographic object spawned by the holodeck diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index b1764d52754..29c20b4b6d9 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -322,3 +322,10 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen W.pixel_x = (CELLSIZE * (cell_x + 0.5)) - center["x"] W.pixel_y = (CELLSIZE * (cell_y + 0.5)) - center["y"] W.pixel_z = 0 + +/obj/structure/hitby(var/atom/movable/AM, var/datum/thrownthing/TT) + . = ..() + if(. && (structure_flags & STRUCTURE_FLAG_THROWN_DAMAGE)) + visible_message(SPAN_DANGER("\The [src] was hit by \the [AM].")) + playsound(src.loc, hitsound, 100, 1) + take_damage(AM.get_thrown_attack_force() * (TT.speed/THROWFORCE_SPEED_DIVISOR), AM.atom_damage_type) diff --git a/code/game/objects/structures/armor_stand.dm b/code/game/objects/structures/armor_stand.dm index 96b52bc8266..7dabc4c24f0 100644 --- a/code/game/objects/structures/armor_stand.dm +++ b/code/game/objects/structures/armor_stand.dm @@ -34,8 +34,9 @@ . = ..() if(. || !LAZYLEN(gear_to_slot)) return + var/weakref/removed_item_ref if(LAZYLEN(gear_to_slot) == 1) - var/weakref/removed_item_ref = gear_to_slot[1] + removed_item_ref = gear_to_slot[1] else removed_item_ref = input(user, "Which piece of equipment would you like to remove?", "Armor Stand") as null|anything in gear_to_slot if(!CanPhysicallyInteract(user) || QDELETED(src) || QDELETED(user) || !(removed_item_ref in gear_to_slot)) diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 9079662e243..745ad4bea2d 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -1,18 +1,18 @@ /obj/structure/door - name = "door" - icon = 'icons/obj/doors/material_doors.dmi' - icon_state = "metal" - hitsound = 'sound/weapons/genhit.ogg' - material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR - max_health = 50 - density = TRUE - anchored = TRUE - opacity = TRUE - - var/has_window = FALSE - var/changing_state = FALSE - var/icon_base + name = "door" + icon = 'icons/obj/doors/material_doors.dmi' + icon_state = "metal" + hitsound = 'sound/weapons/genhit.ogg' + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + max_health = 50 + density = TRUE + anchored = TRUE + opacity = TRUE + structure_flags = STRUCTURE_FLAG_THROWN_DAMAGE + var/has_window = FALSE + var/changing_state = FALSE var/door_sound_volume = 25 + var/icon_base /obj/structure/door/Initialize() ..() diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index d1e4d36df79..0dc8afefce6 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -1,49 +1,97 @@ -// Target stakes for the firing range. +// TODO: skill check on melee/ranged hit to show bullseye/heart shot/etc /obj/structure/target_stake - name = "target stake" - desc = "A thin platform with negatively-magnetized wheels." - icon = 'icons/obj/objects.dmi' - icon_state = "target_stake" - density = TRUE - obj_flags = OBJ_FLAG_CONDUCTIBLE - var/obj/item/target/pinned_target - -/obj/structure/target_stake/attackby(var/obj/item/W, var/mob/user) - if (!pinned_target && istype(W, /obj/item/target) && user.try_unequip(W, get_turf(src))) - to_chat(user, "You slide [W] into the stake.") - set_target(W) + name = "target stake" + desc = "A simple stand used to prop up a target for practice." + icon = 'icons/obj/structures/target_stakes/target_stake.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + density = TRUE + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + structure_flags = STRUCTURE_FLAG_THROWN_DAMAGE + var/obj/item/training_dummy/dummy + +/obj/structure/target_stake/Destroy() + dummy = null + . = ..() + +/obj/structure/target_stake/attackby(obj/item/used_item, mob/user) + if(dummy?.repair_target_dummy(used_item, user)) return TRUE return ..() -/obj/structure/target_stake/attack_hand(var/mob/user) - if (!pinned_target || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) - return ..() - to_chat(user, SPAN_NOTICE("You take \the [pinned_target] off the stake.")) - user.put_in_hands(pinned_target) - set_target(null) - return TRUE - -/obj/structure/target_stake/proc/set_target(var/obj/item/target/T) - if (T) - set_density(0) - T.set_density(1) - T.pixel_x = 0 - T.pixel_y = 0 - T.layer = ABOVE_OBJ_LAYER - events_repository.register(/decl/observ/moved, T, src, TYPE_PROC_REF(/atom/movable, move_to_turf)) - events_repository.register(/decl/observ/moved, src, T, TYPE_PROC_REF(/atom/movable, move_to_turf)) - T.stake = src - pinned_target = T - else - set_density(1) - if(pinned_target) - pinned_target.set_density(0) - pinned_target.layer = OBJ_LAYER - events_repository.unregister(/decl/observ/moved, pinned_target, src) - events_repository.unregister(/decl/observ/moved, src, pinned_target) - pinned_target.stake = null - pinned_target = null +/obj/structure/target_stake/take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) + if(dummy) + . = dummy.take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) + if(QDELETED(dummy)) + dummy = null + update_icon() + return + return ..() -/obj/structure/target_stake/Destroy() +/obj/structure/target_stake/proc/can_hold_dummy(mob/user, obj/item/training_dummy/new_dummy) + return istype(new_dummy) && !istype(new_dummy, /obj/item/training_dummy/straw/archery) + +/obj/structure/target_stake/attack_hand(mob/user) + if(dummy) + dummy.dropInto(loc) + user.put_in_hands(dummy) + dummy = null + update_icon() + return TRUE + return ..() + +/obj/structure/target_stake/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/training_dummy) && can_hold_dummy(user, used_item)) + if(dummy) + to_chat(user, SPAN_WARNING("\The [src] is already holding \the [dummy].")) + else if(user.try_unequip(used_item, src)) + dummy = used_item + visible_message(SPAN_NOTICE("\The [user] places \the [dummy] onto \the [src].")) + update_icon() + return TRUE + return ..() + +/obj/structure/target_stake/Initialize(ml, _mat, _reinf_mat) + if(ispath(dummy)) + dummy = new dummy(src) + . = ..() + update_icon() + +/obj/structure/target_stake/on_update_icon() . = ..() - set_target(null) \ No newline at end of file + if(dummy) + // WTB way to stop vis_contents inheriting atom color + var/image/dummy_overlay = new /image + dummy_overlay.appearance = dummy + dummy_overlay.pixel_x = 0 + dummy_overlay.pixel_y = 0 + dummy_overlay.pixel_z = 0 + dummy_overlay.pixel_w = 0 + dummy_overlay.plane = FLOAT_PLANE + dummy_overlay.layer = FLOAT_LAYER + dummy_overlay.appearance_flags |= RESET_COLOR + add_overlay(dummy_overlay) + +// Subtypes below. +/obj/structure/target_stake/steel + material = /decl/material/solid/metal/steel + +/obj/structure/target_stake/archery + name = "archery butt" + desc = "A heavy circular target used for practicing archery." + icon = 'icons/obj/structures/target_stakes/archery_butt.dmi' + +/obj/structure/target_stake/archery/can_hold_dummy(mob/user, obj/item/training_dummy/new_dummy) + return istype(new_dummy, /obj/item/training_dummy/straw/archery) + +// Subtypes with/for dummies. +/obj/structure/target_stake/mapped + dummy = /obj/item/training_dummy/straw + +/obj/structure/target_stake/steel/mapped/Initialize() + dummy = pick(/obj/item/training_dummy, /obj/item/training_dummy/alien, /obj/item/training_dummy/syndicate) + return ..() + +/obj/structure/target_stake/archery/mapped + dummy = /obj/item/training_dummy/straw/archery diff --git a/code/game/objects/structures/training_dummies.dm b/code/game/objects/structures/training_dummies.dm deleted file mode 100644 index ed0e7fc0d94..00000000000 --- a/code/game/objects/structures/training_dummies.dm +++ /dev/null @@ -1,30 +0,0 @@ -// TODO: skill check on melee/ranged hit to show bullseye/heart shot/etc -// TODO: craft the base frame, add cloth/dry grass to replace dummy, remove dummy on damage. -// TODO: add a modern-style version, merge with and replace the magnet dummies? - -/obj/structure/training_dummy - name = "training dummy" - desc = "A simple stand used to prop up a training dummy for practice." - icon = 'icons/obj/structures/training_dummy.dmi' - icon_state = ICON_STATE_WORLD - anchored = TRUE - density = TRUE - material = /decl/material/solid/organic/wood/oak - material_alteration = MAT_FLAG_ALTERATION_ALL - var/decl/material/dummy_mat = /decl/material/solid/organic/plantmatter/grass/dry - -/obj/structure/training_dummy/Initialize(ml, _mat, _reinf_mat) - if(ispath(dummy_mat)) - dummy_mat = GET_DECL(dummy_mat) - . = ..() - update_icon() - -/obj/structure/training_dummy/on_update_icon() - . = ..() - if(dummy_mat) - add_overlay(overlay_image(icon, "[icon_state]-dummy", dummy_mat.color, RESET_COLOR)) - -/obj/structure/training_dummy/archery - name = "archery butt" - desc = "A heavy circular target used for practicing archery." - icon = 'icons/obj/structures/archery_butt.dmi' diff --git a/code/modules/crafting/stack_recipes/recipes_grass.dm b/code/modules/crafting/stack_recipes/recipes_grass.dm index 398b3ec168b..badba30d8a4 100644 --- a/code/modules/crafting/stack_recipes/recipes_grass.dm +++ b/code/modules/crafting/stack_recipes/recipes_grass.dm @@ -41,3 +41,6 @@ /obj/item/stack/material/bundle, /obj/item/stack/material/thread ) + +/decl/stack_recipe/woven/dummy + result_type = /obj/item/training_dummy/straw diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index de760228f25..4d72d242bc6 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -231,3 +231,6 @@ result_type = /obj/structure/armor_stand difficulty = MAT_VALUE_NORMAL_DIY +/decl/stack_recipe/planks/furniture/target_stake + result_type = /obj/structure/target_stake + difficulty = MAT_VALUE_NORMAL_DIY diff --git a/code/modules/crafting/stack_recipes/recipes_steel.dm b/code/modules/crafting/stack_recipes/recipes_steel.dm index 8f15300c367..9befbe3d3f1 100644 --- a/code/modules/crafting/stack_recipes/recipes_steel.dm +++ b/code/modules/crafting/stack_recipes/recipes_steel.dm @@ -108,3 +108,11 @@ /decl/stack_recipe/steel/furniture/drill_brace result_type = /obj/structure/drill_brace + +/decl/stack_recipe/steel/furniture/armor_stand + result_type = /obj/structure/armor_stand + difficulty = MAT_VALUE_NORMAL_DIY + +/decl/stack_recipe/steel/furniture/target_stake + result_type = /obj/structure/target_stake + difficulty = MAT_VALUE_NORMAL_DIY diff --git a/icons/obj/items/training_dummies/alien.dmi b/icons/obj/items/training_dummies/alien.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a08ae3ce7fa2246caf256a8a3a130f904bc5776b GIT binary patch literal 377 zcmV-<0fzpGP)V=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zsXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`l@(n5T)@Tx06PL2GXQEU^ zks6blaB;H9G~p2BV()*Q?o(k2tfB)fJy{|*(+Ew z=Ol@#bVv05zK`LRDxV&K0SMnF9t)6(Jf2mLi(?Z=igjdVlEgi`T(`oy6{(jKQU zm{q}`ZJ`993-~|ak^@J`wM_-?lrq#{9!kI5a^YY90SJeF1-_nkA7uj`rLF1T#=q+Y X31t_O{b;8400000NkvXXu0mjfMX8tX literal 0 HcmV?d00001 diff --git a/icons/obj/items/training_dummies/archery.dmi b/icons/obj/items/training_dummies/archery.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b3e58a34a26c6675d645a6d2b1942223b6170483 GIT binary patch literal 352 zcmV-m0iXVfP)V=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zsXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`l@(n5T)@Tx06PL2GXQEUnR?nbEn}|$4TO}B z!$><&Hh_)#gjgupbLPPk3b$tiFb{<=a)ntam~%;eVt=9H21Kg5&bePe#Qi&%M?RLW y`EBW-9oFsU>D_Iby8?RKA0rFJ9O^CP-|7UHa2PGP@3?FL0000 zT2F1{I%FWg_Q3MHi2Yl=u-$1Br%YN{%ewOHP3|jflbqx4A9NHr`muTav6Zj?a+p`_ zD%La1-H=gUZPYIjl2B+fL9nm;1-GkuYD7q?U*)tepN^de7O57Wz1+*KGpjuMu~OB) zGiSfcR9xQwQYrIk{AxFIs~ra~3vW`jl@R{0JcogS$-vXaF{EP7+uMqLN{%A!AFt09 z@|d(%Z1FV{&NN#|XX`UNb}}^eJYq<_ew8tR#Za7KE8F!fy$x+FXI6>EGFdK~9J_IY z`-=W0|LvP=^#3ls{48)wZuS;|LmJ0^c)oYkkW)M`Vd@tq=j99rtPPqBK8y)m48aUD zm=1_AEF)5ALpz6nlf*^qfUcW4-yY40{$9Jk)9~Mky$&1?HJ5JresBLViTdaB_D8L? z+w=YSluJq5Z`(ef7jO0a+VaaUXBX$qt==&+(krumZ`}T6Q@-uI-y(46M0Ne17`^;^ zzmw11EKj}vefGk#-2YvB86*9#B=^kMT;b@qA7Z$>||vu`n2xhm^s>D}s{k8`T+*6z7~eD+Q0jSiuq-tYfT zU$tu5kw2e**33BnoIPpV%$dfUb7QZU?e70Suex#F>w9N&Du17SSMcNe8}-SYhV%Z{ zJ6tw-Q8UZ#5Sn$whcis$(wUK$P3m8`wyiSQ{GWe+?ro*-OwIfI_Su&_df0t4eo0Dm Vn%s2<2Vjb3@O1TaS?83{1OOfwMh5@@ literal 0 HcmV?d00001 diff --git a/icons/obj/items/training_dummies/standard.dmi b/icons/obj/items/training_dummies/standard.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d4b367b4db8429c70e6ab26cf917ad1119ef2bd3 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*8>L*XliOMUAiZ8+u;BJ00DGTPE!Ct=GbNc003!vR9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*+P6OZW^*7W$JrO+8 z02Z&z8Gx|>aAbz5zJg(_v@S8f{yNZoFik|w(lPVgWFQhX**V5sdCo24*CP9tZR*1E z2JlfuP-KG5x}v4R>c{h)Um;?L*Br!8jV_;}#Xy{>J z*yy7Y0F+`Z3GxeOaCmkj4amu?3W+FjNi9w;$}A|!%+F(BsF)KRR!~&>{Y!Ac$FEPc zymhtCojD)8A=Kca@qggEfts*E$mTBV83ZXWgmy8b_k8I%4-R-*e zDTCQ@w#L;=m-P*=?)2VoJ4ert(lqT>y3t+E%=Qm@BQE{-^DL8v)Z&>59mq; MPgg&ebxsLQ0P$6bP5=M^ literal 0 HcmV?d00001 diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 4705a37d998f32d2ff382b7d0b67b31e0a5e0ff7..ec7ad98c685e4799fb99ef98a614d4f843dd5743 100644 GIT binary patch delta 51252 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 diff --git a/icons/obj/structures/archery_butt.dmi b/icons/obj/structures/archery_butt.dmi deleted file mode 100644 index 45bbb36c105fbcec1583a324f7fb80fb68061e3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450 zcmV;z0X_bSP)p8x;fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq3Xb=H^!7Qmd@s>gNJ>0stc0CsMiP z?$Q7N0N+VOK~y-6)sjgL!ypVrLx+6~K0t{$Kv6DGqjcXzx&KuP!47H~s!Cb)Z!F=b z?*Vt+p9uOA75ok;kjJdyQsQA)@@5=;C8k@6r)kN108@z|fa3?_^)y-I1t0;CAH22z z+L{F*n1u`|wAn$E)SxiTats_bW(TrY0q$|ulL4@l9Z<{I>mIzd*+Fa508$EEfP^&w z#N?jp5VZkBqJ6;k66+?RZn6xnWX!$^@S+$Pf~?x{LCC7Pg&1VjE^?RrSxrEd?`|JV sB9cQrxldqqv>U*?_5<-z;yG?4Urd%W0d9rr*#H0l07*qoM6N<$g8g&BtN;K2 diff --git a/icons/obj/structures/target_stakes/archery_butt.dmi b/icons/obj/structures/target_stakes/archery_butt.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b2e7253cf4bd7a2578f501365c7f8b67f559c538 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*8>L*96ETit7~3rQkkcF z%vA2mBS0y}k|4ie28U-i(tw=Is*s2hm(=3qqRfJl%=|nChKf1CVFg8{-@gPGeEj-E z%Uf6L+?n&i8$t~(8b5fXbKXbuBtub8?+y#&Amhu%UJ7#_O*%3uL?L*k&3+Aa*UoNZ z)y*p;PMAM=e0iKqJOm1EY3wXp03K^Nx6X&E| zaCQ)Q807ed$;-`PxwbRYk)s^XN>at&FwJ0e;bjzO=Qzu>iG^W7hj@{@Nu@2&N(N6? KKbLh*2~7aM`)@h` literal 0 HcmV?d00001 diff --git a/icons/obj/structures/target_stakes/target_stake.dmi b/icons/obj/structures/target_stakes/target_stake.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7423233493f0af48c8b52886f7bb4c8cee2a3547 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*8>L*bal-;bns+qQkkcF z%r7qCvp^}vk|4ie28U-i(tw=Is*s2hm(=3qqRfJl%=|nChKf1CVFg8{-@gPGeEj-E z%Uf6L+?n&i8$t~(8b5fXbKXbuBtub8?+y#&Amhu%UJ7#_O*%3uL?L*k&3+Aa*UoNZ z)y*p;PMAM=FxJ6? z!S}!ghMCVbG&FQHG+r=>8Z8+u;BJ00DGTPE!Ct=GbNc0047(R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq3Xb=H^!7Qmd@s>gNJ>0stc0CsMiP z?$Q7N0Ln>3K~y-6#gj1(gD?z5i4^wIngbLr&|b9Rhx Xr^Y7VG6Jm+00000NkvXXu0mjfJaM&C diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index ae068ece7af..f9474889117 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -200,7 +200,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/range) "aaD" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/floor/tiled/steel_grid, /area/exodus/security/range) @@ -344,11 +344,11 @@ /area/exodus/security/range) "aaV" = ( /obj/structure/closet/crate, -/obj/item/target, -/obj/item/target, -/obj/item/target, -/obj/item/target, -/obj/item/target, +/obj/item/training_dummy, +/obj/item/training_dummy, +/obj/item/training_dummy, +/obj/item/training_dummy, +/obj/item/training_dummy, /obj/machinery/light, /turf/floor/tiled/steel_grid, /area/exodus/security/range) diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index 9aac14f4417..23ce124bb76 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -7240,7 +7240,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "Ft" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /turf/floor/tiled, /area/ministation/security) "Fy" = ( @@ -8356,18 +8356,18 @@ /area/ministation/medical) "Me" = ( /obj/structure/rack, -/obj/item/target, -/obj/item/target/alien, -/obj/item/target/syndicate, +/obj/item/training_dummy, +/obj/item/training_dummy/alien, +/obj/item/training_dummy/syndicate, /obj/effect/floor_decal/industrial/warning{ dir = 8 }, -/obj/item/target/syndicate, -/obj/item/target/syndicate, -/obj/item/target/syndicate, -/obj/item/target/alien, -/obj/item/target/alien, -/obj/item/target/alien, +/obj/item/training_dummy/syndicate, +/obj/item/training_dummy/syndicate, +/obj/item/training_dummy/syndicate, +/obj/item/training_dummy/alien, +/obj/item/training_dummy/alien, +/obj/item/training_dummy/alien, /turf/floor/tiled, /area/ministation/security) "Mp" = ( diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index f70c0d36926..feaf95611cc 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -3345,7 +3345,7 @@ /turf/floor/plating, /area/ministation/maint/l3nw) "qj" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /obj/item/toy/figure/clown, /turf/floor/reinforced/airless, /area/space) diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index 8779b3ce78d..1be37c41159 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -1931,7 +1931,7 @@ /turf/floor/plating, /area/icarus/vessel) "go" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /turf/floor/plating, /area/icarus/vessel) "gp" = ( diff --git a/nebula.dme b/nebula.dme index 3a5a07def65..fd1d6d087a1 100644 --- a/nebula.dme +++ b/nebula.dme @@ -842,7 +842,6 @@ #include "code\game\machinery\igniter.dm" #include "code\game\machinery\jukebox.dm" #include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\magnet.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\mech_recharger.dm" #include "code\game\machinery\message_server.dm" @@ -1109,10 +1108,10 @@ #include "code\game\objects\items\rescuebag.dm" #include "code\game\objects\items\rock.dm" #include "code\game\objects\items\saddle.dm" -#include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\silencer.dm" #include "code\game\objects\items\spirit_board.dm" #include "code\game\objects\items\toys.dm" +#include "code\game\objects\items\training_dummy.dm" #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\umbrella.dm" #include "code\game\objects\items\waterskin.dm" @@ -1494,7 +1493,6 @@ #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\target_stake.dm" #include "code\game\objects\structures\town_bell.dm" -#include "code\game\objects\structures\training_dummies.dm" #include "code\game\objects\structures\transit_tubes.dm" #include "code\game\objects\structures\under_wardrobe.dm" #include "code\game\objects\structures\wall_frame.dm" diff --git a/tools/map_migrations/4615_target_stakes.txt b/tools/map_migrations/4615_target_stakes.txt new file mode 100644 index 00000000000..8e4677a219f --- /dev/null +++ b/tools/map_migrations/4615_target_stakes.txt @@ -0,0 +1,2 @@ +/obj/item/target/@SUBTYPES : /obj/item/target_dummy/@SUBTYPES{@OLD} +/obj/structure/target_stake/@SUBTYPES : /obj/structure/target_stake/steel/@SUBTYPES{@OLD} From 6cbf766e752b1609ba70707683ad7152fce39e56 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 9 Dec 2024 21:35:14 +1100 Subject: [PATCH 136/554] Removed slavers' den. --- maps/away/slavers/icons/abolitionist.dmi | Bin 1391 -> 0 bytes maps/away/slavers/icons/areas.dmi | Bin 1878 -> 0 bytes maps/away/slavers/icons/uniform.dmi | Bin 781 -> 0 bytes maps/away/slavers/slavers_base.dm | 185 - maps/away/slavers/slavers_base.dmm | 44306 ---------------- maps/away/slavers/slavers_base_areas.dm | 42 - maps/away_sites_testing/away_sites_testing.dm | 1 - maps/exodus/exodus.dm | 1 - maps/ministation/ministation.dm | 1 - maps/tradeship/tradeship.dm | 1 - 10 files changed, 44537 deletions(-) delete mode 100644 maps/away/slavers/icons/abolitionist.dmi delete mode 100644 maps/away/slavers/icons/areas.dmi delete mode 100644 maps/away/slavers/icons/uniform.dmi delete mode 100644 maps/away/slavers/slavers_base.dm delete mode 100644 maps/away/slavers/slavers_base.dmm delete mode 100644 maps/away/slavers/slavers_base_areas.dm diff --git a/maps/away/slavers/icons/abolitionist.dmi b/maps/away/slavers/icons/abolitionist.dmi deleted file mode 100644 index b56da3bc706557a762e6dc2a9ce92292db970f64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1391 zcmV-#1(5oQP)l}Nj5e%4Gj%CI5-_09fN^^Qc_YR zBO@Ff99&#nz`(%&05ktHGu|Q)ZvX%Q0d!JMQvg8b*k%9#0Caj(Sad{Xb7OL8aCB*J zZU6vyoKseCa&`CgQ*iP1C^0t`#5P1zrJItPh@{jIMX9oatDg(l1pw~y zCb#l?ci#X21MEpeK~z|U-Ir@uqdF9Z6NxDSL!3fFo2o5CXXYHOf}M^o&;S2nXD85l zAz_9p^TEAPT)gl;*)f+Lgg#Z^CcOGd6J9;A(c|B|5cmiLqLuz>j7lL7jISdt_R?(S$h2y*Zl1cA-KlK?`~G!;UmeCpA8YJ+p10peNK z=P&Wp1eR_BmsmEJkDzdtWrF(Xxs(+Asg$|P!RQ#zFd*`|+h4&lkY(CUn9pe{sl@ZS zmpQ(wUAd`R9fHZ^9e| zRSL117Fu^QxCVd55WgYBTpY3Pbbr7Fxuf~`(W8Ej_+5qnA@(Bzpf(l-4a0Z{OdkC>7whXYs#0Q=lMe!_S{ zm|*JZKdCTieDo{{sNM x=Zp8pPjg1tj_03MyOXpY5%6fs`;YCS{{e43X;9b=+i3s*002ovPDHLkV1hK7ac}?t diff --git a/maps/away/slavers/icons/areas.dmi b/maps/away/slavers/icons/areas.dmi deleted file mode 100644 index cc911c14cd2cad34a0f950ba2da383087477268c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1878 zcmah~X;hQf7QJ5>0?1IN7BD=ZAmEY$B0fHWmw+;bA=;=EWp0p3hA;()KoDt^L1Y0X ztxX^bJVdFeg))f-Xc?pgfdUn%2?PmafFffU-e;|=>-~A}$G&IXeeOL!&e?b0tTO~> z1vxD_0DuDC#es;#bOZr1(#SeQrQ(rLPCe%p?{F!O6dOj44~vchAc=Xi&ql7@Tt0o` z74|Ea^?{MO3IjEzZf%F^QE6OuWH?oOS+v8Amxbn7lLmB8jxVb}ha zFhw;VE)o7?xGuFy;o#K_y}PF)^V>Fw_O1AA=T;Z-&Ur(I*M;+8^Vkc+Kl^M>Iq5Cq zuj|F9tl}+p3e}F~lr)lZXyad-6#GYHCbI%A*6sjC(3RMmP76l>kdDMV*q=*cF0wu^ zD1+tcy`H=-W?-r+tU8|guTv?8>w#_#!!8=6YayQ7_kC0!c(~LB&DIyVD~YG}DcYKh zlEg$)Zt24fo?vuskCxEV+|San)f{PP74%KD&({QRzUD11@pv`uG5hdh4Ud+)y0Nju z_(DXJ}N=8Us@Knzv!iAH;lmgZ3$u#VH9R(qt_fsVg6*9Yp__ z(2=sE(g8=CmnYF?|lsZyFE=Dzo}zCV6*5~F--K*ZaaJU1x4r%lj|$<$gP ziW<;Gl2EFj19vvMB3cx>VTqSzSLyUUz9-o0^`*%kt|%R%V2nfNPrs02l=MZ^y1S%8 zSyRc~N0+l#1BLZ6YMv6InQ=ZWCrf6gz;pxNo~^EF6*nqvX+)4h>bY_ z-gp7yPL$n=kHL$_;7p!WdaMa3`a2~InGySCuBOdV_b+AnF5wa>>6gG8109(ak$C0) zjP=ewI7W@WlDtIvoMWBaxm&rry1lEvy(?y3P@q{}9_preqj=7`QXgr7qXgeh`c&pnF3PAb# zk^49!LmIRcKN}O3M)9Q|dExh@&RC}aOf7^UsZS4QN%JMyK{x^TxW_$P?EpRJ#RB-L zzSbcFNQM&8ephMC)zM%K%}#ilWL0WA5?P)G5~z+JkrT8->ju4B!_sYhwxa^7R9CoW zO+OCd*%mUc3(=tYTkB@W%H_vq*9TPFD{{C^G!@pZThYrwZr^+c5u42V!Ev)WmHfTg zqsxJ5l@>2E^d(%vyq}ysSi&=fFq=lkFe=$ zkbLj|7SDg{ik|A<^i2CHCCw(DA}W1o#y(aI6&0o!k})rN>{m7^I9}sYJ()SbuIKK7 zfy@z|Ll=lkUq6LIz86UsLd;TESSmyLGkCp0^8zNm6hY3*3WIi-=8 zeE!0yvKwIR@woC0|8^skb#lhzZY#QM`R{He#YLSMMk8ImqxpZ|=-+MTK5yH)RsGv1 SqAld31b9b+!^4vS8UF!Hwr>;w diff --git a/maps/away/slavers/icons/uniform.dmi b/maps/away/slavers/icons/uniform.dmi deleted file mode 100644 index 841007db55fbe81af2043694a4cf714a65d8003c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781 zcmV+o1M>WdP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33t zGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*-GsxnG*6Z7&jQxuZ&Qz~_f zbMi~#%i~M)GSl*lauJ$MP&6wmxca$(-2?zv%`O`gxq+_$00GrWL_t(oh3%JdZ^9rD z#cA&jT4&1?gZlly=nk4WlX9GE{bR{^sZI19_j^z+MLa(|@0 z>$;v$Aau)EF+i95ivhtRx>SH@K?;ykN&x@~m#a8@7+jAIX&4Y(iJ%2YKG8^wutUio z20%x2U;w&x2Q2_t_G!eCC*VHT1aOA~qz3!}C}h+E0FPt9m;lFP!N(qQ14;l`Eu$8I z7YJbD?levS$92G&x7VYAS#LHqK=LPk2!vC~H}gCj|E>J(cLCBbFfjqADf^$RMKVu- zwX^^U@Z*<{+X>Dgqzg_3R|)Wnf8vdR=@I~105za_6l@Jp_w!a>3bqAMeFGQAJFNIW z@mc`I=fiRVQv+xLY~AMu!~nX;4U_;3sQFxw0hJkO0qWxo&kvT{#sC^XlNvzro0^)M zn%<=7Sha%W#~uA6IpPiigAKMRZYM-%ZS-Es7@hag+8tA1Kt%8DwQOIl_ZZ&+kY?~6 z0Fn&g_pg0`5JId2a>-^uUi*L~0SLpRY&+l_ZW7=Y&ieqlvHS+{?d*95yh3$As@Qdu z
From 33ebefc92bee2f578e7776619ce7b81fc22afa92 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 11 Dec 2024 11:16:40 +1100 Subject: [PATCH 139/554] Update code/datums/config/config_types/config_mode.dm Co-authored-by: Penelope Haze --- code/datums/config/config_types/config_mode.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/config/config_types/config_mode.dm b/code/datums/config/config_types/config_mode.dm index 975b84ebca9..6f91654a688 100644 --- a/code/datums/config/config_types/config_mode.dm +++ b/code/datums/config/config_types/config_mode.dm @@ -88,7 +88,7 @@ /decl/config/toggle/continuous_rounds uid = "continuous_rounds" desc = list( - "Remove the # to make rounds which end instantly to continue until the shuttle is called or the station is nuked.", + "Remove the # to make rounds which end instantly continue until the shuttle is called or the station is nuked.", "Malf and Rev will let the shuttle be called when the antags/protags are dead." ) From c2e44edacc05c01c82fd219fe079203a57a97570 Mon Sep 17 00:00:00 2001 From: Greenjoe12345 Date: Wed, 11 Dec 2024 00:51:01 +0000 Subject: [PATCH 140/554] crutch --- mods/content/fantasy/items/clothing/_loadout.dm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 9d7f449a9f5..8f6857ced51 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -288,6 +288,18 @@ "white wine" = /decl/material/liquid/ethanol/wine/premium, )) +/decl/loadout_option/fantasy/utility/crutch + name = "crutch" + path = /obj/item/crutch/wooden/padded + available_materials = list( + /decl/material/solid/organic/wood/oak, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/maple, + /decl/material/solid/organic/wood/ebony, + /decl/material/solid/organic/wood/walnut + ) + uid = "gear_fantasy_crutch" + /decl/loadout_option/fantasy/eyes abstract_type = /decl/loadout_option/fantasy/eyes slot = slot_glasses_str From 4e44316b15415dc4805b41265829e4b4be02e4f3 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 11 Dec 2024 00:43:51 -0500 Subject: [PATCH 141/554] Fix table colors --- code/game/objects/structures/tables.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index 0f6a48c2a6b..e71f8b9df64 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -300,6 +300,7 @@ reset_color() /obj/structure/table/proc/handle_normal_icon() + color = null // Don't double-apply our color, clear the map preview. icon_state = "blank" var/image/I // Base frame shape. From 02495f8993ee0d71b61b2aa8018ae7f8c1170b12 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 2 Dec 2024 18:33:30 +1100 Subject: [PATCH 142/554] Reworking necklaces and rings to use Doe's new icons. --- code/_global_vars/lists/jewellery.dm | 23 ++++ code/_onclick/item_attack.dm | 2 +- code/game/objects/auras/blueforge_aura.dm | 16 --- code/game/objects/auras/radiant_aura.dm | 2 +- code/game/objects/auras/shadowling_aura.dm | 21 ---- code/game/objects/auras/starlight.dm | 20 --- code/game/objects/items/__item.dm | 13 ++ code/game/objects/items/stacks/stack.dm | 1 - .../objects/items/weapons/storage/backpack.dm | 5 +- code/game/objects/random/subtypes/misc.dm | 32 ++--- .../loadout/lists/accessories.dm | 26 ++++ .../preference_setup/loadout/lists/gloves.dm | 41 ++++-- .../clothing/gloves/jewelry/rings/_ring.dm | 81 ++++++++++-- .../clothing/gloves/jewelry/rings/material.dm | 24 ---- .../gloves/jewelry/rings/ring_aura.dm | 29 +++++ .../gloves/jewelry/rings/ring_misc.dm | 24 ++++ .../gloves/jewelry/rings/ring_reagent.dm | 37 ++++++ .../gloves/jewelry/rings/ring_seal.dm | 42 +++++++ .../clothing/gloves/jewelry/rings/rings.dm | 118 ------------------ code/modules/clothing/neck/jewelry.dm | 74 ----------- .../clothing/neck/necklace/__necklace.dm | 97 ++++++++++++++ .../clothing/neck/necklace/_pendant.dm | 51 ++++++++ .../clothing/neck/necklace/necklaces.dm | 15 +++ .../clothing/neck/necklace/pendant_locket.dm | 50 ++++++++ .../clothing/neck/necklace/pendant_random.dm | 27 ++++ .../clothing/neck/necklace/pendant_setting.dm | 36 ++++++ code/modules/clothing/neck/prayer_beads.dm | 29 +++++ .../stack_recipes/recipes_hardness.dm | 14 ++- code/modules/decoration/_decoration.dm | 104 +++++++++++++++ code/modules/decoration/decoration_item.dm | 103 +++++++++++++++ code/modules/decoration/decoration_setting.dm | 30 +++++ code/modules/gemstones/_gemstone.dm | 38 ++++++ code/modules/gemstones/gemstone_cuts.dm | 5 +- .../species/species_bodytype_offsets.dm | 15 ++- icons/clothing/accessories/jewelry/locket.dmi | Bin 837 -> 0 bytes .../clothing/accessories/jewelry/necklace.dmi | Bin 752 -> 489 bytes .../accessories/jewelry/pendants/cross.dmi | Bin 0 -> 427 bytes .../accessories/jewelry/pendants/crystal.dmi | Bin 0 -> 369 bytes .../accessories/jewelry/pendants/diamond.dmi | Bin 0 -> 439 bytes .../accessories/jewelry/pendants/frill.dmi | Bin 0 -> 383 bytes .../accessories/jewelry/pendants/locket.dmi | Bin 0 -> 462 bytes .../accessories/jewelry/pendants/ornate.dmi | Bin 0 -> 585 bytes .../accessories/jewelry/pendants/square.dmi | Bin 0 -> 435 bytes .../accessories/jewelry/rings/ring.dmi | Bin 383 -> 0 bytes .../accessories/jewelry/rings/ring_band.dmi | Bin 0 -> 454 bytes .../jewelry/rings/ring_band_split.dmi | Bin 0 -> 448 bytes .../jewelry/rings/ring_band_thick.dmi | Bin 0 -> 467 bytes .../jewelry/rings/ring_band_thin.dmi | Bin 0 -> 442 bytes .../accessories/jewelry/rings/ring_blue.dmi | Bin 1340 -> 0 bytes .../accessories/jewelry/rings/ring_cti.dmi | Bin 417 -> 0 bytes .../jewelry/rings/ring_diamond.dmi | Bin 376 -> 0 bytes .../accessories/jewelry/rings/ring_magic.dmi | Bin 388 -> 0 bytes .../jewelry/rings/ring_mariner.dmi | Bin 396 -> 0 bytes .../accessories/jewelry/rings/ring_seal.dmi | Bin 0 -> 531 bytes .../jewelry/rings/ring_seal_masonic.dmi | Bin 446 -> 547 bytes .../jewelry/rings/ring_seal_secgen.dmi | Bin 437 -> 0 bytes .../jewelry/rings/ring_seal_signet.dmi | Bin 433 -> 524 bytes .../accessories/jewelry/rings/ring_shadow.dmi | Bin 420 -> 0 bytes .../accessories/jewelry/rings/ring_star.dmi | Bin 421 -> 0 bytes icons/obj/items/gemstones/baguette.dmi | Bin 423 -> 427 bytes icons/obj/items/gemstones/hexagon.dmi | Bin 419 -> 423 bytes icons/obj/items/gemstones/octagon.dmi | Bin 445 -> 449 bytes icons/obj/items/gemstones/poor.dmi | Bin 382 -> 386 bytes icons/obj/items/gemstones/round.dmi | Bin 401 -> 405 bytes icons/obj/items/gemstones/uncut.dmi | Bin 538 -> 542 bytes maps/shaded_hills/outfits/shrine.dm | 2 +- .../content/dungeon_loot/subtypes/bookcase.dm | 2 +- .../fantasy/items/clothing/_loadout.dm | 2 +- nebula.dme | 21 +++- 69 files changed, 941 insertions(+), 331 deletions(-) create mode 100644 code/_global_vars/lists/jewellery.dm delete mode 100644 code/game/objects/auras/blueforge_aura.dm delete mode 100644 code/game/objects/auras/shadowling_aura.dm delete mode 100644 code/game/objects/auras/starlight.dm delete mode 100644 code/modules/clothing/gloves/jewelry/rings/material.dm create mode 100644 code/modules/clothing/gloves/jewelry/rings/ring_aura.dm create mode 100644 code/modules/clothing/gloves/jewelry/rings/ring_misc.dm create mode 100644 code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm create mode 100644 code/modules/clothing/gloves/jewelry/rings/ring_seal.dm delete mode 100644 code/modules/clothing/gloves/jewelry/rings/rings.dm delete mode 100644 code/modules/clothing/neck/jewelry.dm create mode 100644 code/modules/clothing/neck/necklace/__necklace.dm create mode 100644 code/modules/clothing/neck/necklace/_pendant.dm create mode 100644 code/modules/clothing/neck/necklace/necklaces.dm create mode 100644 code/modules/clothing/neck/necklace/pendant_locket.dm create mode 100644 code/modules/clothing/neck/necklace/pendant_random.dm create mode 100644 code/modules/clothing/neck/necklace/pendant_setting.dm create mode 100644 code/modules/clothing/neck/prayer_beads.dm create mode 100644 code/modules/decoration/_decoration.dm create mode 100644 code/modules/decoration/decoration_item.dm create mode 100644 code/modules/decoration/decoration_setting.dm delete mode 100644 icons/clothing/accessories/jewelry/locket.dmi create mode 100644 icons/clothing/accessories/jewelry/pendants/cross.dmi create mode 100644 icons/clothing/accessories/jewelry/pendants/crystal.dmi create mode 100644 icons/clothing/accessories/jewelry/pendants/diamond.dmi create mode 100644 icons/clothing/accessories/jewelry/pendants/frill.dmi create mode 100644 icons/clothing/accessories/jewelry/pendants/locket.dmi create mode 100644 icons/clothing/accessories/jewelry/pendants/ornate.dmi create mode 100644 icons/clothing/accessories/jewelry/pendants/square.dmi delete mode 100644 icons/clothing/accessories/jewelry/rings/ring.dmi create mode 100644 icons/clothing/accessories/jewelry/rings/ring_band.dmi create mode 100644 icons/clothing/accessories/jewelry/rings/ring_band_split.dmi create mode 100644 icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi create mode 100644 icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi delete mode 100644 icons/clothing/accessories/jewelry/rings/ring_blue.dmi delete mode 100644 icons/clothing/accessories/jewelry/rings/ring_cti.dmi delete mode 100644 icons/clothing/accessories/jewelry/rings/ring_diamond.dmi delete mode 100644 icons/clothing/accessories/jewelry/rings/ring_magic.dmi delete mode 100644 icons/clothing/accessories/jewelry/rings/ring_mariner.dmi create mode 100644 icons/clothing/accessories/jewelry/rings/ring_seal.dmi delete mode 100644 icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi delete mode 100644 icons/clothing/accessories/jewelry/rings/ring_shadow.dmi delete mode 100644 icons/clothing/accessories/jewelry/rings/ring_star.dmi diff --git a/code/_global_vars/lists/jewellery.dm b/code/_global_vars/lists/jewellery.dm new file mode 100644 index 00000000000..7364bff8b60 --- /dev/null +++ b/code/_global_vars/lists/jewellery.dm @@ -0,0 +1,23 @@ +var/global/list/random_jewellery_material_types = list( + /decl/material/solid/metal/gold, + /decl/material/solid/metal/silver, + /decl/material/solid/metal/copper, + /decl/material/solid/metal/platinum, + /decl/material/solid/metal/steel, + /decl/material/solid/organic/bone, + /decl/material/solid/organic/wood +) +var/global/list/random_jewellery_gem_types = list( + /obj/item/gemstone/baguette/topaz, + /obj/item/gemstone/baguette/sapphire, + /obj/item/gemstone/baguette/ruby, + /obj/item/gemstone/hexagon/topaz, + /obj/item/gemstone/hexagon/sapphire, + /obj/item/gemstone/hexagon/ruby, + /obj/item/gemstone/octagon/topaz, + /obj/item/gemstone/octagon/sapphire, + /obj/item/gemstone/octagon/ruby, + /obj/item/gemstone/round/topaz, + /obj/item/gemstone/round/sapphire, + /obj/item/gemstone/round/ruby +) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index a3e8714eaff..1dbed7ab122 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -48,7 +48,7 @@ avoid code duplication. This includes items that may sometimes act as a standard // Return TRUE if further actions (afterattack, etc) should be prevented, FALSE if they can proceed. /atom/movable/proc/bash(obj/item/weapon, mob/user) - if(isliving(user) && user.check_intent(I_FLAG_HELP)) + if(isliving(user) && !user.check_intent(I_FLAG_HARM)) return FALSE if(!weapon.user_can_attack_with(user)) return FALSE diff --git a/code/game/objects/auras/blueforge_aura.dm b/code/game/objects/auras/blueforge_aura.dm deleted file mode 100644 index ae3925d0e20..00000000000 --- a/code/game/objects/auras/blueforge_aura.dm +++ /dev/null @@ -1,16 +0,0 @@ -/obj/aura/blueforge_aura - name = "Blueforge Aura" - icon = 'icons/mob/human_races/species/blueforged/eyes.dmi' - icon_state = "eyes" - layer = MOB_LAYER - -/obj/aura/blueforge_aura/life_tick() - user.heal_damage(TOX, 10) - return 0 - -/obj/aura/blueforge_aura/bullet_act(var/obj/item/projectile/P) - if(P.atom_damage_type == BURN) - P.damage *=2 - else if(P.agony || P.stun) - return AURA_FALSE - return 0 \ No newline at end of file diff --git a/code/game/objects/auras/radiant_aura.dm b/code/game/objects/auras/radiant_aura.dm index 0968d057060..d25cfa807b9 100644 --- a/code/game/objects/auras/radiant_aura.dm +++ b/code/game/objects/auras/radiant_aura.dm @@ -17,4 +17,4 @@ if(P.damage_flags() & DAM_LASER) user.visible_message("\The [P] refracts, bending into \the [user]'s aura.") return AURA_FALSE - return 0 \ No newline at end of file + return 0 diff --git a/code/game/objects/auras/shadowling_aura.dm b/code/game/objects/auras/shadowling_aura.dm deleted file mode 100644 index ff081f7dfb1..00000000000 --- a/code/game/objects/auras/shadowling_aura.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/aura/shadowling_aura - name = "Shadowling Aura" - var/added_mutation = FALSE - -/obj/aura/shadowling_aura/added_to(var/mob/living/L) - ..() - if(L.add_genetic_condition(GENE_COND_SPACE_RESISTANCE)) - added_mutation = TRUE - -/obj/aura/shadowling_aura/removed() - if(added_mutation) - added_mutation = FALSE - user.remove_genetic_condition(GENE_COND_SPACE_RESISTANCE) - ..() - -/obj/aura/shadowling_aura/bullet_act(var/obj/item/projectile/P) - if(P.damage_flags() & DAM_LASER) - P.damage *= 2 - if(P.agony) - P.agony *= 2 - return 0 \ No newline at end of file diff --git a/code/game/objects/auras/starlight.dm b/code/game/objects/auras/starlight.dm deleted file mode 100644 index 5e6253cbd93..00000000000 --- a/code/game/objects/auras/starlight.dm +++ /dev/null @@ -1,20 +0,0 @@ -/obj/aura/starborn - name = "starborn's gift" - icon = 'icons/effects/effects.dmi' - icon_state = "white_electricity_constant" - color = "#33cc33" - layer = MOB_LAYER - -/obj/aura/starborn/bullet_act(var/obj/item/projectile/P, var/def_zone) - if(P.atom_damage_type == BURN) - user.visible_message("\The [P] seems to only make \the [user] stronger.") - user.heal_damage(BRUTE, P.damage) - return AURA_FALSE - return 0 - -/obj/aura/starborn/attackby(var/obj/item/I, var/mob/i_user) - if(I.atom_damage_type == BURN) - to_chat(i_user, "\The [I] seems to only feed into \the [user]'s flames.") - user.heal_damage(BRUTE, I.get_attack_force(user)) - return AURA_FALSE - return 0 \ No newline at end of file diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 69dd9c22283..439b62e14b7 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -173,6 +173,16 @@ set_material(material_key) paint_verb ||= "painted" // fallback for the case of no material + // This is a bit gross, but it makes writing rings and necklaces much easier. + // If the decorations list is already populated at this point, we assume it's + // prebaked decorations. Only things handled appropriately at the moment are gems. + if(length(decorations)) + for(var/decoration_type in decorations) + decorations -= decoration_type + if(ispath(decoration_type, /obj/item/gemstone)) + decorations[GET_DECL(/decl/item_decoration/setting)] = list("object" = new decoration_type(src)) + else + PRINT_STACK_TRACE("Item [type] tried to initialize with an unsupported initial decoration type ('[decoration_type]')") . = ..() setup_sprite_sheets() @@ -200,6 +210,9 @@ /obj/item/Destroy() + // May contain object references. + LAZYCLEARLIST(decorations) + if(LAZYLEN(_item_effects)) _item_effects = null SSitem_effects.queued_items -= src diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2a38b4f01c3..2010f99039d 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -53,7 +53,6 @@ update_name() /obj/item/stack/update_name() - . = ..() if(amount == 1) gender = NEUTER SetName(singular_name) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 1bc1144dc87..14a20b4125c 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -456,9 +456,6 @@ /obj/item/backpack/crafted/backpack name = "backpack" + name_prefix = "handmade" desc = "A rather rough handmade backpack." icon = 'icons/obj/items/storage/backpack/backpack_crafted.dmi' - -/obj/item/backpack/crafted/backpack/update_name() - . = ..() - SetName("handmade [name]") diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index a4356724b35..e0003d62ef8 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -515,22 +515,22 @@ /obj/random/jewelry/spawn_choices() var/static/list/spawnable_choices = list( - /obj/item/clothing/ears/stud/wood = 10, - /obj/item/clothing/ears/dangle/wood = 10, - /obj/item/clothing/gloves/bracelet = 10, - /obj/item/clothing/neck/necklace = 10, - /obj/item/clothing/gloves/ring/material/silver = 5, - /obj/item/clothing/gloves/ring/material/bronze = 5, - /obj/item/clothing/gloves/ring/material/gold = 3, - /obj/item/clothing/ears/stud/silver = 3, - /obj/item/clothing/ears/dangle/silver = 3, - /obj/item/clothing/ears/stud/gold = 3, - /obj/item/clothing/ears/dangle/gold = 3, - /obj/item/clothing/gloves/ring/material/platinum = 1, - /obj/item/clothing/ears/stud/platinum = 1, - /obj/item/clothing/ears/dangle/platinum = 1, - /obj/item/clothing/ears/stud/diamond = 1, - /obj/item/clothing/ears/dangle/diamond = 1 + /obj/item/clothing/ears/stud/wood = 10, + /obj/item/clothing/ears/dangle/wood = 10, + /obj/item/clothing/gloves/bracelet = 10, + /obj/item/clothing/neck/necklace = 10, + /obj/item/clothing/gloves/ring/silver = 5, + /obj/item/clothing/gloves/ring/bronze = 5, + /obj/item/clothing/gloves/ring/gold = 3, + /obj/item/clothing/ears/stud/silver = 3, + /obj/item/clothing/ears/dangle/silver = 3, + /obj/item/clothing/ears/stud/gold = 3, + /obj/item/clothing/ears/dangle/gold = 3, + /obj/item/clothing/gloves/ring/platinum = 1, + /obj/item/clothing/ears/stud/platinum = 1, + /obj/item/clothing/ears/dangle/platinum = 1, + /obj/item/clothing/ears/stud/diamond = 1, + /obj/item/clothing/ears/dangle/diamond = 1 ) return spawnable_choices diff --git a/code/modules/client/preference_setup/loadout/lists/accessories.dm b/code/modules/client/preference_setup/loadout/lists/accessories.dm index 7f43717605b..739dc589b36 100644 --- a/code/modules/client/preference_setup/loadout/lists/accessories.dm +++ b/code/modules/client/preference_setup/loadout/lists/accessories.dm @@ -51,6 +51,32 @@ path = /obj/item/clothing/neck/necklace loadout_flags = GEAR_HAS_COLOR_SELECTION uid = "gear_accessory_necklace" + var/list/available_materials = list( + /decl/material/solid/metal/steel, + /decl/material/solid/metal/bronze, + /decl/material/solid/metal/silver, + /decl/material/solid/metal/gold, + /decl/material/solid/metal/platinum + ) + +/decl/loadout_option/accessory/necklace/get_gear_tweak_options() + . = ..() + LAZYINITLIST(.[/datum/gear_tweak/path]) + .[/datum/gear_tweak/path] |= list( + "necklace" = /obj/item/clothing/neck/necklace, + "necklace, square pendant" = /obj/item/clothing/neck/necklace/square, + "necklace, frill" = /obj/item/clothing/neck/necklace/frill, + "necklace, cross pendant" = /obj/item/clothing/neck/necklace/cross, + "necklace, diamond pendant" = /obj/item/clothing/neck/necklace/diamond, + "necklace, ornate" = /obj/item/clothing/neck/necklace/ornate + ) + if(length(available_materials)) + for(var/mat in available_materials) + var/decl/material/mat_decl = GET_DECL(mat) + available_materials -= mat + available_materials[mat_decl.name] = mat + LAZYINITLIST(.[/datum/gear_tweak/material]) + .[/datum/gear_tweak/material] = available_materials /decl/loadout_option/accessory/bow name = "bowtie, horrible" diff --git a/code/modules/client/preference_setup/loadout/lists/gloves.dm b/code/modules/client/preference_setup/loadout/lists/gloves.dm index 94387e8dee2..c923ba47b6b 100644 --- a/code/modules/client/preference_setup/loadout/lists/gloves.dm +++ b/code/modules/client/preference_setup/loadout/lists/gloves.dm @@ -24,20 +24,39 @@ path = /obj/item/clothing/gloves/ring cost = 2 uid = "gear_gloves_ring" + var/list/available_materials = list( + /decl/material/solid/metal/steel, + /decl/material/solid/metal/bronze, + /decl/material/solid/metal/silver, + /decl/material/solid/metal/gold, + /decl/material/solid/metal/platinum, + /decl/material/solid/glass, + /decl/material/solid/organic/plastic, + /decl/material/solid/organic/wood/oak, + /decl/material/solid/organic/wood/bamboo, + /decl/material/solid/organic/wood/ebony, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/maple, + /decl/material/solid/organic/wood/walnut, + /decl/material/solid/organic/wood/yew + ) /decl/loadout_option/ring/get_gear_tweak_options() . = ..() LAZYINITLIST(.[/datum/gear_tweak/path]) .[/datum/gear_tweak/path] |= list( - "engagement ring" = /obj/item/clothing/gloves/ring/engagement, - "signet ring" = /obj/item/clothing/gloves/ring/seal/signet, - "masonic ring" = /obj/item/clothing/gloves/ring/seal/mason, - "ring, steel" = /obj/item/clothing/gloves/ring/material/steel, - "ring, bronze" = /obj/item/clothing/gloves/ring/material/bronze, - "ring, silver" = /obj/item/clothing/gloves/ring/material/silver, - "ring, gold" = /obj/item/clothing/gloves/ring/material/gold, - "ring, platinum" = /obj/item/clothing/gloves/ring/material/platinum, - "ring, glass" = /obj/item/clothing/gloves/ring/material/glass, - "ring, wood" = /obj/item/clothing/gloves/ring/material/wood, - "ring, plastic" = /obj/item/clothing/gloves/ring/material/plastic + "ring" = /obj/item/clothing/gloves/ring/gold, + "ring, thin" = /obj/item/clothing/gloves/ring/thin, + "ring, thick" = /obj/item/clothing/gloves/ring/thick, + "ring, split" = /obj/item/clothing/gloves/ring/split, + "engagement ring" = /obj/item/clothing/gloves/ring/engagement, + "signet ring" = /obj/item/clothing/gloves/ring/seal/signet, + "masonic ring" = /obj/item/clothing/gloves/ring/seal/mason ) + if(length(available_materials)) + for(var/mat in available_materials) + var/decl/material/mat_decl = GET_DECL(mat) + available_materials -= mat + available_materials[mat_decl.name] = mat + LAZYINITLIST(.[/datum/gear_tweak/material]) + .[/datum/gear_tweak/material] = available_materials diff --git a/code/modules/clothing/gloves/jewelry/rings/_ring.dm b/code/modules/clothing/gloves/jewelry/rings/_ring.dm index 7b39b259604..b9e58beedf6 100644 --- a/code/modules/clothing/gloves/jewelry/rings/_ring.dm +++ b/code/modules/clothing/gloves/jewelry/rings/_ring.dm @@ -1,11 +1,15 @@ /obj/item/clothing/gloves/ring - name = "ring" - icon = 'icons/clothing/accessories/jewelry/rings/ring.dmi' - w_class = ITEM_SIZE_TINY - gender = NEUTER - material = /decl/material/solid/metal/silver + name = "ring" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band.dmi' + desc = null + w_class = ITEM_SIZE_TINY + gender = NEUTER + material = /decl/material/solid/metal/silver + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_DESC // We handle name manually + sprite_sheets = null + var/use_material_name = TRUE var/can_fit_under_gloves = TRUE - var/can_inscribe = FALSE + var/can_inscribe = TRUE var/inscription var/base_desc @@ -14,6 +18,24 @@ base_desc = desc . = ..() +/obj/item/clothing/gloves/ring/get_decoration_icon(default_icon, obj/item/thing, on_mob = FALSE) + if(!on_mob && istype(thing, /obj/item/gemstone)) + return thing.icon + return ..() + +/obj/item/clothing/gloves/ring/update_name() + var/list/name_comp = list() + if(name_prefix) + name_comp += name_prefix + if(use_material_name) + var/obj/item/gemstone/gem = locate() in contents + if(gem) + name_comp += gem.name + if(material) + name_comp += material.adjective_name + name_comp += base_name || initial(name) + SetName(jointext(name_comp, " ")) + /obj/item/clothing/gloves/ring/set_material(var/new_material) . = ..() update_desc() @@ -32,7 +54,7 @@ desc = "[base_desc] [desc]" /obj/item/clothing/gloves/ring/attackby(var/obj/item/tool, var/mob/user) - if(can_inscribe && tool.sharp) + if(can_inscribe && tool.sharp && user.check_intent(I_FLAG_HELP)) var/new_inscription = sanitize(input("Enter an inscription to engrave.", "Inscription") as null|text) if(user.stat || !user.incapacitated() || !user.Adjacent(src) || tool.loc != user) return TRUE @@ -55,4 +77,47 @@ /obj/item/clothing/gloves/ring/get_examine_line() . = ..() - . += " \[View\]" \ No newline at end of file + . += " \[View\]" + +// Craftable subtypes. +/obj/item/clothing/gloves/ring/thin + name_prefix = "thin" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi' + +/obj/item/clothing/gloves/ring/thick + name_prefix = "thick" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi' + +/obj/item/clothing/gloves/ring/split + name_prefix = "split" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_split.dmi' + +// Material subtypes for mapping etc. +/obj/item/clothing/gloves/ring/wood + material = /decl/material/solid/organic/wood/walnut + +/obj/item/clothing/gloves/ring/plastic + material = /decl/material/solid/organic/plastic + +/obj/item/clothing/gloves/ring/steel + material = /decl/material/solid/metal/steel + +/obj/item/clothing/gloves/ring/silver + material = /decl/material/solid/metal/silver + +/obj/item/clothing/gloves/ring/gold + material = /decl/material/solid/metal/gold + +/obj/item/clothing/gloves/ring/platinum + material = /decl/material/solid/metal/platinum + +/obj/item/clothing/gloves/ring/bronze + material = /decl/material/solid/metal/bronze + +/obj/item/clothing/gloves/ring/glass + material = /decl/material/solid/glass + +/obj/item/clothing/gloves/ring/random/Initialize(ml, material_key) + material_key = pick(global.random_jewellery_material_types) + decorations = list(pick(global.random_jewellery_gem_types)) + . = ..() diff --git a/code/modules/clothing/gloves/jewelry/rings/material.dm b/code/modules/clothing/gloves/jewelry/rings/material.dm deleted file mode 100644 index 1f4492cffc2..00000000000 --- a/code/modules/clothing/gloves/jewelry/rings/material.dm +++ /dev/null @@ -1,24 +0,0 @@ -///////////////////////////////////////// -//Material Rings -//TODO: Repath to /obj/item/clothing/gloves/ring/crafted? -//Also, maybe move can_inscribe = TRUE down to the base ring? -/obj/item/clothing/gloves/ring/material - material_alteration = MAT_FLAG_ALTERATION_ALL - can_inscribe = TRUE - -/obj/item/clothing/gloves/ring/material/wood - material = /decl/material/solid/organic/wood/walnut -/obj/item/clothing/gloves/ring/material/plastic - material = /decl/material/solid/organic/plastic -/obj/item/clothing/gloves/ring/material/steel - material = /decl/material/solid/metal/steel -/obj/item/clothing/gloves/ring/material/silver - material = /decl/material/solid/metal/silver -/obj/item/clothing/gloves/ring/material/gold - material = /decl/material/solid/metal/gold -/obj/item/clothing/gloves/ring/material/platinum - material = /decl/material/solid/metal/platinum -/obj/item/clothing/gloves/ring/material/bronze - material = /decl/material/solid/metal/bronze -/obj/item/clothing/gloves/ring/material/glass - material = /decl/material/solid/glass diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_aura.dm b/code/modules/clothing/gloves/jewelry/rings/ring_aura.dm new file mode 100644 index 00000000000..2a6c167d7fe --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_aura.dm @@ -0,0 +1,29 @@ +/obj/item/clothing/gloves/ring/aura_ring + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi' + can_inscribe = FALSE + material = /decl/material/solid/metal/silver + abstract_type = /obj/item/clothing/gloves/ring/aura_ring + material_alteration = MAT_FLAG_ALTERATION_COLOR + var/obj/aura/granted_aura + +/obj/item/clothing/gloves/ring/aura_ring/update_name() + return + +/obj/item/clothing/gloves/ring/aura_ring/Initialize() + if(ispath(granted_aura)) + granted_aura = new granted_aura + . = ..() + +/obj/item/clothing/gloves/ring/aura_ring/Destroy() + QDEL_NULL(granted_aura) + . = ..() + +/obj/item/clothing/gloves/ring/aura_ring/equipped(var/mob/living/L, var/slot) + ..() + if(istype(granted_aura) && slot == slot_gloves_str) + L.add_aura(granted_aura) + +/obj/item/clothing/gloves/ring/aura_ring/dropped(var/mob/living/L) + ..() + if(istype(granted_aura)) + L.remove_aura(granted_aura) diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_misc.dm b/code/modules/clothing/gloves/jewelry/rings/ring_misc.dm new file mode 100644 index 00000000000..7660a833859 --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_misc.dm @@ -0,0 +1,24 @@ +///////////////////////////////////////// +//Standard Rings +/obj/item/clothing/gloves/ring/engagement + name = "engagement ring" + desc = "An engagement ring. It certainly looks expensive." + material = /decl/material/solid/metal/silver + decorations = list(/obj/item/gemstone/round) + +/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user) + user.visible_message(SPAN_WARNING("\The [user] gets down on one knee, presenting \the [src]."), SPAN_WARNING("You get down on one knee, presenting \the [src].")) + +/obj/item/clothing/gloves/ring/cti + name = "\improper CTI ring" + desc = "A ring commemorating graduation from CTI." + material = /decl/material/solid/metal/silver + decorations = list(/obj/item/gemstone/round/sapphire) + use_material_name = FALSE + +/obj/item/clothing/gloves/ring/mariner + name = "\improper Mariner University ring" + desc = "A ring commemorating graduation from Mariner University." + material = /decl/material/solid/metal/gold + decorations = list(/obj/item/gemstone/round/ruby) + use_material_name = FALSE diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm b/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm new file mode 100644 index 00000000000..c1941779748 --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm @@ -0,0 +1,37 @@ +///////////////////////////////////////// +//Reagent Rings +/obj/item/clothing/gloves/ring/reagent + atom_flags = ATOM_FLAG_OPEN_CONTAINER + origin_tech = @'{"materials":2,"esoteric":4}' + var/tmp/volume = 15 + +/obj/item/clothing/gloves/ring/reagent/Initialize(ml, material_key) + . = ..() + initialize_reagents() + +/obj/item/clothing/gloves/ring/reagent/initialize_reagents(populate = TRUE) + if(!reagents) + create_reagents(volume) + else + reagents.maximum_volume = max(volume, reagents.maximum_volume) + . = ..() + +/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/human/H) + ..() + if(istype(H) && H.get_equipped_item(slot_gloves_str) == src) + to_chat(H, SPAN_DANGER("You feel a prick as you slip on the ring.")) + + if(reagents.total_volume) + if(H.reagents) + var/contained_reagents = reagents.get_reagents() + var/trans = reagents.trans_to_mob(H, reagents.total_volume, CHEM_INJECT) + admin_inject_log(usr, H, src, contained_reagents, trans) + return + +//Sleepy Ring +/obj/item/clothing/gloves/ring/reagent/sleepy + origin_tech = @'{"materials":2,"esoteric":5}' + +/obj/item/clothing/gloves/ring/reagent/sleepy/populate_reagents() + add_to_reagents(/decl/material/liquid/paralytics, 10) + add_to_reagents(/decl/material/liquid/sedatives, 5) diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_seal.dm b/code/modules/clothing/gloves/jewelry/rings/ring_seal.dm new file mode 100644 index 00000000000..9ba92ac5659 --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_seal.dm @@ -0,0 +1,42 @@ +///////////////////////////////////////// +//Seals and Signet Rings +/obj/item/clothing/gloves/ring/seal + name = "signet ring" + desc = "A ring with a heavy setting for pressing into hot wax to seal letters." + icon = 'icons/clothing/accessories/jewelry/rings/ring_seal.dmi' + material = /decl/material/solid/metal/silver + +/obj/item/clothing/gloves/ring/seal/Initialize() + . = ..() + set_extension(src, /datum/extension/tool, list(TOOL_STAMP = TOOL_QUALITY_DEFAULT)) + +/obj/item/clothing/gloves/ring/seal/secretary + name = "\improper Secretary-General's official seal" + desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring." + use_material_name = FALSE + +/obj/item/clothing/gloves/ring/seal/mason + name = "masonic ring" + desc = "The Square and Compasses feature prominently on this Masonic ring." + icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi' + material = /decl/material/solid/metal/brass + use_material_name = FALSE + +/obj/item/clothing/gloves/ring/seal/signet + name = "signet ring" + desc = "A signet ring, for when you're too sophisticated to sign letters." + icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi' + use_material_name = FALSE + var/name_set = FALSE + +/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user) + if(!user.check_intent(I_FLAG_HELP)) + return ..() + if(name_set) + to_chat(user, SPAN_NOTICE("\The [src] has already been claimed!")) + else + name_set = TRUE + to_chat(user, SPAN_NOTICE("You claim \the [src] as your own!")) + base_name = "\the [user]'s signet ring" + desc = "A signet ring belonging to [user], for when they're too sophisticated to sign letters." + return TRUE diff --git a/code/modules/clothing/gloves/jewelry/rings/rings.dm b/code/modules/clothing/gloves/jewelry/rings/rings.dm deleted file mode 100644 index b0d78e0d7fa..00000000000 --- a/code/modules/clothing/gloves/jewelry/rings/rings.dm +++ /dev/null @@ -1,118 +0,0 @@ -///////////////////////////////////////// -//Standard Rings -/obj/item/clothing/gloves/ring/engagement - name = "engagement ring" - desc = "An engagement ring. It certainly looks expensive." - icon = 'icons/clothing/accessories/jewelry/rings/ring_diamond.dmi' - material = /decl/material/solid/metal/silver - -/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user) - user.visible_message(SPAN_WARNING("\The [user] gets down on one knee, presenting \the [src]."), SPAN_WARNING("You get down on one knee, presenting \the [src].")) - -/obj/item/clothing/gloves/ring/cti - name = "CTI ring" - desc = "A ring commemorating graduation from CTI." - icon = 'icons/clothing/accessories/jewelry/rings/ring_cti.dmi' - material = /decl/material/solid/metal/silver - -/obj/item/clothing/gloves/ring/mariner - name = "Mariner University ring" - desc = "A ring commemorating graduation from Mariner University." - material = /decl/material/solid/metal/gold - icon = 'icons/clothing/accessories/jewelry/rings/ring_mariner.dmi' - -///////////////////////////////////////// -//Magic Rings - -/obj/item/clothing/gloves/ring/magic - name = "magic ring" - desc = "A strange ring with symbols carved on it in some arcane language." - icon = 'icons/clothing/accessories/jewelry/rings/ring_magic.dmi' - material = /decl/material/solid/metal/gold - -/obj/item/clothing/gloves/ring/magic/equipped(var/mob/living/human/H, var/slot) - ..() - if(istype(H) && slot == SLOT_HANDS) - H.add_cloaking_source(src) - -/obj/item/clothing/gloves/ring/magic/dropped(var/mob/living/human/H) - if(!..()) - return 0 - - if(istype(H)) - H.remove_cloaking_source(src) - -///////////////////////////////////////// -//Reagent Rings - -/obj/item/clothing/gloves/ring/reagent - atom_flags = ATOM_FLAG_OPEN_CONTAINER - origin_tech = @'{"materials":2,"esoteric":4}' - var/tmp/volume = 15 - -/obj/item/clothing/gloves/ring/reagent/Initialize(ml, material_key) - . = ..() - initialize_reagents() - -/obj/item/clothing/gloves/ring/reagent/initialize_reagents(populate = TRUE) - if(!reagents) - create_reagents(volume) - else - reagents.maximum_volume = max(volume, reagents.maximum_volume) - . = ..() - -/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/human/H) - ..() - if(istype(H) && H.get_equipped_item(slot_gloves_str) == src) - to_chat(H, SPAN_DANGER("You feel a prick as you slip on the ring.")) - - if(reagents.total_volume) - if(H.reagents) - var/contained_reagents = reagents.get_reagents() - var/trans = reagents.trans_to_mob(H, reagents.total_volume, CHEM_INJECT) - admin_inject_log(usr, H, src, contained_reagents, trans) - return - -//Sleepy Ring -/obj/item/clothing/gloves/ring/reagent/sleepy - name = "silver ring" - desc = "A ring made from what appears to be silver." - origin_tech = @'{"materials":2,"esoteric":5}' - -/obj/item/clothing/gloves/ring/reagent/sleepy/populate_reagents() - add_to_reagents(/decl/material/liquid/paralytics, 10) - add_to_reagents(/decl/material/liquid/sedatives, 5) - -///////////////////////////////////////// -//Seals and Signet Rings -/obj/item/clothing/gloves/ring/seal - name = "Secretary-General's official seal" - desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring." - icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi' - material = /decl/material/solid/metal/silver - -/obj/item/clothing/gloves/ring/seal/Initialize() - . = ..() - set_extension(src, /datum/extension/tool, list(TOOL_STAMP = TOOL_QUALITY_DEFAULT)) - -/obj/item/clothing/gloves/ring/seal/mason - name = "masonic ring" - desc = "The Square and Compasses feature prominently on this Masonic ring." - icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi' - material = /decl/material/solid/metal/brass - -/obj/item/clothing/gloves/ring/seal/signet - name = "signet ring" - desc = "A signet ring, for when you're too sophisticated to sign letters." - icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi' - var/nameset = 0 - -/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user) - if(nameset) - to_chat(user, SPAN_NOTICE("\The [src] has already been claimed!")) - return - - nameset = 1 - to_chat(user, SPAN_NOTICE("You claim \the [src] as your own!")) - name = "[user]'s signet ring" - desc = "A signet ring belonging to [user], for when you're too sophisticated to sign letters." diff --git a/code/modules/clothing/neck/jewelry.dm b/code/modules/clothing/neck/jewelry.dm deleted file mode 100644 index 8e2a3b326f2..00000000000 --- a/code/modules/clothing/neck/jewelry.dm +++ /dev/null @@ -1,74 +0,0 @@ -/obj/item/clothing/neck/necklace - name = "necklace" - desc = "A simple necklace." - icon = 'icons/clothing/accessories/jewelry/necklace.dmi' - material = /decl/material/solid/metal/silver - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - -/obj/item/clothing/neck/necklace/prayer_beads - name = "prayer beads" - desc = "A string of smooth, polished beads." - icon = 'icons/clothing/accessories/jewelry/prayer_beads.dmi' - gender = PLURAL - material = /decl/material/solid/organic/wood/ebony - -/obj/item/clothing/neck/necklace/prayer_beads/bone - material = /decl/material/solid/organic/bone - -/obj/item/clothing/neck/necklace/prayer_beads/gold - material = /decl/material/solid/metal/gold - -/obj/item/clothing/neck/necklace/prayer_beads/basalt - material = /decl/material/solid/stone/basalt - -/obj/item/clothing/neck/necklace/prayer_beads/random - var/list/random_materials = list( - /decl/material/solid/organic/bone, - /decl/material/solid/stone/marble, - /decl/material/solid/stone/basalt, - /decl/material/solid/organic/wood/mahogany, - /decl/material/solid/organic/wood/ebony - ) - -/obj/item/clothing/neck/necklace/prayer_beads/random/Initialize() - material = pick(random_materials) - return ..() - -/obj/item/clothing/neck/necklace/locket - name = "locket" - desc = "A locket that seems to have space for a photo within." - icon = 'icons/clothing/accessories/jewelry/locket.dmi' - var/open - var/obj/item/held - -/obj/item/clothing/neck/necklace/locket/attack_self(mob/user) - if(!("[get_world_inventory_state()]-open" in icon_states(icon))) - to_chat(user, SPAN_WARNING("\The [src] doesn't seem to open.")) - return TRUE - open = !open - to_chat(user, SPAN_NOTICE("You flip \the [src] [open ? "open" : "closed"].")) - if(open && held) - to_chat(user, SPAN_DANGER("\The [held] falls out!")) - held.dropInto(user.loc) - held = null - update_icon() - return TRUE - -/obj/item/clothing/neck/necklace/locket/on_update_icon() - . = ..() - icon_state = get_world_inventory_state() - if(open && check_state_in_icon("[icon_state]-open", icon)) - icon_state = "[icon_state]-open" - -/obj/item/clothing/neck/necklace/locket/attackby(var/obj/item/O, mob/user) - if(!open) - to_chat(user, SPAN_WARNING("You have to open it first.")) - return TRUE - if(istype(O,/obj/item/paper) || istype(O, /obj/item/photo)) - if(held) - to_chat(usr, SPAN_WARNING("\The [src] already has something inside it.")) - else if(user.try_unequip(O, src)) - to_chat(usr, SPAN_NOTICE("You slip \the [O] into \the [src].")) - held = O - return TRUE - return ..() diff --git a/code/modules/clothing/neck/necklace/__necklace.dm b/code/modules/clothing/neck/necklace/__necklace.dm new file mode 100644 index 00000000000..a6e680313b6 --- /dev/null +++ b/code/modules/clothing/neck/necklace/__necklace.dm @@ -0,0 +1,97 @@ +/obj/item/clothing/neck/necklace + name = "necklace" + desc = "A fine chain worn around the neck." + icon = 'icons/clothing/accessories/jewelry/necklace.dmi' + material = /decl/material/solid/metal/silver + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + var/obj/item/pendant/pendant + +/obj/item/clothing/neck/necklace/Initialize() + . = ..() + if(ispath(pendant)) + set_pendant(new pendant(src, material?.type)) + +/obj/item/clothing/neck/necklace/Destroy() + set_pendant(null) + return ..() + +/obj/item/clothing/neck/necklace/proc/set_pendant(obj/item/new_pendant) + if(pendant == new_pendant) + return FALSE + pendant = new_pendant + update_icon() + return TRUE + +/obj/item/clothing/neck/necklace/examine(mob/user) + . = ..() + if(istype(pendant)) + to_chat(user, "There is \a [pendant] attached.") + +/obj/item/clothing/neck/necklace/on_update_icon() + . = ..() + if(istype(pendant)) + var/list/pendant_overlays = pendant.get_pendant_overlays(icon_state) + if(length(pendant_overlays)) + add_overlay(pendant_overlays) + +/obj/item/clothing/neck/necklace/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay && istype(pendant)) + var/pendant_overlays = pendant.get_pendant_overlays(overlay.icon_state) + if(pendant_overlays) + overlay.overlays += pendant_overlays + return ..() + +/obj/item/clothing/neck/necklace/attack_self(mob/user) + if(pendant?.attack_self(user)) + return TRUE + return ..() + +/obj/item/clothing/neck/necklace/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/pendant)) + if(istype(pendant)) + to_chat(user, SPAN_WARNING("\The [src] doesn't have room for \the [used_item].")) + else if(user.try_unequip(used_item, src)) + set_pendant(used_item) + update_icon() + to_chat(user, SPAN_NOTICE("You attach \the [pendant] to \the [src].")) + return TRUE + if(pendant?.attackby(used_item, user)) + return TRUE + return ..() + +/obj/item/clothing/neck/necklace/get_alt_interactions(mob/user) + . = ..() + if(istype(pendant)) + LAZYADD(., /decl/interaction_handler/remove_pendant) + +/decl/interaction_handler/remove_pendant + name = "Remove Pendant" + expected_target_type = /obj/item/clothing/neck/necklace + +/decl/interaction_handler/remove_pendant/invoked(atom/target, mob/user, obj/item/prop) + var/obj/item/clothing/neck/necklace/necklace = target + if(!necklace.pendant) + return FALSE + necklace.pendant.dropInto(user.loc) + user.put_in_hands(necklace.pendant) + necklace.set_pendant(null) + return TRUE + +// Loadout subtypes. +/obj/item/clothing/neck/necklace/prism + pendant = /obj/item/pendant/prism + +/obj/item/clothing/neck/necklace/frill + pendant = /obj/item/pendant/frill + +/obj/item/clothing/neck/necklace/square + pendant = /obj/item/pendant/setting/square + +/obj/item/clothing/neck/necklace/cross + pendant = /obj/item/pendant/setting/cross + +/obj/item/clothing/neck/necklace/diamond + pendant = /obj/item/pendant/setting/diamond + +/obj/item/clothing/neck/necklace/ornate + pendant = /obj/item/pendant/setting/ornate diff --git a/code/modules/clothing/neck/necklace/_pendant.dm b/code/modules/clothing/neck/necklace/_pendant.dm new file mode 100644 index 00000000000..d29a9e6af27 --- /dev/null +++ b/code/modules/clothing/neck/necklace/_pendant.dm @@ -0,0 +1,51 @@ +/obj/item/pendant + name = "pendant" + desc = "A simple pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/square.dmi' + abstract_type = /obj/item/pendant + material = /decl/material/solid/metal/silver + material_alteration = MAT_FLAG_ALTERATION_COLOR // We do manual name/desc handling for the gem. + +// I swear we had a proc for this on /obj/item? +/obj/item/pendant/set_material(new_material) + . = ..() + if(material) + desc = "[desc] This one is made of [material.solid_name]." + +/obj/item/pendant/update_name() + var/list/name_comp = get_name_components() + if(length(name_comp)) + SetName(jointext(name_comp, " ")) + +/obj/item/pendant/proc/get_name_components() + . = list() + if(name_prefix) + . += name_prefix + if(material) + . += material.adjective_name + . += base_name || initial(name) + +/obj/item/pendant/proc/get_pendant_base_state(base_state) + return base_state + +/obj/item/pendant/proc/get_pendant_overlays(base_state) + base_state = get_pendant_base_state(base_state) + var/list/overlay_states = list((base_state) = get_color()) + for(var/decl/item_decoration/decoration as anything in decorations) + overlay_states["[base_state]-[decoration.icon_state_modifier]"] = decoration.resolve_color(src) + . = list() + for(var/overlay_state in overlay_states) + if(check_state_in_icon(overlay_state, icon)) + . += overlay_image(icon, overlay_state, overlay_states[overlay_state], RESET_COLOR) + +// Subtypes below. +/obj/item/pendant/prism + name = "prism" + desc = "A large prism-shaped pendant that hangs from a clasp." + icon = 'icons/clothing/accessories/jewelry/pendants/crystal.dmi' + material = /decl/material/solid/gemstone/diamond + +/obj/item/pendant/frill + name = "chain frill" + icon = 'icons/clothing/accessories/jewelry/pendants/frill.dmi' + desc = "A set of fine chain frills." diff --git a/code/modules/clothing/neck/necklace/necklaces.dm b/code/modules/clothing/neck/necklace/necklaces.dm new file mode 100644 index 00000000000..1cc8ef598c2 --- /dev/null +++ b/code/modules/clothing/neck/necklace/necklaces.dm @@ -0,0 +1,15 @@ +// Subtypes for mapping etc. +/obj/item/clothing/neck/necklace/locket + pendant = /obj/item/pendant/locket + +/obj/item/clothing/neck/necklace/random/Initialize(ml, material_key) + material_key = pick(global.random_jewellery_material_types) + pendant = pick(list( + /obj/item/pendant/setting/cross/random, + /obj/item/pendant/setting/square/random, + /obj/item/pendant/setting/diamond/random, + /obj/item/pendant/setting/ornate/random, + /obj/item/pendant/prism/random, + /obj/item/pendant/frill/random + )) + return ..() diff --git a/code/modules/clothing/neck/necklace/pendant_locket.dm b/code/modules/clothing/neck/necklace/pendant_locket.dm new file mode 100644 index 00000000000..b0944c9c000 --- /dev/null +++ b/code/modules/clothing/neck/necklace/pendant_locket.dm @@ -0,0 +1,50 @@ +/obj/item/pendant/locket + name = "locket" + desc = "A locket that seems to have space for a photo within." + icon = 'icons/clothing/accessories/jewelry/pendants/locket.dmi' + var/open + var/obj/item/held + +/obj/item/pendant/locket/attack_self(mob/user) + if(!("[get_world_inventory_state()]-open" in icon_states(icon))) + to_chat(user, SPAN_WARNING("\The [src] doesn't seem to open.")) + return TRUE + open = !open + to_chat(user, SPAN_NOTICE("You flip \the [src] [open ? "open" : "closed"].")) + if(open && held) + to_chat(user, SPAN_DANGER("\The [held] falls out!")) + held.dropInto(user.loc) + held = null + update_icon() + return TRUE + +/obj/item/pendant/locket/on_update_icon() + . = ..() + icon_state = get_pendant_base_state(get_world_inventory_state()) + if(istype(loc, /obj/item)) + loc.update_icon() + +/obj/item/pendant/locket/get_pendant_base_state(base_state) + . = ..() + if(open) + . = "[.]-open" + +/obj/item/pendant/locket/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay && open) + var/pendant_state = get_pendant_base_state(overlay.icon_state) + if(check_state_in_icon(pendant_state, overlay.icon)) + overlay.icon_state = pendant_state + return ..() + +/obj/item/pendant/locket/attackby(obj/item/used_item, mob/user) + if(!open) + to_chat(user, SPAN_WARNING("You have to open it first.")) + return TRUE + if(istype(used_item, /obj/item/paper) || istype(used_item, /obj/item/photo)) + if(held) + to_chat(usr, SPAN_WARNING("\The [src] already has something inside it.")) + else if(user.try_unequip(used_item, src)) + to_chat(usr, SPAN_NOTICE("You slip \the [used_item] into \the [src].")) + held = used_item + return TRUE + return ..() \ No newline at end of file diff --git a/code/modules/clothing/neck/necklace/pendant_random.dm b/code/modules/clothing/neck/necklace/pendant_random.dm new file mode 100644 index 00000000000..f17171032c6 --- /dev/null +++ b/code/modules/clothing/neck/necklace/pendant_random.dm @@ -0,0 +1,27 @@ +/obj/item/pendant/prism/random/Initialize(ml, material_key) + material_key = list(global.random_jewellery_gem_types) + . = ..() + +/obj/item/pendant/frill/random/Initialize(ml, material_key) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/square/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/cross/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/diamond/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/ornate/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() diff --git a/code/modules/clothing/neck/necklace/pendant_setting.dm b/code/modules/clothing/neck/necklace/pendant_setting.dm new file mode 100644 index 00000000000..80e79b13cf2 --- /dev/null +++ b/code/modules/clothing/neck/necklace/pendant_setting.dm @@ -0,0 +1,36 @@ +// Pendant with a setting for a stone. +/obj/item/pendant/setting + abstract_type = /obj/item/pendant/setting + +// Duplicating some logic here to consistently insert the gem name where appropriate. +/obj/item/pendant/setting/get_name_components() + . = list() + if(name_prefix) + . += name_prefix + if(material) + . += material.adjective_name + var/obj/item/gemstone/gem = locate() in contents + if(gem) + . += gem.name + . += name // base_name has already been applied by parent call + +// Subtypes below. +/obj/item/pendant/setting/square + name_prefix = "square" + desc = "A square-shaped pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/square.dmi' + +/obj/item/pendant/setting/cross + name = "cross" + desc = "A hard-edged cross pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/cross.dmi' + +/obj/item/pendant/setting/diamond + name_prefix = "diamond" + desc = "A diamond-shaped pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/diamond.dmi' + +/obj/item/pendant/setting/ornate + name_prefix = "ornate" + desc = "An ornate set of pendants." + icon = 'icons/clothing/accessories/jewelry/pendants/ornate.dmi' diff --git a/code/modules/clothing/neck/prayer_beads.dm b/code/modules/clothing/neck/prayer_beads.dm new file mode 100644 index 00000000000..0c081e35108 --- /dev/null +++ b/code/modules/clothing/neck/prayer_beads.dm @@ -0,0 +1,29 @@ +/obj/item/clothing/neck/prayer_beads + name = "prayer beads" + desc = "A string of smooth, polished beads." + icon = 'icons/clothing/accessories/jewelry/prayer_beads.dmi' + gender = PLURAL + material = /decl/material/solid/organic/wood/ebony + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/item/clothing/neck/prayer_beads/gold + material = /decl/material/solid/metal/gold + +/obj/item/clothing/neck/prayer_beads/basalt + material = /decl/material/solid/stone/basalt + +/obj/item/clothing/neck/prayer_beads/bone + material = /decl/material/solid/organic/bone + +/obj/item/clothing/neck/prayer_beads/random + var/list/random_materials = list( + /decl/material/solid/organic/bone, + /decl/material/solid/stone/marble, + /decl/material/solid/stone/basalt, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/ebony + ) + +/obj/item/clothing/neck/prayer_beads/random/Initialize() + material = pick(random_materials) + return ..() diff --git a/code/modules/crafting/stack_recipes/recipes_hardness.dm b/code/modules/crafting/stack_recipes/recipes_hardness.dm index a656ebc868e..903769244d6 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness.dm @@ -75,7 +75,19 @@ result_type = /obj/item/chems/glass/mortar /decl/stack_recipe/ring - result_type = /obj/item/clothing/gloves/ring/material + result_type = /obj/item/clothing/gloves/ring + +/decl/stack_recipe/ring_thin + name = "ring, thin" + result_type = /obj/item/clothing/gloves/ring/thin + +/decl/stack_recipe/ring_thick + name = "ring, thick" + result_type = /obj/item/clothing/gloves/ring/thick + +/decl/stack_recipe/ring_split + name = "ring, split" + result_type = /obj/item/clothing/gloves/ring/split /decl/stack_recipe/hardness/clipboard result_type = /obj/item/clipboard diff --git a/code/modules/decoration/_decoration.dm b/code/modules/decoration/_decoration.dm new file mode 100644 index 00000000000..0228f99654b --- /dev/null +++ b/code/modules/decoration/_decoration.dm @@ -0,0 +1,104 @@ +// Should return a linear list of /decl/item_decoration types that can apply to the target items. +/proc/get_decoration_types_for(mob/user, obj/item/target_item, obj/item/used_item) + // TODO: consider caching this somewhere? + for(var/decl/item_decoration/decoration as anything in decls_repository.get_decls_of_subtype_unassociated(/decl/item_decoration)) + if(decoration in target_item.decorations) + continue + if(!decoration.can_apply_to(user, target_item, used_item)) + continue + LAZYADD(., decoration) + +// Decl types for decorations below. +/decl/item_decoration + abstract_type = /decl/item_decoration + /// A descriptive named used to select this decoration. + var/name + /// State used when searching item icon files for world/inventory/onmob states to draw. + var/icon_state_modifier + /// A list of types that this decoration can be applied to. Must contain at least one entry. + var/list/can_decorate_types + /// A list of types that can be used to apply this decoration. Must contain at least one entry. + var/list/can_decorate_with_types + /// String used to describe this action. + var/decoration_verb = "decorate" + /// String used to describe this action while underway. + var/decoration_action = "decorating" + /// What skill to use when applying this decoration. If null, defaults to the material. + var/work_skill + /// How long this work should take. + var/work_time = 10 SECONDS + /// Factor value supplied to do_skilled() + var/work_factor = 1 + /// Additional monetary worth for the item, as a percentage of the base item value (ie. 0.1 = +10%) + var/decoration_worth_factor = 0.1 + +/decl/item_decoration/validate() + . = ..() + if(!istext(name)) + . += "null or invalid name" + if(!istext(icon_state_modifier)) + . += "null or invalid icon_state_modifier" + if(!length(can_decorate_types)) + . += "no types in can_decorate_types" + if(!length(can_decorate_with_types)) + . += "no types in can_decorate_with_types" + +/decl/item_decoration/proc/can_apply_to(mob/user, obj/item/thing, obj/item/decorating_with) + if(!istype(thing) || !is_type_in_list(thing, can_decorate_types)) + return FALSE + if(!istype(decorating_with) || !is_type_in_list(decorating_with, can_decorate_with_types)) + return FALSE + return TRUE + +/decl/item_decoration/proc/show_work_start_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] begins [decoration_action] \the [thing] with \the [decorating_with].")) + +/decl/item_decoration/proc/show_work_end_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] finishes [decoration_action] \the [thing] with \the [decorating_with].")) + +/decl/item_decoration/proc/apply_to_item(mob/user, obj/item/thing, obj/item/decorating_with) + var/stack_use = 0 + if(istype(decorating_with, /obj/item/stack)) + var/obj/item/stack/stack = decorating_with + for(var/stack_type in can_decorate_with_types) + if(istype(stack, stack_type)) + stack_use = can_decorate_with_types[stack_type] + break + if(stack.get_amount() < stack_use) + to_chat(user, SPAN_WARNING("You need at least [stack_use] [stack_use == 1 ? stack.singular_name : stack.plural_name] to [decoration_verb] \the [thing].")) + return FALSE + show_work_start_message(user, thing, decorating_with) + if(work_time && work_skill) + if(!user.do_skilled(work_time, work_skill, thing, work_factor)) + return FALSE + if(!QDELETED(user) || QDELETED(thing) || QDELETED(decorating_with) || user.get_active_held_item() != decorating_with) + return FALSE + if(stack_use && istype(decorating_with, /obj/item/stack)) + var/obj/item/stack/stack = decorating_with + if(!stack.use(stack_use)) + return FALSE + else if(!user.try_unequip(decorating_with, thing, FALSE)) + return FALSE + show_work_end_message(user, thing, decorating_with) + return TRUE + +// This will need work down the track. Value will be added by the decorations +// in matter[] but the value of the labour isn't reflected. Needs thought. +/decl/item_decoration/proc/get_decoration_value(obj/item/thing, base_value) + return max(1, round(base_value * decoration_worth_factor)) + +/decl/item_decoration/proc/attempt_removal(mob/user, obj/item/target_item, obj/item/used_item) + return FALSE + +/decl/item_decoration/proc/resolve_color(obj/item/thing) + var/list/decoration_data = LAZYACCESS(thing.decorations, src) + if(islist(decoration_data) && length(decoration_data)) + var/obj/item/decoration_object = decoration_data["object"] + if(istype(decoration_object) && decoration_object.paint_color) + return decoration_object.paint_color + var/decl/material/decoration_material = decoration_data["material"] + if(istype(decoration_material)) + return decoration_material.color + if(istype(decoration_object)) + return decoration_object.color + return COLOR_WHITE diff --git a/code/modules/decoration/decoration_item.dm b/code/modules/decoration/decoration_item.dm new file mode 100644 index 00000000000..ae628cf68bf --- /dev/null +++ b/code/modules/decoration/decoration_item.dm @@ -0,0 +1,103 @@ +/obj/item + /// Assoc list of decoration instances to metadata, ie. + /// decorations[GET_DECL(/decl/item_decoration/inset)] = list("color" = COLOR_RED, "material" = GET_DECL(/decl/material/foo)) + var/list/decorations + +/obj/item/proc/add_item_decoration(decl/item_decoration/decoration_type, decoration_color, decl/material/decoration_material, obj/item/associated_object) + LAZYINITLIST(decorations) + if(ispath(decoration_type)) + decoration_type = GET_DECL(decoration_type) + if(!istype(decoration_type)) + CRASH("Invalid decoration_type.") + . = list() + if(decoration_color) + // TODO: validate color? + .["color"] = decoration_color + if(decoration_material) + if(ispath(decoration_material)) + decoration_material = GET_DECL(decoration_material) + if(istype(decoration_material)) + .["material"] = decoration_material + if(!associated_object) // Object holds matter, no need to add it to parent. + var/decoration_matter_amount = MATTER_AMOUNT_TRACE * get_matter_amount_modifier() + if(decoration_material.type in matter) + matter[decoration_material.type] += decoration_matter_amount + else + LAZYSET(matter, decoration_material.type, decoration_matter_amount) + else + PRINT_STACK_TRACE("Invalid decoration_material.") + if(associated_object) + .["object"] = associated_object + decorations[decoration_type] = . + queue_icon_update() + update_name() + +/obj/item/proc/get_decoration_icon(default_icon, obj/item/thing, on_mob = FALSE) + return default_icon || icon + +/obj/item/proc/get_decoration_overlays(decoration_state, decoration_icon, on_mob = FALSE) + for(var/decl/item_decoration/decoration as anything in decorations) + var/list/decoration_metadata = decorations[decoration] + if(!islist(decoration_metadata)) + continue + var/obj/item/decoration_object = decoration_metadata["object"] + if(decoration_object) + decoration_icon = get_decoration_icon(decoration_icon, decoration_object, on_mob) + if(!decoration_icon) + continue + decoration_state = "[decoration_state]-[decoration.icon_state_modifier]" + if(check_state_in_icon(decoration_state, decoration_icon)) + LAZYADD(., overlay_image(decoration_icon, decoration_state, decoration.resolve_color(src), RESET_COLOR|RESET_ALPHA)) + +/obj/item/attackby(obj/item/used_item, mob/user) + . = ..() + if(.) + return + + if(user.check_intent(I_FLAG_HELP)) + var/list/possible_decorations = get_decoration_types_for(user, src, used_item) + if(!length(possible_decorations)) + return FALSE + var/decl/item_decoration/decoration + if(length(possible_decorations) == 1) + decoration = possible_decorations[1] + else + decoration = input(user, "Which decoration would you like to apply?", "Item Decoration") as null|anything in possible_decorations + if(!decoration || QDELETED(src) || QDELETED(user) || QDELETED(used_item) || !CanPhysicallyInteract(user) || user.get_active_held_item() != used_item) + return TRUE + if(istype(decoration) && decoration.apply_to_item(user, src, used_item)) + add_item_decoration(decoration, used_item.paint_color, used_item.material, istype(used_item, /obj/item/stack) ? null : used_item) + return TRUE + + for(var/decl/item_decoration/decoration as anything in decorations) + if(decoration.attempt_removal(user, src, used_item)) + return TRUE + +/obj/item/get_single_monetary_worth() + . = ..() + var/base_value = . + for(var/decl/item_decoration/decoration as anything in decorations) + . += decoration.get_decoration_value(src, base_value) + +/obj/item/on_update_icon() + . = ..() + var/list/decoration_overlays = get_decoration_overlays(icon_state) + if(length(decoration_overlays)) + add_overlay(decoration_overlays) + +/obj/item/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay) + var/list/decoration_overlays = get_decoration_overlays(overlay.icon_state, overlay.icon, on_mob = TRUE) + if(length(decoration_overlays)) + overlay.overlays += decoration_overlays + return ..() + +// Except decorations from storage datums. +/obj/item/get_stored_inventory() + . = ..() + if(length(.) && length(decorations)) + for(var/decl/item_decoration/decoration in decorations) + var/list/decoration_data = decorations[decoration] + var/thing = decoration_data?["object"] + if(isitem(thing)) + . -= thing diff --git a/code/modules/decoration/decoration_setting.dm b/code/modules/decoration/decoration_setting.dm new file mode 100644 index 00000000000..352cb3bdc56 --- /dev/null +++ b/code/modules/decoration/decoration_setting.dm @@ -0,0 +1,30 @@ +/decl/item_decoration/setting + name = "set a gem" + icon_state_modifier = "setting" + can_decorate_types = list( + /obj/item/clothing/gloves/ring, + /obj/item/pendant/setting + ) + can_decorate_with_types = list( + /obj/item/gemstone + ) + +/decl/item_decoration/setting/attempt_removal(mob/user, obj/item/target_item, obj/item/used_item) + if(IS_SCREWDRIVER(used_item)) + var/list/decoration_data = target_item.decorations[src] + var/obj/item/removing = decoration_data?["object"] + if(istype(removing)) + user.visible_message(SPAN_DANGER("\The [user] levers \the [removing] out of \the [target_item] with \the [used_item]!")) + removing.dropInto(user.loc) + user.put_in_hands(removing) + LAZYREMOVE(target_item.decorations, src) + target_item.update_icon() + target_item.update_name() + return TRUE + return FALSE + +/decl/item_decoration/setting/show_work_start_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] begins carefully setting \the [decorating_with] into \the [thing].")) + +/decl/item_decoration/setting/show_work_end_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] finishes setting \the [decorating_with] into \the [thing].")) diff --git a/code/modules/gemstones/_gemstone.dm b/code/modules/gemstones/_gemstone.dm index 087266d34f8..d4e51499dd1 100644 --- a/code/modules/gemstones/_gemstone.dm +++ b/code/modules/gemstones/_gemstone.dm @@ -87,3 +87,41 @@ var/global/list/_available_gemstone_cuts name = "round-cut diamond" cut = /decl/gemstone_cut/round icon = 'icons/obj/items/gemstones/round.dmi' + + +// Material subtypes. +/obj/item/gemstone/baguette/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/baguette/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/baguette/ruby + material = /decl/material/solid/gemstone/ruby + +/obj/item/gemstone/hexagon/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/hexagon/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/hexagon/ruby + material = /decl/material/solid/gemstone/ruby + +/obj/item/gemstone/octagon/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/octagon/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/octagon/ruby + material = /decl/material/solid/gemstone/ruby + +/obj/item/gemstone/round/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/round/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/round/ruby + material = /decl/material/solid/gemstone/ruby diff --git a/code/modules/gemstones/gemstone_cuts.dm b/code/modules/gemstones/gemstone_cuts.dm index 86509cc2c17..4b8b15fb7d8 100644 --- a/code/modules/gemstones/gemstone_cuts.dm +++ b/code/modules/gemstones/gemstone_cuts.dm @@ -23,10 +23,11 @@ . += "missing world state from '[icon]'" if(!check_state_in_icon(ICON_STATE_INV, icon)) . += "missing inventory state from '[icon]'" - var/check_state = "[ICON_STATE_WORLD]-set" + var/decl/item_decoration/gem_set = GET_DECL(/decl/item_decoration/setting) + var/check_state = "[ICON_STATE_WORLD]-[gem_set.icon_state_modifier]" if(!check_state_in_icon(check_state, icon)) . += "missing state '[check_state]' from '[icon]'" - check_state = "[ICON_STATE_INV]-set" + check_state = "[ICON_STATE_INV]-[gem_set.icon_state_modifier]" if(!check_state_in_icon(check_state, icon)) . += "missing state '[check_state]' from '[icon]'" else diff --git a/code/modules/species/species_bodytype_offsets.dm b/code/modules/species/species_bodytype_offsets.dm index 6679500a3eb..e0090189112 100644 --- a/code/modules/species/species_bodytype_offsets.dm +++ b/code/modules/species/species_bodytype_offsets.dm @@ -32,7 +32,8 @@ The slots that you can use are found in items_clothing.dm and are the inventory // Check the cache for previously made icons. var/modifier = mob?.get_overlay_state_modifier() var/image_key = modifier ? "[modifier]-[mob_icon]-[mob_state]-[color]-[slot]" : "generic-[mob_icon]-[mob_state]-[color]-[slot]" - if(!equip_overlays[image_key]) + var/image/copying = equip_overlays[image_key] + if(!copying) var/icon/final_I = new(icon_template) var/list/shifts = use_equip_adjust[slot] @@ -44,9 +45,15 @@ The slots that you can use are found in items_clothing.dm and are the inventory var/icon/equip = new(mob_icon, icon_state = mob_state, dir = use_dir) var/icon/canvas = new(icon_template) canvas.Blend(equip, ICON_OVERLAY, facing_list[1]+1, facing_list[2]+1) - final_I.Insert(canvas, dir = use_dir) - equip_overlays[image_key] = overlay_image(final_I, color = color, flags = RESET_COLOR) + final_I.Insert(canvas, icon_state = mob_state, dir = use_dir) + copying = overlay_image(final_I, mob_state, color, RESET_COLOR) + equip_overlays[image_key] = copying + var/image/I = new() // We return a copy of the cached image, in case downstream procs mutate it. - I.appearance = equip_overlays[image_key] + I.appearance = copying + // For some reason icon_state is coming back null... + I.icon = copying.icon + I.icon_state = copying.icon_state return I + return overlay_image(mob_icon, mob_state, color, RESET_COLOR) diff --git a/icons/clothing/accessories/jewelry/locket.dmi b/icons/clothing/accessories/jewelry/locket.dmi deleted file mode 100644 index eeee8efe7eaa53c85c9abbaf09e8cffca0be376f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 837 zcmeAS@N?(olHy`uVBq!ia0vp^2|(k@;xciv6fE%yAOl6ptr zrQ1v1Br&+}zb(AlPn^5&^28aY@A6J-?Oc&`;Nq1TVs`~D>!lXRbljcvDeYw|xP(sEf|*!%19Q`KoZrKYB>|Mb}W`|O=Z4LE_uiSy@JExA!~vYvr~DaX^rF{EP7 z+gbK`j~rxLkFO39_?#^sJ&AQ8$Fa8)c zDO3b`{nfkupQm*Df)#HZX06z<;!uVe|GV2Q<_vS=kDZ_O_t+Iqj@MEi!cTeG7hmez z#4`7P{FI>V``_hTf2{addV8A|>ypl{^v??Gv!9gMT`LQbzVI_NW9|HAg%h{$Rq^<` zIr^?Lh+8MNRrab-Nu8#b=Icg>wG1Vqi$2F*{$i_;6OgF){_u;M^bkI0-ZYIJF}j~F z|CHckU!1Z1Zv4N$b3zrY?yJtP626!FJ#N;DA0>8er>`pQm-uJ7-l1e4ca*Oy(DH7s zKjl34qFEPx-hE_qtgxQkgogzNU3~fL7robHD%q!dZF1o=*B2kYX)T$u=>0>Wfz#ah zA6lI`njWdPN$2&VldDf{UpV>Yi<1>xdkaeT@y_MAk^B8#ij8QHm!YKp?u<{XKILwx z;}Evqp~MCbX9+F_%)mzy%v3$_{cn8e?3Z4q`4_q(cPbVMtNQbOr0>I i8p$?9`~w9)^SR&fmRij8&JCC^7(8A5T-G@yGywn%>2|;X diff --git a/icons/clothing/accessories/jewelry/necklace.dmi b/icons/clothing/accessories/jewelry/necklace.dmi index 23c9eee006315e05e061380876001fe48fe4c79f..2f5ca2d3cfb138501a6780b1fa14c3b62dd77afb 100644 GIT binary patch delta 475 zcmV<10VMwL1?dBj7=Hu<0000N8gD%S000kAOjJd{z`%-%p2ES&|NsAGVs`y6noR%z z00DGTPE!Ct=GbNc005VIR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSJb%9^Cq;>iGbOXA7|1u| z;!G<_%uR)`;i@w8%2M-6@{1}7s>~?OP0Y*BOi@V6PpQ-`&dD!{FHcP@iqB0f&PHf9 zLD8(N;OgfBc0B;-3_6Pfgg&YO008AlL_t(YiS3n94uc>JhKu6>iaWrZ9zewdF!lat zS_KjcPL!wlz<(FTkoLEKks!dosLI6rwnlXtJV!f$qRVPLMIFH?M^w^-cEh4ugI8pcu51mT^Q{rq z8!BYFoR2S;QjRJ?z*i(8KaYfvZiYHH!jsl8BM;-CoeyE8!IAGZftP*(Ix(>CMnas zF?xz?C%pK^E@T??pJ;uKn4hEnB|!==&$nzptd| zbY#Ey*9!?dW4I3Objm+af1DwKhv679aebfmJ^MR14R|i!&6{2uyKmnf*4n%$Gb-6R z4jbr}PUTj-bIwjjSkiu%!tc_mrBgP!2C~@KzMDPel3SokkKrNRt=H23?ki_dbW!WG z{wpl5HgThG%AIPK_F5DF$;;OJz=F9r!{J!g(YTO*{X8UJ5mp+`-U$Z>0VZRyI zu?KU0H(Ytl@&2!kftc^QrWS$Y+VgJKWSQSCtuo$uHq8Hg{C_SBCY!mn>U*lH_`G7D z&VFk(_v~`Bi60-Iye`8yFUsF_%C1x2l@+Wz4+uV3xq0V;pzwAM=R4dzuFEGEzH{pd zcl;+czvXpJvD32n0xPK=#sd-zXvCV&)(^cmN9Zire_jwZFcD$9mT8Ckk%|8fnQgh4 zrFX(sNzQem#4p3brBh6g@%-Bzn{6xkTuyL$5Z|{&MbP0l+XkKkA*xZ diff --git a/icons/clothing/accessories/jewelry/pendants/cross.dmi b/icons/clothing/accessories/jewelry/pendants/cross.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ca9d50a60f0b5ee90e14b9255b197a1f6a075b18 GIT binary patch literal 427 zcmV;c0aX5pP)BELUjND00DGTPE!Ct=GbNc0063bR9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Gp{T)uOz>yQi+Q*C9|j)C}zmTnO2mTn+jpWRhH)$<)jc)1vgK(IJKlCGcTPu zbBR`+QJR~Wm!FxUkd&VSv?C|KB)&W~u_!(_u{ax{*@Se>m@YsyL|MVr&jlRB09>JO zDllyiC;$Kekx4{BR9J=W*Fg${Fc5{|Sna;z1w`w<$Q(fM{&#X~CXzv>0nz{4B}|5w z2!@0J0EJcF21D;#{~CvUL9Hj+PuxJ}d;|HZiEr;r(8USPpMm$#^cE706<{;Dq~0D!BpUS+CcDU}1jlWmD< V2S1Z~MwS2o002ovPDHLkV1kL7u>Jr5 literal 0 HcmV?d00001 diff --git a/icons/clothing/accessories/jewelry/pendants/crystal.dmi b/icons/clothing/accessories/jewelry/pendants/crystal.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a54525da6ab160cdada3e1b98613aef69c83959a GIT binary patch literal 369 zcmV-%0gnEOP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Gp{T)uOz>yQi+Q*C9|j)C}zmTnO2mTn+jpWRhH)$<)jc)l~J0Tn3tcKqL7rI zQmI>BELUjND00DGTPE!Ct=GbNc0063bR9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Gp{T)uOz>yQi+Q*C9|j)C}zmTnO2mTn+jpWRhH)$<)jc)1vgK(IJKlCGcTPu zbBR`+QJR~Wm!FxUkd&VSv?C|KB)&W~u_!(_u{ax{*@Se>m@YsyL|MVr&jlRB09>JO zDllyiC;$Keok>JNR9J=W*Fg?~Fc5{|vEW|u0w&1bkU0RM7cg@FySSCX%*0d@1OK<9 zolYNw&>#W;D?5}nNTm%fCx5=O1LygIq`luj?`Gh3Elkjw246peCfG4#Z^5dA^(l{j zK^}qts&0f@HApZ${etP?&r9b95IF|x%U@jpo3Z%L`xW+B`Eb%KE8Z{i?-Kw3fPWMH hm6?iRtsDUM>;+492Y0z5tl|Iw002ovPDHLkV1nD!x3mBN literal 0 HcmV?d00001 diff --git a/icons/clothing/accessories/jewelry/pendants/frill.dmi b/icons/clothing/accessories/jewelry/pendants/frill.dmi new file mode 100644 index 0000000000000000000000000000000000000000..97891de4bc3bc06ed972b3cc2905d27fed821f98 GIT binary patch literal 383 zcmV-_0f7FAP)nwyxHpP8bNl%G z2`V@wwpHMeFfYI%!QFt$X97a3fJs3Ky9Be6GOBQ3j80tKg9q5002ovPDHLkV1iV-k@5fl literal 0 HcmV?d00001 diff --git a/icons/clothing/accessories/jewelry/pendants/locket.dmi b/icons/clothing/accessories/jewelry/pendants/locket.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e8f1bbee40b2fadb8f4da1eb8da25de538da0d01 GIT binary patch literal 462 zcmV;<0WtoGP)00DGTPE!Ct=GbNc0066cR9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Gp{T)uOz>yQi+Q*C9|j)C}zmTnO2mTn+jpWRhH)$<)jc)l~J0Tn3tcKqL7rI zQmI>jEdBnMhIHmZUg=PY(+msbt{anBy3jk*% zYew1;(4znV0JBL%K~z|U?UqprgD?<8E#v?iasb760nvY>?FHK2|1AEl5s90DDs7<_*~7l>Kg#=HGNo8S)n1J<6#x;NC{rtzJ> zGyyyVLdYMHuBycTkS+=*MF{b6x~gU={O$({Cm@876{Err)d)QRHUIzs07*qoM6N<$ Ef(q%uTmS$7 literal 0 HcmV?d00001 diff --git a/icons/clothing/accessories/jewelry/pendants/ornate.dmi b/icons/clothing/accessories/jewelry/pendants/ornate.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9e6901f4e2988cbd51d3f4b5b552456097f7ce8d GIT binary patch literal 585 zcmV-P0=E5$P)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Gp{T)uOz>yQi+Q*C9|j)C}zmTnO2mTn+jpWRhH)$<)jc)1vgK(IJKlCGcTPu zbBR`+QJR~Wm!FxUkd&VSv?C|KB)&W~u_!(_u{ax{*@Se>m@YsyL|MVr&jlRB09>JO zDllyiC;$KfFG)l}R9J=Wm(6m*AP~nFNbXehPHZ2bj`1GL?AMl00000NkvXXu0mjfir4{f literal 0 HcmV?d00001 diff --git a/icons/clothing/accessories/jewelry/pendants/square.dmi b/icons/clothing/accessories/jewelry/pendants/square.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5c9040c7baa83ef3dbf0260af6ccdc8c1c3c8107 GIT binary patch literal 435 zcmV;k0ZjghP)t<7!okUkik{L{0X_f#00DGTPE!Ct=GbNc0063bR9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Gp{T)uOz>yQi+Q*C9|j)C}zmTnO2mTn+jpWRhH)$<)jc)1vgK(IJKlCGcTPu zbBR`+QJR~Wm!FxUkd&VSv?C|KB)&W~u_!(_u{ax{*@Se>m@YsyL|MVr&jlRB09>JO zDllyiC;$KenMp)JR9J=W)lCY6Fc5}ee|i8bc3*7|P)giO#eGG*|5e=D1oIJsAohKB zV`jb#E;LC1U}tG;Ko%QN7J&m-Yv6JB_viKldmwm&r?^q7LT|LBO&u4I^&fvj--!V8 z_BWW92pGf$gV-SY9RN5F{VV(Fa6iH0R|Smg;^rJrGGJO4t#drffO)e3004({3G3+g d+5^BpTL5^02%(|dri1_h002ovPDHLkV1gTfv4Q{q literal 0 HcmV?d00001 diff --git a/icons/clothing/accessories/jewelry/rings/ring.dmi b/icons/clothing/accessories/jewelry/rings/ring.dmi deleted file mode 100644 index 5a116c6c820912d9ea27258bd9b07d7946f5a3e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcmV-_0f7FAP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`;i@u9 za})FOGgB0j@>42xi*xcz;?r~T%TkLGI!#b?Dl549xqux60J~5u)pi-7>Hq)$aY;l$ zR7iF4>3kWJHkffg3*-(fi4X!T6Bw4|d8lqHQM2d^jk{H@2k)T1uO@X146b-^o z4ID}hq-Zc&(OyJ~1}3B3+bc*=&%h+8U8Df#vEs0+1BtCfVnmOEQ7{Td!6+D-AYz~$ dFbYN<005BX54aCS{dNEV002ovPDHLkV1jLTq3Hks diff --git a/icons/clothing/accessories/jewelry/rings/ring_band.dmi b/icons/clothing/accessories/jewelry/rings/ring_band.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b8f40338dccc9372490ad348da76998887a82a40 GIT binary patch literal 454 zcmV;%0XhDOP)y?%OEqvgcQ_KwVSOJGa7cq9QIN;K124gDOPKtZf6Ri48 z&J?}*Nx8?Q1EEnjGE0*@@zr|DkUq`!&t{W=8H4?{P^*6IUgw`}B~LCFAU3Q3006d0 zL_t(oh3(cs3c@fD1<+{B-lP|(dI3w?6J)Y4n7RK|tfH8biVOj*@ZVwuHRZ$ldx%sf}O1#L;(#kr;v|u@~vcmo|Q7G%T@;N-tR91hFdjRiyqZQ5TN-U zkhSP&f*@d*UiG1;vmn6GIMo#Mp}e4fIxmijKc4BH;pL0b6qzKKF8JvoNiMyR;OqJU w005vg|LQON=54<;2mk;8tW^8!0RaBY6`#xx<5;Xa(EtDd07*qoM6N<$f;q6u`Tzg` literal 0 HcmV?d00001 diff --git a/icons/clothing/accessories/jewelry/rings/ring_band_split.dmi b/icons/clothing/accessories/jewelry/rings/ring_band_split.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fb29ccae72af23ade4c0bab70b7c682e3dba1ba0 GIT binary patch literal 448 zcmV;x0YCnUP)y?%OEqvgcQ_KwVSOJGa7cq9QIN;K124gDOPKtZf6Ri48 z&J?}*Nx8?Q1EEnjGE0*@@zr|DkUq`!&t{W=8H4?{P^*6IUgw`}B~LCFAU3Q3006K_ zL_t(oh3(cs4#FT11<+B-Ug!m?Ucd%=0$|@nxc^n8rinCY%%n-J$$yI>q0H~Fg9u`A$0Fj;n zMT-d1F#?+Ssxu>Qi~#A!Tw^FR8%95o4O7auf9iP^^(T>=E$7k|lS4R{1^@tnEiB)O qZ=QL_jRpY#0Dzt9emwxdpLqa(;|%Mgp}|D}0000y?%OEqvgcQ_KwVSOJGa7cq9QIN;K124gDOPKtZf6Ri48 z&J?}*Nx8?Q1EEnjGE0*@@zr|DkUq`!&t{W=8H4?{P^*6IUgw`}B~LCFAU3Q3006^D zL_t(oh3(iu3WG2Z1<=IQef0zyFVHr60w;T+nfqU*u|u@+Z-Rho zTGu*hF^jqj0t`O`k{08676hDL0U;@kbP)v9w8S;|^iWRFANTW%;*Wc7@5OZ4EkmA3 zGIYkp4@olgn*>+Z4*&oFx$bb)<`3xaoC5#=0De{3pD}>{^8n!L5_U_f7SsR$002ov JPDHLkV1oPu%n<+p literal 0 HcmV?d00001 diff --git a/icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi b/icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi new file mode 100644 index 0000000000000000000000000000000000000000..83c9b2ced56f76a41060a0fc136823650eafea09 GIT binary patch literal 442 zcmV;r0Y(0aP)y?%OEqvgcQ_KwVSOJGa7cq9QIN;K124gDOPKtZf6Ri48 z&J?}*Nx8?Q1EEnjGE0*@@zr|DkUq`!&t{W=8H4?{P^*6IUgw`}B~LCFAU3Q30062< zL_t(oh3(c&3c@fD1>jNBz0?a-@c_0-_mPZyMRWhF*aiwyQjj6wAMaZazcy(qyh37B4a-LXo=}dIoYc9Qz5X<%h002O4{?%XjOIyFG k2mk;8e5vNs1pt1`6P?Knv*O3K%m4rY07*qoM6N<$f{Av+GXMYp literal 0 HcmV?d00001 diff --git a/icons/clothing/accessories/jewelry/rings/ring_blue.dmi b/icons/clothing/accessories/jewelry/rings/ring_blue.dmi deleted file mode 100644 index e607595960ff79462d2973e4800fc67315deef79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1340 zcmV-C1;hG@P)pcQEI4P)>SX7deU z=L=rm4O`I*Sj(=it_xSi6=?DcSH}xj&I?=B3RJ)iTha?uz6w>vwY9YkUfT*(y$e*k zn3$LpY4h9L+sDVp3t7(%T-gm=*a}s{3su7nW%3PN+Y4CA3tQ9*P_hkQ-wIK*3RJ!e zT-XXyw+d3Z3RS=hQn?CHvkFqW2~MmEO{oe^s0vW84PxyJSj-7fwhB?V3sJTTPO1t} zunJYd2}`31O{oV*n+sUT2S$|%N}~x#n+Z#z3Q(;HNSp~rmfQ4P);SX7Lng^9oqc3tZL-POS@4w+&w03QejD zThb9`^T5Esm6estd%`LJ0004WQchCV=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zsXV_ZCq;>iGbOXA7|1u|;!G<_%uNNcjZA>TsX2+2AaNa%Aj15N(%i(n{LB=Er2Ldh z-Qt}5lKAwT{Ib+ygq-fLM$%#u)o=5<=5%wd=ZnBKU}i$FV2wVed1r_b0L6AHc5bgM&g#1)UH^{6QMJ zK9qny+&7Fo+26Sb!9I|FID%YC-M{^#LHAK)GR7n1*|G5i^v5{^xoOHI_WTHN{~sW` zk08sku00{*nF4epJFf5?^rS7Jj}-IBW11N3K1YN#aqR(3JW=?N!uxu>d>VQzrCmM8 z#l-aoqVBPj|L79FcYoeO_YaI}PlfOwVL?|AZTBB!qgts{vaH+cF)fwSN>=a-MbzCt zp`q8g=sRPKF~%5Uj4^h13w^%d^M0U==kJD8%;yz8nZaI}!k(*QFHb+Kq4|3*@w^D< z^SX49XWguad}elP4tZTxUm$NZ>>8TS&(9YZkUM_J7Z*Jb`O*@;{PME10`~*8h7ITQ za()4O=l288c5XlLDQ6CP-Ki_~1FMSpd_v*6!d-<|6u!p&K%_nN`9Ajpq0jfZA7G3z z#u#IaF~;t0q0jewb!p@Id*&r}^A+}nhy7|g9PF=)ip!g}jppy`8|EhRW~-4wzP06T zBj4F^B=X(eVj2Ga<_4V4zj?d2j(mR~&-V`wJT%|$+ysc^;T2ab-g&nnz?vA0@s63yQ|@7O?Y+sUuUPfoslM}AbE z{(-zuI6Xz)YUU-H&#$z8o*_R!ufXpIy0~b!k=wSriof5;J%#&$UmIg^KJP6YLqD`D z(DT(c^m5IGUfAwe><4};=JRJgzW=|iaMkA*{%}7KX%BtA&;3B?^L_3I7-Nhv#u#Ia yF~%5UjIn>4etDzgmjTCbcr}bM#u#I)r~U#$*^jef^<3)!0000V=-0C=2JR&a84_w-Y6@%7{?OD!tS z%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u| z;!G<_%uR)`;i@u9a})FOGgB0j@>42xi*xcz;?r~T%TkLGI!#b?Dl549xqux60J~5u z)pi-7>Hq)$heEJA_qLkhhP_A5Tre!VSm? zhzd$BQ13lLm0#Ezdt5K+e%y*Wu8)(-@7T=D%*@RG>gI2Nnb}L6b2$PPmq1$_00000 LNkvXXu0mjfC&IZG diff --git a/icons/clothing/accessories/jewelry/rings/ring_diamond.dmi b/icons/clothing/accessories/jewelry/rings/ring_diamond.dmi deleted file mode 100644 index e05fcffea0fbf773feb9f16773030232683386ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmV-;0f+vHP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`;i@u9 za})FOGgB0j@>42xi*xcz;?r~T%TkLGI!#b?Dl549xqux60J~5u)pi-7>Hq)$YDq*v zR7iF4>3kWJHkfh$kG*E~X^~}lXN+emqVr;^|(nOjK3@npK&>&S(K$-?o1qKEu z2hudKG?Ai#Dagg6g#`5sOoG}?3UD494!c~C*rdh6C>RB!U=)mkp$bw4+5w|rt diff --git a/icons/clothing/accessories/jewelry/rings/ring_magic.dmi b/icons/clothing/accessories/jewelry/rings/ring_magic.dmi deleted file mode 100644 index 885a1d75314eabb0b3b3597ff705b6f45415e81b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmV-~0ek+5P)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*-G zsxnG*6Z7&jQxuZ&Qz~_fbMi~#({u96Qi~BfO;B_yE4cc(fE@$?yHG6Eb{V1S0001U zNkl2r4O%q@LN;REQ)EZlR_mS-}#PqEuc)ii=vC7^W{GL4!zy0>dm) zG>AG);8dDGf(GHBozsg*(ZFPM=6EFu>KT|sb&3?=Ja!y*O-EuYkr>gVU=)mkQ7{UI iCLpOg83m(&8UO&D@x2w zg|OkOGD>q3^YSxO6q52&Ds_u<@=M~=bMnhlixE0aP;@FQxca$(9RvWoP%PDU8KLR` z004MNL_t(YiDO_G1w$Dy3Mr7LLD*4=Bpr-l#X?OaSrBHZNs<+!$wEr27LlMq(NKv& zY7+?>nt*{MO^Sw2B>_ey0a7$fIw-Y>6b($1?%rBRf_es~4&6lxa2`7jy9ANgN~A^f qC>RB!U=)mkAqoly+5w|rXP)KiiD0Av0004WQchCV=-0C=30kj)ChFc5^#$y0>(T=Az@FVZ4C*jJE9)?}g0O0uT(?F|<6B*oh| z!^|>lsZQ;=>s52) zxCcGL!k^?sVKA#H_Z+n+H0nlXuHry^wF4!H-)8-1vx>ls-mYHAFg|`QELGb#?-#uQ zEbdwH7ZG}y0002?NklGb6Ka_k4UM(PWQ=HdaH1&QMwpkfC1~6fRE?1VIo)PP4kI^B4GcdJqIb z5dT2A%s7Dy9#`)b)_a#m+J8XjzdW!46KxJ^aLu5->Q2A&;<_Y4nTmWoP VB(k3-f!P26002ovPDHLkV1f&>;${E< literal 0 HcmV?d00001 diff --git a/icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi b/icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi index 12fc05d63a0cba5029ec2470fa07ec94356a9966..c2efcfd5c18659f66c862cc36f855a615b094d49 100644 GIT binary patch literal 547 zcmV+;0^I$HP)pU4&00001bW%=J06^y0W&i*H zq12Wsk-R#pdb5>cLc=bL!(IvpXdN#ivS!FwpikhL z!dysUFvRTbq__t?!or{AL}4(iDfb+;Cp79tX0GBue6<55h~H-YXS0gHjNYzZ$S^*B zEi6^rH}4m{04(lV@fQ(#nE(I){YgYYR9J=Wm`e)6Fcd`-W6`0_3ToVdHgyF_<^`L5 zIMbmsKP%83Sa%?9&Zr2n73A?iP~I5?`nf0frL!_d{1It7K;^koLzF-&r7#sjfkp+M z!V2U;kjE7ytdP`7jSvDpGFodB&A@Xtfd~q3t*fF)rzmoOpfkO#NfZ$!n*jvE-vv=b zIBx)g?n6*Tw+cH32ohU{wQ_MO4akT6T*>^$J)d7mWUWWSI&UFEx6sxa$k1;L8kZ*s zf*=T@P4;pn+b{6%^dJa=AbxxI^e4jti84 lZPw63Z2kp879fbf=L!k`B4XI{khTB-002ovPDHLkV1lPS>lOe2 literal 446 zcmV;v0YUzWP)Udx_mtA$eI%dpn6hbAT_OiWBOGc%xfMTOVOvj6}90d!JM zQvg8b*k%9#0FQc9Sad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1D@x2w zg|OkOGD>q3^YSxO6q52&Ds_u<@=M~=bMnhlixE0auF4>3J3}b3Xr0n(b&XDkrWN0p~221Ss|Pp>{wn%iiWgc z2lqx2G$M7?q?75uwVCBY?$`*n*@* z^e7kwqhJ(J9qisfntJXtr%BVW=k6Vntl&QP?(G4RG@Q*PO#{Q(w6~;rg6Hm=-6UyX oICC1!(*&zf5-k`7qktd)0HU-a&uz?H$N&HU07*qoM6N<$g1?5j`Tzg` diff --git a/icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi b/icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi deleted file mode 100644 index bddad5ae7584ea4dc91bb65f1410d3f06e39ba1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmV;m0ZRUfP)D@x2wg|OkOGD>q3^YSxO z6q52&Ds_u<@=M~=bMnhlixE0auKkwFT=Fc3wjH3vv4SeG?RcV*@Pk;w@PdVt=*Y}|VTPa$~9){Tgu@K;ipw@TnY z9w9`=k_k-*?JGV+$XE+E10<+!pv1FqDS)ukp4uxQ48hYD5l+!p(IdimYYQUOV=-0C=30kj)ChFc5^#$y0>(T=Az@FVZ4C*jJE9)?}g0O0uT(?F|<6B*oh| z!^|>lsZQ;=>s52) zxCcGL!k^?sVKA#H_Z+n+H0nlXuHry^wF4!H-)8-1vx>ls-mYHAFg|`QELGb#?-#uQ zEbdwH7ZG}y0002*Nklg z=+aOcP#@281M_dseB6>~vRA@7Zy`-*Xlr{&(=QAfS5FWGK@dbv^YkS15BP6#5ClOG z#0OLXDG1?=3otFX2w@2`PB70nLA6XXa0sivKye1hDF*C4R=5BJ@ntT3<{$uJ0`>y{ O0000D@x2wg|OkOGD>q3^YSxO z6q52&Ds_u<@=M~=bMnhlixE0auF5M83+m~kffeb*-(ij9m0k}LPjKM5Ed38$qHdZW1-L>5;Q0(8#0I{k)Xjy zP=G;<6b&Xy0*p!mq-by|6b&Lp1CvunYaj{g8JLVUf)wC9RvdN-BC(Z7i|A1>3P!;w z7=nOvCW#tm&YVD+1+!L>X2r}^Ggp$PVdYBFG;pq(wG!16gsKyuA4v4|Oj5&@lQauP b!H@?4h3^_z?gEeb00000NkvXXu0mjfX?d%= diff --git a/icons/clothing/accessories/jewelry/rings/ring_shadow.dmi b/icons/clothing/accessories/jewelry/rings/ring_shadow.dmi deleted file mode 100644 index 43542dbc9821a5281725fffc13a0ee5026fc4ad1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^2|({Y!Ac$FEPcymhtCojD)8A=Kca@q zTxH}{Ed2SCaj?jwPr+KH-Nm20A6+i~bULV8(8@QUL`!?eubmCDEDXB?bgq_3E_?-a zRF|iVV@O2n+v^+oS`2uYFC25{Wbyd_KcDkbua3u$C6oV5)0=vCn$Z?h!JmfA4rl+z z@b2N7{VRs|T-J&|OQWA|{>BjfJL=`TCAJJ{*B>1=_j9bVFUVQbWc7DN;{E1H@vMEy zN|Qq`ykhD#G>ZJmTlz!!y?*9*_rN-P*(?7eTtFc1>jy~%rBCX93pJVYZf5?K1Ga{R2L}iL|NjaK3Jnbn2?+@wA0HDF6A}^V=-0C=2JR&a84_w-Y6@%7{?OD!tS z%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u| z;!G<_%uR)`;i@u9a})FOGgB0j@>42xi*xcz;?r~T%TkLGI!#b?Dl549xqux60J~5u z)pi-7>Hq)$i%CR5R9J=W*Rc-5Fbo9H_)MvBi}U|~iz#cDN*of>y(LTJlO1>H7$Wjx zW&pLm-#UR8Vat7WL$DIem&Z|`)k8Pn?+HbadVu-y#u*zYAo1Cu+*koU{p@4klTyC} z0?*7UR>0^5nsZjM>JRkrXPqzU8kb7N`E`K#9gB#Fh=|BnUHlCY5&07@JHY~ZY9fTH P00000NkvXXu0mjfcM-1} diff --git a/icons/obj/items/gemstones/baguette.dmi b/icons/obj/items/gemstones/baguette.dmi index 1fecb840ccbf5ded0e5e05be39e759c59eaaae30..a10c3dc675450875d0ac8c4ad171e73b28954a2b 100644 GIT binary patch delta 41 xcmZ3^yqbA}KV$2}fMTg7D#rSAEs8l;hJ_V;EoQ71VAx~nl0KiO`s~D;=KwY85Gw!x delta 37 tcmZ3@yqtN0KV##>fMT&03*(O~L&6Ha7Bg1!Fhu=#WIpcB@Ot9ia{v$c4~YN( diff --git a/icons/obj/items/gemstones/hexagon.dmi b/icons/obj/items/gemstones/hexagon.dmi index 8b9b72ab45371ba64bd05443aa8b344dbc7aa05e..a66d147db14263db8078b5c605a276c8472ac382 100644 GIT binary patch delta 41 xcmZ3?yqtN04`b^@-(smHD#rSAEs8l;hJ_V;EoQ71VAx~nl0KiO`s~DOX8|+U5E%df delta 37 tcmZ3^yqI}{4`bs*-(s;A3*(O~L&6Ha7Bg1!Fhu=#WIpcB@Ot8{vj7eq4|f0n diff --git a/icons/obj/items/gemstones/octagon.dmi b/icons/obj/items/gemstones/octagon.dmi index 06b5d8617572be65c905bcee8a4f6b25db21fda6..c216faaadf9fa051c14eb3f587b8ffe3de44fe32 100644 GIT binary patch delta 41 xcmdnXe2{s94`b^@-(smHD#rSAEs8l;hJ_V;EoQ71VAx~nl0KiO`s~DO&jCCU5N7}Y delta 37 tcmX@eyq9@`4`bs*-(s;A3*(O~L&6Ha7Bg1!Fhu=#WIpcB@Ot8{=KvLl55)ig diff --git a/icons/obj/items/gemstones/poor.dmi b/icons/obj/items/gemstones/poor.dmi index 95fb0bb44f4e3fae2f36829be265e99c5e107d0e..97d192b3493e5eaaae4b50e3c779522c1d7a3269 100644 GIT binary patch delta 41 xcmeyz)Wkf&hp}~{Z?V)86=VIm7R8(^!@>%_7Bf~0Fzm5(NuSSCeRkrt6#zVX5Geov delta 37 tcmZo-{>L=Ihp};@Z?Ra5h4IIgAz=kyiy5nV7^40=G9Pzmcs=pf3IG)D4~GB% diff --git a/icons/obj/items/gemstones/round.dmi b/icons/obj/items/gemstones/round.dmi index 12517ea0b4f5358688b42a8bc61a44ee8f38d4e0..69bca88b994be5dcf149bf5e4105d212655323d2 100644 GIT binary patch delta 41 xcmbQpJe7HZKV$2}fMTg7D#rSAEs8l;hJ_V;EoQ71VAx~nl0KiO`s~D;I{+^959t5^ delta 37 tcmbQrJdt^VKV##>fMT&03*(O~L&6Ha7Bg1!Fhu=#WIpcB@Ot9i9RLZk4@Uq1 diff --git a/icons/obj/items/gemstones/uncut.dmi b/icons/obj/items/gemstones/uncut.dmi index 4f75bfda2a22d94a068d2a7b21af2199d41b0a45..46b30ab23434f3dceba97d63f7dedf718e285316 100644 GIT binary patch delta 42 ycmbQmGLL0~KV$2}fMTg7D#rSAEs8l;hJ_V;EoQ71VAx~nl0KiO`s~J=j*I|7q7SD4 delta 38 ucmbQoGK*z`KV##>fMT&03*(O~L&6Ha7Bg1!Fhu=#WIpcB@OtB2M@9e}ZVv?j diff --git a/maps/shaded_hills/outfits/shrine.dm b/maps/shaded_hills/outfits/shrine.dm index 1df7dd8b0a9..4f47ac02e62 100644 --- a/maps/shaded_hills/outfits/shrine.dm +++ b/maps/shaded_hills/outfits/shrine.dm @@ -11,4 +11,4 @@ /decl/outfit/job/shaded_hills/shrine/keeper name = "Shaded Hills - Shrine Keeper" suit = /obj/item/clothing/suit/mantle - mask = /obj/item/clothing/neck/necklace/prayer_beads/basalt + mask = /obj/item/clothing/neck/prayer_beads/basalt diff --git a/mods/content/dungeon_loot/subtypes/bookcase.dm b/mods/content/dungeon_loot/subtypes/bookcase.dm index fbbad10735d..4752b9d4bbf 100644 --- a/mods/content/dungeon_loot/subtypes/bookcase.dm +++ b/mods/content/dungeon_loot/subtypes/bookcase.dm @@ -41,7 +41,7 @@ /obj/item/paper/scroll, /obj/item/pen/fancy/quill, /obj/item/pen/fancy/quill, - /obj/item/clothing/neck/necklace/prayer_beads/random, + /obj/item/clothing/neck/prayer_beads/random, /obj/item/hourglass, ) return common_loot diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 77dabd83a6c..1fb533a085d 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -203,7 +203,7 @@ /decl/loadout_option/fantasy/neck/prayer_beads name = "prayer beads" - path = /obj/item/clothing/neck/necklace/prayer_beads + path = /obj/item/clothing/neck/prayer_beads available_materials = list( /decl/material/solid/organic/bone, /decl/material/solid/stone/marble, diff --git a/nebula.dme b/nebula.dme index 8210994f017..7ee2f17e3de 100644 --- a/nebula.dme +++ b/nebula.dme @@ -122,6 +122,7 @@ #include "code\_global_vars\sound.dm" #include "code\_global_vars\lists\clothing.dm" #include "code\_global_vars\lists\flavor.dm" +#include "code\_global_vars\lists\jewellery.dm" #include "code\_global_vars\lists\logs.dm" #include "code\_global_vars\lists\mapping.dm" #include "code\_global_vars\lists\names.dm" @@ -1016,11 +1017,8 @@ #include "code\game\objects\objs_interactions.dm" #include "code\game\objects\topic.dm" #include "code\game\objects\auras\aura.dm" -#include "code\game\objects\auras\blueforge_aura.dm" #include "code\game\objects\auras\radiant_aura.dm" #include "code\game\objects\auras\regenerating_aura.dm" -#include "code\game\objects\auras\shadowling_aura.dm" -#include "code\game\objects\auras\starlight.dm" #include "code\game\objects\auras\personal_shields\personal_shield.dm" #include "code\game\objects\compass\_compass.dm" #include "code\game\objects\compass\compass_holder.dm" @@ -1996,8 +1994,10 @@ #include "code\modules\clothing\gloves\thick.dm" #include "code\modules\clothing\gloves\jewelry\bracelet.dm" #include "code\modules\clothing\gloves\jewelry\rings\_ring.dm" -#include "code\modules\clothing\gloves\jewelry\rings\material.dm" -#include "code\modules\clothing\gloves\jewelry\rings\rings.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_aura.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_misc.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_reagent.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_seal.dm" #include "code\modules\clothing\head\_head.dm" #include "code\modules\clothing\head\collectable.dm" #include "code\modules\clothing\head\earmuffs.dm" @@ -2032,10 +2032,16 @@ #include "code\modules\clothing\neck\_neck.dm" #include "code\modules\clothing\neck\bowties.dm" #include "code\modules\clothing\neck\brace.dm" -#include "code\modules\clothing\neck\jewelry.dm" +#include "code\modules\clothing\neck\prayer_beads.dm" #include "code\modules\clothing\neck\scarf.dm" #include "code\modules\clothing\neck\stethoscope.dm" #include "code\modules\clothing\neck\ties.dm" +#include "code\modules\clothing\neck\necklace\__necklace.dm" +#include "code\modules\clothing\neck\necklace\_pendant.dm" +#include "code\modules\clothing\neck\necklace\necklaces.dm" +#include "code\modules\clothing\neck\necklace\pendant_locket.dm" +#include "code\modules\clothing\neck\necklace\pendant_random.dm" +#include "code\modules\clothing\neck\necklace\pendant_setting.dm" #include "code\modules\clothing\pants\_pants.dm" #include "code\modules\clothing\pants\detective.dm" #include "code\modules\clothing\pants\misc.dm" @@ -2244,6 +2250,9 @@ #include "code\modules\crafting\working\textiles\loom.dm" #include "code\modules\crafting\working\textiles\spinning_wheel.dm" #include "code\modules\crafting\working\textiles\twisting_bench.dm" +#include "code\modules\decoration\_decoration.dm" +#include "code\modules\decoration\decoration_item.dm" +#include "code\modules\decoration\decoration_setting.dm" #include "code\modules\departments\department.dm" #include "code\modules\detectivework\forensics.dm" #include "code\modules\detectivework\evidence\_evidence_holder.dm" From 30f1ff98ac122d9453810a37ea62d145e4375454 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 9 Dec 2024 21:18:23 +1100 Subject: [PATCH 143/554] Augments now keep their intended material costs and don't end up full of meat. --- code/modules/augment/active/armblades.dm | 4 ++++ .../modules/augment/active/tool/engineering.dm | 4 +++- code/modules/augment/active/tool/surgical.dm | 10 ++++++---- code/modules/augment/augment.dm | 2 ++ code/modules/augment/passive/armor.dm | 6 ++++-- code/modules/augment/passive/boost/muscle.dm | 4 +++- code/modules/augment/passive/boost/reflex.dm | 4 +++- code/modules/augment/passive/boost/shooting.dm | 4 +++- code/modules/augment/passive/nanoaura.dm | 9 +++++---- code/modules/organs/organ.dm | 14 ++++++++++++-- .../prosthetics/prosthetics_manufacturer.dm | 3 ++- .../prosthetics_manufacturer_models.dm | 7 ++++++- code/modules/species/species_bodytype.dm | 4 ++-- .../species/species_crystalline_bodytypes.dm | 2 +- mods/content/corporate/datum/robolimbs.dm | 18 +++++++++--------- .../utility_frames/species_bodytypes.dm | 2 +- 16 files changed, 66 insertions(+), 31 deletions(-) diff --git a/code/modules/augment/active/armblades.dm b/code/modules/augment/active/armblades.dm index 3b622668915..1f214a266fe 100644 --- a/code/modules/augment/active/armblades.dm +++ b/code/modules/augment/active/armblades.dm @@ -24,6 +24,8 @@ //Limited to robolimbs augment_flags = AUGMENTATION_MECHANIC material = /decl/material/solid/metal/steel + +/obj/item/organ/internal/augment/active/simple/armblade/reset_matter() matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) /obj/item/armblade/claws @@ -44,4 +46,6 @@ //Limited to robolimbs augment_flags = AUGMENTATION_MECHANIC material = /decl/material/solid/metal/steel + +/obj/item/organ/internal/augment/active/simple/wolverine/reset_matter() matter = list(/decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT) diff --git a/code/modules/augment/active/tool/engineering.dm b/code/modules/augment/active/tool/engineering.dm index 14e3c94b56e..b46692f220d 100644 --- a/code/modules/augment/active/tool/engineering.dm +++ b/code/modules/augment/active/tool/engineering.dm @@ -3,7 +3,6 @@ action_button_name = "Deploy Engineering Tool" desc = "A lightweight augmentation for the engineer on-the-go. This one comes with a series of common tools." material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) paths = list( /obj/item/screwdriver/finger, /obj/item/wrench/finger, @@ -14,6 +13,9 @@ ) origin_tech = @'{"materials":4,"magnets":3,"engineering":3}' +/obj/item/organ/internal/augment/active/polytool/engineer/reset_matter() + matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) + /obj/item/weldingtool/finger name = "digital welder" desc = "A precise, high quality welding tool." diff --git a/code/modules/augment/active/tool/surgical.dm b/code/modules/augment/active/tool/surgical.dm index 808d0c5c24c..faa771cf3e9 100644 --- a/code/modules/augment/active/tool/surgical.dm +++ b/code/modules/augment/active/tool/surgical.dm @@ -3,10 +3,6 @@ action_button_name = "Deploy Surgical Tool" desc = "Part of a line of biomedical augmentations, this device contains the full set of tools any surgeon would ever need." material = /decl/material/solid/metal/steel - matter = list( - /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT - ) paths = list( /obj/item/bonesetter, /obj/item/cautery, @@ -17,3 +13,9 @@ /obj/item/surgicaldrill ) origin_tech = @'{"materials":4,"magnets":3,"engineering":3}' + +/obj/item/organ/internal/augment/active/polytool/surgical/reset_matter() + matter = list( + /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT + ) \ No newline at end of file diff --git a/code/modules/augment/augment.dm b/code/modules/augment/augment.dm index 9b43eea445c..ff96aabde04 100644 --- a/code/modules/augment/augment.dm +++ b/code/modules/augment/augment.dm @@ -16,7 +16,9 @@ /obj/item/organ/internal/augment/Initialize() . = ..() organ_tag = pick(allowed_organs) + set_bodytype(/decl/bodytype/prosthetic/augment) update_parent_organ() + reagents?.clear_reagents() // Removing meat from the reagents list. /obj/item/organ/internal/augment/attackby(obj/item/W, mob/user) if(IS_SCREWDRIVER(W) && allowed_organs.len > 1) diff --git a/code/modules/augment/passive/armor.dm b/code/modules/augment/passive/armor.dm index 738e6c278c7..306de571064 100644 --- a/code/modules/augment/passive/armor.dm +++ b/code/modules/augment/passive/armor.dm @@ -4,7 +4,9 @@ icon_state = "armor-chest" desc = "A flexible composite mesh designed to prevent tearing and puncturing of underlying tissue." material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) origin_tech = @'{"materials":4,"engineering":2,"biotech":3}' var/brute_mult = 0.8 - var/burn_mult = 1 \ No newline at end of file + var/burn_mult = 1 + +/obj/item/organ/internal/augment/armor/reset_matter() + matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) \ No newline at end of file diff --git a/code/modules/augment/passive/boost/muscle.dm b/code/modules/augment/passive/boost/muscle.dm index b9c9bd7f57e..ca38a5cd2ff 100644 --- a/code/modules/augment/passive/boost/muscle.dm +++ b/code/modules/augment/passive/boost/muscle.dm @@ -9,10 +9,12 @@ icon_state = "muscule" desc = "Nanofiber tendons powered by an array of actuators to help the wearer mantain speed even while encumbered. You may want to install these in pairs to see a result." material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' var/obj/item/organ/internal/augment/boost/muscle/other //we need two for these +/obj/item/organ/internal/augment/boost/muscle/reset_matter() + matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) + /obj/item/organ/internal/augment/boost/muscle/on_add_effects() . = ..() if(!owner) diff --git a/code/modules/augment/passive/boost/reflex.dm b/code/modules/augment/passive/boost/reflex.dm index d249075c429..a066e9f1074 100644 --- a/code/modules/augment/passive/boost/reflex.dm +++ b/code/modules/augment/passive/boost/reflex.dm @@ -4,11 +4,13 @@ buffs = list(SKILL_COMBAT = 1) injury_debuffs = list(SKILL_COMBAT = -1) material = /decl/material/solid/metal/steel + origin_tech = @'{"materials":2,"magnets":3,"programming":5,"biotech":2}' + +/obj/item/organ/internal/augment/boost/reflex/reset_matter() matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) - origin_tech = @'{"materials":2,"magnets":3,"programming":5,"biotech":2}' /obj/item/organ/internal/augment/boost/reflex/buff() if((. = ..())) diff --git a/code/modules/augment/passive/boost/shooting.dm b/code/modules/augment/passive/boost/shooting.dm index d29a67a21be..59ca29796cb 100644 --- a/code/modules/augment/passive/boost/shooting.dm +++ b/code/modules/augment/passive/boost/shooting.dm @@ -4,11 +4,13 @@ buffs = list(SKILL_WEAPONS = 1) injury_debuffs = list(SKILL_WEAPONS = -1) material = /decl/material/solid/metal/steel + origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' + +/obj/item/organ/internal/augment/boost/reflex/reset_matter() matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) - origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' /obj/item/organ/internal/augment/boost/reflex/buff() if((. = ..())) diff --git a/code/modules/augment/passive/nanoaura.dm b/code/modules/augment/passive/nanoaura.dm index e7602677d83..b18920b72e8 100644 --- a/code/modules/augment/passive/nanoaura.dm +++ b/code/modules/augment/passive/nanoaura.dm @@ -15,15 +15,16 @@ desc = "Nanomachines, son." action_button_name = "Toggle Nanomachines" material = /decl/material/solid/metal/steel + origin_tech = @'{"materials":4,"magnets":4,"engineering":5,"biotech":3}' + var/obj/aura/nanoaura/aura = null + var/charges = 4 + +/obj/item/organ/internal/augment/active/nanounit/reset_matter() matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE ) - origin_tech = @'{"materials":4,"magnets":4,"engineering":5,"biotech":3}' - - var/obj/aura/nanoaura/aura = null - var/charges = 4 /obj/item/organ/internal/augment/active/nanounit/on_add_effects() . = ..() diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index dc2f2b105a1..4f6094ae0f9 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -37,6 +37,9 @@ /// Set to true if this organ should return info to Stat(). See get_stat_info(). var/has_stat_info +/obj/item/organ/proc/reset_matter() + matter = null + /obj/item/organ/Destroy() if(owner) owner.remove_organ(src, FALSE, FALSE, TRUE, TRUE, FALSE) //Tell our parent we're unisntalling in place @@ -141,9 +144,16 @@ max_damage *= bodytype.hardiness min_broken_damage *= bodytype.hardiness bodytype.resize_organ(src) - set_material(override_material || bodytype.material) - matter = bodytype.matter?.Copy() + + reset_matter() + set_material(override_material || bodytype.organ_material) + for(var/mat in bodytype.matter) + if(mat in matter) + matter[mat] += bodytype.matter[mat] + else + LAZYSET(matter, mat, bodytype.matter[mat]) create_matter() + // maybe this should be a generalized repopulate_reagents helper?? if(reagents) reagents.clear_reagents() diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm index e687a696f63..91915558ed6 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm @@ -6,11 +6,12 @@ modifier_string = "robotic" is_robotic = TRUE body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_EAT - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel appearance_flags = HAS_EYE_COLOR eye_flash_mod = 1 eye_darksight_range = 2 associated_gender = null + edible_reagent = null emote_sounds = list( "whistle" = list('sound/voice/emotes/longwhistle_robot.ogg'), "qwhistle" = list('sound/voice/emotes/shortwhistle_robot.ogg'), diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm index 64776e6aefb..ad3b2c5e9ea 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm @@ -15,8 +15,13 @@ is_robotic = FALSE modular_limb_tier = MODULAR_BODYPART_ANYWHERE bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/organic/wood + organ_material = /decl/material/solid/organic/wood required_map_tech = MAP_TECH_LEVEL_MEDIEVAL uid = "bodytype_prosthetic_wooden" DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/wooden, pirate, 0, "wooden") + +// Dummy/stub prosthetic type for augment implants. +/decl/bodytype/prosthetic/augment + name = "Augment" + uid = "bodytype_prosthetic_augment" diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index 63d6f7ceabe..95394d64551 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -116,7 +116,7 @@ var/global/list/bodytypes_by_category = list() var/base_eye_color = COLOR_BLACK /// Used to initialize organ material - var/material = /decl/material/solid/organic/meat + var/organ_material = /decl/material/solid/organic/meat /// Used to initialize organ matter var/list/matter = null /// The reagent organs are filled with, which currently affects what mobs that eat the organ will receive. @@ -717,7 +717,7 @@ var/global/list/bodytypes_by_category = list() for(var/obj/item/organ/internal/innard in limb.internal_organs) var/obj/item/organ/internal/organ_prototype = replacing_organs[innard.organ_tag] if(organ_prototype && istype(innard, organ_prototype)) - innard.set_bodytype(type, override_material || material) + innard.set_bodytype(type, override_material || organ_material) replacing_organs -= innard.organ_tag else limb.owner.remove_organ(innard, FALSE, FALSE, TRUE, TRUE, FALSE) diff --git a/code/modules/species/species_crystalline_bodytypes.dm b/code/modules/species/species_crystalline_bodytypes.dm index 15c0f6047bb..138d34bae56 100644 --- a/code/modules/species/species_crystalline_bodytypes.dm +++ b/code/modules/species/species_crystalline_bodytypes.dm @@ -7,7 +7,7 @@ abstract_type = /decl/bodytype/crystalline limb_tech = @'{"materials":4}' is_robotic = FALSE - material = /decl/material/solid/gemstone/crystal + organ_material = /decl/material/solid/gemstone/crystal body_flags = BODY_FLAG_CRYSTAL_REFORM | BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS cold_level_1 = SYNTH_COLD_LEVEL_1 cold_level_2 = SYNTH_COLD_LEVEL_2 diff --git a/mods/content/corporate/datum/robolimbs.dm b/mods/content/corporate/datum/robolimbs.dm index fbebd801b95..4eba38ba1b6 100644 --- a/mods/content/corporate/datum/robolimbs.dm +++ b/mods/content/corporate/datum/robolimbs.dm @@ -3,7 +3,7 @@ desc = "This limb has a white polymer casing with blue holo-displays." icon_base = 'mods/content/corporate/icons/cyberlimbs/bishop/bishop_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -15,7 +15,7 @@ icon_base = 'mods/content/corporate/icons/cyberlimbs/bishop/bishop_rook.dmi' has_eyes = FALSE bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/stainlesssteel = MATTER_AMOUNT_SECONDARY ) @@ -41,7 +41,7 @@ desc = "This limb has a sleek black and white polymer finish." icon_base = 'mods/content/corporate/icons/cyberlimbs/zenghu/zenghu_spirit.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -52,7 +52,7 @@ desc = "This skeletal mechanical limb has a minimalist black and red casing." icon_base = 'mods/content/corporate/icons/cyberlimbs/xion/xion_econo.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -64,7 +64,7 @@ icon_base = 'mods/content/corporate/icons/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi' body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -81,7 +81,7 @@ desc = "This limb is simple and functional; no effort has been made to make it look human." icon_base = 'mods/content/corporate/icons/cyberlimbs/morpheus/morpheus_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel uid = "bodytype_prosthetic_morpheus" /decl/bodytype/prosthetic/morpheus/mantis @@ -99,7 +99,7 @@ body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS bodytype_category = BODYTYPE_HUMANOID // todo: add synthflesh material? - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -123,7 +123,7 @@ desc = "This limb has a minimalist black and red casing." icon_base = 'mods/content/corporate/icons/cyberlimbs/xion/xion_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -134,7 +134,7 @@ desc = "This limb is made from a cheap polymer." icon_base = 'mods/content/corporate/icons/cyberlimbs/nanotrasen/nanotrasen_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/organic/plastic + organ_material = /decl/material/solid/organic/plastic uid = "bodytype_prosthetic_nanotrasen" DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/shellguard, shellguard) diff --git a/mods/species/utility_frames/species_bodytypes.dm b/mods/species/utility_frames/species_bodytypes.dm index 5bd6e5e3a67..378c5d86f08 100644 --- a/mods/species/utility_frames/species_bodytypes.dm +++ b/mods/species/utility_frames/species_bodytypes.dm @@ -10,7 +10,7 @@ body_flags = BODY_FLAG_NO_PAIN | BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS base_color = "#333355" base_eye_color = "#00ccff" - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel vital_organs = list( BP_BRAIN, BP_CELL From 0e8657cfddaaace7e26a42090697788cef1081ee Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 11 Dec 2024 18:14:30 +1100 Subject: [PATCH 144/554] Meat and nutriment should no longer cause organ damage on ingestion. --- .../materials/definitions/solids/materials_solid_butchery.dm | 2 ++ code/modules/reagents/chems/chems_drinks.dm | 1 + code/modules/reagents/chems/chems_nutriment.dm | 2 ++ 3 files changed, 5 insertions(+) diff --git a/code/modules/materials/definitions/solids/materials_solid_butchery.dm b/code/modules/materials/definitions/solids/materials_solid_butchery.dm index 666d18c6517..f1bdababb12 100644 --- a/code/modules/materials/definitions/solids/materials_solid_butchery.dm +++ b/code/modules/materials/definitions/solids/materials_solid_butchery.dm @@ -24,6 +24,8 @@ reagent_overlay = "soup_chunks" nutriment_factor = 10 allergen_flags = ALLERGEN_MEAT + affect_blood_on_ingest = 0 + affect_blood_on_inhale = 0 /decl/material/solid/organic/meat/egg name = "egg yolk" diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index 77c2b2c99d0..ba069e72a23 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -9,6 +9,7 @@ nutriment_factor = 0 hydration_factor = 6 affect_blood_on_ingest = FALSE + affect_blood_on_inhale = FALSE var/adj_dizzy = 0 // Per tick var/adj_drowsy = 0 diff --git a/code/modules/reagents/chems/chems_nutriment.dm b/code/modules/reagents/chems/chems_nutriment.dm index 802b96c7992..3ac879172e7 100644 --- a/code/modules/reagents/chems/chems_nutriment.dm +++ b/code/modules/reagents/chems/chems_nutriment.dm @@ -12,6 +12,8 @@ fishing_bait_value = 0.65 compost_value = 1 nutriment_factor = 10 + affect_blood_on_ingest = 0 + affect_blood_on_inhale = 0 // Technically a room-temperature solid, but saves // repathing it to /solid all over the codebase. From daa5d7427dd6cfca7d3f948868fa9242bf78d28a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 12 Dec 2024 10:12:36 +1100 Subject: [PATCH 145/554] Added material alteration flag to grandfather clock. --- code/game/objects/structures/grandfather_clock.dm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/code/game/objects/structures/grandfather_clock.dm b/code/game/objects/structures/grandfather_clock.dm index b1dadeb884a..76cc0c8295d 100644 --- a/code/game/objects/structures/grandfather_clock.dm +++ b/code/game/objects/structures/grandfather_clock.dm @@ -1,13 +1,14 @@ // TODO: buildable with artifice? // TODO: looping 2 second tick tock sound, somehow aligned with pendulum (may not be possible in DM) /obj/structure/grandfather_clock - name = "grandfather clock" - desc = "A tall, stately timepiece." - icon = 'icons/obj/structures/grandfather_clock.dmi' - icon_state = ICON_STATE_WORLD - density = TRUE - material = /decl/material/solid/organic/wood/mahogany - var/face_color = "#f0edc7" + name = "grandfather clock" + desc = "A tall, stately timepiece." + icon = 'icons/obj/structures/grandfather_clock.dmi' + icon_state = ICON_STATE_WORLD + density = TRUE + material = /decl/material/solid/organic/wood/mahogany + material_alteration = MAT_FLAG_ALTERATION_ALL + var/face_color = "#f0edc7" var/last_time var/decl/material/clockwork_mat = /decl/material/solid/metal/brass From 6662830f4cb064efabbc61fa8390a9e522da0c60 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 2 Dec 2024 20:08:47 +1100 Subject: [PATCH 146/554] Adding various fancy goods from Doe's icon set. --- code/game/objects/items/__item.dm | 5 +- code/modules/crafting/handmade_fancy.dm | 58 ++++++++++++++++++ code/modules/crafting/handmade_items.dm | 19 +++--- .../crafting/stack_recipes/recipes_planks.dm | 20 ++++++ code/modules/decoration/decoration_inset.dm | 14 +++++ .../solids/materials_solid_metal.dm | 1 + .../{pottery => items/handmade}/bottle.dmi | Bin .../handmade}/bottle_tall.dmi | Bin .../handmade}/bottle_wide.dmi | Bin .../obj/{pottery => items/handmade}/bowl.dmi | Bin icons/obj/items/handmade/bowl_fancy.dmi | Bin 0 -> 841 bytes icons/obj/{pottery => items/handmade}/cup.dmi | Bin icons/obj/items/handmade/cup_fancy.dmi | Bin 0 -> 804 bytes icons/obj/items/handmade/decanter.dmi | Bin 0 -> 365 bytes icons/obj/{pottery => items/handmade}/jar.dmi | Bin icons/obj/{pottery => items/handmade}/mug.dmi | Bin .../{pottery => items/handmade}/teapot.dmi | Bin .../obj/{pottery => items/handmade}/vase.dmi | Bin icons/obj/items/handmade/vase_fancy.dmi | Bin 0 -> 378 bytes .../obj/items/handmade/vase_fancy_fluted.dmi | Bin 0 -> 369 bytes nebula.dme | 2 + 21 files changed, 108 insertions(+), 11 deletions(-) create mode 100644 code/modules/crafting/handmade_fancy.dm create mode 100644 code/modules/decoration/decoration_inset.dm rename icons/obj/{pottery => items/handmade}/bottle.dmi (100%) rename icons/obj/{pottery => items/handmade}/bottle_tall.dmi (100%) rename icons/obj/{pottery => items/handmade}/bottle_wide.dmi (100%) rename icons/obj/{pottery => items/handmade}/bowl.dmi (100%) create mode 100644 icons/obj/items/handmade/bowl_fancy.dmi rename icons/obj/{pottery => items/handmade}/cup.dmi (100%) create mode 100644 icons/obj/items/handmade/cup_fancy.dmi create mode 100644 icons/obj/items/handmade/decanter.dmi rename icons/obj/{pottery => items/handmade}/jar.dmi (100%) rename icons/obj/{pottery => items/handmade}/mug.dmi (100%) rename icons/obj/{pottery => items/handmade}/teapot.dmi (100%) rename icons/obj/{pottery => items/handmade}/vase.dmi (100%) create mode 100644 icons/obj/items/handmade/vase_fancy.dmi create mode 100644 icons/obj/items/handmade/vase_fancy_fluted.dmi diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 439b62e14b7..ce862be1c1d 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -175,12 +175,15 @@ // This is a bit gross, but it makes writing rings and necklaces much easier. // If the decorations list is already populated at this point, we assume it's - // prebaked decorations. Only things handled appropriately at the moment are gems. + // prebaked decorations. + // Only things handled appropriately at the moment are gems and material inlays. if(length(decorations)) for(var/decoration_type in decorations) decorations -= decoration_type if(ispath(decoration_type, /obj/item/gemstone)) decorations[GET_DECL(/decl/item_decoration/setting)] = list("object" = new decoration_type(src)) + else if(ispath(decoration_type, /decl/material)) + decorations[GET_DECL(/decl/item_decoration/inset)] = list("material" = GET_DECL(decoration_type)) else PRINT_STACK_TRACE("Item [type] tried to initialize with an unsupported initial decoration type ('[decoration_type]')") . = ..() diff --git a/code/modules/crafting/handmade_fancy.dm b/code/modules/crafting/handmade_fancy.dm new file mode 100644 index 00000000000..9622296a587 --- /dev/null +++ b/code/modules/crafting/handmade_fancy.dm @@ -0,0 +1,58 @@ +/obj/item/chems/glass/handmade/fancy + abstract_type = /obj/item/chems/glass/handmade/fancy + material = /decl/material/solid/metal/silver + +/obj/item/chems/glass/handmade/fancy/get_single_monetary_worth() + . = ..() * 1.5 // Crafting value, todo proper crafting skill modifying sale price. + +/obj/item/chems/glass/handmade/fancy/decanter + name = "decanter" + desc = "A masterfully made decanter with a fluted neck and graceful handle." + icon = 'icons/obj/items/handmade/decanter.dmi' + amount_per_transfer_from_this = 10 + volume = 120 + obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE + +/obj/item/chems/glass/handmade/fancy/goblet + name = "goblet" + desc = "An elegant goblet with a flared base, likely handmade by some master artisan." + icon = 'icons/obj/items/handmade/cup_fancy.dmi' + amount_per_transfer_from_this = 10 + volume = 60 + +/obj/item/chems/glass/handmade/fancy/bowl + name = "bowl" + desc = "A sleek, polished bowl, likely handmade by some master artisan." + icon = 'icons/obj/items/handmade/bowl_fancy.dmi' + amount_per_transfer_from_this = 10 + volume = 60 + +/obj/item/chems/glass/handmade/fancy/vase + name = "vase" + desc = "An elegant masterwork vase." + icon = 'icons/obj/items/handmade/vase_fancy.dmi' + amount_per_transfer_from_this = 20 + volume = 240 + material = /decl/material/solid/stone/ceramic + +/obj/item/chems/glass/handmade/fancy/vase/fluted + desc = "An elegant masterwork vase with a fluted neck." + icon = 'icons/obj/items/handmade/vase_fancy_fluted.dmi' + +/obj/item/chems/glass/handmade/fancy/vase/fluted/update_name() + . = ..() + SetName("fluted [name]") + +// Decorated subtypes for mapping/ +/obj/item/chems/glass/handmade/fancy/vase/mapped + decorations = list(/decl/material/solid/organic/bone) + +/obj/item/chems/glass/handmade/fancy/vase/fluted/mapped + decorations = list(/decl/material/solid/organic/bone) + +/obj/item/chems/glass/handmade/fancy/goblet/mapped + material = /decl/material/solid/metal/gold + decorations = list(/obj/item/gemstone/octagon/ruby) + +/obj/item/chems/glass/handmade/fancy/bowl/mapped + decorations = list(/obj/item/gemstone/octagon/sapphire) diff --git a/code/modules/crafting/handmade_items.dm b/code/modules/crafting/handmade_items.dm index 4c294d38b78..5aa1ed2f1ca 100644 --- a/code/modules/crafting/handmade_items.dm +++ b/code/modules/crafting/handmade_items.dm @@ -12,7 +12,7 @@ /obj/item/chems/glass/handmade/teapot name = "teapot" desc = "A handmade, slightly lumpy teapot." - icon = 'icons/obj/pottery/teapot.dmi' + icon = 'icons/obj/items/handmade/teapot.dmi' amount_per_transfer_from_this = 10 volume = 120 obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE @@ -20,14 +20,14 @@ /obj/item/chems/glass/handmade/cup name = "cup" desc = "A handmade, slightly lumpy cup." - icon = 'icons/obj/pottery/cup.dmi' + icon = 'icons/obj/items/handmade/cup.dmi' amount_per_transfer_from_this = 10 volume = 30 /obj/item/chems/glass/handmade/mug name = "mug" desc = "A handmade, slightly lumpy mug." - icon = 'icons/obj/pottery/mug.dmi' + icon = 'icons/obj/items/handmade/mug.dmi' amount_per_transfer_from_this = 10 volume = 60 obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE @@ -35,36 +35,36 @@ /obj/item/chems/glass/handmade/vase name = "vase" desc = "A handmade, slightly lumpy vase." - icon = 'icons/obj/pottery/vase.dmi' + icon = 'icons/obj/items/handmade/vase.dmi' amount_per_transfer_from_this = 20 volume = 240 /obj/item/chems/glass/handmade/jar name = "jar" desc = "A handmade, slightly lumpy jar." - icon = 'icons/obj/pottery/jar.dmi' + icon = 'icons/obj/items/handmade/jar.dmi' amount_per_transfer_from_this = 10 volume = 60 /obj/item/chems/glass/handmade/bottle name = "bottle" desc = "A handmade, slightly lumpy bottle." - icon = 'icons/obj/pottery/bottle.dmi' + icon = 'icons/obj/items/handmade/bottle.dmi' amount_per_transfer_from_this = 10 volume = 120 /obj/item/chems/glass/handmade/bottle/tall name = "tall bottle" - icon = 'icons/obj/pottery/bottle_tall.dmi' + icon = 'icons/obj/items/handmade/bottle_tall.dmi' /obj/item/chems/glass/handmade/bottle/wide name = "wide bottle" - icon = 'icons/obj/pottery/bottle_wide.dmi' + icon = 'icons/obj/items/handmade/bottle_wide.dmi' /obj/item/chems/glass/handmade/bowl name = "bowl" desc = "A handmade, slightly lumpy bowl." - icon = 'icons/obj/pottery/bowl.dmi' + icon = 'icons/obj/items/handmade/bowl.dmi' amount_per_transfer_from_this = 10 volume = 60 @@ -77,7 +77,6 @@ /obj/item/chems/glass/handmade/bowl/wood material = /decl/material/solid/organic/wood/oak - /obj/item/chems/glass/handmade/bottle/beer/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index f58f931cf5b..909f022edc6 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -78,6 +78,26 @@ /decl/stack_recipe/planks/bowl result_type = /obj/item/chems/glass/handmade/bowl +/decl/stack_recipe/planks/fancy + abstract_type = /decl/stack_recipe/planks/fancy + difficulty = MAT_VALUE_VERY_HARD_DIY + +/decl/stack_recipe/planks/fancy/decanter + result_type = /obj/item/chems/glass/handmade/fancy/decanter + +/decl/stack_recipe/planks/fancy/goblet + result_type = /obj/item/chems/glass/handmade/fancy/goblet + +/decl/stack_recipe/planks/fancy/bowl + result_type = /obj/item/chems/glass/handmade/fancy/bowl + +/decl/stack_recipe/planks/fancy/vase + result_type = /obj/item/chems/glass/handmade/fancy/vase + +/decl/stack_recipe/planks/fancy/vase_fluted + name = "vase, fluted" + result_type = /obj/item/chems/glass/handmade/fancy/vase/fluted + /decl/stack_recipe/planks/noticeboard/spawn_result(mob/user, location, amount, decl/material/mat, decl/material/reinf_mat, paint_color, spent_type, spent_amount = 1) . = ..() if(user) diff --git a/code/modules/decoration/decoration_inset.dm b/code/modules/decoration/decoration_inset.dm new file mode 100644 index 00000000000..9ca503ac8e6 --- /dev/null +++ b/code/modules/decoration/decoration_inset.dm @@ -0,0 +1,14 @@ +// Sort of a placeholder for future generalised decorations. +/decl/item_decoration/inset + name = "inlay material" + icon_state_modifier = "-inlay" + can_decorate_types = list( + /obj/item/chems/glass/handmade/fancy/vase + ) + can_decorate_with_types = list( + /obj/item/stack/material/plank = 1, + /obj/item/stack/material/bone = 1, + /obj/item/stack/material/ingot = 1, + /obj/item/stack/material/sheet = 1, + /obj/item/stack/material/brick = 1 + ) diff --git a/code/modules/materials/definitions/solids/materials_solid_metal.dm b/code/modules/materials/definitions/solids/materials_solid_metal.dm index d5a79687013..ee7d435e09d 100644 --- a/code/modules/materials/definitions/solids/materials_solid_metal.dm +++ b/code/modules/materials/definitions/solids/materials_solid_metal.dm @@ -78,6 +78,7 @@ /decl/material/solid/metal/gold name = "gold" + adjective_name = "golden" codex_name = "elemental gold" uid = "solid_gold" lore_text = "A heavy, soft, ductile metal. Once considered valuable enough to back entire currencies, now predominantly used in corrosion-resistant electronics." diff --git a/icons/obj/pottery/bottle.dmi b/icons/obj/items/handmade/bottle.dmi similarity index 100% rename from icons/obj/pottery/bottle.dmi rename to icons/obj/items/handmade/bottle.dmi diff --git a/icons/obj/pottery/bottle_tall.dmi b/icons/obj/items/handmade/bottle_tall.dmi similarity index 100% rename from icons/obj/pottery/bottle_tall.dmi rename to icons/obj/items/handmade/bottle_tall.dmi diff --git a/icons/obj/pottery/bottle_wide.dmi b/icons/obj/items/handmade/bottle_wide.dmi similarity index 100% rename from icons/obj/pottery/bottle_wide.dmi rename to icons/obj/items/handmade/bottle_wide.dmi diff --git a/icons/obj/pottery/bowl.dmi b/icons/obj/items/handmade/bowl.dmi similarity index 100% rename from icons/obj/pottery/bowl.dmi rename to icons/obj/items/handmade/bowl.dmi diff --git a/icons/obj/items/handmade/bowl_fancy.dmi b/icons/obj/items/handmade/bowl_fancy.dmi new file mode 100644 index 0000000000000000000000000000000000000000..af43c58133af56788c5f968f3320681a9bda78c3 GIT binary patch literal 841 zcmV-P1GfB$P)fFDZ*Bkpc$}S+v2Fq}42I{+Q$#RRwX|y&1gaRyE1XQ? zUaTgUlkI?bdm?V?Q0c+Tt0z)|}%2tI-IE|l^2wvd!u zramF)8Df+c$d@$5>Z%EP%(j$Za@ev3fe5}GXqst8Qjx$pr#A03rPN~G73QTmdUTmV z>jhUo6zLf(Pom`hU&Y!UPW#8R+yS$80N<-?K%D>p0pdwSK~!jg?U+$Y!$1&*cO}bK zMCfAU`r3*YP!Eu3#PltJ)U*fiJqv~U*g_AWP%q&rJb;21@Gho-COc`fTdfZw^Cd4c z`_JrbUS>9gAjp4$_PV>ppI%(-l;P+)r`^2H?sE+G-sO_><^*@gIZ?CCPJe4pu_`frjZA3>c(Ez&BwYH}`WM z4vp&wf*{CWA+k%1FlN_SD)?y$tGhI#Mp=n7t$S7zLwl>yArx!Bbysn8{olZbc=y(= zxvH5Z%ZLp+QweO(gje@_ZZARR1$a&I+mz5z!&(7KKasrxI;($yfi(s}kblM(M&L!b Td_Poo00000NkvXXu0mjf4nc-s literal 0 HcmV?d00001 diff --git a/icons/obj/pottery/cup.dmi b/icons/obj/items/handmade/cup.dmi similarity index 100% rename from icons/obj/pottery/cup.dmi rename to icons/obj/items/handmade/cup.dmi diff --git a/icons/obj/items/handmade/cup_fancy.dmi b/icons/obj/items/handmade/cup_fancy.dmi new file mode 100644 index 0000000000000000000000000000000000000000..02f64ffe84fa1db979b185240433c12558de9bf7 GIT binary patch literal 804 zcmV+<1Ka$GP)fFDZ*Bkpc$}S+v2Fq}42I{+Q$#RRwX|y&1gaRyE1XQ? zUaTgUlkI?bdm?V?Q0c+Tt0z)|}%2tI-IE|l^2wvd!u zramF)8Df+c$d@$5>Z%EP%(j$Za@ev3fe5}GXqst8Qjx$pr#A03rPN~G73QTmdUTmV z>jhUo6zLf(Pom`hU&Y!UPW#8R+yS$80N<-?K%D>p0li5?K~!jg?U*r7!ax+qFNbZ3 zaS)ARZA&>ARfeuE?6uIA@p40PL=4iAu=pAL7VbLu0sK%B6Y<`GSI))+lJ^VC|J{4< z{u~LfS3(eEpJ<#`tM__WZlwn2y`I*>(QpWL8URhhFuc|^==b|KI!(j*T-zWB0$0|< zAc$n`G_$O!YaoQ+vi8LiIB>k=wxercGX}KPhPswCE(UTS`uZ3!P2vgM!l;~((C=J= z05z+3TG>E*24&Q|*?p@@1ILT?zd|X~#@VDiOT)$?8uL)i0D>UMK4F`s(hw6$6MOCo|G2!i|% zX7|o51!G0qTwCt2r4msuacLXKXJz^BX(U^yvuFV<=>?pz-(d{Bci7$Sw|2AK@J7uIjdlqzTy3buO0l+!uqai z8NMUlXh2+dhjd4MKp^6$)edhLoMoogOWSf@+Mvte69^Hqwo5Hgk-<%D9~^zD1^TEM iuoBp>%mIQRhtDVR`#X{k*EswD0000$J%i{n500DGTPE!Ct=GbNc004D*R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRp}O|mXu`XrQ=eqtl;YB0(Jxde#R&y z8}buNqe*ftd_GU%Ial?KrZ=!0KKu`pD*MCk<<*x$#ymD00000 LNkvXXu0mjfW2Kvp literal 0 HcmV?d00001 diff --git a/icons/obj/pottery/jar.dmi b/icons/obj/items/handmade/jar.dmi similarity index 100% rename from icons/obj/pottery/jar.dmi rename to icons/obj/items/handmade/jar.dmi diff --git a/icons/obj/pottery/mug.dmi b/icons/obj/items/handmade/mug.dmi similarity index 100% rename from icons/obj/pottery/mug.dmi rename to icons/obj/items/handmade/mug.dmi diff --git a/icons/obj/pottery/teapot.dmi b/icons/obj/items/handmade/teapot.dmi similarity index 100% rename from icons/obj/pottery/teapot.dmi rename to icons/obj/items/handmade/teapot.dmi diff --git a/icons/obj/pottery/vase.dmi b/icons/obj/items/handmade/vase.dmi similarity index 100% rename from icons/obj/pottery/vase.dmi rename to icons/obj/items/handmade/vase.dmi diff --git a/icons/obj/items/handmade/vase_fancy.dmi b/icons/obj/items/handmade/vase_fancy.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8a66723be8375ec6377ec2777fded457b48bfc60 GIT binary patch literal 378 zcmV-=0fqjFP)$J%i{n500DGTPE!Ct=GbNc0047(R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq1BtgNJ>0stVtCqun~ z!4m)g0GCNbK~y-6V_+CUKu7?;Jfn#reg#aRN%M*$rG Y0MKj`JJw&Ip#T5?07*qoM6N<$g1i@y7XSbN literal 0 HcmV?d00001 diff --git a/icons/obj/items/handmade/vase_fancy_fluted.dmi b/icons/obj/items/handmade/vase_fancy_fluted.dmi new file mode 100644 index 0000000000000000000000000000000000000000..af3a2270a7661d15ea6aecd22fe958c9fb15b23f GIT binary patch literal 369 zcmV-%0gnEOP)$J%i{n500DGTPE!Ct=GbNc0047(R9JLGWpiV4X>fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@**gRq1BtgNJ>0stVtCqun~ z!4m)g0FFsSK~y-6?T|4JgD?z5e*)brsCN>H9ZK0txj-G~{%2`Mdr60?0}?OOkAI$} z00*MG*5~dq*9(4s{b*>rTfNY**j$cbr~YXQ)Y}J{vsN@MXQQ}t3~5psaquc*8;OG2 z;RYaR!0ml%;fm&%@ P00000NkvXXu0mjfH4d7= literal 0 HcmV?d00001 diff --git a/nebula.dme b/nebula.dme index 7ee2f17e3de..c8ff24af447 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2203,6 +2203,7 @@ #include "code\modules\codex\entries\tools.dm" #include "code\modules\codex\entries\turfs.dm" #include "code\modules\codex\entries\weapons.dm" +#include "code\modules\crafting\handmade_fancy.dm" #include "code\modules\crafting\handmade_items.dm" #include "code\modules\crafting\metalwork\metalwork_items.dm" #include "code\modules\crafting\pottery\pottery_moulds.dm" @@ -2251,6 +2252,7 @@ #include "code\modules\crafting\working\textiles\spinning_wheel.dm" #include "code\modules\crafting\working\textiles\twisting_bench.dm" #include "code\modules\decoration\_decoration.dm" +#include "code\modules\decoration\decoration_inset.dm" #include "code\modules\decoration\decoration_item.dm" #include "code\modules\decoration\decoration_setting.dm" #include "code\modules\departments\department.dm" From 47992bb6e1e673ace712fa23b19fe441fc7fa5db Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 9 Dec 2024 21:31:22 +1100 Subject: [PATCH 147/554] More robust handling for slapcrafting holder creation. --- code/game/objects/items/__item.dm | 6 +-- .../crafting/slapcrafting/_crafting_holder.dm | 40 ++++++++++++++----- .../crafting/slapcrafting/_crafting_stage.dm | 30 ++++++++++++++ 3 files changed, 60 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 69b1449b419..2499f187758 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -300,11 +300,7 @@ var/list/available_recipes = list() for(var/decl/crafting_stage/initial_stage in SSfabrication.find_crafting_recipes(type)) if(initial_stage.can_begin_with(src) && ispath(initial_stage.completion_trigger_type)) - var/atom/movable/prop = initial_stage.completion_trigger_type - if(initial_stage.stack_consume_amount > 1) - available_recipes[initial_stage] = "[initial_stage.stack_consume_amount] [initial(prop.name)]\s" - else - available_recipes[initial_stage] = "\a [initial(prop.name)]" + available_recipes[initial_stage] = initial_stage.generate_completion_string() if(length(available_recipes)) diff --git a/code/modules/crafting/slapcrafting/_crafting_holder.dm b/code/modules/crafting/slapcrafting/_crafting_holder.dm index 5a2ef109779..b89a73d69a1 100644 --- a/code/modules/crafting/slapcrafting/_crafting_holder.dm +++ b/code/modules/crafting/slapcrafting/_crafting_holder.dm @@ -13,17 +13,13 @@ var/list/next_products = list() for(var/decl/crafting_stage/next_stage in current_crafting_stage.next_stages) if(ispath(next_stage.completion_trigger_type)) - var/atom/next_tool = next_stage.completion_trigger_type - var/tool_string = initial(next_tool.name) - if(next_stage.stack_consume_amount > 1) - tool_string = "[next_stage.stack_consume_amount] [tool_string]\s" - else - tool_string = "\a [tool_string]" + var/tool_string = next_stage.generate_completion_string() if(ispath(next_stage.product)) var/atom/next_product = next_stage.product next_products[tool_string] = "\a [initial(next_product.name)]" else next_steps += tool_string + if(length(next_products)) for(var/thing in next_products) to_chat(user, SPAN_NOTICE("With [thing], you could finish building [next_products[thing]].")) @@ -31,14 +27,27 @@ to_chat(user, SPAN_NOTICE("You could continue to work on this with [english_list(next_steps, and_text = " or ")].")) /obj/item/crafting_holder/Initialize(var/ml, var/decl/crafting_stage/initial_stage, var/obj/item/target, var/obj/item/tool, var/mob/user) + . = ..(ml) if(!initial_stage) return INITIALIZE_HINT_QDEL + name = "[target.name] assembly" - var/mob/M = target.loc - if(istype(M)) + + // Move our component into the new holder. + if(ismob(target.loc)) + var/mob/M = target.loc M.drop_from_inventory(target) - target.forceMove(src) + target.forceMove(src) + else if(ismovable(target.loc)) + var/atom/movable/holder = target.loc + if(holder.storage) + holder.storage.remove_from_storage(user, target, src) + else + target.forceMove(src) + else + target.forceMove(src) + current_crafting_stage = initial_stage update_icon() update_strings() @@ -78,9 +87,18 @@ if(ismob(product) && label_name) var/mob/M = product M.SetName(label_name) - if(ismob(src.loc)) - var/mob/M = src.loc + + if(ismob(loc)) + var/mob/M = loc M.drop_from_inventory(src) + else if(ismovable(loc)) + var/atom/movable/holder = loc + if(holder.storage) + holder.storage.remove_from_storage(user, src, get_turf(src)) + else + forceMove(get_turf(src)) + else + forceMove(get_turf(src)) qdel_self() else current_crafting_stage = next_stage diff --git a/code/modules/crafting/slapcrafting/_crafting_stage.dm b/code/modules/crafting/slapcrafting/_crafting_stage.dm index 23275abf92b..b72c4d4cb8e 100644 --- a/code/modules/crafting/slapcrafting/_crafting_stage.dm +++ b/code/modules/crafting/slapcrafting/_crafting_stage.dm @@ -20,6 +20,28 @@ stages += GET_DECL(nid) next_stages = stages +/decl/crafting_stage/proc/generate_completion_string() + var/list/names = assemble_name_strings() + if(ispath(completion_trigger_type, /obj/item/stack) || stack_consume_amount) + names.Insert(1, max(stack_consume_amount, 1)) + return jointext(names, " ") + +/decl/crafting_stage/proc/assemble_name_strings() + SHOULD_CALL_PARENT(TRUE) + var/list/names = list() + var/obj/item/prop = completion_trigger_type + if(ispath(prop, /obj/item/stack)) + var/obj/item/stack/stack = prop + if(stack_consume_amount == 1) + names += stack::singular_name + else + names += stack::plural_name + else if(stack_consume_amount > 1) + names += "[prop::name]\s" + else + names += prop::name + return names + /decl/crafting_stage/proc/is_available() return global.using_map.map_tech_level >= available_to_map_tech_level @@ -89,6 +111,14 @@ consume_completion_trigger = FALSE var/stack_material = /decl/material/solid/metal/steel +/decl/crafting_stage/material/assemble_name_strings() + var/list/names = ..() + if(stack_material) + var/decl/material/mat = GET_DECL(stack_material) + if(mat) + names.Insert(1, mat.solid_name) + return names + /decl/crafting_stage/material/consume_crafting_resource(var/mob/user, var/obj/item/thing, var/obj/item/target) var/obj/item/stack/material/M = thing . = istype(M) && (!stack_material || M.material.type == stack_material) && ..() From 8dd039a47c959d145b40a6fdced8bd1656d0631a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 5 Dec 2024 18:52:26 -0500 Subject: [PATCH 148/554] Remove remaining hooks --- code/__globals.dm | 8 +- code/_helpers/global_lists.dm | 2 +- code/_helpers/time.dm | 8 -- code/controllers/communications.dm | 6 +- code/controllers/evacuation/evacuation.dm | 2 - code/controllers/hooks-defs.dm | 35 --------- code/controllers/hooks.dm | 39 ---------- .../subsystems/initialization/webhooks.dm | 7 +- code/controllers/subsystems/lighting.dm | 9 +-- code/controllers/subsystems/mapping.dm | 4 - code/controllers/subsystems/ticker.dm | 13 +++- .../config/config_types/config_server.dm | 27 ------- code/datums/mil_ranks.dm | 3 +- code/datums/repositories/admin_pm.dm | 44 ----------- code/datums/traits/_traits.dm | 8 +- code/game/gamemodes/game_mode.dm | 1 - code/game/jobs/server_whitelist.dm | 2 +- code/game/objects/random/subtypes/multi.dm | 4 - code/game/verbs/who.dm | 4 +- code/game/world.dm | 75 +++++++++---------- code/modules/admin/NewBan.dm | 3 - code/modules/admin/admin.dm | 4 +- code/modules/admin/admin_investigate.dm | 4 - code/modules/admin/admin_ranks.dm | 4 - code/modules/admin/banjob.dm | 4 - .../admin/secrets/investigation/admin_pms.dm | 40 ---------- code/modules/admin/ticket.dm | 2 - code/modules/admin/verbs/adminhelp.dm | 4 - code/modules/admin/verbs/adminpm.dm | 29 ------- code/modules/chat_filter/_chat_filter.dm | 2 +- code/modules/client/client_procs.dm | 18 +---- code/modules/error_handler/error_reporting.dm | 23 ------ code/modules/ext_scripts/irc.dm | 55 -------------- code/modules/holidays/holiday_hook.dm | 5 -- .../modules/mob/living/silicon/pai/recruit.dm | 12 ++- .../mob/living/silicon/pai/software.dm | 9 +-- code/modules/mob/new_player/new_player.dm | 4 - code/modules/supermatter/supermatter.dm | 6 +- maps/~mapsystem/maps.dm | 2 +- mods/_modpack.dm | 8 +- mods/content/matchmaking/matchmaker.dm | 32 ++++---- nebula.dme | 6 -- ~code/global_init.dm | 3 +- 43 files changed, 105 insertions(+), 475 deletions(-) delete mode 100644 code/controllers/hooks-defs.dm delete mode 100644 code/controllers/hooks.dm delete mode 100644 code/datums/repositories/admin_pm.dm delete mode 100644 code/modules/admin/secrets/investigation/admin_pms.dm delete mode 100644 code/modules/error_handler/error_reporting.dm delete mode 100644 code/modules/ext_scripts/irc.dm diff --git a/code/__globals.dm b/code/__globals.dm index 12434ad8011..7c9e5ed5dbe 100644 --- a/code/__globals.dm +++ b/code/__globals.dm @@ -1,15 +1,15 @@ // Defined here due to being used immediately below. #define GET_DECL(D) (ispath(D, /decl) ? (decls_repository.fetched_decls[D] || decls_repository.get_decl(D)) : null) +#define IMPLIED_DECL GET_DECL(__IMPLIED_TYPE__) // Defined here due to compile order; overrides in macros make the compiler complain. /decl/global_vars var/static/list/protected_vars = list("protected_vars") // No editing the protected list! +/decl/global_vars/Initialize() + . = ..() + mark_protected_vars() /decl/global_vars/proc/mark_protected_vars() return -/hook/startup/proc/mark_protected_vars() - var/decl/global_vars/global_vars = GET_DECL(/decl/global_vars) - global_vars.mark_protected_vars() - return TRUE #define GLOBAL_GETTER(NAME, TYPE, VAL) \ var/global##TYPE/##NAME; \ diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index f3379f84c52..84463762e67 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -62,7 +62,7 @@ var/global/list/string_slot_flags = list( . = new /mob/living/human/dummy/mannequin() mannequins_[ckey] = . -/hook/global_init/proc/makeDatumRefLists() +/proc/makeDatumRefLists() // Keybindings for(var/KB in subtypesof(/datum/keybinding)) var/datum/keybinding/keybinding = KB diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index eea2b9b3833..a59873ee330 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -72,10 +72,6 @@ var/global/next_duration_update = 0 var/global/last_round_duration = 0 var/global/round_start_time = 0 -/hook/roundstart/proc/start_timer() - round_start_time = world.time - return 1 - /proc/ticks2readable(tick_time) var/hours = round(tick_time / (1 HOUR)) var/minutes = round((tick_time % (1 HOUR)) / (1 MINUTE)) @@ -109,10 +105,6 @@ var/global/round_start_time = 0 next_duration_update = world.time + 1 MINUTES return last_round_duration -/hook/startup/proc/set_roundstart_hour() - roundstart_hour = rand(0, 23) - return TRUE - var/global/midnight_rollovers = 0 var/global/rollovercheck_last_timeofday = 0 /proc/update_midnight_rollover() diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index 4e599b93113..d91f03f89ee 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -123,11 +123,7 @@ var/global/list/all_selectable_radio_filters = list( RADIO_MAGNETS ) -var/global/datum/controller/radio/radio_controller - -/hook/startup/proc/createRadioController() - radio_controller = new /datum/controller/radio() - return 1 +var/global/datum/controller/radio/radio_controller = new /datum/controller/radio() //callback used by objects to react to incoming radio signals /obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param) diff --git a/code/controllers/evacuation/evacuation.dm b/code/controllers/evacuation/evacuation.dm index 69eeb9bc5bc..90849e6e193 100644 --- a/code/controllers/evacuation/evacuation.dm +++ b/code/controllers/evacuation/evacuation.dm @@ -131,8 +131,6 @@ evac_waiting.Announce(replacetext(global.using_map.emergency_shuttle_docked_message, "%ETD%", "[estimated_time] minute\s"), new_sound = sound('sound/effects/Evacuation.ogg', volume = 35)) else priority_announcement.Announce(replacetext(replacetext(global.using_map.shuttle_docked_message, "%dock_name%", "[global.using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s")) - if(get_config_value(/decl/config/toggle/announce_shuttle_dock_to_irc)) - send2mainirc("The shuttle has docked with the station. It will depart in approximately [estimated_time] minute\s.") /datum/evacuation_controller/proc/launch_evacuation() diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm deleted file mode 100644 index 696352c85eb..00000000000 --- a/code/controllers/hooks-defs.dm +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Global init hook. - * Called in global_init.dm when the server is initialized. - */ -/hook/global_init - -/** - * Startup hook. - * Called in world.dm when the server starts. - */ -/hook/startup - -/** - * Roundstart hook. - * Called in ticker.dm when a round starts. - */ -/hook/roundstart - -/** - * Roundend hook. - * Called in ticker.dm when a round ends. - */ -/hook/roundend - -/** - * Shutdown hook. - * Called in world.dm when world/Del is called. - */ -/hook/shutdown - -/** - * Reboot hook. - * Called in world.dm prior to the parent call in world/Reboot. - */ -/hook/reboot diff --git a/code/controllers/hooks.dm b/code/controllers/hooks.dm deleted file mode 100644 index 2e05a0621b0..00000000000 --- a/code/controllers/hooks.dm +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file hooks.dm - * Implements hooks, a simple way to run code on pre-defined events. - */ - -/** @page hooks Code hooks - * @section hooks Hooks - * A hook is defined under /hook in the type tree. - * - * To add some code to be called by the hook, define a proc under the type, as so: - * @code - hook/foo/proc/bar() - if(1) - return 1 //Sucessful - else - return 0 //Error, or runtime. - * @endcode - * All hooks must return nonzero on success, as runtimes will force return null. - */ - -/** - * Calls a hook, executing every piece of code that's attached to it. - * @param hook Identifier of the hook to call. - * @returns 1 if all hooked code runs successfully, 0 otherwise. - */ -/proc/callHook(hook, list/args=null) - var/hook_path = text2path("/hook/[hook]") - if(!hook_path) - error("Invalid hook '/hook/[hook]' called.") - return 0 - - var/caller = new hook_path - var/status = 1 - for(var/P in typesof("[hook_path]/proc")) - if(!call(caller, P)(arglist(args))) - error("Hook '[P]' failed or runtimed.") - status = 0 - - return status diff --git a/code/controllers/subsystems/initialization/webhooks.dm b/code/controllers/subsystems/initialization/webhooks.dm index 14c560979d4..c773998c9ba 100644 --- a/code/controllers/subsystems/initialization/webhooks.dm +++ b/code/controllers/subsystems/initialization/webhooks.dm @@ -46,6 +46,9 @@ SUBSYSTEM_DEF(webhooks) else to_world_log("Failed to set up webhook [wid].") +/datum/controller/subsystem/webhooks/proc/is_webhook_configured(wid) + return isnull(webhook_decls[wid]) + /datum/controller/subsystem/webhooks/proc/send(var/wid, var/wdata) var/decl/webhook/webhook = webhook_decls[wid] if(webhook) @@ -88,7 +91,3 @@ SUBSYSTEM_DEF(webhooks) log_and_message_admins("has pinged webhook [choice].", usr) to_world_log("[usr.key] has pinged webhook [choice].") webhook.send() - -/hook/roundstart/proc/run_webhook() - SSwebhooks.send(WEBHOOK_ROUNDSTART, list("url" = get_world_url())) - return 1 diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm index daf0a7a44df..a7583ae1b2f 100644 --- a/code/controllers/subsystems/lighting.dm +++ b/code/controllers/subsystems/lighting.dm @@ -40,17 +40,12 @@ SUBSYSTEM_DEF(lighting) ) ..(out.Join()) -#ifdef USE_INTELLIGENT_LIGHTING_UPDATES - -/hook/roundstart/proc/lighting_init_roundstart() - SSlighting.handle_roundstart() - return TRUE - +// If intelligent updates are off, this is just an empty stub. /datum/controller/subsystem/lighting/proc/handle_roundstart() +#ifdef USE_INTELLIGENT_LIGHTING_UPDATES force_queued = FALSE total_ss_updates = 0 total_instant_updates = 0 - #endif /datum/controller/subsystem/lighting/Initialize(timeofday) diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index ecc1ad88b1e..6e1061636ec 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -426,7 +426,3 @@ SUBSYSTEM_DEF(mapping) if(!P) continue P.begin_processing() - -/hook/roundstart/proc/start_processing_all_planets() - SSmapping.start_processing_all_planets() - return TRUE diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 4855a9a86c5..6bccadcb70a 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -89,7 +89,16 @@ SUBSYSTEM_DEF(ticker) if(job && job.create_record) CreateModularRecord(H) - callHook("roundstart") + // Initialize the roundstart timer + global.round_start_time = world.time + generate_multi_spawn_items() + SSlighting.handle_roundstart() + SSmapping.start_processing_all_planets() + SSwebhooks.send(WEBHOOK_ROUNDSTART, list("url" = get_world_url())) + global.using_map.refresh_lobby_browsers() + for(var/modpack_name in SSmodpacks.loaded_modpacks) + var/decl/modpack/loaded_modpack = SSmodpacks.loaded_modpacks[modpack_name] + loaded_modpack.on_roundstart() spawn(0)//Forking here so we dont have to wait for this to finish mode.post_setup() // Drafts antags who don't override jobs. @@ -102,7 +111,6 @@ SUBSYSTEM_DEF(ticker) global.current_holiday.set_up_holiday() if(!length(global.admins)) - send2adminirc("Round has started with no admins online.") SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Round Started (Game ID: [game_id])", "body" = "Round has started with no admins online.")) /datum/controller/subsystem/ticker/proc/playing_tick() @@ -128,7 +136,6 @@ SUBSYSTEM_DEF(ticker) return if(END_GAME_READY_TO_END) end_game_state = END_GAME_ENDING - callHook("roundend") if (universe_has_ended) if(mode.station_was_nuked) SSstatistics.set_field_details("end_proper","nuke") diff --git a/code/datums/config/config_types/config_server.dm b/code/datums/config/config_types/config_server.dm index 47239568235..4365bbde4bb 100644 --- a/code/datums/config/config_types/config_server.dm +++ b/code/datums/config/config_types/config_server.dm @@ -16,9 +16,6 @@ /decl/config/num/drone_build_time, /decl/config/num/max_character_traits, /decl/config/num/max_alternate_languages, - /decl/config/text/irc_bot_host, - /decl/config/text/main_irc, - /decl/config/text/admin_irc, /decl/config/text/server_name, /decl/config/text/server, /decl/config/text/serverurl, @@ -54,9 +51,7 @@ /decl/config/toggle/disable_webhook_embeds, /decl/config/toggle/delist_when_no_admins, /decl/config/toggle/wait_for_sigusr1_reboot, - /decl/config/toggle/use_irc_bot, /decl/config/toggle/show_typing_indicator_for_whispers, - /decl/config/toggle/announce_shuttle_dock_to_irc, /decl/config/toggle/guests_allowed, /decl/config/toggle/on/jobs_have_minimal_access, /decl/config/toggle/on/admin_legacy_system, @@ -170,20 +165,6 @@ default_value = 3 desc = "Remove the # to define a different maximum for alternate language selection in chargen." -/decl/config/text/irc_bot_host - uid = "irc_bot_host" - default_value = "localhost" - desc = "Host where the IRC bot is hosted. Port 45678 needs to be open." - -/decl/config/text/main_irc - uid = "main_irc" - default_value = "#main" - desc = "IRC channel to send information to. Leave blank to disable." - -/decl/config/text/admin_irc - uid = "admin_irc" - desc = "IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc." - // server name (for world name / status) /decl/config/text/server_name uid = "server_name" @@ -335,18 +316,10 @@ uid = "wait_for_sigusr1_reboot" desc = "Determines if Dream Daemon should refuse to reboot for any reason other than SIGUSR1." -/decl/config/toggle/use_irc_bot - uid = "use_irc_bot" - desc = "Determines if data is sent to the IRC bot. Generally requires MAIN_IRC and associated setup." - /decl/config/toggle/show_typing_indicator_for_whispers uid = "show_typing_indicator_for_whispers" desc = "Determinese if a typing indicator shows overhead for people currently writing whispers." -/decl/config/toggle/announce_shuttle_dock_to_irc - uid = "announce_shuttle_dock_to_irc" - desc = "Determines if announce shuttle dock announcements are sent to the main IRC channel, if MAIN_IRC has also been setup." - /decl/config/toggle/guests_allowed uid = "guests_allowed" desc = "Determines whether or not people without a registered ckey (i.e. guest-*) can connect to your server." diff --git a/code/datums/mil_ranks.dm b/code/datums/mil_ranks.dm index 23a0b69cb66..136559c4aa7 100644 --- a/code/datums/mil_ranks.dm +++ b/code/datums/mil_ranks.dm @@ -143,10 +143,11 @@ var/global/datum/mil_branches/mil_branches = new() . += spawn_rank +// todo: should this be on /datum/map? this will need heavy reworking if we promote submaps from second to first class map status anyway /** * Populate the global branches list from global.using_map */ -/hook/startup/proc/populate_branches() +/proc/populate_branches() if(!(global.using_map.flags & MAP_HAS_BRANCH) && !(global.using_map.flags & MAP_HAS_RANK)) mil_branches.branches = null mil_branches.spawn_branches_ = null diff --git a/code/datums/repositories/admin_pm.dm b/code/datums/repositories/admin_pm.dm deleted file mode 100644 index 03a48de19ab..00000000000 --- a/code/datums/repositories/admin_pm.dm +++ /dev/null @@ -1,44 +0,0 @@ -var/global/repository/admin_pm/admin_pm_repository = new() - -/repository/admin_pm - var/list/admin_pms_ - var/list/irc_clients_by_name - -/repository/admin_pm/New() - ..() - admin_pms_ = list() - irc_clients_by_name = list() - -/repository/admin_pm/proc/store_pm(var/client/sender, var/client/receiver, var/message) - if(receiver) - if(istype(receiver)) - receiver = client_repository.get_lite_client(receiver) - else if(starts_with(receiver, "IRC-")) - receiver = get_irc_client(receiver) - else - CRASH("Invalid receiver: [log_info_line(receiver)]") - - // Newest messages first - admin_pms_.Insert(1, new/datum/admin_privat_message(client_repository.get_lite_client(sender), receiver, message)) - -/repository/admin_pm/proc/get_irc_client(key) - var/datum/client_lite/cl = irc_clients_by_name[key] - if(!cl) - cl = new/datum/client_lite() - cl.name = "IRC" - cl.key = key - irc_clients_by_name[key] = cl - return cl - -/datum/admin_privat_message - var/station_time - var/datum/client_lite/sender // We don't store the proper client because it gets deleted if banned - var/datum/client_lite/receiver - var/message - -/datum/admin_privat_message/New(var/sender, var/receiver, var/message) - station_time = time_stamp() - src.message = message - src.sender = sender - src.receiver = receiver - diff --git a/code/datums/traits/_traits.dm b/code/datums/traits/_traits.dm index ad1041e32da..7c188e2b526 100644 --- a/code/datums/traits/_traits.dm +++ b/code/datums/traits/_traits.dm @@ -2,12 +2,6 @@ // Selectable traits are basically skills + stats + feats all rolled into one. You get to choose a // certain number of them at character generation and they will alter some interactions with the world. -/hook/startup/proc/initialize_trait_trees() - // Precache/build trait trees. - for(var/decl/trait/trait in decls_repository.get_decls_of_type_unassociated(/decl/trait)) - trait.build_references() - return 1 - /mob/living var/list/traits @@ -170,7 +164,7 @@ if(ispath(parent)) parent = GET_DECL(parent) - if(abstract_type != type && category) + if(category) var/datum/trait_category/trait_category = global.trait_categories[category] if(!istype(trait_category)) trait_category = new(category) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 9a95ba9802f..9bfdd979142 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -410,7 +410,6 @@ var/global/list/additional_antag_types = list() if(escaped_total > 0) SSstatistics.set_field("escaped_total",escaped_total) - send2mainirc("A round of [src.name] has ended - [surviving_total] survivor\s, [ghosts] ghost\s.") SSwebhooks.send(WEBHOOK_ROUNDEND, list("survivors" = surviving_total, "escaped" = escaped_total, "ghosts" = ghosts, "clients" = clients)) return 0 diff --git a/code/game/jobs/server_whitelist.dm b/code/game/jobs/server_whitelist.dm index 083876ecad3..9c8b84f46b5 100644 --- a/code/game/jobs/server_whitelist.dm +++ b/code/game/jobs/server_whitelist.dm @@ -31,7 +31,7 @@ var/global/list/server_whitelist to_file(write_file, jointext(global.server_whitelist, "\n")) var/global/list/alien_whitelist = list() -/hook/startup/proc/loadAlienWhitelist() +/proc/try_load_alien_whitelist() if(get_config_value(/decl/config/toggle/use_alien_whitelist)) if(get_config_value(/decl/config/toggle/use_alien_whitelist_sql)) if(!load_alienwhitelistSQL()) diff --git a/code/game/objects/random/subtypes/multi.dm b/code/game/objects/random/subtypes/multi.dm index 34cd5d7077e..a0268faecae 100644 --- a/code/game/objects/random/subtypes/multi.dm +++ b/code/game/objects/random/subtypes/multi.dm @@ -1,7 +1,3 @@ -/hook/roundstart/proc/roundstart_multi_spawn() - generate_multi_spawn_items() - return TRUE - /proc/generate_multi_spawn_items() for(var/id in multi_point_spawns) var/list/spawn_points = multi_point_spawns[id] diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 4131ea677ae..dacae043660 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -104,7 +104,7 @@ else msg += line - if(get_config_value(/decl/config/text/admin_irc)) - to_chat(src, "Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond.") + if(SSwebhooks.is_webhook_configured(WEBHOOK_AHELP_SENT)) + to_chat(src, "Adminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and join.") to_chat(src, "Current Staff ([active_staff]/[total_staff]):") to_chat(src, jointext(msg,"\n")) diff --git a/code/game/world.dm b/code/game/world.dm index 420c09757f5..079e43ae543 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -1,6 +1,6 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) -/hook/global_init/proc/generate_game_id() +/proc/generate_game_id() if(!isnull(global.game_id)) return @@ -70,6 +70,10 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) return match +// Get the URL used to connect to the server. +/proc/get_world_url() + return "byond://[get_config_value(/decl/config/text/server) || get_config_value(/decl/config/text/serverurl) || "[world.address]:[world.port]"]" + /world/New() //set window title @@ -83,10 +87,23 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) if(byond_version < REQUIRED_DM_VERSION) to_world_log("Your server's BYOND version does not meet the minimum DM version for this server. Please update BYOND.") - callHook("startup") - //Emergency Fix - load_mods() - //end-emergency fix + // Initialize the global vars decl, which marks vars as protected. + GET_DECL(/decl/global_vars) + // And the offset used for in-game time + global.roundstart_hour = rand(0, 23) + initialise_map_list() + world.load_mode() + world.load_motd() + load_admins() + world.connect_database() + jobban_loadbanfile() + LoadBans() + update_holiday() //Uncommenting ALLOW_HOLIDAYS in configuration will enable this. + try_load_alien_whitelist() + investigate_reset() + // Precache/build trait trees. + for(var/decl/trait/trait in decls_repository.get_decls_of_type_unassociated(/decl/trait)) + trait.build_references() . = ..() @@ -149,18 +166,24 @@ var/global/world_topic_last = world.timeofday game_log("World rebooted at [time_stamp()]") - callHook("reboot") + on_reboot(reason) ..(reason) +/// If you need to add modular functionality on-reboot, override this instead of /world/Reboot(). +/// It runs directly before the parent call in /world/Reboot(). +/world/proc/on_reboot(reason) + return + /world/Del() Master.Shutdown() - callHook("shutdown") + on_shutdown() return ..() -/hook/startup/proc/loadMode() - world.load_mode() - return 1 +/// If you need to add modular functionality on-shutdown, override this instead of /world/Del(). +/// It runs directly before the parent call in /world/Del(). +/world/proc/on_shutdown() + return /world/proc/load_mode() if(!fexists("data/mode.txt")) @@ -177,38 +200,9 @@ var/global/world_topic_last = world.timeofday fdel(F) direct_output(F, the_mode) -/hook/startup/proc/loadMOTD() - world.load_motd() - return 1 - /world/proc/load_motd() join_motd = safe_file2text("config/motd.txt", FALSE) -/hook/startup/proc/loadMods() - world.load_mods() - return 1 - -/world/proc/load_mods() - if(get_config_value(/decl/config/toggle/on/admin_legacy_system)) - var/text = safe_file2text("config/moderators.txt", FALSE) - if (!text) - error("Failed to load config/mods.txt") - else - var/list/lines = splittext(text, "\n") - for(var/line in lines) - if (!line) - continue - - if (copytext(line, 1, 2) == ";") - continue - - var/title = "Moderator" - var/rights = admin_ranks[title] - - var/ckey = copytext(line, 1, length(line)+1) - var/datum/admins/D = new /datum/admins(title, rights, ckey) - D.associate(global.ckey_directory[ckey]) - /world/proc/update_status() var/s = "[station_name()]" @@ -281,12 +275,11 @@ var/global/world_topic_last = world.timeofday #define FAILED_DB_CONNECTION_CUTOFF 5 var/global/failed_db_connections = 0 -/hook/startup/proc/connectDB() +/world/proc/connect_database() if(!setup_database_connection()) to_world_log("Your server failed to establish a connection with the SQL database.") else to_world_log("SQL database connection established.") - return 1 /proc/setup_database_connection() diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 5f2e3c19cc6..ecfb5bd522f 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -59,9 +59,6 @@ var/global/savefile/Banlist CMinutes = (world.realtime / 10) / 60 return 1 -/hook/startup/proc/loadBans() - return LoadBans() - /proc/LoadBans() Banlist = new("data/banlist.bdb") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 79c44208bc0..5e06996ca46 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -789,9 +789,7 @@ var/global/BSACooldown = 0 if (new_vis && !world.reachable) message_admins("WARNING: The server will not show up on the hub because byond is detecting that a firewall is blocking incoming connections.") - var/full_message = "[key_name(src)]" + long_message - send2adminirc(full_message) - SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Hub Visibility Toggled (Game ID: [game_id])", "body" = full_message)) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Hub Visibility Toggled (Game ID: [game_id])", "body" = "[key_name(src)]" + long_message)) log_and_message_admins(long_message) SSstatistics.add_field_details("admin_verb","THUB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 66fe7e8daff..546f5753cee 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -11,10 +11,6 @@ /proc/investigate_subject2file(var/subject) return file("[INVESTIGATE_DIR][subject].html") -/hook/startup/proc/resetInvestigate() - investigate_reset() - return 1 - /proc/investigate_reset() if(fdel(INVESTIGATE_DIR)) return 1 return 0 diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 5a6a4d7b17a..42eab17d7f7 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -52,10 +52,6 @@ var/global/list/admin_ranks = list() //list of all ranks with associated testing(msg) #endif -/hook/startup/proc/loadAdmins() - load_admins() - return 1 - /proc/load_admins() //clear the datums references admin_datums.Cut() diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 79ca30569ee..37374968324 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -36,10 +36,6 @@ var/global/list/jobban_keylist = list() //to store the keys & ranks return "Reason Unspecified" return 0 -/hook/startup/proc/loadJobBans() - jobban_loadbanfile() - return 1 - /proc/jobban_loadbanfile() if(get_config_value(/decl/config/toggle/on/ban_legacy_system)) var/savefile/S=new("data/job_full.ban") diff --git a/code/modules/admin/secrets/investigation/admin_pms.dm b/code/modules/admin/secrets/investigation/admin_pms.dm deleted file mode 100644 index cd57bf73283..00000000000 --- a/code/modules/admin/secrets/investigation/admin_pms.dm +++ /dev/null @@ -1,40 +0,0 @@ -/datum/admin_secret_item/investigation/admin_pms - name = "Admin PMs" - -/datum/admin_secret_item/investigation/admin_pms/execute(var/mob/user, var/filter) - . = ..() - if(!.) - return - var/dat = list() - dat += "Refresh Filtering on: " - if(filter) - dat += " [filter] Clear" - else - dat += "None" - dat += "
" - dat += "" - dat += "" - - for(var/datum/admin_privat_message/pm in admin_pm_repository.admin_pms_) - var/datum/client_lite/sender = pm.sender - var/datum/client_lite/receiver = pm.receiver - - if(filter && !(sender.ckey == filter || (receiver && receiver.ckey == filter))) - continue - - if(receiver) - dat += "" - else - dat += "" - dat += "" - dat += "
TimeSenderReceiver
[pm.station_time][sender.key_name(FALSE)] F[receiver.key_name(FALSE)] F
[pm.station_time][sender.key_name(FALSE)] F
[pm.message]
" - - var/datum/browser/popup = new(user, "admin_ahelps", "Admin PMs", 800, 400) - popup.set_content(jointext(dat, null)) - popup.open() - -/datum/admin_secret_item/investigation/admin_pms/Topic(href, href_list) - . = ..() - if(.) - return - execute(usr, href_list["filter"]) diff --git a/code/modules/admin/ticket.dm b/code/modules/admin/ticket.dm index 526c9867927..8612a5306d9 100644 --- a/code/modules/admin/ticket.dm +++ b/code/modules/admin/ticket.dm @@ -51,7 +51,6 @@ var/global/list/ticket_panels = list() src.closed_by = closed_by to_chat(client_by_ckey(src.owner.ckey), "Your ticket has been closed by [closed_by.key].") message_staff("[src.owner.key_name(0)]'s ticket has been closed by [closed_by.key].") - send2adminirc("[src.owner.key_name(0)]'s ticket has been closed by [closed_by.key].") SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Ticket ([id]) (Game ID: [game_id]) Ticket Closed", "body" = "[src.owner.key_name(0)] 's ticket (ID [id]) has been closed by [closed_by.key].")) var/closed_by_not_assigned = TRUE @@ -100,7 +99,6 @@ var/global/list/ticket_panels = list() ticket_take.Execute() message_staff("[assigned_admin.key] has assigned themself to [src.owner.key_name(0)]'s ticket.") - send2adminirc("[assigned_admin.key] has assigned themself to [src.owner.key_name(0)]'s ticket.") to_chat(client_by_ckey(src.owner.ckey), "[assigned_admin.key] has added themself to your ticket and should respond shortly. Thanks for your patience!") SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Ticket ([id]) (Game ID: [game_id]) Ticked Assigned", "body" = "[assigned_admin.key] has added themself to ticket ID [id].")) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index ee9f73e756b..77017eee5f6 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -134,10 +134,6 @@ var/global/list/adminhelp_ignored_words = list("unknown","the","a","an","of","mo to_chat(src, SPAN_BLUE("PM to-Staff (CLOSE): [original_msg]")) var/admin_number_present = global.admins.len - admin_number_afk log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") - if(admin_number_present <= 0) - adminmsg2adminirc(src, null, "[html_decode(original_msg)] - !![admin_number_afk ? "All admins AFK ([admin_number_afk])" : "No admins online"]!!") - else - adminmsg2adminirc(src, null, "[html_decode(original_msg)]") SSstatistics.add_field_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index d3e506f6327..7371ff70873 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -151,7 +151,6 @@ sound_to(C, 'sound/effects/adminhelp.ogg') log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") - adminmsg2adminirc(src, C, html_decode(msg)) ticket.msgs += new /datum/ticket_msg(src.ckey, C.ckey, msg) update_ticket_panels() @@ -168,31 +167,3 @@ continue if(X.key != key && X.key != C.key && (X.holder.rights & R_ADMIN|R_MOD)) to_chat(X, "" + create_text_tag("pm_other", "PM:", X) + " [key_name(src, X, 0, ticket)] to [key_name(C, X, 0, ticket)] ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE): [msg]") - -/client/proc/cmd_admin_irc_pm(sender) - if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") - return - - var/msg = input(src,"Message:", "Reply private message to [sender] on IRC / 400 character limit") as text|null - - if(!msg) - return - - // Handled on Bot32's end, unsure about other bots -// if(length(msg) > 400) // TODO: if message length is over 400, divide it up into seperate messages, the message length restriction is based on IRC limitations. Probably easier to do this on the bots ends. -// to_chat(src, "Your message was not sent because it was more then 400 characters, find your message below for ease of copy/pasting.") -// to_chat(src, "[msg]") -// return - - adminmsg2adminirc(src, sender, html_decode(msg)) - msg = sanitize(msg) - log_admin("PM: [key_name(src)]->IRC-[sender]: [msg]") - admin_pm_repository.store_pm(src, "IRC-[sender]", msg) - - to_chat(src, "" + create_text_tag("pm_out_alt", "PM", src) + " to [sender]: [msg]") - for(var/client/X in global.admins) - if(X == src) - continue - if(X.holder.rights & R_ADMIN|R_MOD) - to_chat(X, "" + create_text_tag("pm_other", "PM:", X) + " [key_name(src, X, 0)] to [sender]: [msg]") diff --git a/code/modules/chat_filter/_chat_filter.dm b/code/modules/chat_filter/_chat_filter.dm index 15beabc9ba0..7e9ce18e77a 100644 --- a/code/modules/chat_filter/_chat_filter.dm +++ b/code/modules/chat_filter/_chat_filter.dm @@ -1,7 +1,7 @@ var/global/list/chat_blockers_in_use var/global/list/chat_modifiers_in_use -/hook/startup/proc/build_filter_lists() +/proc/build_filter_lists() global.chat_blockers_in_use = list() global.chat_modifiers_in_use = list() var/list/all_filters = decls_repository.get_decls_of_type(/decl/chat_filter) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4afacdc2b06..76f96bf0866 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -65,16 +65,6 @@ var/global/list/localhost_addresses = list( cmd_admin_pm(C, null, ticket) return - if(href_list["irc_msg"]) - if(!holder && received_irc_pm < world.time - 6000) //Worst they can do is spam IRC for 10 minutes - to_chat(usr, SPAN_WARNING("You are no longer able to use this, it's been more then 10 minutes since an admin on IRC has responded to you.")) - return - if(mute_irc) - to_chat(usr, SPAN_WARNING("You cannot use this as your client has been muted from sending messages to the admins on IRC.")) - return - cmd_admin_irc_pm(href_list["irc_msg"]) - return - if(href_list["close_ticket"]) var/datum/ticket/ticket = locate(href_list["close_ticket"]) @@ -378,14 +368,10 @@ var/global/list/localhost_addresses = list( if(admin_datums[ckey] && GAME_STATE == RUNLEVEL_GAME) //Only report this stuff if we are currently playing. message_staff("\[[holder.rank]\] [key_name(src)] logged out.") if(!global.admins.len) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell. - var/full_message = "[key_name(src)] logged out - no more staff online." - send2adminirc(full_message) - SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Admin Logout (Game ID: [game_id])", "body" = full_message)) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Admin Logout (Game ID: [game_id])", "body" = "[key_name(src)] logged out - no more staff online.")) if(get_config_value(/decl/config/toggle/delist_when_no_admins) && get_config_value(/decl/config/toggle/hub_visibility)) toggle_config_value(/decl/config/toggle/hub_visibility) - full_message = "Toggled hub visibility. The server is now invisible." - send2adminirc(full_message) - SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Automatic Hub Visibility Toggle (Game ID: [game_id])", "body" = full_message)) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Automatic Hub Visibility Toggle (Game ID: [game_id])", "body" = "Toggled hub visibility. The server is now invisible.")) //checks if a client is afk //3000 frames = 5 minutes diff --git a/code/modules/error_handler/error_reporting.dm b/code/modules/error_handler/error_reporting.dm deleted file mode 100644 index 773920717cb..00000000000 --- a/code/modules/error_handler/error_reporting.dm +++ /dev/null @@ -1,23 +0,0 @@ -// this proc will only work with DEBUG enabled -#ifdef DEBUG - -/hook/roundend/proc/send_runtimes_to_ircbot() - if(!revdata.revision) return // we can't do much useful if we don't know what we are - var/list/errors = list() - for(var/erruid in global.error_cache.error_sources) - var/datum/error_viewer/error_source/e = global.error_cache.error_sources[erruid] - var/datum/error_viewer/error_entry/err = e.errors[1] - - var/data = list( - id = erruid, - name = err.info_name, - info = err.info - ) - - errors[++errors.len] = list2params(data) - - runtimes2irc(list2params(errors), revdata.revision) - - return 1 - -#endif diff --git a/code/modules/ext_scripts/irc.dm b/code/modules/ext_scripts/irc.dm deleted file mode 100644 index 9b1887f118f..00000000000 --- a/code/modules/ext_scripts/irc.dm +++ /dev/null @@ -1,55 +0,0 @@ -/proc/send2irc(var/channel, var/msg) - export2irc(list(type="msg", mesg=msg, chan=channel, pwd=get_config_value(/decl/config/text/comms_password))) - -/proc/export2irc(params) - if(!get_config_value(/decl/config/toggle/use_irc_bot)) - return - var/irc_bot_host = get_config_value(/decl/config/text/irc_bot_host) - if(irc_bot_host) - spawn(-1) // spawn here prevents hanging in the case that the bot isn't reachable - world.Export("http://[irc_bot_host]:45678?[list2params(params)]") - -/proc/runtimes2irc(runtimes, revision) - export2irc(list(pwd=get_config_value(/decl/config/text/comms_password), type="runtime", runtimes=runtimes, revision=revision)) - -/proc/send2mainirc(var/msg) - var/main_irc = get_config_value(/decl/config/text/main_irc) - if(main_irc) - send2irc(main_irc, msg) - return - -/proc/send2adminirc(var/msg) - var/admin_irc = get_config_value(/decl/config/text/admin_irc) - if(admin_irc) - send2irc(admin_irc, msg) - return - -/proc/adminmsg2adminirc(client/source, client/target, msg) - var/admin_irc = get_config_value(/decl/config/text/admin_irc) - if(admin_irc) - var/list/params[0] - - params["pwd"] = get_config_value(/decl/config/text/comms_password) - params["chan"] = admin_irc - params["msg"] = msg - params["src_key"] = source.key - params["src_char"] = source.mob.real_name || source.mob.name - if(!target) - params["type"] = "adminhelp" - else if(istext(target)) - params["type"] = "ircpm" - params["target"] = target - params["rank"] = source.holder ? source.holder.rank : "Player" - else - params["type"] = "adminpm" - params["trg_key"] = target.key - params["trg_char"] = target.mob.real_name || target.mob.name - - export2irc(params) - -/proc/get_world_url() - return "byond://[get_config_value(/decl/config/text/server) || get_config_value(/decl/config/text/serverurl) || "[world.address]:[world.port]"]" - -/hook/startup/proc/ircNotify() - send2mainirc("Server starting up on [get_world_url()]") - return 1 diff --git a/code/modules/holidays/holiday_hook.dm b/code/modules/holidays/holiday_hook.dm index 6b6870c5bb0..231c1a056fd 100644 --- a/code/modules/holidays/holiday_hook.dm +++ b/code/modules/holidays/holiday_hook.dm @@ -1,8 +1,3 @@ -//Uncommenting ALLOW_HOLIDAYS in configuration will enable this hook. -/hook/startup/proc/updateHoliday() - update_holiday() - return TRUE - /proc/update_holiday() if(!get_config_value(/decl/config/toggle/allow_holidays)) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 6e1a7989b71..0d02001ceae 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -2,8 +2,6 @@ // Recruiting observers to play as pAIs -var/global/datum/paiController/paiController // Global handler for pAI candidates - /datum/paiCandidate var/name var/key @@ -14,11 +12,7 @@ var/global/datum/paiController/paiController // Global handler for pAI candida var/chassis = "Drone" var/say_verb = "Robotic" - -/hook/startup/proc/paiControllerSetup() - paiController = new /datum/paiController() - return 1 - +var/global/datum/paiController/paiController = new /datum/paiController() // Global handler for pAI candidates /datum/paiController var/inquirer = null @@ -27,6 +21,10 @@ var/global/datum/paiController/paiController // Global handler for pAI candida var/askDelay = 10 * 60 * 1 // One minute [ms * sec * min] +/datum/paiController/New() + ..() + populate_pai_software_list() + /datum/paiController/Topic(href, href_list[]) if(href_list["download"]) var/datum/paiCandidate/candidate = locate(href_list["candidate"]) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 72c1af676bb..b53b8a9cfe2 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -19,19 +19,18 @@ var/global/list/pai_emotions = list( var/global/list/pai_software_by_key = list() var/global/list/default_pai_software = list() -/hook/startup/proc/populate_pai_software_list() - var/r = 1 // I would use ., but it'd sacrifice runtime detection +/proc/populate_pai_software_list() + pai_software_by_key = list() + default_pai_software = list() for(var/type in subtypesof(/datum/pai_software)) var/datum/pai_software/P = new type() if(pai_software_by_key[P.id]) var/datum/pai_software/O = pai_software_by_key[P.id] - log_error("pAI software module [P.name] has the same key as [O.name]!") - r = 0 + PRINT_STACK_TRACE("pAI software module [type] has the same key ([P.id]) as [O.type] [O.id]!") continue pai_software_by_key[P.id] = P if(P.default) default_pai_software[P.id] = P - return r /mob/living/silicon/pai/proc/paiInterface() ui_interact(src) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index f03372203ad..df2fc50f4b3 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -482,10 +482,6 @@ INITIALIZE_IMMEDIATE(/mob/new_player) /mob/new_player/get_admin_job_string() return "New player" -/hook/roundstart/proc/update_lobby_browsers() - global.using_map.refresh_lobby_browsers() - return TRUE - /mob/new_player/change_mob_type(var/new_type, var/turf/location, var/new_name, var/delete_old_mob = FALSE, var/subspecies) to_chat(usr, SPAN_WARNING("You cannot convert players who have not entered the game yet!")) return FALSE diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 56b086005c7..5cb5d84467e 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -237,13 +237,13 @@ var/global/list/supermatter_delam_accent_sounds = list( else aw_EPR = FALSE -/obj/machinery/power/supermatter/proc/status_adminwarn_check(var/min_status, var/current_state, var/message, var/send_to_irc = FALSE) +/obj/machinery/power/supermatter/proc/status_adminwarn_check(var/min_status, var/current_state, var/message, var/send_webhook = FALSE) var/status = get_status() if(status >= min_status) if(!current_state) log_and_message_admins(message) - if(send_to_irc) - send2adminirc(message) + if(send_webhook) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Supermatter Warning", "body" = message)) return TRUE else return FALSE diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index fa0aaa49977..807c786ed51 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -4,7 +4,7 @@ var/global/list/all_maps = list() var/global/const/MAP_HAS_BRANCH = 1 //Branch system for occupations, togglable var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable -/hook/startup/proc/initialise_map_list() +/proc/initialise_map_list() for(var/type in subtypesof(/datum/map)) var/datum/map/M if(type == global.using_map.type) diff --git a/mods/_modpack.dm b/mods/_modpack.dm index 279002ba251..1e8accdf306 100644 --- a/mods/_modpack.dm +++ b/mods/_modpack.dm @@ -56,6 +56,10 @@ if(length(credits_nouns)) SSlore.credits_nouns |= credits_nouns +/// This runs on-roundstart after roundstart characters have been created. +/decl/modpack/proc/on_roundstart() + return + /decl/modpack/proc/get_membership_perks() return @@ -70,11 +74,11 @@ . = "

Modpacks List



" for(var/modpack in SSmodpacks.loaded_modpacks) var/decl/modpack/M = SSmodpacks.loaded_modpacks[modpack] - + if(M.name) . += "
" . += "
[M.name]
" - + if(M.desc || M.author) . += "
" if(M.desc) diff --git a/mods/content/matchmaking/matchmaker.dm b/mods/content/matchmaking/matchmaker.dm index 0892ba4c827..453d885321c 100644 --- a/mods/content/matchmaking/matchmaker.dm +++ b/mods/content/matchmaking/matchmaker.dm @@ -1,14 +1,12 @@ -var/global/datum/matchmaker/matchmaker = new() - -/hook/roundstart/proc/matchmaking() - matchmaker.do_matchmaking() - return TRUE +/decl/modpack/matchmaking/on_roundstart() + do_matchmaking() -/datum/matchmaker/matchmaker/New() +// It doesn't really matter when this registers during init as long as it's before roundstart. +/decl/modpack/matchmaking/post_initialize() . = ..() events_repository.register_global(/decl/observ/player_latejoin, src, PROC_REF(matchmake_latejoiner)) -/datum/matchmaker/proc/matchmake_latejoiner(mob/living/character, datum/job/job) +/decl/modpack/matchmaking/proc/matchmake_latejoiner(mob/living/character, datum/job/job) if(character.mind && character.client?.prefs.relations.len) for(var/T in character.client.prefs.relations) var/TT = relation_types[T] @@ -30,17 +28,17 @@ var/global/datum/matchmaker/matchmaker = new() QDEL_NULL_LIST(known_connections) . = ..() -/datum/matchmaker +/decl/modpack/matchmaking var/list/relation_types = list() var/list/relations = list() -/datum/matchmaker/New() - ..() +/decl/modpack/matchmaking/Initialize() + . = ..() for(var/T in subtypesof(/datum/relation/)) var/datum/relation/R = T relation_types[initial(R.name)] = T -/datum/matchmaker/proc/do_matchmaking() +/decl/modpack/matchmaking/proc/do_matchmaking() var/list/to_warn = list() for(var/datum/relation/R in relations) if(R.other) @@ -51,13 +49,13 @@ var/global/datum/matchmaker/matchmaker = new() for(var/mob/M in to_warn) to_chat(M,"You have new connections. Use \"See Relationship Info\" to view and finalize them.") -/datum/matchmaker/proc/get_relationships(datum/mind/M, finalized_only) +/decl/modpack/matchmaking/proc/get_relationships(datum/mind/M, finalized_only) . = list() for(var/datum/relation/R in relations) if(R.holder == M && R.other && (R.finalized || !finalized_only)) . += R -/datum/matchmaker/proc/get_relationships_between(datum/mind/holder, datum/mind/target, finalized_only) +/decl/modpack/matchmaking/proc/get_relationships_between(datum/mind/holder, datum/mind/target, finalized_only) . = list() for(var/datum/relation/R in relations) if(R.holder == holder && R.other && R.other.holder == target && (R.finalized || !finalized_only)) @@ -68,6 +66,7 @@ var/global/datum/matchmaker/matchmaker = new() return if(!source.mind || !user.mind || source.name != source.real_name) return + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL if(!length(matchmaker.get_relationships_between(user.mind, source.mind, TRUE))) return return "
You know them. More...
" @@ -89,10 +88,12 @@ var/global/datum/matchmaker/matchmaker = new() ..() if(!can_connect_to) can_connect_to = list(type) + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL matchmaker.relations += src /datum/relation/proc/get_candidates() .= list() + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL for(var/datum/relation/R in matchmaker.relations) if(!valid_candidate(R.holder) || !can_connect(R)) continue @@ -112,6 +113,7 @@ var/global/datum/matchmaker/matchmaker = new() return TRUE /datum/relation/proc/can_connect(var/datum/relation/R) + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL for(var/datum/relation/D in matchmaker.relations) //have to check all connections between us and them if(D.holder == R.holder && D.other && D.other.holder == holder) if(D.type in incompatible) @@ -141,6 +143,7 @@ var/global/datum/matchmaker/matchmaker = new() to_chat(holder.current,"Your connection with [other.holder] is no more.") to_chat(other.holder.current,"Your connection with [holder] is no more.") other.other = null + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL matchmaker.relations -= other matchmaker.relations -= src qdel(other) @@ -187,6 +190,7 @@ var/global/datum/matchmaker/matchmaker = new() set desc = "See what connections between people you know of." set category = "IC" + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL var/list/relations = matchmaker.get_relationships(mind) var/list/dat = list() var/editable = 0 @@ -221,6 +225,7 @@ var/global/datum/matchmaker/matchmaker = new() /mob/living/proc/see_relationship_info_with(var/mob/living/other) if(!other.mind) return + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL var/list/relations = matchmaker.get_relationships(mind,other.mind,TRUE) var/list/dat = list("

[other]

") if(mind.gen_relations_info) @@ -268,6 +273,7 @@ var/global/datum/matchmaker/matchmaker = new() var/ok = "Close anyway" ok = alert("HEY! You have some non-finalized relationships. You can terminate them if they do not fit your character, or edit the info tidbit that the other party is given. THIS IS YOUR ONLY CHANCE to do so - after you close the window, they won't be editable.","Finalize relationships","Return to edit", "Close anyway") if(ok == "Close anyway") + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL var/list/relations = matchmaker.get_relationships(mind) for(var/datum/relation/R in relations) R.finalize() diff --git a/nebula.dme b/nebula.dme index d28a50a9d58..5036830ed67 100644 --- a/nebula.dme +++ b/nebula.dme @@ -241,8 +241,6 @@ #include "code\controllers\communications.dm" #include "code\controllers\controller.dm" #include "code\controllers\failsafe.dm" -#include "code\controllers\hooks-defs.dm" -#include "code\controllers\hooks.dm" #include "code\controllers\master.dm" #include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" @@ -616,7 +614,6 @@ #include "code\datums\proximity_trigger\proximity_trigger.dm" #include "code\datums\proximity_trigger\turf_selection.dm" #include "code\datums\repositories\_defines.dm" -#include "code\datums\repositories\admin_pm.dm" #include "code\datums\repositories\areas.dm" #include "code\datums\repositories\atom_info.dm" #include "code\datums\repositories\attack_logs.dm" @@ -1705,7 +1702,6 @@ #include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" #include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" #include "code\modules\admin\secrets\fun_secrets\waddle.dm" -#include "code\modules\admin\secrets\investigation\admin_pms.dm" #include "code\modules\admin\secrets\investigation\attack_logs.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" @@ -2302,7 +2298,6 @@ #include "code\modules\emotes\definitions\tail.dm" #include "code\modules\emotes\definitions\visible.dm" #include "code\modules\error_handler\error_handler.dm" -#include "code\modules\error_handler\error_reporting.dm" #include "code\modules\error_handler\error_viewer.dm" #include "code\modules\events\ailments.dm" #include "code\modules\events\apc_damage.dm" @@ -2345,7 +2340,6 @@ #include "code\modules\events\trivial_news.dm" #include "code\modules\events\wallrot.dm" #include "code\modules\events\wormholes.dm" -#include "code\modules\ext_scripts\irc.dm" #include "code\modules\fabrication\__fabricator_defines.dm" #include "code\modules\fabrication\_fabricator.dm" #include "code\modules\fabrication\_fabricator_build_order.dm" diff --git a/~code/global_init.dm b/~code/global_init.dm index 00301af2ca2..82950bb246d 100644 --- a/~code/global_init.dm +++ b/~code/global_init.dm @@ -15,7 +15,8 @@ var/global_init = new /datum/global_init() /datum/global_init/New() SSconfiguration.load_all_configuration() - callHook("global_init") + generate_game_id() + makeDatumRefLists() qdel(src) //we're done /datum/global_init/Destroy() From bb79c469c77163ec89f6a1c32d5abf386a2ecfb8 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 5 Dec 2024 19:21:47 -0500 Subject: [PATCH 149/554] Remove redundant multitool extension Topic defines --- code/__defines/topic.dm | 4 +- .../datums/extensions/multitool/_multitool.dm | 3 - .../circuitboards/buildtype_select.dm | 2 +- .../circuitboards/shuttle_console.dm | 6 +- .../multitool/circuitboards/stationalert.dm | 4 +- .../extensions/multitool/items/cable.dm | 2 +- .../multitool/items/stock_parts_radio.dm | 58 +++++++++---------- code/datums/extensions/multitool/multitool.dm | 21 ++++--- .../airlock_controllers_dummy.dm | 6 +- .../embedded_controller_base.dm | 8 +-- nebula.dme | 1 - 11 files changed, 58 insertions(+), 57 deletions(-) delete mode 100644 code/datums/extensions/multitool/_multitool.dm diff --git a/code/__defines/topic.dm b/code/__defines/topic.dm index 74e2ca005f0..219abf3728e 100644 --- a/code/__defines/topic.dm +++ b/code/__defines/topic.dm @@ -2,6 +2,8 @@ #define TOPIC_HANDLED BITFLAG(0) #define TOPIC_REFRESH BITFLAG(1) #define TOPIC_UPDATE_PREVIEW BITFLAG(2) - // use to force a browse() call, unblocking some rsc operations +/// Return this to force a browse() call, unblocking some rsc operations #define TOPIC_HARD_REFRESH BITFLAG(3) +/// Return this to indicate the window associated with this Topic() call should be closed. +#define TOPIC_CLOSE BITFLAG(4) #define TOPIC_REFRESH_UPDATE_PREVIEW (TOPIC_HARD_REFRESH|TOPIC_UPDATE_PREVIEW) diff --git a/code/datums/extensions/multitool/_multitool.dm b/code/datums/extensions/multitool/_multitool.dm deleted file mode 100644 index fd581a007f9..00000000000 --- a/code/datums/extensions/multitool/_multitool.dm +++ /dev/null @@ -1,3 +0,0 @@ -#define MT_NOACTION 0 -#define MT_REFRESH 1 -#define MT_CLOSE 2 diff --git a/code/datums/extensions/multitool/circuitboards/buildtype_select.dm b/code/datums/extensions/multitool/circuitboards/buildtype_select.dm index 703d9c4f3f6..ae95b5cb13a 100644 --- a/code/datums/extensions/multitool/circuitboards/buildtype_select.dm +++ b/code/datums/extensions/multitool/circuitboards/buildtype_select.dm @@ -25,5 +25,5 @@ board.build_path = path var/obj/thing = path board.SetName("circuitboard ([initial(thing.name)])") - return MT_REFRESH + return TOPIC_REFRESH return ..() \ No newline at end of file diff --git a/code/datums/extensions/multitool/circuitboards/shuttle_console.dm b/code/datums/extensions/multitool/circuitboards/shuttle_console.dm index 9e267968246..77ad6c394f3 100644 --- a/code/datums/extensions/multitool/circuitboards/shuttle_console.dm +++ b/code/datums/extensions/multitool/circuitboards/shuttle_console.dm @@ -19,11 +19,11 @@ break if(!new_name) to_chat(user, SPAN_WARNING("No eligible shuttle could be located. Make sure the board is inside a shuttle and try again.")) - return MT_NOACTION + return TOPIC_NOACTION if(!board.is_valid_shuttle(SSshuttle.shuttles[new_name])) to_chat(user, SPAN_WARNING("The current shuttle does not support this console type. Try a different shuttle or circuit board.")) - return MT_NOACTION + return TOPIC_NOACTION board.shuttle_tag = new_name to_chat(user, SPAN_NOTICE("You set the shuttle name to '[new_name]'.")) - return MT_REFRESH + return TOPIC_REFRESH return ..() \ No newline at end of file diff --git a/code/datums/extensions/multitool/circuitboards/stationalert.dm b/code/datums/extensions/multitool/circuitboards/stationalert.dm index e3ec67a2024..209dfba6b73 100644 --- a/code/datums/extensions/multitool/circuitboards/stationalert.dm +++ b/code/datums/extensions/multitool/circuitboards/stationalert.dm @@ -18,12 +18,12 @@ var/datum/alarm_handler/AH = locate(href_list["add"]) in SSalarm.all_handlers if(AH) SA.alarm_handlers |= AH - return MT_REFRESH + return TOPIC_REFRESH if(href_list["remove"]) var/datum/alarm_handler/AH = locate(href_list["remove"]) in SSalarm.all_handlers if(AH) SA.alarm_handlers -= AH - return MT_REFRESH + return TOPIC_REFRESH return ..() diff --git a/code/datums/extensions/multitool/items/cable.dm b/code/datums/extensions/multitool/items/cable.dm index f58fc823297..7f95e27e73e 100644 --- a/code/datums/extensions/multitool/items/cable.dm +++ b/code/datums/extensions/multitool/items/cable.dm @@ -21,6 +21,6 @@ var/obj/item/stack/cable_coil/cable_coil = holder if(href_list["select_color"] && (href_list["select_color"] in get_global_cable_colors())) cable_coil.set_cable_color(href_list["select_color"], user) - return MT_REFRESH + return TOPIC_REFRESH return ..() diff --git a/code/datums/extensions/multitool/items/stock_parts_radio.dm b/code/datums/extensions/multitool/items/stock_parts_radio.dm index ec0b51dc454..e35bf864977 100644 --- a/code/datums/extensions/multitool/items/stock_parts_radio.dm +++ b/code/datums/extensions/multitool/items/stock_parts_radio.dm @@ -49,48 +49,48 @@ var/obj/item/stock_parts/radio/radio = holder if(href_list["unlink"]) machine = null - return MT_CLOSE + return TOPIC_CLOSE if(href_list["frequency"]) var/new_frequency = input(user, "Select a new frequency:", "Frequency Selection", radio.frequency) as null|num if(!new_frequency || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) if(new_frequency == radio.frequency) - return MT_NOACTION + return TOPIC_NOACTION radio.set_frequency(new_frequency, radio.filter) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["id_tag"]) var/new_id_tag = input(user, "Select a new ID:", "ID Selection", radio.id_tag) as null|text if(!new_id_tag || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_id_tag = sanitize(new_id_tag) if(new_id_tag == radio.id_tag) - return MT_NOACTION + return TOPIC_NOACTION radio.set_id_tag(new_id_tag) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["filter"]) var/new_filter = input(user, "Select a new radio filter (usually signals are sent to listeners on your id_tag; this will override that behavior):", "Filter Selection", radio.filter) as null|anything in global.all_selectable_radio_filters if(!new_filter || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION if(new_filter == radio.filter) - return MT_NOACTION + return TOPIC_NOACTION radio.set_frequency(radio.frequency, new_filter) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["encryption"]) var/new_encryption = input(user, "Select a new encryption key:", "Encryption Key Selection", radio.encryption) as null|num if(!new_encryption || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_encryption = sanitize_integer(new_encryption, 0, 999, radio.encryption) if(new_encryption == radio.encryption) - return MT_NOACTION + return TOPIC_NOACTION radio.encryption = new_encryption - return MT_REFRESH + return TOPIC_REFRESH if(href_list["stockreset"]) var/obj/machinery/actual_machine = machine && machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE actual_machine.apply_preset_to(radio) - return MT_REFRESH + return TOPIC_REFRESH // Helper. /datum/extension/interactive/multitool/radio/proc/event_list_to_selection_table(table_tag, list/selected_events) @@ -111,44 +111,44 @@ if(href_list["remove"]) var/thing = href_list["remove"] LAZYREMOVE(selected_events, thing) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["rename"]) var/thing = href_list["rename"] if(selected_events && selected_events[thing]) var/new_name = input(user, "Select a new message key for this item:", "Key Select", thing) as null|text new_name = sanitize(new_name) if(!new_name || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_REFRESH + return TOPIC_REFRESH if(!selected_events || !selected_events[thing]) - return MT_REFRESH + return TOPIC_REFRESH selected_events[new_name] = selected_events[thing] selected_events -= thing - return MT_REFRESH + return TOPIC_REFRESH if(href_list["new_val"]) var/thing = href_list["new_val"] var/decl/public_access/variable = selected_events && selected_events[thing] if(!variable || !LAZYLEN(valid_events)) - return MT_REFRESH + return TOPIC_REFRESH var/valid_variables = list() for(var/path in valid_events) valid_variables += valid_events[path] var/new_var = input(user, "Select a new action for this item:", "Action Select", thing) as null|anything in valid_variables if(!new_var || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_REFRESH + return TOPIC_REFRESH if(!(selected_events && selected_events[thing] == variable)) - return MT_REFRESH + return TOPIC_REFRESH selected_events[thing] = new_var - return MT_REFRESH + return TOPIC_REFRESH if(href_list["add"]) if(!LAZYLEN(valid_events)) - return MT_REFRESH + return TOPIC_REFRESH LAZYSET(selected_events, copytext(md5(num2text(rand(0, 1))), 1, 11), valid_events[pick(valid_events)]) // random key - return MT_REFRESH + return TOPIC_REFRESH if(href_list["desc"]) var/decl/public_access/variable = locate(href_list["desc"]) if(istype(variable)) to_chat(user, variable.desc) - return MT_NOACTION + return TOPIC_NOACTION /datum/extension/interactive/multitool/radio/transmitter/aquire_target() var/obj/machinery/actual_machine = ..() @@ -178,7 +178,7 @@ return var/obj/machinery/actual_machine = machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE var/obj/item/stock_parts/radio/transmitter/basic/radio = holder if(href_list["on_change"]) return event_list_topic(radio.transmit_on_change, actual_machine.public_variables, user, href_list) @@ -216,7 +216,7 @@ return var/obj/machinery/actual_machine = machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE var/obj/item/stock_parts/radio/transmitter/on_event/radio = holder if(href_list["on_event"]) @@ -257,7 +257,7 @@ return var/obj/machinery/actual_machine = machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE var/obj/item/stock_parts/radio/receiver/radio = holder if(href_list["call"]) return event_list_topic(radio.receive_and_call, actual_machine.public_methods, user, href_list) diff --git a/code/datums/extensions/multitool/multitool.dm b/code/datums/extensions/multitool/multitool.dm index 08e98ebe7eb..7327f919da9 100644 --- a/code/datums/extensions/multitool/multitool.dm +++ b/code/datums/extensions/multitool/multitool.dm @@ -45,26 +45,29 @@ . = send_buffer(M, buffer, user) else if(href_list["purge"]) M.set_buffer(null) - . = MT_REFRESH + . = TOPIC_REFRESH else . = on_topic(href, href_list, user) - switch(.) - if(MT_REFRESH) - interact(M, user) - if(MT_CLOSE) - close_window(user) - return MT_NOACTION ? FALSE : TRUE + if(. & TOPIC_CLOSE) + close_window(user) + return TOPIC_HANDLED // don't run any other Topic() behavior for this call + else if(. & TOPIC_REFRESH) + interact(M, user) + return TOPIC_HANDLED // don't return TOPIC_REFRESH to avoid any potential double-refreshes + else if(!.) + return TOPIC_NOACTION + return TOPIC_REFRESH /datum/extension/interactive/multitool/proc/on_topic(href, href_list, user) - return MT_NOACTION + return TOPIC_NOACTION /datum/extension/interactive/multitool/proc/send_buffer(var/obj/item/multitool/M, var/atom/buffer, var/mob/user) if(M.get_buffer() == buffer && buffer) receive_buffer(M, buffer, user) else if(!buffer) to_chat(user, "Unable to acquire data from the buffered object. Purging from memory.") - return MT_REFRESH + return TOPIC_REFRESH /datum/extension/interactive/multitool/proc/receive_buffer(var/obj/item/multitool/M, var/atom/buffer, var/mob/user) return \ No newline at end of file diff --git a/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm b/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm index f187d98f09c..dabbb7680fb 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm @@ -132,12 +132,12 @@ if(href_list["input_tag"]) var/new_tag = input(user, "Enter the tag of the controller to connect to.", "Tag Selection", terminal.id_tag) as text|null if(extension_status(user) != STATUS_INTERACTIVE) - return MT_NOACTION + return TOPIC_NOACTION new_tag = sanitize_name(new_tag, MAX_MESSAGE_LEN, TRUE, FALSE) if(new_tag) terminal.id_tag = new_tag terminal.setup_target_controller() - return MT_REFRESH + return TOPIC_REFRESH if(istext(href_list["set_tag"])) var/new_tag = href_list["set_tag"] @@ -145,6 +145,6 @@ if(new_tag) terminal.id_tag = new_tag terminal.setup_target_controller() - return MT_REFRESH + return TOPIC_REFRESH return ..() diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index bfdbc356c44..2f893501f6e 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -174,20 +174,20 @@ if(href_list["set_tag"]) var/new_tag = input(user, "Enter a new tag to use. Warning: this will reset all tags used by this machine, not just the main one!", "Tag Selection", controller.id_tag) as text|null if(extension_status(user) != STATUS_INTERACTIVE) - return MT_NOACTION + return TOPIC_NOACTION new_tag = sanitize_name(new_tag, MAX_MESSAGE_LEN, TRUE, FALSE) if(new_tag) controller.reset_id_tags(new_tag) controller.set_frequency(controller.frequency) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["set_freq"]) var/new_frequency = input(user, "Enter a new frequency to use.", "frequency Selection", controller.frequency) as num|null if(!new_frequency || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) controller.set_frequency(new_frequency) - return MT_REFRESH + return TOPIC_REFRESH /decl/stock_part_preset/radio/receiver/vent_pump/airlock frequency = EXTERNAL_AIR_FREQ diff --git a/nebula.dme b/nebula.dme index 5036830ed67..c3058b700c4 100644 --- a/nebula.dme +++ b/nebula.dme @@ -449,7 +449,6 @@ #include "code\datums\extensions\eye\landing.dm" #include "code\datums\extensions\holster\holster.dm" #include "code\datums\extensions\milkable\milkable.dm" -#include "code\datums\extensions\multitool\_multitool.dm" #include "code\datums\extensions\multitool\multitool.dm" #include "code\datums\extensions\multitool\store.dm" #include "code\datums\extensions\multitool\circuitboards\buildtype_select.dm" From 7635c33395e9f210636631147f84e5dcc24672fe Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 5 Dec 2024 20:30:33 -0500 Subject: [PATCH 150/554] Consolidate ghost mob files with only one proc each --- code/modules/mob/observer/ghost/ghost.dm | 18 ++++++++++++++++++ code/modules/mob/observer/ghost/login.dm | 6 ------ code/modules/mob/observer/ghost/logout.dm | 5 ----- code/modules/mob/observer/ghost/say.dm | 2 -- nebula.dme | 3 --- 5 files changed, 18 insertions(+), 16 deletions(-) delete mode 100644 code/modules/mob/observer/ghost/login.dm delete mode 100644 code/modules/mob/observer/ghost/logout.dm delete mode 100644 code/modules/mob/observer/ghost/say.dm diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index acf4b0af582..b6c2f5f18be 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -626,3 +626,21 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghost_all_access = new if(!is_type_in_list(ghost_all_access, exceptions)) LAZYDISTINCTADD(., ghost_all_access) + +/mob/observer/ghost/Login() + ..() + if (ghost_image) + ghost_image.appearance = src + ghost_image.appearance_flags = RESET_ALPHA + SSghost_images.queue_image_update(src) + +/mob/observer/ghost/proc/check_existence_failure() + if(!QDELETED(src) && !key) //we've transferred to another mob. This ghost should be deleted. + qdel(src) + +/mob/observer/ghost/Logout() + ..() + addtimer(CALLBACK(src, PROC_REF(check_existence_failure)), 0) + +/mob/observer/ghost/say(var/message) + sanitize_and_communicate(/decl/communication_channel/dsay, client, message) diff --git a/code/modules/mob/observer/ghost/login.dm b/code/modules/mob/observer/ghost/login.dm deleted file mode 100644 index f8be3dd4671..00000000000 --- a/code/modules/mob/observer/ghost/login.dm +++ /dev/null @@ -1,6 +0,0 @@ -/mob/observer/ghost/Login() - ..() - if (ghost_image) - ghost_image.appearance = src - ghost_image.appearance_flags = RESET_ALPHA - SSghost_images.queue_image_update(src) diff --git a/code/modules/mob/observer/ghost/logout.dm b/code/modules/mob/observer/ghost/logout.dm deleted file mode 100644 index 7c125cef367..00000000000 --- a/code/modules/mob/observer/ghost/logout.dm +++ /dev/null @@ -1,5 +0,0 @@ -/mob/observer/ghost/Logout() - ..() - spawn(0) - if(src && !key) //we've transferred to another mob. This ghost should be deleted. - qdel(src) diff --git a/code/modules/mob/observer/ghost/say.dm b/code/modules/mob/observer/ghost/say.dm deleted file mode 100644 index f30f4a672c1..00000000000 --- a/code/modules/mob/observer/ghost/say.dm +++ /dev/null @@ -1,2 +0,0 @@ -/mob/observer/ghost/say(var/message) - sanitize_and_communicate(/decl/communication_channel/dsay, client, message) diff --git a/nebula.dme b/nebula.dme index c3058b700c4..a48e4415c23 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3089,9 +3089,6 @@ #include "code\modules\mob\observer\eye\freelook\ai\update_triggers.dm" #include "code\modules\mob\observer\ghost\follow.dm" #include "code\modules\mob\observer\ghost\ghost.dm" -#include "code\modules\mob\observer\ghost\login.dm" -#include "code\modules\mob\observer\ghost\logout.dm" -#include "code\modules\mob\observer\ghost\say.dm" #include "code\modules\mob\observer\virtual\_constants.dm" #include "code\modules\mob\observer\virtual\base.dm" #include "code\modules\mob\observer\virtual\helpers.dm" From da2fbfc1566d0bc7060b413a1309111efe8c5594 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 5 Dec 2024 22:01:24 -0500 Subject: [PATCH 151/554] Remove unused item worth define --- code/modules/item_worth/_helpers.dm | 3 --- nebula.dme | 1 - 2 files changed, 4 deletions(-) delete mode 100644 code/modules/item_worth/_helpers.dm diff --git a/code/modules/item_worth/_helpers.dm b/code/modules/item_worth/_helpers.dm deleted file mode 100644 index 8841debc67a..00000000000 --- a/code/modules/item_worth/_helpers.dm +++ /dev/null @@ -1,3 +0,0 @@ -//Workaround by Ginja due to the fact initial(parent_type) does not work. - -#define PARENT(x) text2path(replacetext("[x]", regex("/\[^/\]+$"), "")) \ No newline at end of file diff --git a/nebula.dme b/nebula.dme index a48e4415c23..2033d9acb32 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2630,7 +2630,6 @@ #include "code\modules\item_effects\item_effect_charges.dm" #include "code\modules\item_effects\item_effect_debug.dm" #include "code\modules\item_effects\item_effect_item.dm" -#include "code\modules\item_worth\_helpers.dm" #include "code\modules\keybindings\_defines.dm" #include "code\modules\keybindings\_keybindings.dm" #include "code\modules\keybindings\admin.dm" From 0b9bea4cbe068eb6ffcddaf8a1c6ec7634f627e2 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 11 Dec 2024 01:51:16 -0500 Subject: [PATCH 152/554] Bump Del count for comments --- test/check-paths.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/check-paths.sh b/test/check-paths.sh index 77f46145433..64ca05563de 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -24,7 +24,7 @@ exactly() { # exactly N name search [mode] [filter] # With the potential exception of << if you increase any of these numbers you're probably doing it wrong # Additional exception August 2020: \b is a regex symbol as well as a BYOND macro. exactly 1 "escapes" '\\\\(red|blue|green|black|b|i[^mc])' -exactly 6 "Del()s" '\WDel\(' +exactly 8 "Del()s" '\WDel\(' exactly 2 "/atom text paths" '"/atom' exactly 2 "/area text paths" '"/area' exactly 2 "/datum text paths" '"/datum' From 2d69b12ab4403df901cc00b341a97a7da13c743e Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 11 Dec 2024 01:51:31 -0500 Subject: [PATCH 153/554] Add guard for mobs destroyed in handle_environment --- code/modules/mob/living/life.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index e73ef41b016..22631be2091 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -23,6 +23,8 @@ //Handle temperature/pressure differences between body and environment handle_environment(loc.return_air()) + if(QDELETED(src)) // Destroyed by fire or pressure damage in handle_environment() + return PROCESS_KILL handle_regular_status_updates() // Status & health update, are we dead or alive etc. handle_stasis() From 38aa9d3ed745366ed1caa444fe573a743107af52 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 12 Dec 2024 17:27:11 -0500 Subject: [PATCH 154/554] Adjust counts in check-paths.sh --- test/check-paths.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/check-paths.sh b/test/check-paths.sh index 64ca05563de..dcf902b9335 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -32,12 +32,12 @@ exactly 2 "/mob text paths" '"/mob' exactly 6 "/obj text paths" '"/obj' exactly 10 "/turf text paths" '"/turf' exactly 1 "world<< uses" 'world<<|world[[:space:]]<<' -exactly 93 "'in world' uses" 'in world' +exactly 90 "'in world' uses" 'in world' exactly 1 "world.log<< uses" 'world.log<<|world.log[[:space:]]<<' exactly 18 "<< uses" '(?> uses" '>>(?!>)' -P exactly 0 "incorrect indentations" '^( {4,})' -P -exactly 24 "text2path uses" 'text2path' +exactly 22 "text2path uses" 'text2path' exactly 4 "update_icon() override" '/update_icon\((.*)\)' -P exactly 0 "goto uses" 'goto ' exactly 9 "atom/New uses" '^/(obj|atom|area|mob|turf).*/New\(' From c252f04be75508e97487b7225919972fc53f9450 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 13 Dec 2024 18:05:46 +1100 Subject: [PATCH 155/554] Reloacing/cleaning up some bodytype logic. --- .../_bodytype.dm} | 196 +++++++++++------- .../bodytype_abilities.dm} | 0 .../bodytype_crystalline.dm} | 0 .../bodytype_helpers.dm} | 7 +- .../bodytype_offsets.dm} | 0 .../bodytype_prosthetic.dm} | 44 ++-- .../bodytype_prosthetic_models.dm} | 0 .../bodytype_quadruped.dm} | 0 .../bodytype_random.dm} | 0 code/modules/mob/living/human/update_icons.dm | 2 +- code/modules/mob/living/life.dm | 2 +- .../organs/external/_external_icons.dm | 4 +- code/modules/organs/internal/eyes.dm | 4 +- .../_prosthetics.dm => organ_prosthetics.dm} | 0 code/modules/species/species_getters.dm | 3 - .../species/species_shapeshifter_bodytypes.dm | 5 +- .../species/station/human_bodytypes.dm | 2 +- .../unathi/datum/species_bodytypes.dm | 2 +- mods/species/drakes/species.dm | 3 - mods/species/drakes/species_bodytypes.dm | 1 + nebula.dme | 20 +- 21 files changed, 169 insertions(+), 126 deletions(-) rename code/modules/{species/species_bodytype.dm => bodytype/_bodytype.dm} (82%) rename code/modules/{species/species_bodytype_abilities.dm => bodytype/bodytype_abilities.dm} (100%) rename code/modules/{species/species_crystalline_bodytypes.dm => bodytype/bodytype_crystalline.dm} (100%) rename code/modules/{species/species_bodytype_helpers.dm => bodytype/bodytype_helpers.dm} (96%) rename code/modules/{species/species_bodytype_offsets.dm => bodytype/bodytype_offsets.dm} (100%) rename code/modules/{organs/prosthetics/prosthetics_manufacturer.dm => bodytype/bodytype_prosthetic.dm} (70%) rename code/modules/{organs/prosthetics/prosthetics_manufacturer_models.dm => bodytype/bodytype_prosthetic_models.dm} (100%) rename code/modules/{species/species_bodytype_quadruped.dm => bodytype/bodytype_quadruped.dm} (100%) rename code/modules/{species/species_bodytype_random.dm => bodytype/bodytype_random.dm} (100%) rename code/modules/organs/{prosthetics/_prosthetics.dm => organ_prosthetics.dm} (100%) diff --git a/code/modules/species/species_bodytype.dm b/code/modules/bodytype/_bodytype.dm similarity index 82% rename from code/modules/species/species_bodytype.dm rename to code/modules/bodytype/_bodytype.dm index 95394d64551..ec0d6033d5f 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/bodytype/_bodytype.dm @@ -4,70 +4,89 @@ var/global/list/bodytypes_by_category = list() decl_flags = DECL_FLAG_MANDATORY_UID abstract_type = /decl/bodytype /// Name used in general. - var/name = "default" + var/name = "default" /// Name used in preference bodytype selection. Defaults to name. var/pref_name /// Seen when examining a prosthetic limb, if non-null. var/desc + /// The base 'standard' icon set for this bodytype's organs. var/icon_base + /// A variant on icon_base for used when a limb has the mutated status. var/icon_deformed + /// An icon used to draw from for cosmetic sprite accessories. var/cosmetics_icon + /// A set of overlays to draw from when a limb has been bandaged. TODO: merge with bandage markings. var/bandages_icon - var/bodytype_flag = BODY_EQUIP_FLAG_HUMANOID - var/bodytype_category = BODYTYPE_OTHER - var/limb_icon_intensity = 1.5 + /// A flag used on clothing to determine if this bodytype can wear a given clothing item. + var/bodytype_flag = BODY_EQUIP_FLAG_HUMANOID + /// A general label for bodytypes. + var/bodytype_category = BODYTYPE_OTHER + /// A general intensity value applied to limbs during apply_limb_colouration(). + var/limb_icon_intensity + /// A set of states to use when rendering blood over the top of worn clothing. TODO: move this to item icons. var/blood_overlays - var/vulnerable_location = BP_GROIN //organ tag that can be kicked for increased pain, previously `sexybits_location`. - var/limb_blend = ICON_ADD - var/damage_overlays = 'icons/mob/human_races/species/default_damage_overlays.dmi' - var/husk_icon = 'icons/mob/human_races/species/default_husk.dmi' - var/skeletal_icon = 'icons/mob/human_races/species/human/skeleton.dmi' - var/icon_template = 'icons/mob/human_races/species/template.dmi' // Used for mob icon generation for non-32x32 species. - var/ignited_icon = 'icons/mob/OnFire.dmi' + /// An organ tag that can be kicked for increased pain, previously `sexybits_location`. + var/vulnerable_location = BP_GROIN + /// What blend mode should be used when drawing this limb icon? + var/limb_blend = ICON_ADD + /// A set of base icons used to generate damaged states for brute/burn injuries to limbs. + var/damage_overlays = 'icons/mob/human_races/species/default_damage_overlays.dmi' + /// An overlay applied when a mob is 'husked' via burn damage. + var/husk_icon = 'icons/mob/human_races/species/default_husk.dmi' + /// An alternate icon set to use when a mob or organ has been skeletonised. + var/skeletal_icon = 'icons/mob/human_races/species/human/skeleton.dmi' + /// Used for mob icon generation for non-32x32 species. + var/icon_template = 'icons/mob/human_races/species/template.dmi' + /// Drawn over a mob when the mob is on fire. + var/ignited_icon = 'icons/mob/OnFire.dmi' + /// Drawn over mob bodyparts when they are surgically open/retracted. + var/surgery_overlay_icon = 'icons/mob/surgery.dmi' + /// Used to retrieve bodytypes by pronoun type in get_bodytype_by_pronouns() var/associated_gender - var/appearance_flags = 0 // Appearance/display related features. - - /// Used when filing your nails. + /// Appearance/display related features. + var/appearance_flags = 0 + /// What noun is used when filing your nails? var/nail_noun /// What tech levels should limbs of this type use/need? - var/limb_tech = @'{"biotech":2}' - var/icon_cache_uid + var/limb_tech = @'{"biotech":2}' /// Determines if eyes should render on heads using this bodytype. - var/has_eyes = TRUE + var/has_eyes = TRUE /// Prefixed to the initial name of the limb, if non-null. var/modifier_string /// Modifies min and max broken damage for the limb. - var/hardiness = 1 + var/hardiness = 1 /// Applies a slowdown value to this limb. - var/movement_slowdown = 0 + var/movement_slowdown = 0 /// Determines if this bodytype can be repaired by nanopaste, sparks when damaged, can malfunction, and can take EMP damage. - var/is_robotic = FALSE + var/is_robotic = FALSE /// For hands, determines the dexterity value passed to get_manual_dexterity(). If null, defers to species. - var/manual_dexterity = null + var/manual_dexterity = null /// Determines how the limb behaves with regards to manual attachment/detachment. - var/modular_limb_tier = MODULAR_BODYPART_INVALID - // Expected organ types per category, used only for stance checking at time of writing. - var/list/organs_by_category = list() - // Expected organ tags per category, used only for stance checking at time of writing. - var/list/organ_tags_by_category = list() - + var/modular_limb_tier = MODULAR_BODYPART_INVALID + /// Expected organ types per category, used only for stance checking at time of writing. + VAR_PRIVATE/list/_organs_by_category + /// Expected organ tags per category, used only for stance checking at time of writing. + VAR_PRIVATE/list/_organ_tags_by_category + /// A set of slot strings to modifier strings, used to modify clothing if the state is available in the icon. var/list/onmob_state_modifiers + /// An intensity value applied to limbs with this bodytype when creating the health status indicator HUD element. var/health_hud_intensity = 1 - - var/pixel_offset_x = 0 // Used for offsetting large icons. - var/pixel_offset_y = 0 // Used for offsetting large icons. - var/pixel_offset_z = 0 // Used for offsetting large icons. - - var/antaghud_offset_x = 0 // As above, but specifically for the antagHUD indicator. - var/antaghud_offset_y = 0 // As above, but specifically for the antagHUD indicator. - - var/eye_offset = 0 // Amount to shift eyes on the Y axis to correct for non-32px height. - - var/z_flags = 0 - - var/list/prone_overlay_offset = list(0, 0) // amount to shift overlays when lying - - // Per-bodytype per-zone message strings, see /mob/proc/get_hug_zone_messages + /// Used for offsetting large icons. + var/pixel_offset_x = 0 + /// Used for offsetting large icons. + var/pixel_offset_y = 0 + /// Used for offsetting large icons. + var/pixel_offset_z = 0 + /// Used to offset the antagHUD indicator for wide or tall mobs. + var/antaghud_offset_x = 0 + /// Used to offset the antagHUD indicator for wide or tall mobs. + var/antaghud_offset_y = 0 + /// Used to apply flags like WIDE_LOAD to nonstandard mobs. + var/z_flags = 0 + /// Amount to shift overlays when lying. TODO: check if this is still needed with KEEP_TOGETHER + var/list/prone_overlay_offset + + /// Per-bodytype per-zone message strings, see /mob/proc/get_hug_zone_messages var/list/default_hug_message var/list/hug_messages = list( BP_L_HAND = list( @@ -88,6 +107,7 @@ var/global/list/bodytypes_by_category = list() ) ) + /// For emotes that check bodytypes for sounds, this list will partially override the general emote_sounds list. var/list/override_emote_sounds = list( "cough" = list( 'sound/voice/emotes/f_cougha.ogg', @@ -97,6 +117,8 @@ var/global/list/bodytypes_by_category = list() 'sound/voice/emotes/f_sneeze.ogg' ) ) + + /// Provides bodytype-specific sounds to emote that need them. var/list/emote_sounds = list( "whistle" = list('sound/voice/emotes/longwhistle.ogg'), "qwhistle" = list('sound/voice/emotes/shortwhistle.ogg'), @@ -106,24 +128,26 @@ var/global/list/bodytypes_by_category = list() var/list/broadcast_emote_sounds = list( "swhistle" = list('sound/voice/emotes/summon_whistle.ogg') ) + + /// Sounds that play when a mob with this bodytype goes prone. var/list/bodyfall_sounds = list( 'sound/foley/meat1.ogg', 'sound/foley/meat2.ogg' ) // Used for initializing prefs/preview - var/base_color = COLOR_BLACK - var/base_eye_color = COLOR_BLACK + var/base_color = COLOR_BLACK + var/base_eye_color = COLOR_BLACK /// Used to initialize organ material var/organ_material = /decl/material/solid/organic/meat /// Used to initialize organ matter - var/list/matter = null + var/list/matter /// The reagent organs are filled with, which currently affects what mobs that eat the organ will receive. /// TODO: Remove this in a later matter edibility refactor. var/edible_reagent = /decl/material/solid/organic/meat /// A bitfield representing various bodytype-specific features. - var/body_flags = 0 + var/body_flags = 0 /// Used to modify the arterial_bleed_severity of organs. var/arterial_bleed_multiplier = 1 /// Associative list of organ_tag = "encased value". If set, sets the organ's encased var to the corresponding value; used in surgery. @@ -167,53 +191,66 @@ var/global/list/bodytypes_by_category = list() var/vision_organ /// If set, an organ with this tag is required for breathing var/breathing_organ - - var/list/override_organ_types // Used for species that only need to change one or two entries in has_organ. - + /// Used for species that only need to change one or two entries in has_organ. + var/list/override_organ_types + /// Used for comparing ages between mobs. var/age_descriptor = /datum/appearance_descriptor/age + /// Used for comparing various cosmetic properties between mobs. var/list/appearance_descriptors = list( /datum/appearance_descriptor/height = 1, /datum/appearance_descriptor/build = 1 ) - /// Losing an organ from this list will give a grace period of `vital_organ_failure_death_delay` then kill the mob. var/list/vital_organs = list(BP_BRAIN) /// The grace period before mob death when an organ in `vital_organs` is lost var/vital_organ_failure_death_delay = 25 SECONDS + /// The relative size of a mob. Consistent with ITEM_SIZE defines. var/mob_size = MOB_SIZE_MEDIUM - + /// A list of sprite accessories applied to this mob by default. var/list/default_sprite_accessories // Darksight handling /// Fractional multiplier (0 to 1) for the base alpha of the darkness overlay. A value of 1 means darkness is completely invisible. - var/eye_base_low_light_vision = 0 + var/eye_base_low_light_vision = 0 /// The lumcount (turf luminosity) threshold under which adaptive low light vision will begin processing. - var/eye_low_light_vision_threshold = 0.3 + var/eye_low_light_vision_threshold = 0.3 /// Fractional multiplier for the overall effectiveness of low light vision for this species. Caps the final alpha value of the darkness plane. - var/eye_low_light_vision_effectiveness = 0 + var/eye_low_light_vision_effectiveness = 0 /// The rate at which low light vision adjusts towards the final value, as a fractional multiplier of the difference between the current and target alphas. ie. set to 0.15 for a 15% shift towards the target value each tick. var/eye_low_light_vision_adjustment_speed = 0.15 + /// How many tiles can this mob see in the dark? Note that degree of visibility is determined by low light vision vars above, this is just the radius. + var/eye_darksight_range = 2 - // Other eye vars. - var/eye_contaminant_guard = 0 + /// Do the eyes of this bodytype protect against chlorine and such? + var/eye_contaminant_guard = 0 + /// Are the eyes of this bodytype resistant to flashes? var/eye_innate_flash_protection = FLASH_PROTECTION_NONE - var/eye_icon = 'icons/mob/human_races/species/default_eyes.dmi' - var/apply_eye_colour = TRUE - var/eye_darksight_range = 2 - var/eye_blend = ICON_ADD + /// Icon to draw eye overlays from. + var/eye_icon = 'icons/mob/human_races/species/default_eyes.dmi' + /// Do the eyes of this mob apply a pref colour like hair? + var/apply_eye_colour = TRUE + /// What blend mode is used to draw eyes onto the mob? + var/eye_blend = ICON_ADD /// Stun from blindness modifier. - var/eye_flash_mod = 1 + var/eye_flash_mod = 1 // Bodytype temperature damage thresholds. - var/cold_level_1 = 243 // Cold damage level 1 below this point. -30 Celsium degrees - var/cold_level_2 = 200 // Cold damage level 2 below this point. - var/cold_level_3 = 120 // Cold damage level 3 below this point. - var/heat_level_1 = 360 // Heat damage level 1 above this point. - var/heat_level_2 = 400 // Heat damage level 2 above this point. - var/heat_level_3 = 1000 // Heat damage level 3 above this point. - - // Temperature comfort levels and strings. + /// Cold damage level 1 below this point. -30 Celsium degrees + var/cold_level_1 = 243 + /// Cold damage level 2 below this point. + var/cold_level_2 = 200 + /// Cold damage level 3 below this point. + var/cold_level_3 = 120 + /// Heat damage level 1 above this point. + var/heat_level_1 = 360 + /// Heat damage level 2 above this point. + var/heat_level_2 = 400 + /// Heat damage level 3 above this point. + var/heat_level_3 = 1000 + + // Above this point, discomfort strings will be shown. var/heat_discomfort_level = 315 + // Below this point, discomfort strings will be shown. var/cold_discomfort_level = 285 /// Aesthetic messages about feeling warm. var/list/heat_discomfort_strings = list( @@ -372,15 +409,19 @@ var/global/list/bodytypes_by_category = list() organ_data["descriptor"] = initial(organ.name) var/organ_cat = initial(organ.organ_category) if(organ_cat) - LAZYADD(organs_by_category[organ_cat], organ) - LAZYADD(organ_tags_by_category[organ_cat], organ_tag) + LAZYINITLIST(_organs_by_category) + LAZYADD(_organs_by_category[organ_cat], organ) + LAZYINITLIST(_organ_tags_by_category) + LAZYADD(_organ_tags_by_category[organ_cat], organ_tag) for(var/organ_tag in has_organ) var/obj/item/organ/organ = has_organ[organ_tag] var/organ_cat = initial(organ.organ_category) if(organ_cat) - LAZYADD(organs_by_category[organ_cat], organ) - LAZYADD(organ_tags_by_category[organ_cat], organ_tag) + LAZYINITLIST(_organs_by_category) + LAZYADD(_organs_by_category[organ_cat], organ) + LAZYINITLIST(_organ_tags_by_category) + LAZYADD(_organ_tags_by_category[organ_cat], organ_tag) if(LAZYLEN(appearance_descriptors)) for(var/desctype in appearance_descriptors) @@ -394,13 +435,18 @@ var/global/list/bodytypes_by_category = list() appearance_descriptors.Insert(1, age.name) appearance_descriptors[age.name] = age +/decl/bodytype/proc/get_expected_organ_tags_for_category(var/category) + return LAZYACCESS(_organ_tags_by_category, category) + /decl/bodytype/proc/get_expected_organ_count_for_categories(var/list/categories) . = 0 for(var/category in categories) - if(category && (category in organs_by_category)) - . += length(organs_by_category[category]) + if(category && (category in _organs_by_category)) + . += length(_organs_by_category[category]) /decl/bodytype/proc/apply_limb_colouration(var/obj/item/organ/external/E, var/icon/applying) + if(!isnull(limb_icon_intensity)) + applying.SetIntensity(limb_icon_intensity) return applying /decl/bodytype/proc/check_dismember_type_override(var/disintegrate) diff --git a/code/modules/species/species_bodytype_abilities.dm b/code/modules/bodytype/bodytype_abilities.dm similarity index 100% rename from code/modules/species/species_bodytype_abilities.dm rename to code/modules/bodytype/bodytype_abilities.dm diff --git a/code/modules/species/species_crystalline_bodytypes.dm b/code/modules/bodytype/bodytype_crystalline.dm similarity index 100% rename from code/modules/species/species_crystalline_bodytypes.dm rename to code/modules/bodytype/bodytype_crystalline.dm diff --git a/code/modules/species/species_bodytype_helpers.dm b/code/modules/bodytype/bodytype_helpers.dm similarity index 96% rename from code/modules/species/species_bodytype_helpers.dm rename to code/modules/bodytype/bodytype_helpers.dm index bff05c2fa81..53e30984d13 100644 --- a/code/modules/species/species_bodytype_helpers.dm +++ b/code/modules/bodytype/bodytype_helpers.dm @@ -5,9 +5,7 @@ return "Standing" /decl/bodytype/proc/get_icon_cache_uid(var/mob/H) - if(!icon_cache_uid) - icon_cache_uid = "[sequential_id(/decl/bodytype)]" - return icon_cache_uid + return uid /decl/bodytype/proc/get_bandages_icon(var/mob/living/human/H) return bandages_icon @@ -85,3 +83,6 @@ /decl/bodytype/proc/adjust_status(mob/living/target, condition, amount) return amount + +/decl/bodytype/proc/get_surgery_overlay_icon(var/mob/living/user) + return surgery_overlay_icon diff --git a/code/modules/species/species_bodytype_offsets.dm b/code/modules/bodytype/bodytype_offsets.dm similarity index 100% rename from code/modules/species/species_bodytype_offsets.dm rename to code/modules/bodytype/bodytype_offsets.dm diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm b/code/modules/bodytype/bodytype_prosthetic.dm similarity index 70% rename from code/modules/organs/prosthetics/prosthetics_manufacturer.dm rename to code/modules/bodytype/bodytype_prosthetic.dm index 91915558ed6..c01812a7578 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm +++ b/code/modules/bodytype/bodytype_prosthetic.dm @@ -1,19 +1,20 @@ /decl/bodytype/prosthetic - abstract_type = /decl/bodytype/prosthetic - icon_base = 'icons/mob/human_races/cyberlimbs/robotic.dmi' - desc = "A generic unbranded robotic prosthesis." - limb_tech = @'{"engineering":1,"materials":1,"magnets":1}' - modifier_string = "robotic" - is_robotic = TRUE - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_EAT - organ_material = /decl/material/solid/metal/steel - appearance_flags = HAS_EYE_COLOR - eye_flash_mod = 1 - eye_darksight_range = 2 - associated_gender = null + abstract_type = /decl/bodytype/prosthetic + icon_base = 'icons/mob/human_races/cyberlimbs/robotic.dmi' + surgery_overlay_icon = null + desc = "A generic unbranded robotic prosthesis." + limb_tech = @'{"engineering":1,"materials":1,"magnets":1}' + modifier_string = "robotic" + is_robotic = TRUE + body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_EAT + organ_material = /decl/material/solid/metal/steel + appearance_flags = HAS_EYE_COLOR + eye_flash_mod = 1 + eye_darksight_range = 2 + associated_gender = null edible_reagent = null emote_sounds = list( - "whistle" = list('sound/voice/emotes/longwhistle_robot.ogg'), + "whistle" = list('sound/voice/emotes/longwhistle_robot.ogg'), "qwhistle" = list('sound/voice/emotes/shortwhistle_robot.ogg'), "swhistle" = list('sound/voice/emotes/summon_whistle_robot.ogg'), "wwhistle" = list('sound/voice/emotes/wolfwhistle_robot.ogg') @@ -38,17 +39,20 @@ BP_EYES = /obj/item/organ/internal/eyes, BP_CELL = /obj/item/organ/internal/cell ) - cold_level_1 = SYNTH_COLD_LEVEL_1 - cold_level_2 = SYNTH_COLD_LEVEL_2 - cold_level_3 = SYNTH_COLD_LEVEL_3 - heat_level_1 = SYNTH_HEAT_LEVEL_1 - heat_level_2 = SYNTH_HEAT_LEVEL_2 - heat_level_3 = SYNTH_HEAT_LEVEL_3 + cold_discomfort_strings = null - heat_discomfort_level = 373.15 + cold_level_1 = SYNTH_COLD_LEVEL_1 + cold_level_2 = SYNTH_COLD_LEVEL_2 + cold_level_3 = SYNTH_COLD_LEVEL_3 + + heat_level_1 = SYNTH_HEAT_LEVEL_1 + heat_level_2 = SYNTH_HEAT_LEVEL_2 + heat_level_3 = SYNTH_HEAT_LEVEL_3 + heat_discomfort_level = 373.15 heat_discomfort_strings = list( "You are dangerously close to overheating!" ) + /// Determines which bodyparts can use this limb. var/list/applies_to_part /// Prosthetics of this type are not available in chargen unless the map has the required tech level. diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm b/code/modules/bodytype/bodytype_prosthetic_models.dm similarity index 100% rename from code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm rename to code/modules/bodytype/bodytype_prosthetic_models.dm diff --git a/code/modules/species/species_bodytype_quadruped.dm b/code/modules/bodytype/bodytype_quadruped.dm similarity index 100% rename from code/modules/species/species_bodytype_quadruped.dm rename to code/modules/bodytype/bodytype_quadruped.dm diff --git a/code/modules/species/species_bodytype_random.dm b/code/modules/bodytype/bodytype_random.dm similarity index 100% rename from code/modules/species/species_bodytype_random.dm rename to code/modules/bodytype/bodytype_random.dm diff --git a/code/modules/mob/living/human/update_icons.dm b/code/modules/mob/living/human/update_icons.dm index d1c508dcd44..34fcb8ccc31 100644 --- a/code/modules/mob/living/human/update_icons.dm +++ b/code/modules/mob/living/human/update_icons.dm @@ -139,7 +139,7 @@ Please contact me on #coderbus IRC. ~Carn x return var/matrix/M = matrix() - if(current_posture?.prone && (root_bodytype.prone_overlay_offset[1] || root_bodytype.prone_overlay_offset[2])) + if(current_posture?.prone && !isnull(root_bodytype.prone_overlay_offset) && (root_bodytype.prone_overlay_offset[1] || root_bodytype.prone_overlay_offset[2])) M.Translate(root_bodytype.prone_overlay_offset[1], root_bodytype.prone_overlay_offset[2]) var/mangle_planes = FALSE diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index f81a0412fcc..87bd9c64527 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -631,7 +631,7 @@ // Calculate the expected and actual number of functioning legs we have. var/has_sufficient_working_legs = TRUE - var/list/root_limb_tags = root_bodytype.organ_tags_by_category[ORGAN_CATEGORY_STANCE_ROOT] + var/list/root_limb_tags = root_bodytype.get_expected_organ_tags_for_category(ORGAN_CATEGORY_STANCE_ROOT) var/minimum_working_legs = ceil(length(root_limb_tags) * 0.5) if(minimum_working_legs > 0) var/leg_count = 0 diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index ed9e9140734..7c7c5b2e24e 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -21,9 +21,7 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/get_surgery_overlay_icon() if(limb_flags & ORGAN_FLAG_SKELETAL) return null - if(BP_IS_PROSTHETIC(src)) - return null - return species?.get_surgery_overlay_icon(owner) + return bodytype?.get_surgery_overlay_icon(owner) /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/human/human) _icon_cache_key = null diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index f193afaa4da..9d887adb99a 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -40,13 +40,11 @@ var/modifier = owner?.get_overlay_state_modifier() var/eye_state = modifier ? "eyes[modifier]" : "eyes" last_cached_eye_colour = eye_colour - last_eye_cache_key = "[type]-[bodytype.eye_icon]-[last_cached_eye_colour]-[bodytype.eye_offset]-[eye_state]" + last_eye_cache_key = "[type]-[bodytype.eye_icon]-[last_cached_eye_colour]-[eye_state]" if(!bodytype.eye_icon) return if(!global.eye_icon_cache[last_eye_cache_key]) var/icon/eyes_icon = icon(icon = bodytype.eye_icon, icon_state = eye_state) - if(bodytype.eye_offset) - eyes_icon.Shift(NORTH, bodytype.eye_offset) if(bodytype.apply_eye_colour) eyes_icon.Blend(last_cached_eye_colour, bodytype.eye_blend) global.eye_icon_cache[last_eye_cache_key] = eyes_icon diff --git a/code/modules/organs/prosthetics/_prosthetics.dm b/code/modules/organs/organ_prosthetics.dm similarity index 100% rename from code/modules/organs/prosthetics/_prosthetics.dm rename to code/modules/organs/organ_prosthetics.dm diff --git a/code/modules/species/species_getters.dm b/code/modules/species/species_getters.dm index 90b97759adc..f2e3abce845 100644 --- a/code/modules/species/species_getters.dm +++ b/code/modules/species/species_getters.dm @@ -19,9 +19,6 @@ /decl/species/proc/get_vision_flags(var/mob/living/human/H) return vision_flags -/decl/species/proc/get_surgery_overlay_icon(var/mob/living/human/H) - return 'icons/mob/surgery.dmi' - /decl/species/proc/get_footstep(var/mob/living/human/H, var/footstep_type) return diff --git a/code/modules/species/species_shapeshifter_bodytypes.dm b/code/modules/species/species_shapeshifter_bodytypes.dm index 9c3e4d00f15..a1ee2815579 100644 --- a/code/modules/species/species_shapeshifter_bodytypes.dm +++ b/code/modules/species/species_shapeshifter_bodytypes.dm @@ -5,7 +5,7 @@ /decl/bodytype/shapeshifter/apply_limb_colouration(var/obj/item/organ/external/E, var/icon/applying) applying.MapColors("#4d4d4d","#969696","#1c1c1c", "#000000") - applying.SetIntensity(limb_icon_intensity) + applying = ..() applying += rgb(,,,180) // Makes the icon translucent, SO INTUITIVE TY BYOND return applying @@ -38,7 +38,8 @@ /decl/bodytype/shapeshifter/get_icon_cache_uid(var/mob/H) . = ..() if(H) - . = "[.]-[wrapped_species_by_ref["\ref[H]"]]" + var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) + if(S) return S.default_bodytype.get_icon_cache_uid(H) /decl/bodytype/shapeshifter/apply_bodytype_organ_modifications(obj/item/organ/org) ..() diff --git a/code/modules/species/station/human_bodytypes.dm b/code/modules/species/station/human_bodytypes.dm index be6879a20a4..b6c753b5514 100644 --- a/code/modules/species/station/human_bodytypes.dm +++ b/code/modules/species/station/human_bodytypes.dm @@ -8,7 +8,7 @@ bandages_icon = 'icons/mob/bandage.dmi' limb_icon_intensity = 0.7 associated_gender = FEMALE - onmob_state_modifiers = list(slot_w_uniform_str = "f") + onmob_state_modifiers = list((slot_w_uniform_str) = "f") appearance_flags = HAS_SKIN_TONE_NORMAL | HAS_UNDERWEAR | HAS_EYE_COLOR nail_noun = "nails" uid = "bodytype_human_fem" diff --git a/mods/species/bayliens/unathi/datum/species_bodytypes.dm b/mods/species/bayliens/unathi/datum/species_bodytypes.dm index 33fef3a1188..31e9a058438 100644 --- a/mods/species/bayliens/unathi/datum/species_bodytypes.dm +++ b/mods/species/bayliens/unathi/datum/species_bodytypes.dm @@ -10,7 +10,7 @@ limb_icon_intensity = 0.7 health_hud_intensity = 2 associated_gender = FEMALE - onmob_state_modifiers = list(slot_w_uniform_str = "f") + onmob_state_modifiers = list((slot_w_uniform_str) = "f") movement_slowdown = 0.5 base_color = "#066000" appearance_flags = HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index 12b6b2109d0..e752bcde2f4 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -69,9 +69,6 @@ pain_emotes_with_pain_level = adult_pain_emotes_with_pain_level return ..() -/decl/species/grafadreka/get_surgery_overlay_icon(var/mob/living/human/H) - return null // todo: 'mods/species/drakes/icons/surgery.dmi' - // Stub for muscle memory of the Sit verb on Polaris. /mob/living/human/proc/drake_sit() set name = "Sit" diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index daec4b0ea06..54f8feb36f0 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -28,6 +28,7 @@ eye_icon = 'mods/species/drakes/icons/eyes.dmi' icon_template = 'mods/species/drakes/icons/template.dmi' skeletal_icon = 'mods/species/drakes/icons/skeleton.dmi' + surgery_overlay_icon = null // todo: 'mods/species/drakes/icons/surgery.dmi' bodytype_category = BODYTYPE_GRAFADREKA eye_blend = ICON_MULTIPLY limb_blend = ICON_MULTIPLY diff --git a/nebula.dme b/nebula.dme index f083035f50c..0077d792a40 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1834,6 +1834,15 @@ #include "code\modules\blood\blood.dm" #include "code\modules\blood\blood_types.dm" #include "code\modules\blood\blood_types_subtypes.dm" +#include "code\modules\bodytype\_bodytype.dm" +#include "code\modules\bodytype\bodytype_abilities.dm" +#include "code\modules\bodytype\bodytype_crystalline.dm" +#include "code\modules\bodytype\bodytype_helpers.dm" +#include "code\modules\bodytype\bodytype_offsets.dm" +#include "code\modules\bodytype\bodytype_prosthetic.dm" +#include "code\modules\bodytype\bodytype_prosthetic_models.dm" +#include "code\modules\bodytype\bodytype_quadruped.dm" +#include "code\modules\bodytype\bodytype_random.dm" #include "code\modules\brain_interface\_brain_interface.dm" #include "code\modules\brain_interface\interface_radio.dm" #include "code\modules\butchery\_butchery.dm" @@ -3280,6 +3289,7 @@ #include "code\modules\nano\modules\nano_module.dm" #include "code\modules\organs\_organ_setup.dm" #include "code\modules\organs\organ.dm" +#include "code\modules\organs\organ_prosthetics.dm" #include "code\modules\organs\pain.dm" #include "code\modules\organs\ailments\_ailment.dm" #include "code\modules\organs\ailments\ailment_codex.dm" @@ -3319,9 +3329,6 @@ #include "code\modules\organs\internal\stomach.dm" #include "code\modules\organs\internal\voice.dm" #include "code\modules\organs\internal\species\golem.dm" -#include "code\modules\organs\prosthetics\_prosthetics.dm" -#include "code\modules\organs\prosthetics\prosthetics_manufacturer.dm" -#include "code\modules\organs\prosthetics\prosthetics_manufacturer_models.dm" #include "code\modules\overmap\_defines.dm" #include "code\modules\overmap\_overmap.dm" #include "code\modules\overmap\overmap_object.dm" @@ -3757,13 +3764,6 @@ #include "code\modules\species\species.dm" #include "code\modules\species\species_allergies.dm" #include "code\modules\species\species_attack.dm" -#include "code\modules\species\species_bodytype.dm" -#include "code\modules\species\species_bodytype_abilities.dm" -#include "code\modules\species\species_bodytype_helpers.dm" -#include "code\modules\species\species_bodytype_offsets.dm" -#include "code\modules\species\species_bodytype_quadruped.dm" -#include "code\modules\species\species_bodytype_random.dm" -#include "code\modules\species\species_crystalline_bodytypes.dm" #include "code\modules\species\species_getters.dm" #include "code\modules\species\species_helpers.dm" #include "code\modules\species\species_hud.dm" From f7f02b87e35ad3b4f9cb77693ad0824088c423c4 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 21:19:44 -0500 Subject: [PATCH 156/554] Remove unnecessary uses of usr in onclick code --- code/_onclick/ai.dm | 46 ++++++++++++++++++------------------- code/_onclick/click.dm | 2 +- code/_onclick/cyborg.dm | 37 ++++++++++++++--------------- code/_onclick/hud/action.dm | 2 +- code/_onclick/hud/robot.dm | 4 ++-- 5 files changed, 44 insertions(+), 47 deletions(-) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index e35ab0ceb7e..56e4ee39cc8 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -60,7 +60,7 @@ if(silicon_camera.in_camera_mode) silicon_camera.camera_mode_off() - silicon_camera.captureimage(A, usr) + silicon_camera.captureimage(A, src) return A.add_hiddenprint(src) @@ -118,10 +118,10 @@ I have no idea why it was in atoms.dm instead of respective files. */ -/atom/proc/AICtrlAltClick() +/atom/proc/AICtrlAltClick(mob/living/silicon/user) -/obj/machinery/door/airlock/AICtrlAltClick() // Electrifies doors. - if(usr.incapacitated()) +/obj/machinery/door/airlock/AICtrlAltClick(mob/living/silicon/user) // Electrifies doors. + if(user.incapacitated()) return if(!electrified_until) // permanent shock @@ -131,14 +131,14 @@ Topic(src, list("command"="electrify_permanently", "activate" = "0")) return 1 -/atom/proc/AICtrlShiftClick() +/atom/proc/AICtrlShiftClick(mob/living/silicon/user) return -/atom/proc/AIShiftClick() +/atom/proc/AIShiftClick(mob/living/silicon/user) return -/obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors! - if(usr.incapacitated()) +/obj/machinery/door/airlock/AIShiftClick(mob/living/silicon/user) // Opens and closes doors! + if(user.incapacitated()) return if(density) Topic(src, list("command"="open", "activate" = "1")) @@ -146,11 +146,11 @@ Topic(src, list("command"="open", "activate" = "0")) return 1 -/atom/proc/AICtrlClick() +/atom/proc/AICtrlClick(mob/living/silicon/user) return FALSE -/obj/machinery/door/airlock/AICtrlClick() // Bolts doors - if(usr.incapacitated()) +/obj/machinery/door/airlock/AICtrlClick(mob/living/silicon/user) // Bolts doors + if(user.incapacitated()) return FALSE if(locked) Topic(src, list("command"="bolts", "activate" = "0")) @@ -158,35 +158,35 @@ Topic(src, list("command"="bolts", "activate" = "1")) return TRUE -/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. - if(usr.incapacitated()) +/obj/machinery/power/apc/AICtrlClick(mob/living/silicon/user) // turns off/on APCs. + if(user.incapacitated()) return FALSE Topic(src, list("breaker"="1")) return TRUE -/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets - if(usr.incapacitated()) +/obj/machinery/turretid/AICtrlClick(mob/living/silicon/user) //turns off/on Turrets + if(user.incapacitated()) return FALSE Topic(src, list("command"="enable", "value"="[!enabled]")) return TRUE -/atom/proc/AIAltClick(var/atom/A) - return AltClick(A) +/atom/proc/AIAltClick(mob/living/silicon/user) + return AltClick(user) -/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets - if(usr.incapacitated()) +/obj/machinery/turretid/AIAltClick(mob/living/silicon/user) //toggles lethal on turrets + if(user.incapacitated()) return Topic(src, list("command"="lethal", "value"="[!lethal]")) return 1 -/obj/machinery/atmospherics/binary/pump/AIAltClick() - return AltClick() +/obj/machinery/atmospherics/binary/pump/AIAltClick(mob/living/silicon/user) + return AltClick(user) /atom/proc/AIMiddleClick(var/mob/living/silicon/user) return 0 -/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights. - if(usr.incapacitated()) +/obj/machinery/door/airlock/AIMiddleClick(mob/living/silicon/user) // Toggles door bolt lights. + if(user.incapacitated()) return if(..()) return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 5be9c8e9447..a2c8f683021 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -108,7 +108,7 @@ if(holding == A) // Handle attack_self holding.attack_self(src) trigger_aiming(TARGET_CAN_CLICK) - usr.update_inhand_overlays(FALSE) + update_inhand_overlays(FALSE) return 1 //Atoms on your person diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 695fbe49f20..686a08b4cb2 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -42,9 +42,9 @@ if(silicon_camera.in_camera_mode) silicon_camera.camera_mode_off() if(is_component_functioning("camera")) - silicon_camera.captureimage(A, usr) + silicon_camera.captureimage(A, src) else - to_chat(src, "Your camera isn't functional.") + to_chat(src, SPAN_DANGER("Your camera isn't functional.")) return var/obj/item/holding = get_active_held_item() @@ -111,42 +111,39 @@ /atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden CtrlShiftClick(user) -/obj/machinery/door/airlock/BorgCtrlShiftClick() - AICtrlShiftClick() +/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) + AICtrlShiftClick(user) /atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden ShiftClick(user) -/obj/machinery/door/airlock/BorgShiftClick() // Opens and closes doors! Forwards to AI code. - AIShiftClick() +/obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code. + AIShiftClick(user) /atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden return CtrlClick(user) -/obj/machinery/door/airlock/BorgCtrlClick() // Bolts doors. Forwards to AI code. - return AICtrlClick() +/obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. + return AICtrlClick(user) -/obj/machinery/power/apc/BorgCtrlClick() // turns off/on APCs. Forwards to AI code. - return AICtrlClick() +/obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. + return AICtrlClick(user) -/obj/machinery/turretid/BorgCtrlClick() //turret control on/off. Forwards to AI code. - return AICtrlClick() +/obj/machinery/turretid/BorgCtrlClick(mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code. + return AICtrlClick(user) /atom/proc/BorgAltClick(var/mob/living/silicon/robot/user) AltClick(user) return -/obj/machinery/door/airlock/BorgAltClick() // Eletrifies doors. Forwards to AI code. - if (!usr.check_intent(I_FLAG_HELP)) - AICtrlAltClick() +/obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code. + if (!user.check_intent(I_FLAG_HELP)) + AICtrlAltClick(user) else ..() -/obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code. - AIAltClick() - -/obj/machinery/atmospherics/binary/pump/BorgAltClick() - return AltClick() +/obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code. + AIAltClick(user) /atom/proc/BorgCtrlAltClick(var/mob/living/silicon/robot/user) CtrlAltClick(user) diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index dbd392509b6..e122262cdb9 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -78,7 +78,7 @@ Deactivate() if(AB_GENERIC) if(target && procname) - call(target,procname)(usr) + call(target,procname)(owner) return /datum/action/proc/Activate() diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 6408ee43038..2243f9e4923 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -96,11 +96,11 @@ var/global/obj/screen/robot_inventory R.active_storage.close(R) //Closes the inventory ui. if(!R.module) - to_chat(usr, SPAN_WARNING("No module selected.")) + to_chat(R, SPAN_WARNING("No module selected.")) return if(!R.module.equipment) - to_chat(usr, SPAN_WARNING("Selected module has no equipment available.")) + to_chat(R, SPAN_WARNING("Selected module has no equipment available.")) return if(!R.robot_modules_background) From b7b6dabba1f405d216f12d6b889c3b0e64c8dfd1 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 21:20:07 -0500 Subject: [PATCH 157/554] Remove unnecessary uses of usr in screenobj code --- code/_onclick/hud/screen/screen_ai_button.dm | 4 +- code/_onclick/hud/screen/screen_equip.dm | 4 +- code/_onclick/hud/screen/screen_exosuit.dm | 10 ++-- code/_onclick/hud/screen/screen_inventory.dm | 2 +- code/_onclick/hud/screen/screen_needs.dm | 56 ++++++++++---------- code/_onclick/hud/screen/screen_pai.dm | 2 +- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/code/_onclick/hud/screen/screen_ai_button.dm b/code/_onclick/hud/screen/screen_ai_button.dm index 03371223da7..a7f2861002f 100644 --- a/code/_onclick/hud/screen/screen_ai_button.dm +++ b/code/_onclick/hud/screen/screen_ai_button.dm @@ -8,9 +8,9 @@ var/image/template_undelay /obj/screen/ai_button/handle_click(mob/user, params) - if(!isAI(usr)) + if(!isAI(user)) return TRUE - var/mob/living/silicon/ai/A = usr + var/mob/living/silicon/ai/A = user if(!(ai_verb in A.verbs)) return TRUE diff --git a/code/_onclick/hud/screen/screen_equip.dm b/code/_onclick/hud/screen/screen_equip.dm index 997fe5683bc..39ca9349ad8 100644 --- a/code/_onclick/hud/screen/screen_equip.dm +++ b/code/_onclick/hud/screen/screen_equip.dm @@ -3,6 +3,6 @@ icon_state = "act_equip" /obj/screen/equip/handle_click(mob/user, params) - if(ishuman(usr)) - var/mob/living/human/H = usr + if(ishuman(user)) + var/mob/living/human/H = user H.quick_equip() diff --git a/code/_onclick/hud/screen/screen_exosuit.dm b/code/_onclick/hud/screen/screen_exosuit.dm index 565de7e3644..5677d2d93bc 100644 --- a/code/_onclick/hud/screen/screen_exosuit.dm +++ b/code/_onclick/hud/screen/screen_exosuit.dm @@ -340,19 +340,19 @@ toggled = owner.head.active_sensors . = ..() -/obj/screen/exosuit/toggle/camera/toggled() +/obj/screen/exosuit/toggle/camera/toggled(mob/user) var/mob/living/exosuit/owner = get_owning_exosuit() if(!istype(owner) || !owner.head) - to_chat(usr, SPAN_WARNING("I/O Error: Camera systems not found.")) + to_chat(user, SPAN_WARNING("I/O Error: Camera systems not found.")) return if(!owner.head.vision_flags) - to_chat(usr, SPAN_WARNING("Alternative sensor configurations not found. Contact manufacturer for more details.")) + to_chat(user, SPAN_WARNING("Alternative sensor configurations not found. Contact manufacturer for more details.")) return if(!owner.get_cell()) - to_chat(usr, SPAN_WARNING("The augmented vision systems are offline.")) + to_chat(user, SPAN_WARNING("The augmented vision systems are offline.")) return owner.head.active_sensors = ..() - to_chat(usr, SPAN_NOTICE("[owner.head.name] advanced sensor mode is [owner.head.active_sensors ? "now" : "no longer" ] active.")) + to_chat(user, SPAN_NOTICE("[owner.head.name] advanced sensor mode is [owner.head.active_sensors ? "now" : "no longer" ] active.")) /obj/screen/exosuit/needle vis_flags = VIS_INHERIT_ID diff --git a/code/_onclick/hud/screen/screen_inventory.dm b/code/_onclick/hud/screen/screen_inventory.dm index 4033741be78..5bacceaeef0 100644 --- a/code/_onclick/hud/screen/screen_inventory.dm +++ b/code/_onclick/hud/screen/screen_inventory.dm @@ -55,7 +55,7 @@ // Mark anything we're potentially trying to equip. var/obj/item/mouse_over_atom = mouse_over_atom_ref?.resolve() - if(istype(mouse_over_atom) && !QDELETED(mouse_over_atom) && !usr.get_equipped_item(slot_id)) + if(istype(mouse_over_atom) && !QDELETED(mouse_over_atom) && !owner.get_equipped_item(slot_id)) var/mutable_appearance/MA = new /mutable_appearance(mouse_over_atom) MA.layer = HUD_ABOVE_ITEM_LAYER MA.plane = HUD_PLANE diff --git a/code/_onclick/hud/screen/screen_needs.dm b/code/_onclick/hud/screen/screen_needs.dm index eaa8d41ed3e..8a4c66ca08b 100644 --- a/code/_onclick/hud/screen/screen_needs.dm +++ b/code/_onclick/hud/screen/screen_needs.dm @@ -12,15 +12,15 @@ if(user.nutrition_icon == src) switch(icon_state) if("nutrition0") - to_chat(usr, SPAN_WARNING("You are completely stuffed.")) + to_chat(user, SPAN_WARNING("You are completely stuffed.")) if("nutrition1") - to_chat(usr, SPAN_NOTICE("You are not hungry.")) + to_chat(user, SPAN_NOTICE("You are not hungry.")) if("nutrition2") - to_chat(usr, SPAN_NOTICE("You are a bit peckish.")) + to_chat(user, SPAN_NOTICE("You are a bit peckish.")) if("nutrition3") - to_chat(usr, SPAN_WARNING("You are quite hungry.")) + to_chat(user, SPAN_WARNING("You are quite hungry.")) if("nutrition4") - to_chat(usr, SPAN_DANGER("You are starving!")) + to_chat(user, SPAN_DANGER("You are starving!")) /obj/screen/drink name = "hydration" @@ -32,15 +32,15 @@ if(user.hydration_icon == src) switch(icon_state) if("hydration0") - to_chat(usr, SPAN_WARNING("You are overhydrated.")) + to_chat(user, SPAN_WARNING("You are overhydrated.")) if("hydration1") - to_chat(usr, SPAN_NOTICE("You are not thirsty.")) + to_chat(user, SPAN_NOTICE("You are not thirsty.")) if("hydration2") - to_chat(usr, SPAN_NOTICE("You are a bit thirsty.")) + to_chat(user, SPAN_NOTICE("You are a bit thirsty.")) if("hydration3") - to_chat(usr, SPAN_WARNING("You are quite thirsty.")) + to_chat(user, SPAN_WARNING("You are quite thirsty.")) if("hydration4") - to_chat(usr, SPAN_DANGER("You are dying of thirst!")) + to_chat(user, SPAN_DANGER("You are dying of thirst!")) /obj/screen/bodytemp name = "body temperature" @@ -52,23 +52,23 @@ if(user.bodytemp == src) switch(icon_state) if("temp4") - to_chat(usr, SPAN_DANGER("You are being cooked alive!")) + to_chat(user, SPAN_DANGER("You are being cooked alive!")) if("temp3") - to_chat(usr, SPAN_DANGER("Your body is burning up!")) + to_chat(user, SPAN_DANGER("Your body is burning up!")) if("temp2") - to_chat(usr, SPAN_DANGER("You are overheating.")) + to_chat(user, SPAN_DANGER("You are overheating.")) if("temp1") - to_chat(usr, SPAN_WARNING("You are uncomfortably hot.")) + to_chat(user, SPAN_WARNING("You are uncomfortably hot.")) if("temp-4") - to_chat(usr, SPAN_DANGER("You are being frozen solid!")) + to_chat(user, SPAN_DANGER("You are being frozen solid!")) if("temp-3") - to_chat(usr, SPAN_DANGER("You are freezing cold!")) + to_chat(user, SPAN_DANGER("You are freezing cold!")) if("temp-2") - to_chat(usr, SPAN_WARNING("You are dangerously chilled!")) + to_chat(user, SPAN_WARNING("You are dangerously chilled!")) if("temp-1") - to_chat(usr, SPAN_NOTICE("You are uncomfortably cold.")) + to_chat(user, SPAN_NOTICE("You are uncomfortably cold.")) else - to_chat(usr, SPAN_NOTICE("Your body is at a comfortable temperature.")) + to_chat(user, SPAN_NOTICE("Your body is at a comfortable temperature.")) /obj/screen/pressure name = "pressure" @@ -80,15 +80,15 @@ if(user.pressure == src) switch(icon_state) if("pressure2") - to_chat(usr, SPAN_DANGER("The air pressure here is crushing!")) + to_chat(user, SPAN_DANGER("The air pressure here is crushing!")) if("pressure1") - to_chat(usr, SPAN_WARNING("The air pressure here is dangerously high.")) + to_chat(user, SPAN_WARNING("The air pressure here is dangerously high.")) if("pressure-1") - to_chat(usr, SPAN_WARNING("The air pressure here is dangerously low.")) + to_chat(user, SPAN_WARNING("The air pressure here is dangerously low.")) if("pressure-2") - to_chat(usr, SPAN_DANGER("There is nearly no air pressure here!")) + to_chat(user, SPAN_DANGER("There is nearly no air pressure here!")) else - to_chat(usr, SPAN_NOTICE("The local air pressure is comfortable.")) + to_chat(user, SPAN_NOTICE("The local air pressure is comfortable.")) /obj/screen/toxins name = "toxin" @@ -99,9 +99,9 @@ /obj/screen/toxins/handle_click(mob/user, params) if(user.toxin == src) if(icon_state == "tox0") - to_chat(usr, SPAN_NOTICE("The air is clear of toxins.")) + to_chat(user, SPAN_NOTICE("The air is clear of toxins.")) else - to_chat(usr, SPAN_DANGER("The air is eating away at your skin!")) + to_chat(user, SPAN_DANGER("The air is eating away at your skin!")) /obj/screen/oxygen name = "oxygen" @@ -112,6 +112,6 @@ /obj/screen/oxygen/handle_click(mob/user, params) if(user.oxygen == src) if(icon_state == "oxy0") - to_chat(usr, SPAN_NOTICE("You are breathing easy.")) + to_chat(user, SPAN_NOTICE("You are breathing easy.")) else - to_chat(usr, SPAN_DANGER("You cannot breathe!")) + to_chat(user, SPAN_DANGER("You cannot breathe!")) diff --git a/code/_onclick/hud/screen/screen_pai.dm b/code/_onclick/hud/screen/screen_pai.dm index 7059432c1a7..51ceb9d7c27 100644 --- a/code/_onclick/hud/screen/screen_pai.dm +++ b/code/_onclick/hud/screen/screen_pai.dm @@ -68,7 +68,7 @@ /obj/screen/pai/subsystems/handle_click(mob/user, params) var/mob/living/silicon/pai/pai = user if(istype(pai)) - var/ss_name = input(usr, "Activates the given subsystem", "Subsystems", "") in pai.silicon_subsystems_by_name + var/ss_name = input(user, "Activates the given subsystem", "Subsystems", "") in pai.silicon_subsystems_by_name if (!ss_name) return var/stat_silicon_subsystem/SSS = pai.silicon_subsystems_by_name[ss_name] From 985f0c11d6d8c36f7a2b5382c36b189c879b84c2 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 21:20:33 -0500 Subject: [PATCH 158/554] Remove unnecessary uses of usr in machinery folder --- code/game/machinery/CableLayer.dm | 4 ++-- code/game/machinery/Sleeper.dm | 2 +- .../stock_parts/network_lock.dm | 2 +- code/game/machinery/atmo_control.dm | 8 +++---- code/game/machinery/biogenerator.dm | 6 ++--- code/game/machinery/camera/tracking.dm | 23 +++++++++---------- code/game/machinery/floorlayer.dm | 2 +- code/game/machinery/jukebox.dm | 2 +- code/game/machinery/newscaster.dm | 8 +++---- code/game/machinery/nuclear_bomb.dm | 10 ++++---- code/game/machinery/oxygen_pump.dm | 2 +- code/game/machinery/portable_turret.dm | 2 +- code/game/machinery/self_destruct.dm | 2 +- code/game/machinery/spaceheater.dm | 2 +- code/game/machinery/teleporter.dm | 6 ++--- code/game/machinery/turret_control.dm | 2 +- 16 files changed, 41 insertions(+), 42 deletions(-) diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 16353f9bf47..55054da3de1 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -38,7 +38,7 @@ if(IS_WIRECUTTER(O)) if(cable && cable.amount) - var/m = round(input(usr,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) + var/m = round(input(user,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) m = min(m, cable.amount) m = min(m, 30) if(m) @@ -47,7 +47,7 @@ var/obj/item/stack/cable_coil/CC = new (get_turf(src)) CC.amount = m else - to_chat(usr, "There's no more cable on the reel.") + to_chat(user, "There's no more cable on the reel.") return TRUE return ..() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index dd697812746..0efbfce6cd4 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -248,7 +248,7 @@ /obj/machinery/sleeper/CanUseTopic(user) if(user == occupant) - to_chat(usr, SPAN_WARNING("You can't reach the controls from the inside.")) + to_chat(user, SPAN_WARNING("You can't reach the controls from the inside.")) return STATUS_CLOSE . = ..() diff --git a/code/game/machinery/_machines_base/stock_parts/network_lock.dm b/code/game/machinery/_machines_base/stock_parts/network_lock.dm index ca74dc09444..54098438408 100644 --- a/code/game/machinery/_machines_base/stock_parts/network_lock.dm +++ b/code/game/machinery/_machines_base/stock_parts/network_lock.dm @@ -183,7 +183,7 @@ if(href_list["add_pattern"]) if(length(groups) >= MAX_PATTERNS) - to_chat(usr, SPAN_WARNING("You cannot add more than [MAX_PATTERNS] patterns to \the [src]!")) + to_chat(user, SPAN_WARNING("You cannot add more than [MAX_PATTERNS] patterns to \the [src]!")) return TOPIC_HANDLED LAZYADD(groups, list(list())) return TOPIC_REFRESH diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index a08744dd251..b9664324917 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -221,7 +221,7 @@ return TOPIC_REFRESH if(href_list["set_input_tag"]) - var/t = sanitize_safe(input(usr, "Enter the input ID tag.", src.name, src.input_tag), MAX_NAME_LEN) + var/t = sanitize_safe(input(user, "Enter the input ID tag.", src.name, src.input_tag), MAX_NAME_LEN) t = sanitize_safe(t, MAX_NAME_LEN) if (t) src.input_tag = t @@ -229,7 +229,7 @@ return TOPIC_REFRESH if(href_list["set_output_tag"]) - var/t = sanitize_safe(input(usr, "Enter the output ID tag.", src.name, src.output_tag), MAX_NAME_LEN) + var/t = sanitize_safe(input(user, "Enter the output ID tag.", src.name, src.output_tag), MAX_NAME_LEN) t = sanitize_safe(t, MAX_NAME_LEN) if (t) src.output_tag = t @@ -237,7 +237,7 @@ return TOPIC_REFRESH if(href_list["set_sensor_tag"]) - var/t = sanitize_safe(input(usr, "Enter the sensor ID tag.", src.name, src.sensor_tag)) + var/t = sanitize_safe(input(user, "Enter the sensor ID tag.", src.name, src.sensor_tag)) t = sanitize_safe(t, MAX_NAME_LEN) if(t) src.sensor_tag = t @@ -245,7 +245,7 @@ return TOPIC_REFRESH if(href_list["set_sensor_name"]) - var/t = sanitize_safe(input(usr, "Enter the sensor name.", src.name, src.sensor_name)) + var/t = sanitize_safe(input(user, "Enter the sensor name.", src.name, src.sensor_name)) t = sanitize_safe(t, MAX_NAME_LEN) if(t) src.sensor_name = t diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index e6eb5609476..2260e4012d9 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -160,7 +160,7 @@ /obj/machinery/biogenerator/OnTopic(user, href_list) switch (href_list["action"]) if("activate") - activate() + activate(user) if("detach") if(beaker) beaker.dropInto(src.loc) @@ -186,8 +186,8 @@ ui_interact(user) return TRUE -/obj/machinery/biogenerator/proc/activate() - if (usr.stat) +/obj/machinery/biogenerator/proc/activate(mob/user) + if (user.incapacitated()) return if (stat) //NOPOWER etc return diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 0042bac3abb..d1a10d81ea0 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -149,33 +149,32 @@ /mob/living/silicon/ai/proc/ai_actual_track(mob/living/target) if(!istype(target)) return - var/mob/living/silicon/ai/U = usr - if(target == U.cameraFollow) + if(target == cameraFollow) return - if(U.cameraFollow) - U.ai_cancel_tracking() - U.cameraFollow = target - to_chat(U, "Tracking target...") + if(cameraFollow) + ai_cancel_tracking() + cameraFollow = target + to_chat(src, "Tracking target...") target.tracking_initiated() spawn (0) - while (U.cameraFollow == target) - if (U.cameraFollow == null) + while (cameraFollow == target) + if (cameraFollow == null) return switch(target.tracking_status()) if(TRACKING_NO_COVERAGE) - to_chat(U, "Target is not near any active cameras.") + to_chat(src, "Target is not near any active cameras.") sleep(100) continue if(TRACKING_TERMINATE) - U.ai_cancel_tracking(1) + ai_cancel_tracking(1) return - if(U.eyeobj) - U.eyeobj.setLoc(get_turf(target), 0) + if(eyeobj) + eyeobj.setLoc(get_turf(target), 0) else view_core() return diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index 6d804caa374..b8628b7e508 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -41,7 +41,7 @@ var/m = input("Choose work mode", "Mode") as null|anything in mode mode[m] = !mode[m] var/O = mode[m] - user.visible_message("[usr] has set \the [src] [m] mode [!O?"off":"on"].", "You set \the [src] [m] mode [!O?"off":"on"].") + user.visible_message("[user] has set \the [src] [m] mode [!O?"off":"on"].", "You set \the [src] [m] mode [!O?"off":"on"].") return TRUE if(istype(W, /obj/item/stack/tile)) diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 6351cca16c7..1fb6b7666b7 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -110,7 +110,7 @@ if(emagged) emag_play() else if(!current_track) - to_chat(usr, "No track selected.") + to_chat(user, "No track selected.") else StartPlaying() return TOPIC_REFRESH diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 75221d30278..50cf312569b 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -253,7 +253,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Message Body: [src.msg]
" dat+="Photo: " if(photo_data && photo_data.photo) - send_rsc(usr, photo_data.photo.img, "tmp_photo.png") + send_rsc(user, photo_data.photo.img, "tmp_photo.png") dat+="
" dat+="
Delete Photo
" else @@ -325,7 +325,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="-[MESSAGE.body]
" if(MESSAGE.img) var/resourc_name = "newscaster_photo_[sanitize(viewing_channel.channel_name)]_[i].png" - send_asset(usr.client, resourc_name) + send_asset(user.client, resourc_name) dat+="
" if(MESSAGE.caption) dat+="[MESSAGE.caption]
" @@ -397,7 +397,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Description: [src.msg]
" dat+="Photo: " if(photo_data && photo_data.photo) - send_rsc(usr, photo_data.photo.img, "tmp_photo.png") + send_rsc(user, photo_data.photo.img, "tmp_photo.png") dat+="
" dat+="
Delete Photo
" else @@ -431,7 +431,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Description: [news_network.wanted_issue.body]
" dat+="Photo: " if(news_network.wanted_issue.img) - send_rsc(usr, news_network.wanted_issue.img, "tmp_photow.png") + send_rsc(user, news_network.wanted_issue.img, "tmp_photow.png") dat+="
" else dat+="None" diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 27e7d81ea03..dd3da2e44ae 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -278,7 +278,7 @@ var/global/bomb_set to_chat(usr, "Nothing happens, something might be wrong with the wiring.") return 1 if(!timing && !safety) - start_bomb() + start_bomb(usr) else check_cutoff() if(href_list["safety"]) @@ -306,9 +306,9 @@ var/global/bomb_set to_chat(usr, "There is nothing to anchor to!") return 1 -/obj/machinery/nuclearbomb/proc/start_bomb() +/obj/machinery/nuclearbomb/proc/start_bomb(user) timing = 1 - log_and_message_admins("activated the detonation countdown of \the [src]") + log_and_message_admins("activated the detonation countdown of \the [src]", user) bomb_set++ //There can still be issues with this resetting when there are multiple bombs. Not a big deal though for Nuke/N var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) original_level = security_state.current_security_level @@ -479,11 +479,11 @@ var/global/bomb_set if(href_list["anchor"]) return -/obj/machinery/nuclearbomb/station/start_bomb() +/obj/machinery/nuclearbomb/station/start_bomb(mob/user) for(var/inserter in inserters) var/obj/machinery/self_destruct/sd = inserter if(!istype(sd) || !sd.armed) - to_chat(usr, "An inserter has not been armed or is damaged.") + to_chat(user, "An inserter has not been armed or is damaged.") return visible_message("Warning. The self-destruct sequence override will be disabled [self_destruct_cutoff] seconds before detonation.") ..() diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 27a13a93063..aeb5ac90cac 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -185,7 +185,7 @@ /obj/machinery/oxygen_pump/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] if(!tank) - to_chat(usr, SPAN_WARNING("It is missing a tank!")) + to_chat(user, SPAN_WARNING("It is missing a tank!")) data["tankPressure"] = 0 data["releasePressure"] = 0 data["defaultReleasePressure"] = 0 diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index e7f5b123b93..0124b95786e 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -193,7 +193,7 @@ var/global/list/turret_icons return STATUS_CLOSE if(!anchored) - to_chat(usr, "\The [src] has to be secured first!") + to_chat(user, "\The [src] has to be secured first!") return STATUS_CLOSE return ..() diff --git a/code/game/machinery/self_destruct.dm b/code/game/machinery/self_destruct.dm index ee842c32e23..3cf9137e831 100644 --- a/code/game/machinery/self_destruct.dm +++ b/code/game/machinery/self_destruct.dm @@ -14,7 +14,7 @@ if(!damaged) return FALSE user.visible_message("[user] begins to repair [src].", "You begin repairing [src].") - if(do_after(usr, 100, src)) + if(do_after(user, 100, src)) var/obj/item/weldingtool/w = W if(w.weld(10)) damaged = 0 diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index e59df75a663..77dcbafee90 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -81,7 +81,7 @@ dat += " [set_temperature]K ([set_temperature-T0C]°C)" dat += "+
" - var/datum/browser/popup = new(usr, "spaceheater", "Space Heater Control Panel") + var/datum/browser/popup = new(user, "spaceheater", "Space Heater Control Panel") popup.set_content(jointext(dat, null)) popup.open() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index e6ce02af3f7..f48d05b08d7 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -66,13 +66,13 @@ L = locate("landmark*[C.data]") // use old stype if(istype(L, /obj/abstract/landmark) && isturf(L.loc) && user.try_unequip(I)) - to_chat(usr, "You insert the coordinates into the machine.") - to_chat(usr, "A message flashes across the screen reminding the traveller that the nuclear authentication disk is to remain on the [station_name()] at all times.") + to_chat(user, "You insert the coordinates into the machine.") + to_chat(user, "A message flashes across the screen reminding the traveller that the nuclear authentication disk is to remain on the [station_name()] at all times.") qdel(I) audible_message(SPAN_NOTICE("Locked in.")) src.locked = L one_time_use = 1 - add_fingerprint(usr) + add_fingerprint(user) return TRUE /obj/machinery/computer/teleporter/interface_interact(var/mob/user) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 141619bd14f..c7c2924326f 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -89,7 +89,7 @@ return FALSE if(istype(W, /obj/item/card/id)||istype(W, /obj/item/modular_computer)) - if(src.allowed(usr)) + if(src.allowed(user)) if(emagged) to_chat(user, "The turret control is unresponsive.") else From d93303df38dbd989a920f6bcdcddeed76cc2c5ea Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 21:20:54 -0500 Subject: [PATCH 159/554] Remove unnecessary uses of usr in objects folder --- code/game/objects/items/weapons/tanks/tanks.dm | 6 +++--- code/game/objects/items/weapons/tools/wirecutter.dm | 2 +- .../objects/structures/crates_lockers/closets/__closet.dm | 2 +- code/game/objects/structures/crematorium.dm | 2 +- code/game/objects/structures/fishtanks.dm | 6 +++--- code/game/objects/structures/girders.dm | 4 ++-- code/game/objects/structures/safe.dm | 2 +- .../objects/structures/stool_bed_chair_nest_sofa/bed.dm | 6 +++--- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 847e581f446..35c99e1d7dc 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -147,12 +147,12 @@ var/global/list/global/tank_gauge_cache = list() var/obj/item/assembly_holder/assy = proxyassembly.assembly if(assy.a_left && assy.a_right) - assy.dropInto(usr.loc) + assy.dropInto(user.loc) assy.master = null proxyassembly.assembly = null else if(!proxyassembly.assembly.a_left) - assy.a_right.dropInto(usr.loc) + assy.a_right.dropInto(user.loc) assy.a_right.holder = null assy.a_right = null proxyassembly.assembly = null @@ -299,7 +299,7 @@ var/global/list/global/tank_gauge_cache = list() return TOPIC_REFRESH if (href_list["stat"]) - toggle_valve(usr) + toggle_valve(user) return TOPIC_REFRESH /obj/item/tank/proc/toggle_valve(var/mob/user) diff --git a/code/game/objects/items/weapons/tools/wirecutter.dm b/code/game/objects/items/weapons/tools/wirecutter.dm index 6cb93a254f1..2886de69bc3 100644 --- a/code/game/objects/items/weapons/tools/wirecutter.dm +++ b/code/game/objects/items/weapons/tools/wirecutter.dm @@ -46,7 +46,7 @@ var/obj/item/handcuffs/cable/cuffs = target.get_equipped_item(slot_handcuffed_str) if(user.check_intent(I_FLAG_HELP) && istype(cuffs) && target.try_unequip(cuffs)) user.visible_message( - "\The [usr] cuts \the [target]'s restraints with \the [src]!", + "\The [user] cuts \the [target]'s restraints with \the [src]!", "You cut \the [target]'s restraints with \the [src]!", "You hear cable being cut." ) diff --git a/code/game/objects/structures/crates_lockers/closets/__closet.dm b/code/game/objects/structures/crates_lockers/closets/__closet.dm index 80a61cff485..9e717d53f97 100644 --- a/code/game/objects/structures/crates_lockers/closets/__closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/__closet.dm @@ -344,7 +344,7 @@ var/global/list/closets = list() if(!. && istype(AM) && opened && !istype(AM, /obj/structure/closet) && AM.simulated && !AM.anchored && (large || !ismob(AM))) step_towards(AM, loc) if(user != AM) - user.show_viewers(SPAN_DANGER("\The [user] stuffs \the [AM] into \the [src]!")) + user.visible_message(SPAN_DANGER("\The [user] stuffs \the [AM] into \the [src]!"), SPAN_DANGER("You stuff \the [AM] into \the [src]!")) return TRUE /obj/structure/closet/attack_ai(mob/living/silicon/ai/user) diff --git a/code/game/objects/structures/crematorium.dm b/code/game/objects/structures/crematorium.dm index 4b03414f3bd..61b22755224 100644 --- a/code/game/objects/structures/crematorium.dm +++ b/code/game/objects/structures/crematorium.dm @@ -82,7 +82,7 @@ if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() if(locked) - to_chat(usr, SPAN_WARNING("It's currently locked.")) + to_chat(user, SPAN_WARNING("It's currently locked.")) return TRUE if(open) close() diff --git a/code/game/objects/structures/fishtanks.dm b/code/game/objects/structures/fishtanks.dm index 3dafa9160f3..b6724f46775 100644 --- a/code/game/objects/structures/fishtanks.dm +++ b/code/game/objects/structures/fishtanks.dm @@ -191,13 +191,13 @@ var/global/list/global/aquarium_states_and_layers = list( return if(!Adjacent(target)) return - usr.visible_message(SPAN_WARNING("\The [user] starts climbing out of \the [src]!")) + user.visible_message(SPAN_WARNING("\The [user] starts climbing out of \the [src]!")) if(!do_after(user,50)) return if (!Adjacent(target)) return - usr.forceMove(target) - usr.visible_message(SPAN_WARNING("\The [user] climbs out of \the [src]!")) + user.forceMove(target) + user.visible_message(SPAN_WARNING("\The [user] climbs out of \the [src]!")) /obj/structure/glass_tank/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) . = locate(/obj/structure/glass_tank) in (target == loc) ? (mover && mover.loc) : target diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d4aed89ecdc..4a9c41b13ed 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -145,7 +145,7 @@ to_chat(user, SPAN_WARNING("You will need a support made of sturdier material to hold up [S.material.solid_name] cladding.")) return FALSE - add_hiddenprint(usr) + add_hiddenprint(user) if(S.material.integrity < 50) to_chat(user, SPAN_WARNING("This material is too soft for use in wall construction.")) return 0 @@ -165,7 +165,7 @@ var/turf/wall/T = get_turf(src) T.set_turf_materials(S.material, reinf_material, null, material) T.can_open = prepped_for_fakewall - T.add_hiddenprint(usr) + T.add_hiddenprint(user) material = null reinf_material = null qdel(src) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 7b78fc8c944..10db1cd1afb 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -100,7 +100,7 @@ FLOOR SAFES to_chat(user, "You can't [open ? "close" : "open"] [src], the lock is engaged!") return - var/canhear = locate(/obj/item/clothing/neck/stethoscope) in usr.get_held_items() + var/canhear = locate(/obj/item/clothing/neck/stethoscope) in user.get_held_items() if(href_list["decrement"]) dial = decrement(dial) if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71) diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm index 2090da1a2cc..771e8594213 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm @@ -234,8 +234,8 @@ remove_beaker(user) return TRUE -/obj/structure/bed/roller/proc/collapse() - visible_message("[usr] collapses [src].") +/obj/structure/bed/roller/proc/collapse(mob/user) + visible_message("[user] collapses [src].") new item_form_type(get_turf(src)) qdel(src) @@ -300,7 +300,7 @@ remove_beaker(user) return TRUE if(!buckled_mob) - collapse() + collapse(user) return TRUE . = ..() From 68a223db6674a616004fab3d619d4c8f377b5593 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 21:21:19 -0500 Subject: [PATCH 160/554] Remove unnecessary uses of usr in datums folder --- code/datums/communication/aooc.dm | 2 +- code/datums/extensions/assembly/assembly_interaction.dm | 6 +++--- code/datums/extensions/eye/landing.dm | 4 ++-- code/datums/extensions/holster/holster.dm | 2 +- code/datums/extensions/multitool/multitool.dm | 4 ++-- code/datums/extensions/storage/subtypes_sheets.dm | 8 ++++---- code/datums/traits/_traits.dm | 4 +++- 7 files changed, 16 insertions(+), 14 deletions(-) diff --git a/code/datums/communication/aooc.dm b/code/datums/communication/aooc.dm index 52ca16f4194..8c4a25349c3 100644 --- a/code/datums/communication/aooc.dm +++ b/code/datums/communication/aooc.dm @@ -30,7 +30,7 @@ receive_communication(C, target, SPAN_AOOC("[get_options_bar(C, 0, 1, 1)]: [message]")) else if(target.mob?.mind?.assigned_special_role) var/display_name = C.key - var/player_display = holder ? "[display_name]([usr.client.holder.rank])" : display_name + var/player_display = holder ? "[display_name]([C.holder.rank])" : display_name receive_communication(C, target, SPAN_AOOC("[player_display]: [message]")) /decl/communication_channel/aooc/do_broadcast(message) diff --git a/code/datums/extensions/assembly/assembly_interaction.dm b/code/datums/extensions/assembly/assembly_interaction.dm index 9e250bb5d7b..a4c4c8b2f92 100644 --- a/code/datums/extensions/assembly/assembly_interaction.dm +++ b/code/datums/extensions/assembly/assembly_interaction.dm @@ -20,7 +20,7 @@ return TRUE to_chat(user, "You begin repairing damage to \the [holder]...") - if(WT.weld(round(damage/75)) && do_after(usr, damage/10)) + if(WT.weld(round(damage/75)) && do_after(user, damage/10)) damage = 0 to_chat(user, "You repair \the [holder].") return TRUE @@ -33,11 +33,11 @@ for(var/obj/item/stock_parts/computer/H in parts) component_names.Add(H.name) - var/choice = input(usr, "Which component do you want to uninstall?", "[assembly_name] maintenance", null) as null|anything in component_names + var/choice = input(user, "Which component do you want to uninstall?", "[assembly_name] maintenance", null) as null|anything in component_names if(!choice) return TRUE var/atom/movable/HA = holder - if(!HA.Adjacent(usr)) + if(!HA.Adjacent(user)) return TRUE var/obj/item/stock_parts/H = find_component_by_name(choice) diff --git a/code/datums/extensions/eye/landing.dm b/code/datums/extensions/eye/landing.dm index b54a722cb4f..deaa8dafc8d 100644 --- a/code/datums/extensions/eye/landing.dm +++ b/code/datums/extensions/eye/landing.dm @@ -27,12 +27,12 @@ /datum/action/eye/landing/rotate_cw name = "Rotate clockwise" - procname ="turn_shuttle_cw" + procname = TYPE_PROC_REF(/mob/observer/eye/landing, turn_shuttle_cw) button_icon_state = "shuttle_rotate_cw" target_type = EYE_TARGET /datum/action/eye/landing/rotate_ccw name = "Rotate counterclockwise" - procname ="turn_shuttle_ccw" + procname = TYPE_PROC_REF(/mob/observer/eye/landing, turn_shuttle_ccw) button_icon_state = "shuttle_rotate_ccw" target_type = EYE_TARGET \ No newline at end of file diff --git a/code/datums/extensions/holster/holster.dm b/code/datums/extensions/holster/holster.dm index 55373db095d..8792a616b5a 100644 --- a/code/datums/extensions/holster/holster.dm +++ b/code/datums/extensions/holster/holster.dm @@ -82,7 +82,7 @@ G.check_accidents(user) if(G.safety() && !user.skill_fail_prob(SKILL_WEAPONS, 100, SKILL_EXPERT, 0.5)) //Experienced shooter will disable safety before shooting. G.toggle_safety(user) - usr.visible_message( + user.visible_message( "\The [user] draws \the [holstered], ready to go!", "You draw \the [holstered], ready to go!" ) diff --git a/code/datums/extensions/multitool/multitool.dm b/code/datums/extensions/multitool/multitool.dm index 08e98ebe7eb..ce3c2ae09e7 100644 --- a/code/datums/extensions/multitool/multitool.dm +++ b/code/datums/extensions/multitool/multitool.dm @@ -13,7 +13,7 @@ popup.set_content(html) popup.open() else - close_window(usr) + close_window(user) /datum/extension/interactive/multitool/proc/get_interact_window(var/obj/item/multitool/M, var/mob/user) return @@ -36,7 +36,7 @@ /datum/extension/interactive/multitool/extension_act(href, href_list, var/mob/user) if(..()) - close_window(usr) + close_window(user) return TRUE var/obj/item/multitool/M = user.get_multitool() diff --git a/code/datums/extensions/storage/subtypes_sheets.dm b/code/datums/extensions/storage/subtypes_sheets.dm index 1db2042cb97..a72c49ab856 100644 --- a/code/datums/extensions/storage/subtypes_sheets.dm +++ b/code/datums/extensions/storage/subtypes_sheets.dm @@ -44,10 +44,10 @@ inserted = 1 break if(!inserted || !S.amount) - usr.drop_from_inventory(S, holder) + user.drop_from_inventory(S, holder) if(!S.amount) qdel(S) - prepare_ui(usr) + prepare_ui(user) if(isatom(holder)) var/atom/atom_holder = holder atom_holder.update_icon() @@ -64,8 +64,8 @@ if(!S.amount) qdel(S) // todo: there's probably something missing here prepare_ui() - if(usr.active_storage) - usr.active_storage.show_to(usr) + if(user.active_storage) + user.active_storage.show_to(user) if(isatom(holder)) var/atom/atom_holder = holder atom_holder.update_icon() diff --git a/code/datums/traits/_traits.dm b/code/datums/traits/_traits.dm index ad1041e32da..42d3bdb1b75 100644 --- a/code/datums/traits/_traits.dm +++ b/code/datums/traits/_traits.dm @@ -236,6 +236,8 @@ result += trait.get_trait_selection_data(caller, ticked_traits, (recurse_level+1), ignore_children_if_unticked) return result +/// Shows `show_to` a browser window describing the character setup traits taken by `src`. +/// `show_to` must be non-null. /mob/proc/get_trait_data(var/mob/show_to) var/list/traits = get_traits() @@ -262,7 +264,7 @@ if(printed_cat) dat += "
" - var/datum/browser/popup = new((show_to || usr), "trait_summary_\ref[src]", "Aspect Summary") + var/datum/browser/popup = new(show_to, "trait_summary_\ref[src]", "Aspect Summary") popup.set_content(jointext(dat, null)) popup.open() From c122b4e8c33cdf67d0646d4185d3bf73edbbbe43 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 21:21:53 -0500 Subject: [PATCH 161/554] Remove unnecessary uses of usr in preferences --- code/modules/client/preference_setup/general/05_flavor.dm | 8 ++++---- code/modules/client/preference_setup/global/03_pai.dm | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/client/preference_setup/general/05_flavor.dm b/code/modules/client/preference_setup/general/05_flavor.dm index e34ae4c9dc3..803e65cee7c 100644 --- a/code/modules/client/preference_setup/general/05_flavor.dm +++ b/code/modules/client/preference_setup/general/05_flavor.dm @@ -54,11 +54,11 @@ if("open") pass() if("general") - var/msg = sanitize(input(usr,"Give a general description of your character. This will be shown regardless of clothing. Do not include OOC information here.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) + var/msg = sanitize(input(user,"Give a general description of your character. This will be shown regardless of clothing. Do not include OOC information here.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) if(CanUseTopic(user)) pref.flavor_texts[href_list["flavor_text"]] = msg else - var/msg = sanitize(input(usr,"Set the flavor text for your [href_list["flavor_text"]].","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) + var/msg = sanitize(input(user,"Set the flavor text for your [href_list["flavor_text"]].","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) if(CanUseTopic(user)) pref.flavor_texts[href_list["flavor_text"]] = msg SetFlavorText(user) @@ -69,11 +69,11 @@ if("open") pass() if("Default") - var/msg = sanitize(input(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"])) as message, extra = 0) + var/msg = sanitize(input(user,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"])) as message, extra = 0) if(CanUseTopic(user)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg else - var/msg = sanitize(input(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]])) as message, extra = 0) + var/msg = sanitize(input(user,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]])) as message, extra = 0) if(CanUseTopic(user)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg SetFlavourTextRobot(user) diff --git a/code/modules/client/preference_setup/global/03_pai.dm b/code/modules/client/preference_setup/global/03_pai.dm index 61c82951286..aeef174d4ff 100644 --- a/code/modules/client/preference_setup/global/03_pai.dm +++ b/code/modules/client/preference_setup/global/03_pai.dm @@ -67,13 +67,13 @@ if(!isnull(t) && CanUseTopic(user)) candidate.comments = sanitize(t) if("chassis") - t = input(usr,"What would you like to use for your mobile chassis icon?") as null|anything in global.possible_chassis + t = input(user,"What would you like to use for your mobile chassis icon?") as null|anything in global.possible_chassis if(!isnull(t) && CanUseTopic(user)) candidate.chassis = t update_pai_preview(user) . = TOPIC_HARD_REFRESH if("say") - t = input(usr,"What theme would you like to use for your speech verbs?") as null|anything in global.possible_say_verbs + t = input(user,"What theme would you like to use for your speech verbs?") as null|anything in global.possible_say_verbs if(!isnull(t) && CanUseTopic(user)) candidate.say_verb = t if("cyclebg") From 775e3458e289d14013629fc112a26a6383bd6d5c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 23:53:18 -0500 Subject: [PATCH 162/554] Remove unnecessary uses of usr in modpacks --- mods/content/matchmaking/matchmaker.dm | 4 ++-- mods/gamemodes/cult/spells/construct.dm | 4 ++-- mods/mobs/borers/mob/borer/borer_hud.dm | 2 +- mods/species/ascent/effects/razorweb.dm | 8 ++++---- mods/species/ascent/mobs/nymph/nymph_life.dm | 21 ++++++++++---------- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/mods/content/matchmaking/matchmaker.dm b/mods/content/matchmaking/matchmaker.dm index 0892ba4c827..3634f91bd3f 100644 --- a/mods/content/matchmaking/matchmaker.dm +++ b/mods/content/matchmaking/matchmaker.dm @@ -271,8 +271,8 @@ var/global/datum/matchmaker/matchmaker = new() var/list/relations = matchmaker.get_relationships(mind) for(var/datum/relation/R in relations) R.finalize() - show_browser(usr,null, "window=relations") + show_browser(src,null, "window=relations") else - show_browser(usr,null, "window=relations") + show_browser(src,null, "window=relations") return TOPIC_HANDLED return ..() \ No newline at end of file diff --git a/mods/gamemodes/cult/spells/construct.dm b/mods/gamemodes/cult/spells/construct.dm index a300bacacb2..05c35c46785 100644 --- a/mods/gamemodes/cult/spells/construct.dm +++ b/mods/gamemodes/cult/spells/construct.dm @@ -89,12 +89,12 @@ hud_state = "const_pylon" -/spell/aoe_turf/conjure/pylon/cast(list/targets) +/spell/aoe_turf/conjure/pylon/cast(list/targets, mob/user) ..() var/turf/spawn_place = pick(targets) for(var/obj/structure/cult/pylon/P in spawn_place.contents) if(P.isbroken) - P.repair(usr) + P.repair(user) continue return diff --git a/mods/mobs/borers/mob/borer/borer_hud.dm b/mods/mobs/borers/mob/borer/borer_hud.dm index 084bacb7a16..8ec7b333971 100644 --- a/mods/mobs/borers/mob/borer/borer_hud.dm +++ b/mods/mobs/borers/mob/borer/borer_hud.dm @@ -54,7 +54,7 @@ /obj/screen/borer/handle_click(mob/user, params) if(!isborer(user)) return FALSE - var/mob/living/simple_animal/borer/worm = usr + var/mob/living/simple_animal/borer/worm = user if(!worm.host) return FALSE return TRUE diff --git a/mods/species/ascent/effects/razorweb.dm b/mods/species/ascent/effects/razorweb.dm index d67a55ee498..c8b05c70deb 100644 --- a/mods/species/ascent/effects/razorweb.dm +++ b/mods/species/ascent/effects/razorweb.dm @@ -13,7 +13,7 @@ web.buckle_mob(hit_atom) web.visible_message(SPAN_DANGER("\The [hit_atom] is tangled in \the [web]!")) web.entangle(hit_atom, TRUE) - playsound(usr, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) qdel(src) // Hey, did you ever see The Cube (1997) directed by Vincenzo Natali? @@ -68,7 +68,7 @@ START_PROCESSING(SSobj, src) /obj/effect/razorweb/proc/decay() - playsound(usr, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) qdel_self() /obj/effect/razorweb/attack_hand(mob/user) @@ -163,8 +163,8 @@ if(prob(break_chance)) visible_message(SPAN_DANGER("\The [src] breaks apart!")) - playsound(usr, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) qdel(src) else - playsound(usr, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) break_chance = min(break_chance+10, 100) \ No newline at end of file diff --git a/mods/species/ascent/mobs/nymph/nymph_life.dm b/mods/species/ascent/mobs/nymph/nymph_life.dm index 4c217a9aee0..f8e5c45fd4a 100644 --- a/mods/species/ascent/mobs/nymph/nymph_life.dm +++ b/mods/species/ascent/mobs/nymph/nymph_life.dm @@ -61,23 +61,22 @@ return molt = min(molt + 1, 5) - var/mob/living/simple_animal/alien/kharmaan/nymph = usr - nymph.visible_message("\icon[nymph] [nymph] begins to shimmy and shake out of its old skin.") + visible_message("\icon[src] [src] begins to shimmy and shake out of its old skin.") if(molt == 5) - if(do_after(nymph, 10 SECONDS, nymph, FALSE)) - var/mob/living/human/H = new(get_turf(usr), SPECIES_MANTID_ALATE) - H.set_gyne_lineage(nymph.get_gyne_lineage()) + if(do_after(src, 10 SECONDS, src, FALSE)) + var/mob/living/human/H = new(get_turf(src), SPECIES_MANTID_ALATE) + H.set_gyne_lineage(get_gyne_lineage()) H.real_name = "[random_id(/decl/species/mantid, 10000, 99999)] [H.get_gyne_name()]" - H.nutrition = nymph.nutrition * 0.25 // Homgry after molt. - nymph.mind.transfer_to(H) - qdel(nymph) + H.nutrition = nutrition * 0.25 // Homgry after molt. + mind.transfer_to(H) + qdel(src) H.visible_message("\icon[H] [H] emerges from its molt as a new alate.") new/obj/item/ascent_molt(get_turf(src)) else - nymph.visible_message("\icon[nymph] [nymph] abruptly stops molting.") + visible_message("\icon[src] [src] abruptly stops molting.") return - if(do_after(nymph, 5 SECONDS, nymph, FALSE)) + if(do_after(src, 5 SECONDS, src, FALSE)) var/matrix/M = matrix() M.Scale(1 + (molt / 10)) animate(src, transform = M, time = 2, easing = QUAD_EASING) @@ -88,4 +87,4 @@ new /obj/item/ascent_molt(get_turf(src)) else - nymph.visible_message("\icon[nymph] [nymph] abruptly stops molting.") \ No newline at end of file + visible_message("\icon[src] [src] abruptly stops molting.") \ No newline at end of file From ac7009d50ece5df310c8f758e35df7f0b52c9c2f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 23:53:45 -0500 Subject: [PATCH 163/554] Remove unnecessary uses of usr in mob code --- code/modules/mob/living/bot/bot.dm | 4 +-- code/modules/mob/living/human/human.dm | 16 ++++----- code/modules/mob/living/living.dm | 6 ++-- code/modules/mob/living/living_resist.dm | 14 ++++---- .../mob/living/silicon/robot/drone/drone.dm | 4 +-- .../mob/living/silicon/robot/robot_items.dm | 6 ++-- code/modules/mob/living/silicon/silicon.dm | 2 +- code/modules/mob/mob.dm | 35 ++++++------------- code/modules/mob/mob_movement.dm | 7 ++-- code/modules/mob/observer/ghost/ghost.dm | 3 -- code/modules/mob/stripping.dm | 2 +- 11 files changed, 41 insertions(+), 58 deletions(-) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index cfe9577d41c..ff453a99da4 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -95,7 +95,7 @@ if(access_scanner.allowed(user) && !open) locked = !locked to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]") - Interact(usr) + Interact(user) else if(open) to_chat(user, "Please close the access panel before locking it.") else @@ -105,7 +105,7 @@ if(!locked) open = !open to_chat(user, "Maintenance panel is now [open ? "opened" : "closed"].") - Interact(usr) + Interact(user) else to_chat(user, "You need to unlock the controls first.") return TRUE diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 43c38c6f553..dad5d4d85a8 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -182,7 +182,7 @@ var/datum/computer_file/report/crew_record/R = network.get_crew_record_by_name(perpname) if(R) var/setcriminal = input(user, "Specify a new criminal status for this person.", "Security HUD", R.get_criminalStatus()) as null|anything in global.security_statuses - if(hasHUD(usr, HUD_SECURITY) && setcriminal) + if(hasHUD(user, HUD_SECURITY) && setcriminal) R.set_criminalStatus(setcriminal) modified = 1 @@ -196,11 +196,11 @@ U.handle_regular_hud_updates() if(!modified) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(user, "Unable to locate a data core entry for this person.") return TOPIC_HANDLED if (href_list["secrecord"]) - if(hasHUD(usr, HUD_SECURITY)) + if(hasHUD(user, HUD_SECURITY)) var/perpname = "wot" var/read = 0 @@ -274,11 +274,11 @@ var/datum/computer_file/report/crew_record/E = network.get_crew_record_by_name(perpname) if(E) if(hasHUD(user, HUD_MEDICAL)) - to_chat(usr, "Name: [E.get_name()]") - to_chat(usr, "Gender: [E.get_gender()]") - to_chat(usr, "Species: [E.get_species_name()]") - to_chat(usr, "Blood Type: [E.get_bloodtype()]") - to_chat(usr, "Details: [E.get_medical_record()]") + to_chat(user, "Name: [E.get_name()]") + to_chat(user, "Gender: [E.get_gender()]") + to_chat(user, "Species: [E.get_species_name()]") + to_chat(user, "Blood Type: [E.get_bloodtype()]") + to_chat(user, "Details: [E.get_medical_record()]") read = 1 if(!read) to_chat(user, "Unable to locate a data core entry for this person.") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a8af9c4657a..7bab0e45da2 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -36,7 +36,7 @@ if(!..()) return 0 - usr.visible_message("[src] points to [A]") + visible_message("[src] points to [A]") return 1 /*one proc, four uses @@ -657,7 +657,7 @@ default behaviour is: if(length(selectable_postures) == 1) selected_posture = selectable_postures[1] else - selected_posture = input(usr, "Which posture do you wish to adopt?", "Change Posture", current_posture) as null|anything in selectable_postures + selected_posture = input(src, "Which posture do you wish to adopt?", "Change Posture", current_posture) as null|anything in selectable_postures if(!selected_posture || length(get_available_postures()) <= 1 || incapacitated(INCAPACITATION_KNOCKOUT) || !canClick()) return if(current_posture == selected_posture || !(selected_posture in get_selectable_postures())) @@ -1063,7 +1063,7 @@ default behaviour is: if(user.mob_size >= exosuit.body.min_pilot_size && user.mob_size <= exosuit.body.max_pilot_size) exosuit.enter(src) else - to_chat(usr, SPAN_WARNING("You cannot pilot a exosuit of this size.")) + to_chat(user, SPAN_WARNING("You cannot pilot a exosuit of this size.")) return TRUE . = ..() diff --git a/code/modules/mob/living/living_resist.dm b/code/modules/mob/living/living_resist.dm index 9228eda91a5..c1339fbaefc 100644 --- a/code/modules/mob/living/living_resist.dm +++ b/code/modules/mob/living/living_resist.dm @@ -13,37 +13,39 @@ if(buckled.can_buckle) buckled.user_unbuckle_mob(src) else - to_chat(usr, "You can't seem to escape from \the [buckled]!") + to_chat(src, "You can't seem to escape from \the [buckled]!") return setClickCooldown(100) unbuckle_time = max(0, (2 MINUTES) - get_special_resist_time()) + var/decl/pronouns/pronouns = get_pronouns() + visible_message( - "[src] attempts to unbuckle themself!", + "[src] attempts to unbuckle [pronouns.self]!", "You attempt to unbuckle yourself. (This will take around [unbuckle_time / (1 SECOND)] second\s and you need to stand still)", range = 2 ) if(unbuckle_time && buckled) var/stages = 2 for(var/i = 1 to stages) - if(!unbuckle_time || do_after(usr, unbuckle_time*0.5, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) + if(!unbuckle_time || do_after(src, unbuckle_time*0.5, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) if(!buckled) return visible_message( - SPAN_WARNING("\The [src] tries to unbuckle themself."), + SPAN_WARNING("\The [src] tries to unbuckle [pronouns.self]."), SPAN_WARNING("You try to unbuckle yourself ([i*100/stages]% done)."), range = 2 ) else if(!buckled) return visible_message( - SPAN_WARNING("\The [src] stops trying to unbuckle themself."), + SPAN_WARNING("\The [src] stops trying to unbuckle [pronouns.self]."), SPAN_WARNING("You stop trying to unbuckle yourself."), range = 2 ) return visible_message( - SPAN_DANGER("\The [src] manages to unbuckle themself!"), + SPAN_DANGER("\The [src] manages to unbuckle [pronouns.self]!"), SPAN_NOTICE("You successfully unbuckle yourself."), range = 2 ) buckled.user_unbuckle_mob(src) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index c80b26a83b5..0563fce5521 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -178,7 +178,7 @@ if(!get_config_value(/decl/config/toggle/on/allow_drone_spawn) || emagged || should_be_dead()) //It's dead, Dave. to_chat(user, "The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.") return TRUE - if(!allowed(usr)) + if(!allowed(user)) to_chat(user, "Access denied.") return TRUE var/decl/pronouns/pronouns = user.get_pronouns() @@ -193,7 +193,7 @@ SPAN_DANGER("\The [user] swipes [pronouns.his] ID card through \the [src], attempting to shut it down."), \ SPAN_DANGER("You swipe your ID card through \the [src], attempting to shut it down.")) if(!emagged) - if(allowed(usr)) + if(allowed(user)) shut_down() else to_chat(user, SPAN_DANGER("Access denied.")) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index eb0a535eec6..6c4ccab5c3a 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -243,9 +243,9 @@ to_chat(user, "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored.") to_chat(user, "It is set to deploy [mode ? "doors" : "walls"]") -/obj/item/inflatable_dispenser/attack_self() +/obj/item/inflatable_dispenser/attack_self(mob/user) mode = !mode - to_chat(usr, "You set \the [src] to deploy [mode ? "doors" : "walls"].") + to_chat(user, "You set \the [src] to deploy [mode ? "doors" : "walls"].") /obj/item/inflatable_dispenser/afterattack(var/atom/A, var/mob/user) ..(A, user) @@ -301,7 +301,7 @@ if(istype(A, /obj/item/inflatable)) if(istype(A, /obj/item/inflatable/door)) if(stored_doors >= max_doors) - to_chat(usr, "\The [src] is full!") + to_chat(user, "\The [src] is full!") return stored_doors++ qdel(A) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 714102823d0..768dc1c0d51 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -368,7 +368,7 @@ if(istype(W) && user.try_unequip(W)) W.forceMove(src) stock_parts += W - to_chat(usr, "You install the [W.name].") + to_chat(user, "You install the [W.name].") return TRUE /mob/living/silicon/proc/try_stock_parts_removal(obj/item/W, mob/user) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 35df33c80fa..5ed9d75db53 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -561,10 +561,10 @@ update_flavor_text(href_list["flavor_change"]) return TOPIC_HANDLED -// If usr != src, or if usr == src but the Topic call was not resolved, this is called next. /mob/proc/get_comments_record() return +// If usr != src, or if usr == src but the Topic call was not resolved, this is called next. /mob/OnTopic(mob/user, href_list, datum/topic_state/state) if(href_list["refresh"]) @@ -626,9 +626,6 @@ return TRUE . = ..() -/mob/proc/is_active() - return (0 >= usr.stat) - /mob/proc/can_touch(var/atom/touching) if(!touching.Adjacent(src) || incapacitated()) return FALSE @@ -639,16 +636,6 @@ to_chat(src, SPAN_WARNING("You are buckled down.")) return TRUE -/mob/proc/see(message) - if(!is_active()) - return 0 - to_chat(src, message) - return 1 - -/mob/proc/show_viewers(message) - for(var/mob/M in viewers()) - M.see(message) - /mob/Stat() ..() . = (is_client_active(10 MINUTES)) @@ -806,12 +793,10 @@ to_chat(usr, "You are restrained and cannot do that!") return - var/mob/S = src - var/mob/U = usr var/list/valid_objects = list() var/self = null - if(S == U) + if(src == usr) self = 1 // Removing object from yourself. valid_objects = get_visible_implants(0) @@ -819,16 +804,16 @@ if(self) to_chat(src, "You have nothing stuck in your body that is large enough to remove.") else - to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") + to_chat(usr, "[src] has nothing stuck in their wounds that is large enough to remove.") return var/obj/item/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects if(self) to_chat(src, "You attempt to get a good grip on [selection] in your body.") else - to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") - if(!do_mob(U, S, 30, incapacitation_flags = INCAPACITATION_DEFAULT & (~INCAPACITATION_FORCELYING))) //let people pinned to stuff yank it out, otherwise they're stuck... forever!!! + to_chat(usr, "You attempt to get a good grip on [selection] in [src]'s body.") + if(!do_mob(usr, src, 30, incapacitation_flags = INCAPACITATION_DEFAULT & (~INCAPACITATION_FORCELYING))) //let people pinned to stuff yank it out, otherwise they're stuck... forever!!! return - if(!selection || !S || !U) + if(QDELETED(selection) || QDELETED(src) || QDELETED(usr)) return if(self) @@ -837,10 +822,10 @@ visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.") remove_implant(selection) selection.forceMove(get_turf(src)) - if(U.get_empty_hand_slot()) - U.put_in_hands(selection) - if(ishuman(U)) - var/mob/living/human/human_user = U + if(usr.get_empty_hand_slot()) + usr.put_in_hands(selection) + if(ishuman(usr)) + var/mob/living/human/human_user = usr human_user.bloody_hands(src) return 1 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index c11e15b0580..21c41101077 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -39,11 +39,10 @@ attack_self() return if(SOUTHWEST) - if(isliving(usr)) - var/mob/living/M = usr - M.toggle_throw_mode() + if(isliving(mob)) + mob.toggle_throw_mode() else - to_chat(usr, "This mob type cannot throw items.") + to_chat(src, "This mob type cannot throw items.") return if(NORTHWEST) mob.hotkey_drop() diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index acf4b0af582..e0d72bed61d 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -185,9 +185,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. announce_ghost_joinleave(ghost) -/mob/observer/ghost/is_active() - return FALSE - /mob/observer/ghost/Stat() . = ..() if(statpanel("Status") && SSevac.evacuation_controller) diff --git a/code/modules/mob/stripping.dm b/code/modules/mob/stripping.dm index 18b1ccb45e9..0856c861787 100644 --- a/code/modules/mob/stripping.dm +++ b/code/modules/mob/stripping.dm @@ -47,7 +47,7 @@ visible_message(SPAN_NOTICE("\The [user] [sensor.get_sensors_locked() ? "" : "un"]locks \the [src]'s vitals sensor controls."), range = 2) return if("internals") - visible_message("\The [usr] is trying to set \the [src]'s internals!") + visible_message("\The [user] is trying to set \the [src]'s internals!") if(do_after(user, HUMAN_STRIP_DELAY, src, progress = 0)) toggle_internals(user) return From c750c274f81d12ef06fb36fecabdbb9654f4804a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 23:54:02 -0500 Subject: [PATCH 164/554] Remove unnecessary uses of usr in projectile code --- code/modules/projectiles/guns/launcher/rocket.dm | 2 +- .../projectiles/guns/projectile/dartgun.dm | 6 +++--- .../projectiles/targeting/targeting_client.dm | 15 +++++++-------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index ee2bc15639b..d8d3d2e48bd 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -32,7 +32,7 @@ to_chat(user, "[rockets.len] / [max_rockets] rockets.") return TRUE else - to_chat(usr, "\The [src] cannot hold more rockets.") + to_chat(user, "\The [src] cannot hold more rockets.") return TRUE return ..() diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index a34c5d36ae9..6c00e6c2594 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -151,13 +151,13 @@ else if (href_list["eject"]) var/index = text2num(href_list["eject"]) if(beakers[index]) - remove_beaker(beakers[index], usr) + remove_beaker(beakers[index], user) . = TOPIC_REFRESH else if (href_list["eject_cart"]) - unload_ammo(usr) + unload_ammo(user) . = TOPIC_REFRESH - Interact(usr) + Interact(user) /obj/item/gun/projectile/dartgun/medical starting_chems = list(/decl/material/liquid/burn_meds,/decl/material/liquid/brute_meds,/decl/material/liquid/antitoxins) diff --git a/code/modules/projectiles/targeting/targeting_client.dm b/code/modules/projectiles/targeting/targeting_client.dm index eeaf61909de..082471448a5 100644 --- a/code/modules/projectiles/targeting/targeting_client.dm +++ b/code/modules/projectiles/targeting/targeting_client.dm @@ -1,12 +1,11 @@ //These are called by the on-screen buttons, adjusting what the victim can and cannot do. /client/proc/add_gun_icons() - if(!usr || !usr.item_use_icon) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. - screen |= usr.item_use_icon - screen |= usr.gun_move_icon - screen |= usr.radio_use_icon + if(!mob.item_use_icon) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. + screen |= mob.item_use_icon + screen |= mob.gun_move_icon + screen |= mob.radio_use_icon /client/proc/remove_gun_icons() - if(!usr) return 1 // Runtime prevention on N00k agents spawning with SMG - screen -= usr.item_use_icon - screen -= usr.gun_move_icon - screen -= usr.radio_use_icon + screen -= mob.item_use_icon + screen -= mob.gun_move_icon + screen -= mob.radio_use_icon From 525eddf776b04ae2ebf3af8cfeb2a1d9dafc2fc5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 23:54:15 -0500 Subject: [PATCH 165/554] Remove unnecessary uses of usr in reagent code --- code/modules/reagents/Chemistry-Machinery.dm | 2 +- code/modules/reagents/dispenser/cartridge.dm | 9 +++++---- code/modules/reagents/reagent_containers.dm | 4 ++-- code/modules/reagents/reagent_containers/borghydro.dm | 4 ++-- code/modules/reagents/reagent_containers/food/eggs.dm | 4 ++-- code/modules/reagents/reagent_containers/glass.dm | 6 +++--- code/modules/reagents/reagent_containers/spray.dm | 6 +++--- 7 files changed, 18 insertions(+), 17 deletions(-) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index eaac5570598..0216e31ad13 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -254,7 +254,7 @@ spawn() has_sprites += user.client for(var/i = 1 to MAX_PILL_SPRITE) - send_rsc(usr, icon('icons/obj/items/chem/pill.dmi', "pill" + num2text(i)), "pill[i].png") + send_rsc(user, icon('icons/obj/items/chem/pill.dmi', "pill" + num2text(i)), "pill[i].png") var/dat = list() dat += "[name]" dat += "[name] Menu:" diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm index ab55f5dd975..62f5d50a7e3 100644 --- a/code/modules/reagents/dispenser/cartridge.dm +++ b/code/modules/reagents/dispenser/cartridge.dm @@ -48,13 +48,14 @@ else if(user) to_chat(user, SPAN_NOTICE("You clear the label on \the [src].")) -/obj/item/chems/chem_disp_cartridge/attack_self() - ..() +/obj/item/chems/chem_disp_cartridge/attack_self(mob/user) + if((. = ..())) + return if (ATOM_IS_OPEN_CONTAINER(src)) - to_chat(usr, SPAN_NOTICE("You put the cap on \the [src].")) + to_chat(user, SPAN_NOTICE("You put the cap on \the [src].")) atom_flags ^= ATOM_FLAG_OPEN_CONTAINER else - to_chat(usr, SPAN_NOTICE("You take the cap off \the [src].")) + to_chat(user, SPAN_NOTICE("You take the cap off \the [src].")) atom_flags |= ATOM_FLAG_OPEN_CONTAINER /obj/item/chems/chem_disp_cartridge/afterattack(obj/target, mob/user, proximity_flag, click_parameters) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 49d66cb0af7..a39da55a863 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -43,10 +43,10 @@ /obj/item/chems/proc/cannot_interact(mob/user) if(!CanPhysicallyInteract(user)) - to_chat(usr, SPAN_WARNING("You're in no condition to do that!")) + to_chat(user, SPAN_WARNING("You're in no condition to do that!")) return TRUE if(ismob(loc) && loc != user) - to_chat(usr, SPAN_WARNING("You can't set transfer amounts while \the [src] is being held by someone else.")) + to_chat(user, SPAN_WARNING("You can't set transfer amounts while \the [src] is being held by someone else.")) return TRUE return FALSE diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 6e69142d458..06147c369b4 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -100,14 +100,14 @@ return -/obj/item/chems/borghypo/OnTopic(var/href, var/list/href_list) +/obj/item/chems/borghypo/OnTopic(mob/user, href_list, datum/topic_state/state) if(href_list["reagent_index"]) var/index = text2num(href_list["reagent_index"]) if(index > 0 && index <= reagent_ids.len) playsound(loc, 'sound/effects/pop.ogg', 50, 0) mode = index var/decl/material/R = reagent_ids[mode] - to_chat(usr, "Synthesizer is now producing '[initial(R.name)]'.") + to_chat(user, "Synthesizer is now producing '[initial(R.name)]'.") return TOPIC_REFRESH /obj/item/chems/borghypo/examine(mob/user, distance) diff --git a/code/modules/reagents/reagent_containers/food/eggs.dm b/code/modules/reagents/reagent_containers/food/eggs.dm index bf707313e55..ea7851b65ed 100644 --- a/code/modules/reagents/reagent_containers/food/eggs.dm +++ b/code/modules/reagents/reagent_containers/food/eggs.dm @@ -39,10 +39,10 @@ var/clr = W.get_tool_property(TOOL_PEN, TOOL_PROP_COLOR_NAME) if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - to_chat(usr, SPAN_WARNING("The egg refuses to take on this color!")) + to_chat(user, SPAN_WARNING("The egg refuses to take on this color!")) return TRUE - to_chat(usr, SPAN_NOTICE("You color \the [src] [clr]")) + to_chat(user, SPAN_NOTICE("You color \the [src] [clr]")) icon_state = "egg-[clr]" return TRUE return ..() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index d120bce478c..64e7fb66199 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -56,14 +56,14 @@ /obj/item/chems/glass/proc/can_lid() return TRUE -/obj/item/chems/glass/attack_self() +/obj/item/chems/glass/attack_self(mob/user) . = ..() if(!. && can_lid()) if(ATOM_IS_OPEN_CONTAINER(src)) - to_chat(usr, SPAN_NOTICE("You put the lid on \the [src].")) + to_chat(user, SPAN_NOTICE("You put the lid on \the [src].")) atom_flags ^= ATOM_FLAG_OPEN_CONTAINER else - to_chat(usr, SPAN_NOTICE("You take the lid off \the [src].")) + to_chat(user, SPAN_NOTICE("You take the lid off \the [src].")) atom_flags |= ATOM_FLAG_OPEN_CONTAINER update_icon() diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 2df686595f8..711c448ebdd 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -85,7 +85,7 @@ /obj/item/chems/spray/attack_self(var/mob/user) if(has_safety()) - toggle_safety() + toggle_safety(user) return TRUE else //If no safety, we just toggle the nozzle @@ -98,9 +98,9 @@ /obj/item/chems/spray/proc/has_safety() return FALSE -/obj/item/chems/spray/proc/toggle_safety() +/obj/item/chems/spray/proc/toggle_safety(mob/user) safety = !safety - to_chat(usr, SPAN_NOTICE("You switch the safety [safety ? "on" : "off"].")) + to_chat(user, SPAN_NOTICE("You switch the safety [safety ? "on" : "off"].")) /obj/item/chems/spray/examine(mob/user, distance) . = ..() From 0f78949e76df83a7f17fd490fd1aa0be37c3af94 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 23:54:33 -0500 Subject: [PATCH 166/554] Remove unnecessary uses of usr in modular computers --- .../file_system/programs/command/card.dm | 18 +++---- .../file_system/programs/command/comm.dm | 50 +++++++++---------- .../engineering/network_monitoring.dm | 4 +- .../file_system/programs/generic/records.dm | 2 +- .../file_system/programs/generic/reports.dm | 2 +- .../networking/machinery/acl.dm | 14 +++--- code/modules/modular_computers/os/ui.dm | 12 ++--- 7 files changed, 51 insertions(+), 51 deletions(-) diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index 68257d94e53..af9339b6a13 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -151,7 +151,7 @@ module.show_assignments = 1 if("print") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer.has_component(PART_PRINTER)) //This option should never be called if there is no printer if(module.mod_mode) @@ -175,7 +175,7 @@ contents += " [get_access_desc(A)]" if(!computer.print_paper(contents,"access report")) - to_chat(usr, "Hardware error: Printer was unable to print the file. It may be out of paper.") + to_chat(user, "Hardware error: Printer was unable to print the file. It may be out of paper.") return else var/contents = {"

Crew Manifest

@@ -183,7 +183,7 @@ [html_crew_manifest()] "} if(!computer.print_paper(contents, "crew manifest ([stationtime2text()])")) - to_chat(usr, "Hardware error: Printer was unable to print the file. It may be out of paper.") + to_chat(user, "Hardware error: Printer was unable to print the file. It may be out of paper.") return if("eject") var/obj/item/stock_parts/computer/card_slot/card_slot = computer.get_component(PART_CARD) @@ -193,7 +193,7 @@ card_slot.insert_id(user.get_active_held_item(), user) if("terminate") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer) id_card.assignment = "Terminated" @@ -201,7 +201,7 @@ RAISE_EVENT(/decl/observ/employee_id_terminated, id_card) if("edit") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer) var/static/regex/hash_check = regex(@"^[0-9a-fA-F]{32}$") @@ -212,7 +212,7 @@ id_card.formal_name_suffix = initial(id_card.formal_name_suffix) id_card.formal_name_prefix = initial(id_card.formal_name_prefix) else - computer.show_error(usr, "Invalid name entered!") + computer.show_error(user, "Invalid name entered!") else if(href_list["account"]) var/account_num = text2num(input("Enter account number.", "Account", id_card.associated_account_number)) id_card.associated_account_number = account_num @@ -243,11 +243,11 @@ if(!isnull(sug_blood_type) && CanUseTopic(user)) id_card.blood_type = sug_blood_type else if(href_list["front_photo"]) - var/photo = get_photo(usr) + var/photo = get_photo(user) if(photo && CanUseTopic(user)) id_card.front = photo else if(href_list["side_photo"]) - var/photo = get_photo(usr) + var/photo = get_photo(user) if(photo && CanUseTopic(user)) id_card.side = photo else if(href_list["load_data"]) @@ -275,7 +275,7 @@ apply_access(id_card, access) if("assign") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer && id_card) var/t1 = href_list["assign_target"] diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm index 8d9a59feacf..fbb4c292e2c 100644 --- a/code/modules/modular_computers/file_system/programs/command/comm.dm +++ b/code/modules/modular_computers/file_system/programs/command/comm.dm @@ -62,7 +62,7 @@ data["message_line1"] = msg_line1 data["message_line2"] = msg_line2 data["state"] = current_status - data["isAI"] = issilicon(usr) + data["isAI"] = issilicon(user) data["authenticated"] = is_authenticated(user) data["boss_short"] = global.using_map.boss_short @@ -153,17 +153,17 @@ current_status = text2num(href_list["target"]) if("announce") . = 1 - if(is_authenticated(user) && !issilicon(usr) && ntn_comm) + if(is_authenticated(user) && !issilicon(user) && ntn_comm) if(user) var/obj/item/card/id/id_card = user.GetIdCard() crew_announcement.announcer = GetNameAndAssignmentFromId(id_card) else crew_announcement.announcer = "Unknown" if(announcment_cooldown) - to_chat(usr, "Please allow at least one minute to pass between announcements.") + to_chat(user, "Please allow at least one minute to pass between announcements.") return TRUE - var/input = input(usr, "Please write a message to announce to the [station_name()].", "Priority Announcement") as null|message - if(!input || !can_still_topic() || filter_block_message(usr, input)) + var/input = input(user, "Please write a message to announce to the [station_name()].", "Priority Announcement") as null|message + if(!input || !can_still_topic() || filter_block_message(user, input)) return 1 var/affected_zlevels = SSmapping.get_connected_levels(get_host_z()) crew_announcement.Announce(input, zlevels = affected_zlevels) @@ -174,35 +174,35 @@ . = 1 if(href_list["target"] == "emagged") if(program) - if(is_authenticated(user) && program.computer.emagged() && !issilicon(usr) && ntn_comm) + if(is_authenticated(user) && program.computer.emagged() && !issilicon(user) && ntn_comm) if(centcomm_message_cooldown) - to_chat(usr, "Arrays recycling. Please stand by.") + to_chat(user, "Arrays recycling. Please stand by.") SSnano.update_uis(src) return - var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) - if(!input || !can_still_topic() || filter_block_message(usr, input)) + var/input = sanitize(input(user, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) + if(!input || !can_still_topic() || filter_block_message(user, input)) return 1 - Syndicate_announce(input, usr) - to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made an illegal announcement: [input]") + Syndicate_announce(input, user) + to_chat(user, "Message transmitted.") + log_say("[key_name(user)] has made an illegal announcement: [input]") centcomm_message_cooldown = 1 spawn(300)//30 second cooldown centcomm_message_cooldown = 0 else if(href_list["target"] == "regular") - if(is_authenticated(user) && !issilicon(usr) && ntn_comm) + if(is_authenticated(user) && !issilicon(user) && ntn_comm) if(centcomm_message_cooldown) - to_chat(usr, "Arrays recycling. Please stand by.") + to_chat(user, "Arrays recycling. Please stand by.") SSnano.update_uis(src) return if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs. - to_chat(usr, "No emergency communication relay detected. Unable to transmit message.") + to_chat(user, "No emergency communication relay detected. Unable to transmit message.") return 1 var/input = sanitize(input("Please choose a message to transmit to [global.using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) - if(!input || !can_still_topic() || filter_block_message(usr, input)) + if(!input || !can_still_topic() || filter_block_message(user, input)) return 1 - Centcomm_announce(input, usr) - to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made an IA [global.using_map.boss_short] announcement: [input]") + Centcomm_announce(input, user) + to_chat(user, "Message transmitted.") + log_say("[key_name(user)] has made an IA [global.using_map.boss_short] announcement: [input]") centcomm_message_cooldown = 1 spawn(300) //30 second cooldown centcomm_message_cooldown = 0 @@ -241,7 +241,7 @@ post_status(href_list["target"]) if("setalert") . = 1 - if(is_authenticated(user) && !issilicon(usr) && ntn_cont && ntn_comm) + if(is_authenticated(user) && !issilicon(user) && ntn_cont && ntn_comm) var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) var/decl/security_level/target_level = locate(href_list["target"]) in security_state.comm_console_security_levels if(target_level && security_state.can_switch_to(target_level)) @@ -250,7 +250,7 @@ if(security_state.set_security_level(target_level)) SSstatistics.add_field(target_level.type,1) else - to_chat(usr, "You press the button, but a red light flashes and nothing happens.") //This should never happen + to_chat(user, "You press the button, but a red light flashes and nothing happens.") //This should never happen current_status = STATE_DEFAULT if("viewmessage") @@ -270,13 +270,13 @@ . = 1 if(is_authenticated(user) && ntn_comm) if(!program.computer.print_paper(current_viewing_message["contents"],current_viewing_message["title"])) - to_chat(usr, "Hardware Error: Printer was unable to print the selected file.") + to_chat(user, "Hardware Error: Printer was unable to print the selected file.") if("unbolt_doors") global.using_map.unbolt_saferooms() - to_chat(usr, "The console beeps, confirming the signal was sent to have the saferooms unbolted.") + to_chat(user, "The console beeps, confirming the signal was sent to have the saferooms unbolted.") if("bolt_doors") global.using_map.bolt_saferooms() - to_chat(usr, "The console beeps, confirming the signal was sent to have the saferooms bolted.") + to_chat(user, "The console beeps, confirming the signal was sent to have the saferooms bolted.") #undef STATE_DEFAULT #undef STATE_MESSAGELIST @@ -365,7 +365,7 @@ var/global/last_message_id = 0 if(isnull(emergency)) emergency = 1 - if(!global.universe.OnShuttleCall(usr)) + if(!global.universe.OnShuttleCall(user)) to_chat(user, "Cannot establish a connection.") return diff --git a/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm b/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm index 0a0dd383145..0b111c2306a 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm @@ -119,7 +119,7 @@ return TOPIC_HANDLED var/new_roles = global.all_mainframe_roles - M.roles if(!length(new_roles)) - to_chat(usr, SPAN_WARNING("This server already has all possible roles enabled.")) + to_chat(user, SPAN_WARNING("This server already has all possible roles enabled.")) return TOPIC_HANDLED var/role = input(user,"What role to enable on this server?") as null|anything in new_roles if(role && CanUseTopic(user, state)) @@ -132,7 +132,7 @@ if(!istype(M)) return TOPIC_HANDLED if(!length(M.roles)) - to_chat(usr, SPAN_WARNING("This server has no enabled roles to remove.")) + to_chat(user, SPAN_WARNING("This server has no enabled roles to remove.")) return TOPIC_HANDLED var/role = input(user,"What role to disable on this server?") as null|anything in M.roles if(role && CanUseTopic(user, state)) diff --git a/code/modules/modular_computers/file_system/programs/generic/records.dm b/code/modules/modular_computers/file_system/programs/generic/records.dm index 4d79e385dd3..0305f32e421 100644 --- a/code/modules/modular_computers/file_system/programs/generic/records.dm +++ b/code/modules/modular_computers/file_system/programs/generic/records.dm @@ -163,7 +163,7 @@ var/obj/item/photo/photo = user.get_active_held_item() return photo.img if(issilicon(user)) - var/mob/living/silicon/tempAI = usr + var/mob/living/silicon/tempAI = user var/obj/item/photo/selection = tempAI.GetPicture() if (selection) return selection.img diff --git a/code/modules/modular_computers/file_system/programs/generic/reports.dm b/code/modules/modular_computers/file_system/programs/generic/reports.dm index 4897bd58385..a88753fdd88 100644 --- a/code/modules/modular_computers/file_system/programs/generic/reports.dm +++ b/code/modules/modular_computers/file_system/programs/generic/reports.dm @@ -141,7 +141,7 @@ return 1 var/field_ID = text2num(href_list["ID"]) var/datum/report_field/field = selected_report.field_from_ID(field_ID) - if(!field || !(field.get_perms(get_access(usr), usr) & OS_WRITE_ACCESS)) + if(!field || !(field.get_perms(get_access(user), user) & OS_WRITE_ACCESS)) return 1 field.ask_value(user) //Handles the remaining IO. return 1 diff --git a/code/modules/modular_computers/networking/machinery/acl.dm b/code/modules/modular_computers/networking/machinery/acl.dm index 566d6e17816..7fe16ac83c0 100644 --- a/code/modules/modular_computers/networking/machinery/acl.dm +++ b/code/modules/modular_computers/networking/machinery/acl.dm @@ -32,14 +32,14 @@ if(href_list["back"]) current_group = null return TOPIC_REFRESH - + if(href_list["create_group"]) - var/group_name = sanitize_for_group(input(usr, "Enter the name of the new group. Maximum 15 characters, only alphanumeric characters, _ and - are allowed:", "Create Group")) + var/group_name = sanitize_for_group(input(user, "Enter the name of the new group. Maximum 15 characters, only alphanumeric characters, _ and - are allowed:", "Create Group")) if(!length(group_name)) return TOPIC_HANDLED if(!CanInteract(user, global.default_topic_state)) return TOPIC_REFRESH - + var/output = D.add_group(group_name, current_group) if(group_name in D.all_groups) to_chat(user, SPAN_NOTICE(output)) @@ -59,15 +59,15 @@ else to_chat(user, SPAN_NOTICE(output)) return TOPIC_REFRESH - + if(href_list["toggle_submanagement"]) D.toggle_submanagement() return TOPIC_REFRESH - + if(href_list["toggle_parent_account_creation"]) D.toggle_parent_account_creation() return TOPIC_REFRESH - + if(href_list["view_child_groups"]) var/parent_group = href_list["view_child_groups"] if(parent_group && (parent_group in D.group_dict)) @@ -75,7 +75,7 @@ else current_group = null return TOPIC_REFRESH - + if(href_list["info"]) switch(href_list["info"]) if("submanagement") diff --git a/code/modules/modular_computers/os/ui.dm b/code/modules/modular_computers/os/ui.dm index 59ec11f651e..e619be1904f 100644 --- a/code/modules/modular_computers/os/ui.dm +++ b/code/modules/modular_computers/os/ui.dm @@ -61,7 +61,7 @@ . = min(., extension_status(user)) // Handles user's GUI input -/datum/extension/interactive/os/extension_act(href, href_list, user) +/datum/extension/interactive/os/extension_act(href, href_list, mob/user) if( href_list["PC_exit"] ) kill_program(active_program) return TOPIC_HANDLED @@ -94,7 +94,7 @@ system_shutdown() return TOPIC_HANDLED if( href_list["PC_minimize"] ) - minimize_program(usr) + minimize_program(user) return TOPIC_HANDLED if( href_list["PC_killprogram"] ) @@ -105,7 +105,7 @@ kill_program(P) update_uis() - to_chat(usr, "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.") + to_chat(user, "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.") return TOPIC_HANDLED if( href_list["PC_runprogram"] ) @@ -117,15 +117,15 @@ return TOPIC_REFRESH if( href_list["PC_terminal"] ) - open_terminal(usr) + open_terminal(user) return TOPIC_HANDLED if( href_list["PC_login"]) - login_prompt(usr) + login_prompt(user) return TOPIC_REFRESH if( href_list["PC_logout"]) - logout_account(usr) + logout_account(user) return TOPIC_REFRESH /datum/extension/interactive/os/proc/regular_ui_update() From 23aa0f2c51dd21f15ede326c408aad3ab5e528d1 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 23:55:32 -0500 Subject: [PATCH 167/554] Remove unnecessary uses of usr in paperwork code --- code/modules/paperwork/clipboard.dm | 2 +- code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/paper.dm | 2 +- code/modules/paperwork/paperbin.dm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index ee1e92dd890..d25c1d6cbe5 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -111,7 +111,7 @@ user.set_machine(src) show_browser(user, dat, "window=[initial(name)]") onclose(user, initial(name)) - add_fingerprint(usr) + add_fingerprint(user) return /obj/item/clipboard/proc/add_pen(var/obj/item/I, var/mob/user) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index cdcbe7b3444..a5008f8e225 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -44,7 +44,7 @@ else if(IS_PEN(W)) updateUsrDialog() - var/n_name = sanitize_safe(input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text, MAX_NAME_LEN) + var/n_name = sanitize_safe(input(user, "What would you like to label the folder?", "Folder Labelling", null) as text, MAX_NAME_LEN) if(!CanPhysicallyInteractWith(user, src)) to_chat(user, SPAN_WARNING("You must stay close to \the [src].")) return TRUE diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index b5beaeb8400..92a37e75a1b 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -332,7 +332,7 @@ var/pen_flags = I.get_tool_property(TOOL_PEN, TOOL_PROP_PEN_FLAG) var/decl/tool_archetype/pen/parch = GET_DECL(TOOL_PEN) if(!(pen_flags & PEN_FLAG_ACTIVE)) - parch.toggle_active(usr, I) + parch.toggle_active(user, I) var/iscrayon = pen_flags & PEN_FLAG_CRAYON var/isfancy = pen_flags & PEN_FLAG_FANCY diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 5d900aab357..70b9b4c453d 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -129,7 +129,7 @@ //Dump all stored papers too for(var/i=1 to amount) var/obj/item/paper/P = new /obj/item/paper(forced_loc) - P.merge_with_existing(forced_loc, usr) + P.merge_with_existing(forced_loc, user) LAZYCLEARLIST(papers) /obj/item/paper_bin/proc/add_paper(var/obj/item/paper/P) From a5b3bb4d07c7a370629f3f02e306cb0971fa2606 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 23:56:08 -0500 Subject: [PATCH 168/554] Remove unnecessary uses of usr in power/machinery code --- code/modules/power/cable.dm | 4 ++-- code/modules/power/port_gen.dm | 4 ++-- code/modules/power/singularity/emitter.dm | 8 ++++---- code/modules/power/smes_construction.dm | 2 +- code/modules/power/turbine.dm | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 86418a32c3a..dd74a49e3d3 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -235,7 +235,7 @@ By design, d1 is the smallest direction and d2 is the highest if(c.d1 == UP || c.d2 == UP) qdel(c) - investigate_log("was cut by [key_name(usr, usr.client)] in [get_area_name(user)]","wires") + investigate_log("was cut by [key_name(user, user.client)] in [get_area_name(user)]","wires") qdel(src) @@ -245,7 +245,7 @@ By design, d1 is the smallest direction and d2 is the highest return 0 if (electrocute_mob(user, powernet, src, siemens_coeff)) spark_at(src, amount=5, cardinal_only = TRUE) - if(HAS_STATUS(usr, STAT_STUN)) + if(HAS_STATUS(user, STAT_STUN)) return 1 return 0 diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index ae7a1bc6e42..43143998113 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -76,9 +76,9 @@ if(distance > 1) return if(active) - to_chat(usr, "The generator is on.") + to_chat(user, "The generator is on.") else - to_chat(usr, "The generator is off.") + to_chat(user, "The generator is off.") /obj/machinery/port_gen/emp_act(severity) if(!active) return diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index d7ae1df1a1a..233b66d985f 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -67,8 +67,8 @@ if(active==1) active = 0 to_chat(user, "You turn off \the [src].") - log_and_message_admins("turned off \the [src]") - investigate_log("turned off by [key_name_admin(user || usr)]","singulo") + log_and_message_admins("turned off \the [src]", user) + investigate_log("turned off by [key_name_admin(user)]","singulo") else active = 1 if(user) @@ -77,8 +77,8 @@ to_chat(user, "You turn on \the [src].") shot_number = 0 fire_delay = get_initial_fire_delay() - log_and_message_admins("turned on \the [src]") - investigate_log("turned on by [key_name_admin(user || usr)]","singulo") + log_and_message_admins("turned on \the [src]", user) + investigate_log("turned on by [key_name_admin(user)]","singulo") update_icon() else to_chat(user, "The controls are locked!") diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 3a956c49e00..59665f270cb 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -155,7 +155,7 @@ var/obj/item/clothing/gloves/G = h_user.get_equipped_item(slot_gloves_str) if(istype(G) && G.siemens_coefficient == 0) user_protected = 1 - log_and_message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100 - JMP") + log_and_message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [user.ckey], Intensity: [intensity]/100 - JMP") switch (intensity) if (0 to 15) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 8fb0064ca70..aa6c612f55b 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -185,7 +185,7 @@ /obj/machinery/turbine/OnTopic(user, href_list) if(href_list["close"]) - close_browser(usr, "window=turbine") + close_browser(user, "window=turbine") return TOPIC_HANDLED if(href_list["str"]) @@ -244,9 +244,9 @@ -/obj/machinery/computer/turbine_computer/OnTopic(user, href_list) +/obj/machinery/computer/turbine_computer/OnTopic(mob/user, href_list) if( href_list["view"] ) - usr.client.eye = src.compressor + user.client.eye = src.compressor . = TOPIC_HANDLED else if( href_list["str"] ) src.compressor.starter = !src.compressor.starter From 92832d0e865905019b9216c4829979ac1ce08ac0 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 23:56:22 -0500 Subject: [PATCH 169/554] Remove unnecessary uses of usr in vehicle code --- code/modules/vehicles/bike.dm | 2 +- code/modules/vehicles/cargo_train.dm | 2 +- code/modules/vehicles/vehicle.dm | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 08318914e2e..a5aa85daf86 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -63,7 +63,7 @@ usr.visible_message("\The [usr] puts up \the [src]'s kickstand.") else if(isspaceturf(src.loc)) - to_chat(usr, " You don't think kickstands work in space...") + to_chat(usr, "You don't think kickstands work in space...") return usr.visible_message("\The [usr] puts down \the [src]'s kickstand.") diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 342d8dbba7e..62606d2626b 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -193,7 +193,7 @@ if(distance > 1) return - if(!ishuman(usr)) + if(!ishuman(user)) return to_chat(user, "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition.") diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index fc8fbe1ee9d..edfc8efaba4 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -240,23 +240,23 @@ turn_on() return -/obj/vehicle/proc/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) +/obj/vehicle/proc/insert_cell(var/obj/item/cell/C, var/mob/living/user) if(cell) return if(!istype(C)) return - if(!H.try_unequip(C, src)) + if(!user.try_unequip(C, src)) return cell = C powercheck() - to_chat(usr, "You install [C] in [src].") + to_chat(user, "You install [C] in [src].") -/obj/vehicle/proc/remove_cell(var/mob/living/human/H) +/obj/vehicle/proc/remove_cell(var/mob/living/user) if(!cell) return - to_chat(usr, "You remove [cell] from [src].") - H.put_in_hands(cell) + to_chat(user, "You remove [cell] from [src].") + user.put_in_hands(cell) cell = null powercheck() From 12e20b7f42fa003c1bc8fa9cbe4080bf77537aaa Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 23:56:32 -0500 Subject: [PATCH 170/554] Remove unnecessary uses of usr in shuttle code --- code/modules/shuttles/docking_beacon.dm | 16 ++++++++-------- code/modules/shuttles/shuttle_console.dm | 2 +- code/modules/shuttles/shuttle_console_multi.dm | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/modules/shuttles/docking_beacon.dm b/code/modules/shuttles/docking_beacon.dm index 8c0f64d87b1..bac4e5fe16a 100644 --- a/code/modules/shuttles/docking_beacon.dm +++ b/code/modules/shuttles/docking_beacon.dm @@ -94,7 +94,7 @@ if(href_list["edit_codes"]) var/newcode = sanitize(input("Input new docking codes:", "Docking codes", docking_codes) as text|null) - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(newcode) docking_codes = uppertext(newcode) @@ -103,7 +103,7 @@ if(href_list["edit_display_name"]) var/newname = sanitize(input("Input new display name:", "Display name", display_name) as text|null) - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(newname) display_name = newname @@ -114,7 +114,7 @@ if(href_list["edit_size"]) var/newwidth = input("Input new docking width for beacon:", "Docking size", docking_width) as num|null var/newheight = input("Input new docking height for beacon:", "Docking size", docking_height) as num|null - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(newwidth && newheight) docking_width = clamp(newwidth, 0, MAX_DOCKING_SIZE) @@ -134,7 +134,7 @@ return TOPIC_REFRESH if(href_list["edit_permitted_shuttles"]) - var/shuttle = sanitize(input(usr,"Enter the ID of the shuttle you wish to permit/unpermit for this beacon:", "Enter ID") as text|null) + var/shuttle = sanitize(input(user,"Enter the ID of the shuttle you wish to permit/unpermit for this beacon:", "Enter ID") as text|null) if(shuttle) if(shuttle in permitted_shuttles) permitted_shuttles -= shuttle @@ -166,7 +166,7 @@ if(href_list["change_color"]) var/new_color = input(user, "Choose a color.", "\the [src]", ship_color) as color|null - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(new_color && new_color != ship_color) ship_color = new_color @@ -175,7 +175,7 @@ if(href_list["change_ship_name"]) var/new_ship_name = sanitize(input(user, "Enter a new name for the ship:", "Change ship name.") as null|text) - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(!new_ship_name) return TOPIC_HANDLED @@ -195,7 +195,7 @@ if(!construction_mode) return TOPIC_HANDLED var/confirm = alert(user, "This will permanently finalize the ship, are you sure?", "Ship finalization", "No", "Yes") - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(confirm == "Yes") if(create_ship()) @@ -203,7 +203,7 @@ ship_name = "" LAZYCLEARLIST(errors) else - to_chat(usr, SPAN_WARNING("Could not finalize the construction of the ship!")) + to_chat(user, SPAN_WARNING("Could not finalize the construction of the ship!")) return TOPIC_REFRESH /obj/machinery/docking_beacon/proc/allow_projection() diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 67337ab8fe2..422e33e3f0e 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -89,7 +89,7 @@ if(href_list["set_codes"]) var/newcode = input("Input new docking codes", "Docking codes", shuttle.docking_codes) as text|null - if (newcode && CanInteract(usr, global.default_topic_state)) + if (newcode && CanInteract(user, global.default_topic_state)) shuttle.set_docking_codes(uppertext(newcode)) return TOPIC_REFRESH diff --git a/code/modules/shuttles/shuttle_console_multi.dm b/code/modules/shuttles/shuttle_console_multi.dm index c55dcc37721..28f8805a36d 100644 --- a/code/modules/shuttles/shuttle_console_multi.dm +++ b/code/modules/shuttles/shuttle_console_multi.dm @@ -9,14 +9,14 @@ "can_pick" = shuttle.moving_status == SHUTTLE_IDLE, ) -/obj/machinery/computer/shuttle_control/multi/handle_topic_href(var/datum/shuttle/autodock/multi/shuttle, var/list/href_list) +/obj/machinery/computer/shuttle_control/multi/handle_topic_href(var/datum/shuttle/autodock/multi/shuttle, var/list/href_list, var/user) if((. = ..()) != null) return if(href_list["pick"]) var/dest_key = input("Choose shuttle destination", "Shuttle Destination") as null|anything in shuttle.get_destinations() - if(dest_key && CanInteract(usr, global.default_topic_state)) - shuttle.set_destination(dest_key, usr) + if(dest_key && CanInteract(user, global.default_topic_state)) + shuttle.set_destination(dest_key, user) return TOPIC_REFRESH From 6362ba64548d507aa33263f58fb0c55ff00e8e79 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 10 Dec 2024 23:56:46 -0500 Subject: [PATCH 171/554] Remove unnecessary uses of usr in miscellaneous code --- code/modules/clothing/neck/necklace/pendant_locket.dm | 4 ++-- code/modules/codex/codex_implant.dm | 2 +- code/modules/crafting/pottery/pottery_structures.dm | 2 +- .../detectivework/microscope/_forensic_machine.dm | 4 ++-- code/modules/economy/worth_cash.dm | 2 +- code/modules/fabrication/fabricator_intake.dm | 4 ++-- code/modules/games/boardgame.dm | 2 +- code/modules/games/cards.dm | 1 - code/modules/holodeck/HolodeckControl.dm | 2 +- code/modules/mechs/mech_interaction.dm | 4 ++-- code/modules/mining/ore_box.dm | 2 +- code/modules/mob_holder/_holder.dm | 4 ++-- code/modules/organs/external/_external.dm | 4 ++-- code/modules/overmap/internet/internet_uplink.dm | 4 ++-- code/modules/overmap/ships/computers/shuttle.dm | 10 +++++----- code/modules/shield_generators/handheld_diffuser.dm | 4 ++-- 16 files changed, 27 insertions(+), 28 deletions(-) diff --git a/code/modules/clothing/neck/necklace/pendant_locket.dm b/code/modules/clothing/neck/necklace/pendant_locket.dm index b0944c9c000..930f7c927e3 100644 --- a/code/modules/clothing/neck/necklace/pendant_locket.dm +++ b/code/modules/clothing/neck/necklace/pendant_locket.dm @@ -42,9 +42,9 @@ return TRUE if(istype(used_item, /obj/item/paper) || istype(used_item, /obj/item/photo)) if(held) - to_chat(usr, SPAN_WARNING("\The [src] already has something inside it.")) + to_chat(user, SPAN_WARNING("\The [src] already has something inside it.")) else if(user.try_unequip(used_item, src)) - to_chat(usr, SPAN_NOTICE("You slip \the [used_item] into \the [src].")) + to_chat(user, SPAN_NOTICE("You slip \the [used_item] into \the [src].")) held = used_item return TRUE return ..() \ No newline at end of file diff --git a/code/modules/codex/codex_implant.dm b/code/modules/codex/codex_implant.dm index 6918ebd175a..48d57b472ed 100644 --- a/code/modules/codex/codex_implant.dm +++ b/code/modules/codex/codex_implant.dm @@ -8,4 +8,4 @@ /obj/item/implant/codex/implanted(var/mob/source) . = ..(source) - to_chat(usr, "You feel the brief sensation of having an entire encyclopedia at the tip of your tongue as the codex implant meshes with your nervous system.") + to_chat(imp_in, SPAN_NOTICE("You feel the brief sensation of having an entire encyclopedia at the tip of your tongue as the codex implant meshes with your nervous system.")) diff --git a/code/modules/crafting/pottery/pottery_structures.dm b/code/modules/crafting/pottery/pottery_structures.dm index 34f021019fa..2c9a369296b 100644 --- a/code/modules/crafting/pottery/pottery_structures.dm +++ b/code/modules/crafting/pottery/pottery_structures.dm @@ -63,5 +63,5 @@ /decl/interaction_handler/open_firebox/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/fire_source/kiln/kiln = target kiln.firebox_open = !kiln.firebox_open - to_chat(usr, SPAN_NOTICE("You [kiln.firebox_open ? "open" : "close"] \the [kiln]'s firebox.")) + to_chat(user, SPAN_NOTICE("You [kiln.firebox_open ? "open" : "close"] \the [kiln]'s firebox.")) kiln.update_icon() diff --git a/code/modules/detectivework/microscope/_forensic_machine.dm b/code/modules/detectivework/microscope/_forensic_machine.dm index 9ba28f8bb13..5eb1834a2b5 100644 --- a/code/modules/detectivework/microscope/_forensic_machine.dm +++ b/code/modules/detectivework/microscope/_forensic_machine.dm @@ -111,7 +111,7 @@ /obj/machinery/forensic/handle_mouse_drop(atom/over, mob/user, params) if(user == over) - remove_sample(usr) + remove_sample(user) return TRUE . = ..() @@ -125,4 +125,4 @@ /decl/interaction_handler/forensics_remove_sample/invoked(atom/target, mob/user, obj/item/prop) var/obj/machinery/forensic/F = target - F.remove_sample(usr) + F.remove_sample(user) diff --git a/code/modules/economy/worth_cash.dm b/code/modules/economy/worth_cash.dm index fda0929fe7c..2b0eec774a6 100644 --- a/code/modules/economy/worth_cash.dm +++ b/code/modules/economy/worth_cash.dm @@ -137,7 +137,7 @@ if(QDELETED(src) || get_worth() <= 1 || user.incapacitated() || loc != user) return TRUE - var/amount = input(usr, "How many [cur.name] do you want to take? (0 to [get_worth() - 1])", "Take Money", 20) as num + var/amount = input(user, "How many [cur.name] do you want to take? (0 to [get_worth() - 1])", "Take Money", 20) as num amount = round(clamp(amount, 0, floor(get_worth() - 1))) if(!amount || QDELETED(src) || get_worth() <= 1 || user.incapacitated() || loc != user) diff --git a/code/modules/fabrication/fabricator_intake.dm b/code/modules/fabrication/fabricator_intake.dm index 33c516ba6be..c94d1681def 100644 --- a/code/modules/fabrication/fabricator_intake.dm +++ b/code/modules/fabrication/fabricator_intake.dm @@ -115,10 +115,10 @@ if(istype(O, /obj/item/disk/design_disk)) var/obj/item/disk/design_disk/disk = O if(!disk.blueprint) - to_chat(usr, SPAN_WARNING("\The [O] is blank.")) + to_chat(user, SPAN_WARNING("\The [O] is blank.")) return TRUE if(disk.blueprint in installed_designs) - to_chat(usr, SPAN_WARNING("\The [src] is already loaded with the blueprint stored on \the [O].")) + to_chat(user, SPAN_WARNING("\The [src] is already loaded with the blueprint stored on \the [O].")) return TRUE installed_designs += disk.blueprint design_cache |= disk.blueprint diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index 6cd35f6b546..5c7765027cb 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -101,7 +101,7 @@ if(selected >= 0 && !isobserver(user)) dat += "
Remove Selected Piece" show_browser(user, jointext(dat, null), "window=boardgame;size=430x500") // 50px * 8 squares + 30 margin - onclose(usr, "boardgame") + onclose(user, "boardgame") /obj/item/board/Topic(href, href_list) if(!usr.Adjacent(src)) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 25d30addecd..c4351b213e2 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -208,7 +208,6 @@ var/global/list/card_decks = list() for(var/mob/living/player in viewers(3)) if(!player.stat) players += player - //players -= usr var/mob/living/M = input("Who do you wish to deal a card?") as null|anything in players if(!usr || !src || !M) return diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 3a497c97ce2..843d0ed4d48 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -144,7 +144,7 @@ update_projections() to_chat(user, "You vastly increase projector power and override the safety and security protocols.") to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call [global.using_map.company_name] maintenance and do not use the simulator.") - log_game("[key_name(usr)] emagged the Holodeck Control Computer") + log_game("[key_name(user)] emagged the Holodeck Control Computer") src.updateUsrDialog() return 1 else diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index 77fc243c705..bd5306b18bb 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -314,7 +314,7 @@ if(!silent) to_chat(user, SPAN_WARNING("The [body.hatch_descriptor] is locked.")) return - hud_open.toggled() + hud_open.toggled(user) if(!silent) to_chat(user, SPAN_NOTICE("You open the hatch and climb out of \the [src].")) else @@ -506,7 +506,7 @@ to_chat(user, SPAN_WARNING("The [body.hatch_descriptor] is locked.")) return TRUE if(hud_open) - hud_open.toggled() + hud_open.toggled(user) return TRUE /mob/living/exosuit/default_hurt_interaction(var/mob/user) diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm index b77e158dbe0..f61ac8e6886 100644 --- a/code/modules/mining/ore_box.dm +++ b/code/modules/mining/ore_box.dm @@ -31,7 +31,7 @@ return insert_ore(W, user) if(W.storage) var/added_ore = FALSE - W.storage.hide_from(usr) + W.storage.hide_from(user) for(var/obj/item/stack/material/ore/O in W.storage.get_contents()) if(total_ores >= maximum_ores) break diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm index a462eff5ba0..ec0dcd39482 100644 --- a/code/modules/mob_holder/_holder.dm +++ b/code/modules/mob_holder/_holder.dm @@ -115,9 +115,9 @@ if(length(cards)) LAZYDISTINCTADD(., cards) -/obj/item/holder/attack_self() +/obj/item/holder/attack_self(mob/user) for(var/mob/M in contents) - M.show_stripping_window(usr) + M.show_stripping_window(user) /obj/item/holder/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 57bf6892044..5712202d6af 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -259,7 +259,7 @@ if(connecting_limb.organ_tag == parent_organ) if(length(connecting_limb.children)) - to_chat(usr, SPAN_WARNING("You cannot connect additional limbs to \the [connecting_limb].")) + to_chat(user, SPAN_WARNING("You cannot connect additional limbs to \the [connecting_limb].")) return TRUE var/mob/holder = loc @@ -282,7 +282,7 @@ else if(connecting_limb.parent_organ == organ_tag) if(LAZYLEN(children)) - to_chat(usr, SPAN_WARNING("You cannot connect additional limbs to \the [src].")) + to_chat(user, SPAN_WARNING("You cannot connect additional limbs to \the [src].")) return TRUE if(!user.try_unequip(connecting_limb, src)) diff --git a/code/modules/overmap/internet/internet_uplink.dm b/code/modules/overmap/internet/internet_uplink.dm index 337e9b07589..cd38e4509fe 100644 --- a/code/modules/overmap/internet/internet_uplink.dm +++ b/code/modules/overmap/internet/internet_uplink.dm @@ -181,7 +181,7 @@ var/global/list/internet_uplinks = list() return ..() -/obj/machinery/computer/internet_uplink/interface_interact(user) +/obj/machinery/computer/internet_uplink/interface_interact(mob/user) var/datum/extension/local_network_member/uplink_comp = get_extension(src, /datum/extension/local_network_member) var/datum/local_network/lan = uplink_comp.get_local_network() @@ -193,5 +193,5 @@ var/global/list/internet_uplinks = list() return FALSE var/datum/topic_state/remote/R = new(src, linked) - linked.ui_interact(usr, state = R) + linked.ui_interact(user, state = R) return TRUE \ No newline at end of file diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index ce08d9c7b59..6543aebddfc 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -42,8 +42,8 @@ if(length(port_choices)) port = input("Choose shuttle docking port:", "Shuttle Docking Port") as null|anything in port_choices else - to_chat(usr, SPAN_WARNING("No functional docking ports, defaulting to center-of-mass landing.")) - if(CanInteract(usr, global.default_topic_state) && (port in port_choices)) + to_chat(user, SPAN_WARNING("No functional docking ports, defaulting to center-of-mass landing.")) + if(CanInteract(user, global.default_topic_state) && (port in port_choices)) shuttle.set_port(port_choices[port]) if(href_list["pick"]) var/list/possible_d = shuttle.get_possible_destinations() @@ -51,9 +51,9 @@ if(possible_d.len) D = input("Choose shuttle destination", "Shuttle Destination") as null|anything in possible_d else - to_chat(usr, SPAN_WARNING("No valid landing sites in range.")) + to_chat(user, SPAN_WARNING("No valid landing sites in range.")) possible_d = shuttle.get_possible_destinations() - if(CanInteract(usr, global.default_topic_state) && (D in possible_d)) + if(CanInteract(user, global.default_topic_state) && (D in possible_d)) shuttle.set_destination(possible_d[D]) return TOPIC_REFRESH if(href_list["manual_landing"]) @@ -68,7 +68,7 @@ else start_landing(user, shuttle) return TOPIC_REFRESH - to_chat(usr, SPAN_WARNING("The manual controls look hopelessly complex to you!")) + to_chat(user, SPAN_WARNING("The manual controls look hopelessly complex to you!")) /obj/machinery/computer/shuttle_control/explore/proc/start_landing(var/mob/user, var/datum/shuttle/autodock/overmap/shuttle) var/obj/effect/overmap/visitable/current_sector = global.overmap_sectors[num2text(z)] diff --git a/code/modules/shield_generators/handheld_diffuser.dm b/code/modules/shield_generators/handheld_diffuser.dm index 250691aa2a6..4a546c0241f 100644 --- a/code/modules/shield_generators/handheld_diffuser.dm +++ b/code/modules/shield_generators/handheld_diffuser.dm @@ -41,14 +41,14 @@ if(istype(S) && !S.diffused_for && !S.disabled_for && cell.checked_use(10 KILOWATTS * CELLRATE)) S.diffuse(20) -/obj/item/shield_diffuser/attack_self() +/obj/item/shield_diffuser/attack_self(mob/user) enabled = !enabled update_icon() if(enabled) START_PROCESSING(SSobj, src) else STOP_PROCESSING(SSobj, src) - to_chat(usr, "You turn \the [src] [enabled ? "on" : "off"].") + to_chat(user, "You turn \the [src] [enabled ? "on" : "off"].") /obj/item/shield_diffuser/examine(mob/user) . = ..() From 6189684deac3f11fad75d5e0cf82121f9bae99e6 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 11 Dec 2024 00:11:43 -0500 Subject: [PATCH 172/554] Remove unnecessary uses of usr in OnTopic overrides --- code/game/machinery/kitchen/microwave.dm | 8 ++++---- code/game/objects/items/devices/radio/radio.dm | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 632c1458349..bda3e44c704 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -415,20 +415,20 @@ ffuu.add_to_reagents(/decl/material/liquid/acrylamide, amount/10) return ffuu -/obj/machinery/microwave/OnTopic(href, href_list) +/obj/machinery/microwave/OnTopic(mob/user, href_list) switch(href_list["action"]) if ("cook") cook() return TOPIC_REFRESH if ("dispose") - dispose(usr) + dispose(user) return TOPIC_REFRESH if ("ejectitem") for(var/obj/O in get_contained_external_atoms()) if(strip_improper(O.name) == href_list["target"]) - eject_item(usr, O) + eject_item(user, O) break return TOPIC_REFRESH @@ -437,7 +437,7 @@ for(var/material_type in reagents.reagent_volumes) mat = GET_DECL(material_type) if(mat.name == href_list["target"]) - eject_reagent(usr, material_type) + eject_reagent(user, material_type) break return TOPIC_REFRESH diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index e4db86946c2..2b435362919 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -227,11 +227,11 @@ return STATUS_CLOSE return ..() -/obj/item/radio/OnTopic(href, href_list) +/obj/item/radio/OnTopic(mob/user, href_list) if((. = ..())) return - usr.set_machine(src) + user.set_machine(src) if(href_list["analog"]) if(can_use_analog) analog = text2num(href_list["analog"]) @@ -258,8 +258,8 @@ var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"])) set_frequency(new_frequency) if(hidden_uplink) - if(hidden_uplink.check_trigger(usr, frequency, traitor_frequency)) - close_browser(usr, "window=radio") + if(hidden_uplink.check_trigger(user, frequency, traitor_frequency)) + close_browser(user, "window=radio") . = TOPIC_REFRESH else if (href_list["talk"]) toggle_broadcast() @@ -278,14 +278,14 @@ . = TOPIC_REFRESH else if(href_list["spec_freq"]) var freq = href_list["spec_freq"] - if(has_channel_access(usr, freq)) + if(has_channel_access(user, freq)) set_frequency(text2num(freq)) . = TOPIC_REFRESH if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk return TOPIC_HANDLED if(href_list["network_settings"]) var/datum/extension/network_device/D = get_extension(src, /datum/extension/network_device) - D.ui_interact(usr) + D.ui_interact(user) . = TOPIC_HANDLED if(. & TOPIC_REFRESH) SSnano.update_uis(src) From 9c068f7c8d00e7d49beaaedad7b7e81453b92fe7 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 6 Dec 2024 18:34:54 +1100 Subject: [PATCH 173/554] Cleaning up some submap archetype code, allowing maps to override submap availability. --- .../subsystems/initialization/modpacks.dm | 2 +- code/controllers/subsystems/jobs.dm | 14 ++++++------- code/modules/mob/new_player/new_player.dm | 2 +- code/modules/submaps/_submap.dm | 6 +++--- code/modules/submaps/submap_archetype.dm | 17 +++++++++++----- code/modules/submaps/submap_job.dm | 8 ++++---- code/unit_tests/unique_tests.dm | 20 ------------------- maps/away/bearcat/bearcat.dm | 4 ++-- maps/away/liberia/liberia_jobs.dm | 2 +- maps/away/unishi/unishi.dm | 4 ++-- .../crashed_pod/crashed_pod.dm | 14 ++++++------- .../playablecolony/playablecolony.dm | 12 +++++------ maps/shaded_hills/shaded_hills_define.dm | 3 +++ maps/~mapsystem/maps.dm | 3 +++ 14 files changed, 52 insertions(+), 59 deletions(-) diff --git a/code/controllers/subsystems/initialization/modpacks.dm b/code/controllers/subsystems/initialization/modpacks.dm index 4e3819c4b56..5fad4ec549c 100644 --- a/code/controllers/subsystems/initialization/modpacks.dm +++ b/code/controllers/subsystems/initialization/modpacks.dm @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(modpacks) // Update compiled infolists and apply. default_submap_whitelisted_species |= global.using_map.default_species - for(var/decl/submap_archetype/submap in decls_repository.get_decls_of_type_unassociated(/decl/submap_archetype)) + for(var/decl/submap_archetype/submap in global.using_map.get_available_submap_archetypes()) if(islist(submap.whitelisted_species) && !length(submap.whitelisted_species)) submap.whitelisted_species |= SSmodpacks.default_submap_whitelisted_species if(islist(submap.blacklisted_species) && !length(submap.blacklisted_species)) diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm index b900dcf8c32..58e71e52d0d 100644 --- a/code/controllers/subsystems/jobs.dm +++ b/code/controllers/subsystems/jobs.dm @@ -45,9 +45,9 @@ SUBSYSTEM_DEF(jobs) // Create abstract submap archetype jobs for use in prefs, etc. archetype_job_datums.Cut() - var/list/submap_archetypes = decls_repository.get_decls_of_subtype(/decl/submap_archetype) - for(var/atype in submap_archetypes) - var/decl/submap_archetype/arch = submap_archetypes[atype] + var/list/submap_archetypes = list() + for(var/decl/submap_archetype/arch as anything in global.using_map.get_available_submap_archetypes()) + submap_archetypes += arch for(var/jobtype in arch.crew_jobs) var/datum/job/job = get_by_path(jobtype) if(!job && ispath(jobtype, /datum/job/submap)) @@ -57,7 +57,8 @@ SUBSYSTEM_DEF(jobs) job = get_by_path(jobtype) if(job) archetype_job_datums |= job - submap_archetypes = sortTim(submap_archetypes, /proc/cmp_submap_archetype_asc, TRUE) + if(length(submap_archetypes)) + submap_archetypes = sortTim(submap_archetypes, /proc/cmp_submap_archetype_asc) // Load job configuration (is this even used anymore?) if(job_config_file && get_config_value(/decl/config/toggle/load_jobs_from_txt)) @@ -90,16 +91,15 @@ SUBSYSTEM_DEF(jobs) primary_job_datums = sortTim(primary_job_datums, /proc/cmp_job_desc) job_lists_by_map_name = list("[global.using_map.full_name]" = list("jobs" = primary_job_datums, "default_to_hidden" = FALSE)) - for(var/atype in submap_archetypes) + for(var/decl/submap_archetype/arch as anything in submap_archetypes) var/list/submap_job_datums - var/decl/submap_archetype/arch = submap_archetypes[atype] for(var/jobtype in arch.crew_jobs) var/datum/job/job = get_by_path(jobtype) if(job) LAZYADD(submap_job_datums, job) if(LAZYLEN(submap_job_datums)) submap_job_datums = sortTim(submap_job_datums, /proc/cmp_job_desc) - job_lists_by_map_name[arch.descriptor] = list("jobs" = submap_job_datums, "default_to_hidden" = arch.default_to_hidden) + job_lists_by_map_name[arch.name] = list("jobs" = submap_job_datums, "default_to_hidden" = arch.default_to_hidden) // Update global map blacklists and whitelists. for(var/mappath in global.all_maps) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index f03372203ad..e0d9757f467 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -323,7 +323,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) ordered_submaps = sortTim(SSmapping.submaps.Copy(), /proc/cmp_submap_asc) for(var/datum/submap/submap as anything in ordered_submaps) if(submap?.available()) - dat += "[submap.name] ([submap.archetype.descriptor]):" + dat += "[submap.name] ([submap.archetype.name]):" job_summaries = list() for(var/otherthing in submap.jobs) var/datum/job/job = submap.jobs[otherthing] diff --git a/code/modules/submaps/_submap.dm b/code/modules/submaps/_submap.dm index 20404728d37..c2fde5b895d 100644 --- a/code/modules/submaps/_submap.dm +++ b/code/modules/submaps/_submap.dm @@ -26,7 +26,7 @@ archetype = _archetype if(!pref_name) - pref_name = archetype.descriptor + pref_name = archetype.name testing("Starting submap setup - '[name]', [archetype], [associated_z]z.") @@ -41,7 +41,7 @@ jobs[job.title] = job if(!associated_z) - testing( "Submap error - [name]/[archetype ? archetype.descriptor : "NO ARCHETYPE"] could not find an associated z-level for spawnpoint registration.") + testing( "Submap error - [name]/[archetype ? archetype.name : "NO ARCHETYPE"] could not find an associated z-level for spawnpoint registration.") qdel(src) return @@ -59,7 +59,7 @@ registered_spawnpoint = TRUE if(!registered_spawnpoint) - testing( "Submap error - [name]/[archetype ? archetype.descriptor : "NO ARCHETYPE"] has no job spawn points.") + testing( "Submap error - [name]/[archetype ? archetype.name : "NO ARCHETYPE"] has no job spawn points.") qdel(src) return diff --git a/code/modules/submaps/submap_archetype.dm b/code/modules/submaps/submap_archetype.dm index be118fa8202..9597b64f1f6 100644 --- a/code/modules/submaps/submap_archetype.dm +++ b/code/modules/submaps/submap_archetype.dm @@ -1,5 +1,6 @@ /decl/submap_archetype - var/descriptor = "generic ship archetype" + // TODO: use UID instead of name for pref saving. + var/name = "generic ship archetype" var/list/whitelisted_species = list() var/list/blacklisted_species = list() var/call_webhook @@ -13,12 +14,18 @@ /decl/submap_archetype/validate() . = ..() - if(!descriptor) - . += "no descriptor set" + if(name) + var/static/list/submaps_by_name = list( (global.using_map.name) = global.using_map.type) + if(submaps_by_name[name]) + . += "name '[name]' ([type]) collides with submap type '[submaps_by_name[name]]'" + else + submaps_by_name[name] = type + else + . += "no name set" // Generic ships to populate the list. /decl/submap_archetype/derelict - descriptor = "drifting wreck" + name = "drifting wreck" /decl/submap_archetype/abandoned_ship - descriptor = "abandoned ship" + name = "abandoned ship" diff --git a/code/modules/submaps/submap_job.dm b/code/modules/submaps/submap_job.dm index 49e6622328e..9bc3687a1ae 100644 --- a/code/modules/submaps/submap_job.dm +++ b/code/modules/submaps/submap_job.dm @@ -78,17 +78,17 @@ to_chat(feedback, "Not old enough. Minimum character age is [minimum_character_age[S.get_root_species_name()]].") return TRUE if(LAZYLEN(whitelisted_species) && !(prefs.species in whitelisted_species)) - to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.name].") return TRUE if(prefs.species in blacklisted_species) - to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.name].") return TRUE if(owner && owner.archetype) if(LAZYLEN(owner.archetype.whitelisted_species) && !(prefs.species in owner.archetype.whitelisted_species)) - to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.name].") return TRUE if(prefs.species in owner.archetype.blacklisted_species) - to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.name].") return TRUE return FALSE diff --git a/code/unit_tests/unique_tests.dm b/code/unit_tests/unique_tests.dm index 2d23719ea30..b409acf6edc 100644 --- a/code/unit_tests/unique_tests.dm +++ b/code/unit_tests/unique_tests.dm @@ -207,26 +207,6 @@ pass("All gas symbols are unique.") return TRUE -/datum/unit_test/submaps_shall_have_a_unique_descriptor - name = "UNIQUENESS: Archetypes shall have a valid, unique descriptor." - -/datum/unit_test/submaps_shall_have_a_unique_descriptor/start_test() - var/list/submaps_by_name = list() - - var/list/all_submaps = decls_repository.get_decls_of_subtype(/decl/submap_archetype) - for(var/submap_type in all_submaps) - var/decl/submap_archetype/submap = all_submaps[submap_type] - if(submap.descriptor) - group_by(submaps_by_name, submap.descriptor, submap_type) - - var/number_of_issues = number_of_issues(submaps_by_name, "Submap Archetype Descriptors") - if(length(number_of_issues)) - fail("Found [number_of_issues] submap archetype\s with duplicate descriptors.") - else - pass("All submap archetypes have unique descriptors.") - return 1 - - /datum/unit_test/proc/number_of_issues(var/list/entries, var/type, var/feedback = /decl/noi_feedback) var/issues = 0 for(var/key in entries) diff --git a/maps/away/bearcat/bearcat.dm b/maps/away/bearcat/bearcat.dm index e9f35248199..37d26d36b55 100644 --- a/maps/away/bearcat/bearcat.dm +++ b/maps/away/bearcat/bearcat.dm @@ -3,11 +3,11 @@ #include "bearcat_access.dm" /obj/abstract/submap_landmark/joinable_submap/bearcat - name = "FTV Bearcat" + name = "FTV Bearcat" archetype = /decl/submap_archetype/derelict/bearcat /decl/submap_archetype/derelict/bearcat - descriptor = "derelict cargo vessel" + name = "derelict cargo vessel" crew_jobs = list( /datum/job/submap/bearcat_captain, /datum/job/submap/bearcat_crewman diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index 72d4d2ddbb2..4d3b627143f 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -1,6 +1,6 @@ // Submap datum and archetype. /decl/submap_archetype/liberia - descriptor = "merchant ship" + name = "merchant ship" crew_jobs = list( /datum/job/submap/merchant ) diff --git a/maps/away/unishi/unishi.dm b/maps/away/unishi/unishi.dm index 21700989838..a1670a3978c 100644 --- a/maps/away/unishi/unishi.dm +++ b/maps/away/unishi/unishi.dm @@ -3,11 +3,11 @@ #include "../../../mods/content/xenobiology/_xenobiology.dme" /obj/abstract/submap_landmark/joinable_submap/unishi - name = "SRV Verne" + name = "SRV Verne" archetype = /decl/submap_archetype/derelict/unishi /decl/submap_archetype/derelict/unishi - descriptor = "derelict research vessel" + name = "derelict research vessel" crew_jobs = list( /datum/job/submap/unishi_crew, /datum/job/submap/unishi_researcher diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm index 62b11f8ae72..7eb021cf0cb 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm @@ -1,17 +1,17 @@ /datum/map_template/ruin/exoplanet/crashed_pod - name = "crashed survival pod" - description = "A crashed survival pod from a destroyed ship." - suffixes = list("crashed_pod/crashed_pod.dmm") - cost = 2 + name = "crashed survival pod" + description = "A crashed survival pod from a destroyed ship." + suffixes = list("crashed_pod/crashed_pod.dmm") + cost = 2 template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS | TEMPLATE_FLAG_NO_RADS - template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_WRECK + template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_WRECK /area/map_template/crashed_pod - name = "\improper Crashed Survival Pod" + name = "\improper Crashed Survival Pod" icon_state = "blue" /decl/submap_archetype/crashed_pod - descriptor = "crashed survival pod" + name = "crashed survival pod" crew_jobs = list(/datum/job/submap/pod) /datum/submap/crashed_pod/sync_cell(var/obj/effect/overmap/visitable/cell) diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm b/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm index e27736fd251..d0b72f2445f 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm @@ -1,18 +1,18 @@ #include "../../../../mods/mobs/dionaea/_dionaea.dme" /datum/map_template/ruin/exoplanet/playablecolony - name = "established colony" - description = "a fully functional colony on the frontier of settled space" - suffixes = list("playablecolony/colony.dmm") - cost = 2 + name = "established colony" + description = "a fully functional colony on the frontier of settled space" + suffixes = list("playablecolony/colony.dmm") + cost = 2 template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS | TEMPLATE_FLAG_NO_RADS - template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_HABITAT + template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_HABITAT apc_test_exempt_areas = list( /area/map_template/colony/mineralprocessing = NO_SCRUBBER|NO_VENT ) /decl/submap_archetype/playablecolony - descriptor = "established colony" + name = "established colony" crew_jobs = list(/datum/job/submap/colonist) /datum/job/submap/colonist diff --git a/maps/shaded_hills/shaded_hills_define.dm b/maps/shaded_hills/shaded_hills_define.dm index bfb694d4ee6..47684f0fc40 100644 --- a/maps/shaded_hills/shaded_hills_define.dm +++ b/maps/shaded_hills/shaded_hills_define.dm @@ -47,3 +47,6 @@ /datum/map/shaded_hills/get_map_info() return "You're in the [station_name] of the [system_name], nestled between the mountains and the river and bisected by the decaying Queens' Road. On all sides, you are surrounded by untamed wilds, with only a small ruined fort, rebuilt into an inn, to the east as a sign of civilisation. \ Far from the control of [boss_name], you are free to carve forward a path to survival for yourself and your comrades however you wish. Strike the earth!" + +/datum/map/shaded_hills/get_available_submap_archetypes() + return null // Return list of decl instances when relevant submaps exist. diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index fa0aaa49977..915cccfbaad 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -527,3 +527,6 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable /datum/map/proc/finalize_map_generation() return + +/datum/map/proc/get_available_submap_archetypes() + return decls_repository.get_decls_of_subtype_unassociated(/decl/submap_archetype) From 912cf240d0379b21182c56bd9e5a07077790685b Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 15 Dec 2024 14:22:27 +1100 Subject: [PATCH 174/554] Tweaking biogenerator/seed extractor attackby(). --- .../machine_construction/_construction.dm | 4 +- .../machine_construction/airlock.dm | 4 +- .../machine_construction/default.dm | 9 ++- .../machine_construction/frame.dm | 29 ++++---- .../machine_construction/item_chassis.dm | 2 +- .../machine_construction/wall_frame.dm | 11 +-- .../_machines_base/machinery_components.dm | 6 +- code/game/machinery/biogenerator.dm | 72 ++++++++++--------- code/game/machinery/seed_extractor.dm | 3 - code/game/machinery/turrets/turret_ammo.dm | 10 +-- .../microscope/_forensic_machine.dm | 4 +- code/modules/fabrication/fabricator_intake.dm | 4 +- .../modular_computers/hardware/_hardware.dm | 2 +- .../modular_computers/hardware/lan_port.dm | 2 +- code/modules/paperwork/printer.dm | 6 +- code/modules/power/smes.dm | 4 +- .../research/design_database_analyzer.dm | 4 +- 17 files changed, 90 insertions(+), 86 deletions(-) diff --git a/code/game/machinery/_machines_base/machine_construction/_construction.dm b/code/game/machinery/_machines_base/machine_construction/_construction.dm index 26a364d9d8f..fa819a58c1a 100644 --- a/code/game/machinery/_machines_base/machine_construction/_construction.dm +++ b/code/game/machinery/_machines_base/machine_construction/_construction.dm @@ -88,8 +88,8 @@ /decl/machine_construction/proc/attackby(obj/item/I, mob/user, obj/machinery/machine) if(!validate_state(machine)) PRINT_STACK_TRACE("Machine [log_info_line(machine)] violated the state assumptions of the construction state [type]!") - machine.attackby(I, user) - return TRUE + return machine.attackby(I, user) + return FALSE /decl/machine_construction/proc/mechanics_info() diff --git a/code/game/machinery/_machines_base/machine_construction/airlock.dm b/code/game/machinery/_machines_base/machine_construction/airlock.dm index 52c25f29a99..835402c5484 100644 --- a/code/game/machinery/_machines_base/machine_construction/airlock.dm +++ b/code/game/machinery/_machines_base/machine_construction/airlock.dm @@ -9,7 +9,7 @@ playsound(get_turf(machine), 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, SPAN_NOTICE("You release some of the logic wiring on \the [machine]. The cover panel remains closed.")) machine.update_icon() - return + return TRUE if(IS_WRENCH(I)) TRANSFER_STATE(down_state) playsound(get_turf(machine), 'sound/items/Crowbar.ogg', 50, 1) @@ -23,6 +23,7 @@ machine.part_replacement(user, replacer) machine.display_parts(user) return TRUE + return FALSE /decl/machine_construction/default/panel_closed/door/mechanics_info() . = list() @@ -40,6 +41,7 @@ to_chat(user, SPAN_NOTICE("You tuck the exposed wiring back into \the [machine] and screw the hatch back into place.")) machine.queue_icon_update() return TRUE + return FALSE /decl/machine_construction/default/panel_closed/door/hacking/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machine_construction/default.dm b/code/game/machinery/_machines_base/machine_construction/default.dm index b2cd2e49d11..c178a598eb4 100644 --- a/code/game/machinery/_machines_base/machine_construction/default.dm +++ b/code/game/machinery/_machines_base/machine_construction/default.dm @@ -30,13 +30,14 @@ machine.panel_open = TRUE to_chat(user, SPAN_NOTICE("You open the maintenance hatch of \the [machine].")) machine.update_icon() - return + return TRUE if(istype(I, /obj/item/part_replacer)) var/obj/item/part_replacer/replacer = I if(replacer.remote_interaction) machine.part_replacement(user, replacer) machine.display_parts(user) return TRUE + return FALSE /decl/machine_construction/default/panel_closed/post_construct(obj/machinery/machine) try_change_state(machine, down_state) @@ -75,16 +76,14 @@ machine.panel_open = FALSE to_chat(user, SPAN_NOTICE("You close the maintenance hatch of \the [machine].")) machine.update_icon() - return - + return TRUE if(istype(I, /obj/item/part_replacer)) return machine.part_replacement(user, I) - if(IS_WRENCH(I)) return machine.part_removal(user) - if(istype(I)) return machine.part_insertion(user, I) + return FALSE /decl/machine_construction/default/panel_open/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machine_construction/frame.dm b/code/game/machinery/_machines_base/machine_construction/frame.dm index 459f90a8fb2..1913c959fbe 100644 --- a/code/game/machinery/_machines_base/machine_construction/frame.dm +++ b/code/game/machinery/_machines_base/machine_construction/frame.dm @@ -30,7 +30,7 @@ TRANSFER_STATE(/decl/machine_construction/default/deconstructed) to_chat(user, "You deconstruct \the [machine].") machine.dismantle() - + return FALSE /decl/machine_construction/frame/unwrenched/mechanics_info() . = list() @@ -49,15 +49,13 @@ try_change_state(machine, /decl/machine_construction/frame/unwrenched) /decl/machine_construction/frame/wrenched/attackby(obj/item/I, mob/user, obj/machinery/machine) - if(IS_WRENCH(I)) playsound(machine.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, machine)) TRANSFER_STATE(/decl/machine_construction/frame/unwrenched) to_chat(user, "You unfasten \the [machine].") machine.anchored = FALSE - return - + return TRUE if(IS_COIL(I)) var/obj/item/stack/cable_coil/C = I if(C.get_amount() < 5) @@ -69,7 +67,7 @@ TRANSFER_STATE(/decl/machine_construction/frame/awaiting_circuit) to_chat(user, "You add cables to the frame.") return TRUE - + return FALSE /decl/machine_construction/frame/wrenched/mechanics_info() . = list() @@ -91,22 +89,22 @@ if(istype(I, /obj/item/stock_parts/circuitboard)) var/obj/item/stock_parts/circuitboard/circuit = I if(circuit.board_type == machine.expected_machine_type) - if(!user.canUnEquip(I)) - return FALSE - TRANSFER_STATE(/decl/machine_construction/frame/awaiting_parts) - user.try_unequip(I, machine) - playsound(machine.loc, 'sound/items/Deconstruct.ogg', 50, 1) - to_chat(user, "You add the circuit board to \the [machine].") - machine.circuit = I - return + if(user.canUnEquip(I)) + TRANSFER_STATE(/decl/machine_construction/frame/awaiting_parts) + user.try_unequip(I, machine) + playsound(machine.loc, 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You add the circuit board to \the [machine].") + machine.circuit = I else to_chat(user, "This frame does not accept circuit boards of this type!") - return TRUE + return TRUE if(IS_WIRECUTTER(I)) TRANSFER_STATE(/decl/machine_construction/frame/wrenched) playsound(machine.loc, 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "You remove the cables.") new /obj/item/stack/cable_coil(machine.loc, 5) + return TRUE + return FALSE /decl/machine_construction/frame/awaiting_circuit/mechanics_info() . = list() @@ -131,7 +129,7 @@ machine.circuit.dropInto(machine.loc) machine.circuit = null to_chat(user, "You remove the circuit board.") - return + return TRUE if(IS_SCREWDRIVER(I)) playsound(machine.loc, 'sound/items/Screwdriver.ogg', 50, 1) var/obj/machinery/new_machine = new machine.circuit.build_path(machine.loc, machine.dir, FALSE) @@ -145,6 +143,7 @@ PRINT_STACK_TRACE("Machine of type [new_machine.type] was built from a circuit and frame, but had no construct state set.") qdel(machine) return TRUE + return FALSE /decl/machine_construction/frame/awaiting_parts/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machine_construction/item_chassis.dm b/code/game/machinery/_machines_base/machine_construction/item_chassis.dm index f395d35b1b9..234319a1bca 100644 --- a/code/game/machinery/_machines_base/machine_construction/item_chassis.dm +++ b/code/game/machinery/_machines_base/machine_construction/item_chassis.dm @@ -11,7 +11,7 @@ playsound(get_turf(machine), 'sound/items/Ratchet.ogg', 50, 1) machine.visible_message(SPAN_NOTICE("\The [user] deconstructs \the [machine].")) machine.dismantle() - return + return TRUE return ..() /decl/machine_construction/default/panel_closed/item_chassis/mechanics_info() diff --git a/code/game/machinery/_machines_base/machine_construction/wall_frame.dm b/code/game/machinery/_machines_base/machine_construction/wall_frame.dm index 023bbbc699f..e050c23ff8f 100644 --- a/code/game/machinery/_machines_base/machine_construction/wall_frame.dm +++ b/code/game/machinery/_machines_base/machine_construction/wall_frame.dm @@ -78,7 +78,7 @@ new /obj/item/stack/cable_coil(get_turf(machine), 5) machine.set_broken(TRUE, MACHINE_BROKEN_CONSTRUCT) machine.queue_icon_update() - return + return TRUE if((. = up_interaction(I, user, machine))) return @@ -135,10 +135,9 @@ to_chat(user, SPAN_NOTICE("You wire the [machine].")) machine.set_broken(FALSE, MACHINE_BROKEN_CONSTRUCT) machine.queue_icon_update() - return else to_chat(user, SPAN_WARNING("You need five pieces of cable to wire \the [machine].")) - return TRUE + return TRUE if((. = down_interaction(I, user, machine))) return @@ -200,14 +199,16 @@ machine.install_component(board) user.visible_message(SPAN_NOTICE("\The [user] inserts \the [board] into \the [machine]!"), SPAN_NOTICE("You insert \the [board] into \the [machine]!")) machine.queue_icon_update() - return + return TRUE if(IS_WRENCH(I)) TRANSFER_STATE(/decl/machine_construction/default/deconstructed) playsound(get_turf(machine), 'sound/items/Ratchet.ogg', 50, 1) machine.visible_message(SPAN_NOTICE("\The [user] deconstructs \the [machine].")) machine.dismantle() - return + return TRUE + + return FALSE /decl/machine_construction/wall_frame/no_circuit/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machinery_components.dm b/code/game/machinery/_machines_base/machinery_components.dm index f6096358929..cdc1dc9e71d 100644 --- a/code/game/machinery/_machines_base/machinery_components.dm +++ b/code/game/machinery/_machines_base/machinery_components.dm @@ -255,8 +255,8 @@ var/global/list/machine_path_to_circuit_type /obj/machinery/proc/component_stat_change(var/obj/item/stock_parts/part, old_stat, flag) /obj/machinery/attackby(obj/item/I, mob/user) - if(component_attackby(I, user)) - return TRUE + if((. = component_attackby(I, user))) + return return ..() /obj/machinery/proc/component_attackby(obj/item/I, mob/user) @@ -265,7 +265,7 @@ var/global/list/machine_path_to_circuit_type continue if((. = part.attackby(I, user))) return - return construct_state && construct_state.attackby(I, user, src) + return construct_state?.attackby(I, user, src) /obj/machinery/proc/component_attack_hand(mob/user) for(var/obj/item/stock_parts/part in component_parts) diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index e6eb5609476..710ca1c1e53 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -79,45 +79,53 @@ return SPAN_NOTICE("You must turn \the [src] off first.") return ..() -/obj/machinery/biogenerator/attackby(var/obj/item/O, var/mob/user) - if((. = component_attackby(O, user))) - return +/obj/machinery/biogenerator/attackby(var/obj/item/used_item, var/mob/user) + if(processing) - to_chat(user, "\The [src] is currently processing.") - if(istype(O, /obj/item/chems/glass)) + if((. = component_attackby(used_item, user))) + return + to_chat(user, SPAN_WARNING("\The [src] is currently processing.")) + return TRUE + + if(istype(used_item, /obj/item/chems/glass)) if(beaker) - to_chat(user, "]\The [src] is already loaded.") - return TRUE - else if(user.try_unequip(O, src)) - beaker = O + to_chat(user, SPAN_NOTICE("\The [src] is already loaded.")) + else if(user.try_unequip(used_item, src)) + beaker = used_item state = BG_READY updateUsrDialog() - return TRUE + return TRUE if(ingredients >= capacity) - to_chat(user, "\The [src] is already full! Activate it.") - else if(isobj(O)) - if(O.storage) - var/hadPlants = 0 - for(var/obj/item/food/grown/G in O.storage.get_contents()) - hadPlants = 1 - O.storage.remove_from_storage(user, G, src, TRUE) - ingredients++ - if(ingredients >= capacity) - to_chat(user, "You fill \the [src] to its capacity.") - break - O.storage.finish_bulk_removal() //Now do the UI stuff once. - if(!hadPlants) - to_chat(user, "\The [O] has no produce inside.") - else if(ingredients < capacity) - to_chat(user, "You empty \the [O] into \the [src].") - - else if(!istype(O, /obj/item/food/grown)) - to_chat(user, "You cannot put this in \the [src].") - else if(user.try_unequip(O, src)) + to_chat(user, SPAN_NOTICE("\The [src] is already full! Activate it.")) + return TRUE + + if(used_item.storage) + var/added_plants = FALSE + for(var/obj/item/food/grown/G in used_item.storage.get_contents()) + added_plants = TRUE + used_item.storage.remove_from_storage(user, G, src, TRUE) + ingredients++ + if(ingredients >= capacity) + to_chat(user, SPAN_NOTICE("You fill \the [src] to its capacity.")) + break + used_item.storage.finish_bulk_removal() //Now do the UI stuff once. + if(!added_plants) + to_chat(user, SPAN_WARNING("\The [used_item] has no produce inside.")) + else if(ingredients < capacity) + to_chat(user, SPAN_NOTICE("You empty \the [used_item] into \the [src].")) + return TRUE + + if(!istype(used_item, /obj/item/food/grown)) + to_chat(user, SPAN_WARNING("You cannot put this in \the [src].")) + return TRUE + + if(user.try_unequip(used_item, src)) ingredients++ - to_chat(user, "You put \the [O] in \the [src]") - update_icon() + to_chat(user, SPAN_NOTICE("You put \the [used_item] in \the [src]")) + return TRUE + + return ..() /** * Display the NanoUI window for the vending machine. diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index 6bc3d2230d4..28bcefc7158 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -14,9 +14,6 @@ /obj/machinery/seed_extractor/attackby(var/obj/item/O, var/mob/user) - if((. = component_attackby(O, user))) - return - // Fruits and vegetables. if(istype(O, /obj/item/food/grown)) if(!user.try_unequip(O)) diff --git a/code/game/machinery/turrets/turret_ammo.dm b/code/game/machinery/turrets/turret_ammo.dm index 7054e5ecf23..52cf5825df0 100644 --- a/code/game/machinery/turrets/turret_ammo.dm +++ b/code/game/machinery/turrets/turret_ammo.dm @@ -32,10 +32,10 @@ var/obj/item/ammo_casing/casing = W if(stored_caliber && casing.caliber != stored_caliber) to_chat(user, SPAN_WARNING("The caliber of \the [casing] does not match the caliber stored in \the [src]!")) - return FALSE + return TRUE if(length(stored_ammo) >= max_ammo) to_chat(user, SPAN_WARNING("\The [src] is full!")) - return FALSE + return TRUE casing.forceMove(src) stored_ammo += casing @@ -49,13 +49,13 @@ var/obj/item/ammo_magazine/magazine = W if(stored_caliber && magazine.caliber != stored_caliber) to_chat(user, SPAN_WARNING("The caliber of \the [magazine] does not match the caliber stored in \the [src]!")) - return FALSE + return TRUE if(!length(magazine.stored_ammo)) to_chat(user, SPAN_WARNING("\The [magazine] is empty!")) - return FALSE + return TRUE if(length(stored_ammo) >= max_ammo) to_chat(user, SPAN_WARNING("\The [src] is full!")) - return FALSE + return TRUE stored_caliber = magazine.caliber for(var/obj/item/ammo_casing/casing in magazine.stored_ammo) diff --git a/code/modules/detectivework/microscope/_forensic_machine.dm b/code/modules/detectivework/microscope/_forensic_machine.dm index a5edee029bd..fa82fd57c11 100644 --- a/code/modules/detectivework/microscope/_forensic_machine.dm +++ b/code/modules/detectivework/microscope/_forensic_machine.dm @@ -42,8 +42,8 @@ return res + ..() /obj/machinery/forensic/attackby(obj/item/W, mob/user) - if(component_attackby(W, user)) - return TRUE + if((. = component_attackby(W, user))) + return if(user?.a_intent == I_HURT) return ..() // bash, bash! diff --git a/code/modules/fabrication/fabricator_intake.dm b/code/modules/fabrication/fabricator_intake.dm index 8013c8e63da..2cddeb34053 100644 --- a/code/modules/fabrication/fabricator_intake.dm +++ b/code/modules/fabrication/fabricator_intake.dm @@ -92,8 +92,8 @@ to_chat(user, SPAN_WARNING("\The [src] cannot process \the [thing].")) /obj/machinery/fabricator/attackby(var/obj/item/O, var/mob/user) - if(component_attackby(O, user)) - return TRUE + if((. = component_attackby(O, user))) + return if(panel_open && (IS_MULTITOOL(O) || IS_WIRECUTTER(O))) attack_hand_with_interaction_checks(user) return TRUE diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index de61e09ddfd..64fc7f971be 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -16,7 +16,7 @@ to_chat(user, "***** DIAGNOSTICS REPORT *****") to_chat(user, jointext(diagnostics(), "\n")) to_chat(user, "******************************") - return 1 + return TRUE return ..() /obj/item/stock_parts/computer/on_install(obj/machinery/machine) diff --git a/code/modules/modular_computers/hardware/lan_port.dm b/code/modules/modular_computers/hardware/lan_port.dm index cde307de70d..1c0701880ef 100644 --- a/code/modules/modular_computers/hardware/lan_port.dm +++ b/code/modules/modular_computers/hardware/lan_port.dm @@ -67,7 +67,7 @@ var/turf/T = get_turf(parent) if(check_terminal_block(T)) to_chat(user, SPAN_WARNING("There's already a network cable there!")) - return FALSE + return TRUE if(istype(T) && !T.is_plating()) to_chat(user, SPAN_WARNING("You must remove the floor plating beneath \the [parent] first.")) return TRUE diff --git a/code/modules/paperwork/printer.dm b/code/modules/paperwork/printer.dm index 3c7bda42989..7cfeaa96c43 100644 --- a/code/modules/paperwork/printer.dm +++ b/code/modules/paperwork/printer.dm @@ -63,15 +63,13 @@ if(toner) to_chat(user, SPAN_WARNING("There is already \a [W] in \the [src]!")) return TRUE - else - return insert_toner(W, user) + return insert_toner(W, user) else if(istype(W, /obj/item/paper) || istype(W, /obj/item/paper_bundle)) if(paper_left >= paper_max) to_chat(user, SPAN_WARNING("There is no more room for paper in \the [src]!")) return TRUE - else - return insert_paper(W, user) + return insert_paper(W, user) . = ..() /obj/item/stock_parts/printer/attack_hand(mob/user) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 6ad9f2fbc7f..50c22d1479e 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -221,8 +221,8 @@ return TRUE /obj/machinery/power/smes/attackby(var/obj/item/W, var/mob/user) - if(component_attackby(W, user)) - return TRUE + if((. = component_attackby(W, user))) + return return bash(W, user) /obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) diff --git a/code/modules/research/design_database_analyzer.dm b/code/modules/research/design_database_analyzer.dm index ad1c78d239a..7459e67a44f 100644 --- a/code/modules/research/design_database_analyzer.dm +++ b/code/modules/research/design_database_analyzer.dm @@ -89,8 +89,8 @@ if(busy) to_chat(user, SPAN_WARNING("\The [src] is busy right now.")) return TRUE - if(component_attackby(O, user)) - return TRUE + if((. = component_attackby(O, user))) + return if(isrobot(user)) return TRUE if(loaded_item) From 6c5009eaf9e1ad53b3f2b72a7dae267c273ba500 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 16 Dec 2024 10:16:36 +1100 Subject: [PATCH 175/554] Readding eye_offset. --- code/modules/bodytype/_bodytype.dm | 2 ++ code/modules/organs/internal/eyes.dm | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/bodytype/_bodytype.dm b/code/modules/bodytype/_bodytype.dm index ec0d6033d5f..64d2e2f21b0 100644 --- a/code/modules/bodytype/_bodytype.dm +++ b/code/modules/bodytype/_bodytype.dm @@ -81,6 +81,8 @@ var/global/list/bodytypes_by_category = list() var/antaghud_offset_x = 0 /// Used to offset the antagHUD indicator for wide or tall mobs. var/antaghud_offset_y = 0 + /// Amount to shift eyes on the Y axis to correct for non-32px height. Used downstream, do not remove. + var/eye_offset = 0 /// Used to apply flags like WIDE_LOAD to nonstandard mobs. var/z_flags = 0 /// Amount to shift overlays when lying. TODO: check if this is still needed with KEEP_TOGETHER diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index 9d887adb99a..f193afaa4da 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -40,11 +40,13 @@ var/modifier = owner?.get_overlay_state_modifier() var/eye_state = modifier ? "eyes[modifier]" : "eyes" last_cached_eye_colour = eye_colour - last_eye_cache_key = "[type]-[bodytype.eye_icon]-[last_cached_eye_colour]-[eye_state]" + last_eye_cache_key = "[type]-[bodytype.eye_icon]-[last_cached_eye_colour]-[bodytype.eye_offset]-[eye_state]" if(!bodytype.eye_icon) return if(!global.eye_icon_cache[last_eye_cache_key]) var/icon/eyes_icon = icon(icon = bodytype.eye_icon, icon_state = eye_state) + if(bodytype.eye_offset) + eyes_icon.Shift(NORTH, bodytype.eye_offset) if(bodytype.apply_eye_colour) eyes_icon.Blend(last_cached_eye_colour, bodytype.eye_blend) global.eye_icon_cache[last_eye_cache_key] = eyes_icon From e33cd11d91e14e85baabe492e59b73f82ff707e3 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 16 Dec 2024 10:30:26 +1100 Subject: [PATCH 176/554] Fixing issues with adjusting clothing not updating mob icon. --- code/game/objects/items/__item.dm | 36 +++++++++++++++---- .../objects/items/weapons/storage/belt.dm | 4 --- code/modules/clothing/costumes/_costume.dm | 5 --- code/modules/clothing/dresses/_dress.dm | 5 --- code/modules/clothing/glasses/_glasses.dm | 6 ++-- code/modules/clothing/gloves/_gloves.dm | 4 --- code/modules/clothing/head/_head.dm | 4 --- code/modules/clothing/jumpsuits/_jumpsuit.dm | 5 --- code/modules/clothing/masks/_mask.dm | 4 --- code/modules/clothing/pants/_pants.dm | 5 --- code/modules/clothing/shirts/_shirts.dm | 5 --- code/modules/clothing/shoes/_shoes.dm | 4 --- code/modules/clothing/skirts/_skirt.dm | 5 --- code/modules/clothing/suits/_suit.dm | 4 --- 14 files changed, 32 insertions(+), 64 deletions(-) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index f28cea5cadf..f55744e50eb 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -1033,16 +1033,38 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. if(item_flags & ITEM_FLAG_IS_BELT) LAZYADD(., slot_belt_str) + // Where are we usually worn? + var/default_slot = get_fallback_slot() + if(default_slot) + LAZYDISTINCTADD(., default_slot) + // Uniforms can show or hide ID. + if(default_slot == slot_w_uniform_str) + LAZYDISTINCTADD(., slot_wear_id_str) + + // Currently this proc is used for clothing updates, so we + // need to care what slot we are being worn in, if any. + if(ismob(loc)) + var/mob/wearer = loc + var/equipped_slot = wearer.get_equipped_slot_for_item(src) + if(equipped_slot) + LAZYDISTINCTADD(., equipped_slot) + // Updates the icons of the mob wearing the clothing item, if any. /obj/item/proc/update_clothing_icon(do_update_icon = TRUE) - var/mob/wearer = loc - if(!istype(wearer)) - return FALSE - var/equip_slots = get_associated_equipment_slots() - if(!islist(equip_slots)) + + // Accessories should pass this back to their holder. + if(isitem(loc)) + var/obj/item/holder = loc + return holder.update_clothing_icon(do_update_icon) + + // If we're not on a mob, we do not care. + if(!ismob(loc)) return FALSE - for(var/slot in equip_slots) - wearer.update_equipment_overlay(slot, FALSE) + + // We refresh our equipped slot and any associated slots that might depend on the state of this slot. + var/mob/wearer = loc + for(var/equipped_slot in get_associated_equipment_slots()) + wearer.update_equipment_overlay(equipped_slot, FALSE) if(do_update_icon) wearer.update_icon() return TRUE diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 3d6aa29ea00..3a5cde951c7 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -13,10 +13,6 @@ material = /decl/material/solid/organic/leather/synth var/overlay_flags -/obj/item/belt/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_belt_str) - /obj/item/belt/verb/toggle_layer() set name = "Switch Belt Layer" set category = "Object" diff --git a/code/modules/clothing/costumes/_costume.dm b/code/modules/clothing/costumes/_costume.dm index 1afd7a2643f..bb0035a8e63 100644 --- a/code/modules/clothing/costumes/_costume.dm +++ b/code/modules/clothing/costumes/_costume.dm @@ -6,8 +6,3 @@ w_class = ITEM_SIZE_NORMAL fallback_slot = slot_w_uniform_str valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES - -/obj/item/clothing/costume/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/dresses/_dress.dm b/code/modules/clothing/dresses/_dress.dm index 11570f7b552..c29c27b6734 100644 --- a/code/modules/clothing/dresses/_dress.dm +++ b/code/modules/clothing/dresses/_dress.dm @@ -8,8 +8,3 @@ w_class = ITEM_SIZE_NORMAL valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES fallback_slot = slot_w_uniform_str - -/obj/item/clothing/dress/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 78a5fedc480..5802d8fe8b9 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -104,9 +104,9 @@ /obj/item/clothing/glasses/update_clothing_icon() . = ..() - if(.) - var/mob/M = loc - M.update_action_buttons() + if(. && ismob(loc)) + var/mob/wearer = loc + wearer.update_action_buttons() /obj/item/clothing/glasses/proc/toggle() set category = "Object" diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index b97d5aed843..78696640604 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -17,10 +17,6 @@ fallback_slot = slot_gloves_str var/obj/item/clothing/gloves/ring/covering_ring -/obj/item/clothing/gloves/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_gloves_str) - /obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) return diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index a4728547633..ae91f9dcc1f 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -57,7 +57,3 @@ light_overlay = image(overlay.icon, "[overlay.icon_state]_light") overlay.overlays += light_overlay . = ..() - -/obj/item/clothing/head/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_head_str) diff --git a/code/modules/clothing/jumpsuits/_jumpsuit.dm b/code/modules/clothing/jumpsuits/_jumpsuit.dm index 2e7dede575f..205a8af7997 100644 --- a/code/modules/clothing/jumpsuits/_jumpsuit.dm +++ b/code/modules/clothing/jumpsuits/_jumpsuit.dm @@ -15,8 +15,3 @@ GET_DECL(/decl/clothing_state_modifier/rolled_sleeves) ) return expected_state_modifiers - -/obj/item/clothing/costume/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/masks/_mask.dm b/code/modules/clothing/masks/_mask.dm index 6053880f172..214afe1c907 100644 --- a/code/modules/clothing/masks/_mask.dm +++ b/code/modules/clothing/masks/_mask.dm @@ -30,10 +30,6 @@ action_button_name = "Adjust Mask" verbs += .verb/adjust_mask -/obj/item/clothing/mask/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_wear_mask_str) - /obj/item/clothing/mask/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && hanging && slot == slot_wear_mask_str && check_state_in_icon("[overlay.icon_state]-down", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-down" diff --git a/code/modules/clothing/pants/_pants.dm b/code/modules/clothing/pants/_pants.dm index f0fd128a5fc..89f3e1c5b43 100644 --- a/code/modules/clothing/pants/_pants.dm +++ b/code/modules/clothing/pants/_pants.dm @@ -9,8 +9,3 @@ w_class = ITEM_SIZE_NORMAL fallback_slot = slot_w_uniform_str valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES - -/obj/item/clothing/pants/get_associated_equipment_slots() - . = ..() - var/static/list/pants_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., pants_slots) diff --git a/code/modules/clothing/shirts/_shirts.dm b/code/modules/clothing/shirts/_shirts.dm index ff3eeb08056..7b841100fd4 100644 --- a/code/modules/clothing/shirts/_shirts.dm +++ b/code/modules/clothing/shirts/_shirts.dm @@ -5,8 +5,3 @@ slot_flags = SLOT_UPPER_BODY accessory_slot = ACCESSORY_SLOT_DECOR fallback_slot = slot_w_uniform_str - -/obj/item/clothing/shirt/get_associated_equipment_slots() - . = ..() - var/static/list/shirt_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., shirt_slots) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index aa9b8d82291..6aedbb3edaf 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -162,10 +162,6 @@ attached_cuffs = null return -/obj/item/clothing/shoes/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_shoes_str) - /obj/item/clothing/shoes/set_material(var/new_material) ..() if(shine != -1 && material.reflectiveness >= MAT_VALUE_DULL) diff --git a/code/modules/clothing/skirts/_skirt.dm b/code/modules/clothing/skirts/_skirt.dm index 4ec2f85f32d..893909ee364 100644 --- a/code/modules/clothing/skirts/_skirt.dm +++ b/code/modules/clothing/skirts/_skirt.dm @@ -8,8 +8,3 @@ w_class = ITEM_SIZE_NORMAL valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES fallback_slot = slot_w_uniform_str - -/obj/item/clothing/skirt/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/suits/_suit.dm b/code/modules/clothing/suits/_suit.dm index f256b84311f..7b4809a3b42 100644 --- a/code/modules/clothing/suits/_suit.dm +++ b/code/modules/clothing/suits/_suit.dm @@ -16,10 +16,6 @@ /obj/item/clothing/suit/gives_weather_protection() return protects_against_weather -/obj/item/clothing/suit/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_wear_suit_str) - /obj/item/clothing/suit/preserve_in_cryopod(var/obj/machinery/cryopod/pod) return TRUE From 694628ff2edfc3cbf9eea58cfb7d1a3263e2606c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 15 Dec 2024 15:28:20 +1100 Subject: [PATCH 177/554] Moved various fire procs to /atom level as stubs, consistent name/setter/getter use. --- code/_helpers/washing.dm | 6 +- code/game/atoms_fires.dm | 21 ++++ code/game/machinery/igniter.dm | 18 ++-- code/game/objects/items/flame/_flame.dm | 32 +++---- .../items/flame/flame_fuelled_lighter.dm | 2 +- .../game/objects/items/flame/flame_matches.dm | 2 +- code/game/objects/items/flame/flame_torch.dm | 2 +- .../objects/items/weapons/flamethrower.dm | 2 +- .../objects/items/weapons/material/ashtray.dm | 2 +- .../game/objects/items/weapons/tanks/tanks.dm | 4 +- .../items/weapons/tools/weldingtool.dm | 4 +- code/game/objects/structures/wall_sconce.dm | 4 + code/modules/ZAS/Fire.dm | 2 +- code/modules/clothing/head/misc_special.dm | 12 +-- code/modules/clothing/masks/chewable.dm | 4 +- code/modules/clothing/masks/smokable.dm | 18 ++-- code/modules/detectivework/tools/rag.dm | 48 +++++----- code/modules/materials/_materials.dm | 2 +- .../liquids/materials_liquid_water.dm | 8 +- code/modules/mob/living/human/examine.dm | 7 +- .../mob/living/human/human_attackhand.dm | 2 +- code/modules/mob/living/human/life.dm | 4 +- code/modules/mob/living/living.dm | 36 +++---- code/modules/mob/living/living_attackhand.dm | 22 ++--- code/modules/mob/living/living_defense.dm | 91 +----------------- code/modules/mob/living/living_defines.dm | 4 +- code/modules/mob/living/living_fires.dm | 96 +++++++++++++++++++ code/modules/mob/living/silicon/robot/life.dm | 6 +- .../hostile/retaliate/exoplanet.dm | 4 +- .../organs/external/_external_damage.dm | 2 +- code/modules/projectiles/projectile/beams.dm | 6 +- .../modules/projectiles/projectile/special.dm | 4 +- .../reagent_containers/drinks/bottle.dm | 16 ++-- .../modules/spells/targeted/ethereal_jaunt.dm | 2 +- mods/gamemodes/cult/runes.dm | 7 +- mods/species/serpentid/datum/species.dm | 4 +- nebula.dme | 2 + 37 files changed, 268 insertions(+), 240 deletions(-) create mode 100644 code/game/atoms_fires.dm create mode 100644 code/modules/mob/living/living_fires.dm diff --git a/code/_helpers/washing.dm b/code/_helpers/washing.dm index 487afbd8700..0bb0169a3d1 100644 --- a/code/_helpers/washing.dm +++ b/code/_helpers/washing.dm @@ -2,8 +2,8 @@ if(!istype(washing)) return var/mob/living/L = washing - if(L.on_fire) + if(L.is_on_fire()) L.visible_message("A cloud of steam rises up as the water hits \the [L]!") - L.ExtinguishMob() - L.fire_stacks = -20 //Douse ourselves with water to avoid fire more easily + L.extinguish_fire() + L.adjust_fire_intensity(-20) //Douse ourselves with water to avoid fire more easily washing.clean() diff --git a/code/game/atoms_fires.dm b/code/game/atoms_fires.dm new file mode 100644 index 00000000000..c70cc007cb8 --- /dev/null +++ b/code/game/atoms_fires.dm @@ -0,0 +1,21 @@ +// Stubs for atom fire system, TODO. +/atom/proc/set_fire_intensity(amount) + return + +/atom/proc/get_fire_intensity() + return 0 + +/atom/proc/adjust_fire_intensity(amount) + return + +/atom/proc/can_ignite() + return FALSE + +/atom/proc/ignite_fire() + return + +/atom/proc/extinguish_fire(mob/user, no_message = FALSE) + return + +/atom/proc/is_on_fire() + return FALSE diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index f086a33332b..47f7eab5211 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -40,7 +40,7 @@ /obj/machinery/igniter/interface_interact(mob/user) if(!CanInteract(user, DefaultTopicState())) return FALSE - ignite() + toggle_igniter() visible_message(SPAN_NOTICE("\The [user] toggles \the [src].")) return TRUE @@ -51,7 +51,7 @@ location.hotspot_expose(1000,500,1) return 1 -/obj/machinery/igniter/proc/ignite() +/obj/machinery/igniter/proc/toggle_igniter() use_power_oneoff(2000) on = !on if(on) @@ -73,7 +73,7 @@ /decl/public_access/public_method/igniter_toggle name = "igniter toggle" desc = "Toggle the igniter on or off." - call_proc = TYPE_PROC_REF(/obj/machinery/igniter, ignite) + call_proc = TYPE_PROC_REF(/obj/machinery/igniter, toggle_igniter) /decl/stock_part_preset/radio/receiver/igniter frequency = BUTTON_FREQ @@ -133,19 +133,15 @@ return ..() /obj/machinery/sparker/attack_ai() - if (anchored) - return ignite() - else - return + return anchored ? create_sparks() : null -/obj/machinery/sparker/proc/ignite() +/obj/machinery/sparker/proc/create_sparks() if (stat & NOPOWER) return if (disable || (last_spark && world.time < last_spark + 50)) return - flick("[base_state]-spark", src) spark_at(src, amount=2, cardinal_only = TRUE) src.last_spark = world.time @@ -159,13 +155,13 @@ if(stat & (BROKEN|NOPOWER)) ..(severity) return - ignite() + create_sparks() ..(severity) /decl/public_access/public_method/sparker_spark name = "spark" desc = "Creates sparks to ignite nearby gases." - call_proc = TYPE_PROC_REF(/obj/machinery/sparker, ignite) + call_proc = TYPE_PROC_REF(/obj/machinery/sparker, create_sparks) /decl/stock_part_preset/radio/receiver/sparker frequency = BUTTON_FREQ diff --git a/code/game/objects/items/flame/_flame.dm b/code/game/objects/items/flame/_flame.dm index 1078285da3b..bee61f2c54c 100644 --- a/code/game/objects/items/flame/_flame.dm +++ b/code/game/objects/items/flame/_flame.dm @@ -56,7 +56,7 @@ loc.update_icon() /obj/item/flame/Destroy() - extinguish(null, TRUE) + snuff_out(null, TRUE) return ..() /obj/item/flame/proc/get_available_scents() @@ -115,7 +115,7 @@ return ..() -/obj/item/flame/proc/extinguish(var/mob/user, var/no_message) +/obj/item/flame/proc/snuff_out(mob/user, no_message = FALSE) if(!lit) return FALSE lit = FALSE @@ -147,7 +147,7 @@ return TRUE if(lit && can_manually_extinguish) - extinguish(user) + snuff_out(user) return TRUE return ..() @@ -175,7 +175,7 @@ else check_depth = FLUID_SHALLOW if(fluids.total_volume >= check_depth) - extinguish(no_message = TRUE) + snuff_out(no_message = TRUE) /obj/item/flame/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) . = ..() @@ -206,31 +206,21 @@ other.light(user) /obj/item/flame/attackby(obj/item/used_item, mob/user) - if(!user.check_intent(I_FLAG_HARM) && !can_manually_light && (used_item.isflamesource() || used_item.get_heat() > T100C)) light(user) return TRUE - return ..() /obj/item/flame/Process() - if((!waterproof && submerged()) || !expend_fuel(_fuel_spend_amt)) - extinguish() + snuff_out() return PROCESS_KILL - update_icon() - if(istype(loc, /obj/structure/wall_sconce)) - loc.update_icon() - - // TODO: generalized ignition proc - if(isliving(loc)) - var/mob/living/M = loc - M.IgniteMob() - - var/turf/location = get_turf(src) - if(location) - location.hotspot_expose(get_heat(), w_class) + if(loc) + loc.ignite_fire() + var/turf/my_turf = get_turf(src) + if(my_turf) + my_turf.hotspot_expose(get_heat(), w_class) /obj/item/flame/dropped(var/mob/user) //If dropped, put ourselves out @@ -239,7 +229,7 @@ var/turf/location = loc if(istype(location)) location.hotspot_expose(700, 5) - extinguish() + snuff_out() return ..() /obj/item/flame/spark_act(obj/effect/sparks/sparks) diff --git a/code/game/objects/items/flame/flame_fuelled_lighter.dm b/code/game/objects/items/flame/flame_fuelled_lighter.dm index 7719c082a6f..2e1e6903bc2 100644 --- a/code/game/objects/items/flame/flame_fuelled_lighter.dm +++ b/code/game/objects/items/flame/flame_fuelled_lighter.dm @@ -33,7 +33,7 @@ user.visible_message(SPAN_NOTICE("After a few attempts, \the [user] manages to light \the [src], burning their finger in the process.")) playsound(src.loc, "light_bic", 100, 1, -4) -/obj/item/flame/fuelled/lighter/extinguish(var/mob/user, var/no_message) +/obj/item/flame/fuelled/lighter/snuff_out(mob/user, no_message = FALSE) if(!no_message && user) no_message = TRUE . = ..() diff --git a/code/game/objects/items/flame/flame_matches.dm b/code/game/objects/items/flame/flame_matches.dm index ebaead8790b..41300c9d1e0 100644 --- a/code/game/objects/items/flame/flame_matches.dm +++ b/code/game/objects/items/flame/flame_matches.dm @@ -23,7 +23,7 @@ /obj/item/flame/match/light(mob/user, no_message) . = !burnt && ..() -/obj/item/flame/match/extinguish(var/mob/user, var/no_message) +/obj/item/flame/match/snuff_out(mob/user, no_message = FALSE) . = ..() if(. && !burnt) _fuel = 0 diff --git a/code/game/objects/items/flame/flame_torch.dm b/code/game/objects/items/flame/flame_torch.dm index 66aac1847d6..26f616a4a47 100644 --- a/code/game/objects/items/flame/flame_torch.dm +++ b/code/game/objects/items/flame/flame_torch.dm @@ -50,7 +50,7 @@ update_icon() -/obj/item/flame/torch/extinguish(var/mob/user, var/no_message) +/obj/item/flame/torch/snuff_out(mob/user, no_message = FALSE) . = ..() if(. && _fuel <= 0 && !burnt) burnt = TRUE diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 61ddcccfbae..cc1018b1639 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -296,7 +296,7 @@ target.create_fire(tank.air_contents.temperature * 2 + 400) target.hotspot_expose(1000, 100) for(var/mob/living/M in target) - M.IgniteMob(1) + M.ignite_fire() // slightly weird looking initialize cuz it has to do some stuff first /obj/item/flamethrower/full/Initialize() diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index fe6ac6673c9..41b4cae00d9 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -34,7 +34,7 @@ var/obj/item/clothing/mask/smokable/cigarette/cig = W if (cig.lit == 1) visible_message(SPAN_NOTICE("\The [user] crushes \the [cig] in \the [src], putting it out.")) - W = cig.extinguish(no_message = 1) + W = cig.extinguish_fire(no_message = TRUE) else if (cig.lit == 0) to_chat(user, SPAN_NOTICE("You place \the [cig] in \the [src] without even smoking it. Why would you do that?")) else diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 35c99e1d7dc..68f46f69269 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -553,7 +553,7 @@ var/global/list/global/tank_gauge_cache = list() return ..() /obj/item/tankassemblyproxy/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here. - tank.ignite() //boom (or not boom if you made shijwtty mix) + tank.cause_explosion() //boom (or not boom if you made shijwtty mix) /obj/item/tank/proc/assemble_bomb(W,user) //Bomb assembly proc. This turns assembly+tank into a bomb var/obj/item/assembly_holder/S = W @@ -573,7 +573,7 @@ var/global/list/global/tank_gauge_cache = list() update_icon(TRUE) -/obj/item/tank/proc/ignite() //This happens when a bomb is told to explode +/obj/item/tank/proc/cause_explosion() //This happens when a bomb is told to explode var/obj/item/assembly_holder/assy = proxyassembly.assembly var/ign = assy.a_right var/obj/item/other = assy.a_left diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 4a95497c9aa..3b9c293256e 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -192,7 +192,7 @@ var/turf/location = get_turf(user) if(isliving(O)) var/mob/living/L = O - L.IgniteMob() + L.ignite_fire() else if(isatom(O)) O.handle_external_heating(WELDING_TOOL_HOTSPOT_TEMP_ACTIVE, src, user) if (isturf(location)) @@ -243,7 +243,7 @@ var/mob/living/L = loc if(!(src in L.get_held_items())) fuel_usage = max(fuel_usage, 2) - L.IgniteMob() + L.ignite_fire() else if(isturf(loc)) var/turf/location = get_turf(src) location.hotspot_expose(WELDING_TOOL_HOTSPOT_TEMP_IDLE, 5) //a bit colder when idling diff --git a/code/game/objects/structures/wall_sconce.dm b/code/game/objects/structures/wall_sconce.dm index 5a3dd0a38a2..c1211712b3c 100644 --- a/code/game/objects/structures/wall_sconce.dm +++ b/code/game/objects/structures/wall_sconce.dm @@ -58,6 +58,10 @@ QDEL_NULL(light_source) return ..() +/obj/structure/wall_sconce/ignite_fire() + . = ..() + update_icon() + /obj/structure/wall_sconce/physically_destroyed() if(light_source) light_source.dropInto(loc) diff --git a/code/modules/ZAS/Fire.dm b/code/modules/ZAS/Fire.dm index c961aed56c7..10ecd938f69 100644 --- a/code/modules/ZAS/Fire.dm +++ b/code/modules/ZAS/Fire.dm @@ -17,7 +17,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return simulated /turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) - if(locate(/obj/fire) in src) + if((locate(/obj/fire) in src) || !simulated) return 1 var/datum/gas_mixture/air_contents = return_air() diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 19e0a6c4aca..01d01335e58 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -204,7 +204,7 @@ icon = 'icons/clothing/head/cakehat.dmi' body_parts_covered = SLOT_HEAD item_flags = null - var/is_on_fire = FALSE + VAR_PRIVATE/_on_fire = FALSE /obj/item/clothing/head/cakehat/equipped(mob/user, slot) . = ..() @@ -217,7 +217,7 @@ /obj/item/clothing/head/cakehat/on_update_icon(mob/user) . = ..() z_flags &= ~ZMM_MANGLE_PLANES - if(is_on_fire && check_state_in_icon("[icon_state]-flame", icon)) + if(is_on_fire() && check_state_in_icon("[icon_state]-flame", icon)) if(plane == HUD_PLANE) add_overlay("[icon_state]-flame") else @@ -230,7 +230,7 @@ return emissive_overlay(overlay.icon, "[overlay.icon_state]-flame") /obj/item/clothing/head/cakehat/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) - if(overlay && is_on_fire) + if(overlay && is_on_fire()) var/image/I = get_mob_flame_overlay(overlay, bodytype) if(I) overlay.overlays += I @@ -241,7 +241,7 @@ return ..() /obj/item/clothing/head/cakehat/Process() - if(!is_on_fire) + if(!is_on_fire()) STOP_PROCESSING(SSobj, src) return var/turf/location = loc @@ -255,9 +255,9 @@ /obj/item/clothing/head/cakehat/attack_self(mob/user) . = ..() if(!.) - is_on_fire = !is_on_fire + _on_fire = !_on_fire update_icon() - if(is_on_fire) + if(is_on_fire()) atom_damage_type = BURN START_PROCESSING(SSobj, src) else diff --git a/code/modules/clothing/masks/chewable.dm b/code/modules/clothing/masks/chewable.dm index 594eb26b6aa..84d490148fb 100644 --- a/code/modules/clothing/masks/chewable.dm +++ b/code/modules/clothing/masks/chewable.dm @@ -51,7 +51,7 @@ /obj/item/clothing/mask/chewable/Process() chew(1) if(chewtime < 1) - extinguish() + extinguish_fire() /obj/item/clothing/mask/chewable/tobacco name = "wad" @@ -72,7 +72,7 @@ desc = "A disgusting spitwad." icon = 'icons/clothing/mask/chewables/chew_spit.dmi' -/obj/item/clothing/mask/chewable/proc/extinguish(var/mob/user, var/no_message) +/obj/item/clothing/mask/chewable/extinguish_fire(mob/user, no_message = FALSE) STOP_PROCESSING(SSobj, src) if(type_butt) var/obj/item/trash/cigbutt/butt = new type_butt(get_turf(src)) diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index e36a224c787..9d5c9cf1a9f 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -82,7 +82,7 @@ if (src == user.get_equipped_item(slot_wear_mask_str) && user.internal) environment = user.internal.return_air() if(environment.get_by_flag(XGM_GAS_OXIDIZER) < gas_consumption) - extinguish() + extinguish_fire() else environment.remove_by_flag(XGM_GAS_OXIDIZER, gas_consumption) environment.adjust_gas(/decl/material/gas/carbon_dioxide, 0.5*gas_consumption,0) @@ -91,7 +91,7 @@ /obj/item/clothing/mask/smokable/Process() var/turf/location = get_turf(src) if(submerged() || smoketime < 1) - extinguish() + extinguish_fire() return smoke(1) if(location) @@ -126,7 +126,7 @@ var/turf/location = get_turf(src) if(location) location.hotspot_expose(700, 5) - extinguish(no_message = TRUE) + extinguish_fire(no_message = TRUE) /obj/item/clothing/mask/smokable/proc/light(var/flavor_text = "[usr] lights \the [src].") if(QDELETED(src)) @@ -152,7 +152,7 @@ smoke_amount = reagents.total_volume / smoketime START_PROCESSING(SSobj, src) -/obj/item/clothing/mask/smokable/proc/extinguish(var/mob/user, var/no_message) +/obj/item/clothing/mask/smokable/extinguish_fire(mob/user, no_message = FALSE) lit = FALSE atom_damage_type = BRUTE STOP_PROCESSING(SSobj, src) @@ -182,7 +182,7 @@ return ..() /obj/item/clothing/mask/smokable/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(target.on_fire) + if(target.is_on_fire()) user.do_attack_animation(target) light(SPAN_NOTICE("\The [user] coldly lights the \the [src] with the burning body of \the [target].")) return TRUE @@ -221,7 +221,7 @@ if(is_processing) set_scent_by_reagents(src) -/obj/item/clothing/mask/smokable/extinguish(var/mob/user, var/no_message) +/obj/item/clothing/mask/smokable/extinguish_fire(mob/user, no_message = FALSE) ..() remove_extension(src, /datum/extension/scent) if (type_butt) @@ -384,7 +384,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE - if(!lit && target.on_fire) + if(!lit && target.is_on_fire()) user.do_attack_animation(target) light(target, user) return TRUE @@ -412,7 +412,7 @@ /obj/item/clothing/mask/smokable/cigarette/attack_self(var/mob/user) if(lit == 1) user.visible_message(SPAN_NOTICE("[user] calmly drops and treads on the lit [src], putting it out instantly.")) - extinguish(no_message = 1) + extinguish_fire(no_message = TRUE) return ..() //////////// @@ -530,7 +530,7 @@ set_scent_by_reagents(src) update_icon() -/obj/item/clothing/mask/smokable/pipe/extinguish(var/mob/user, var/no_message) +/obj/item/clothing/mask/smokable/pipe/extinguish_fire(mob/user, no_message) ..() new /obj/effect/decal/cleanable/ash(get_turf(src)) if(ismob(loc)) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 5487388845d..3ed5186e6b8 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -13,8 +13,8 @@ material = /decl/material/solid/organic/cloth material_alteration = MAT_FLAG_ALTERATION_NAME - var/on_fire = 0 - var/burn_time = 20 //if the rag burns for too long it turns to ashes + VAR_PRIVATE/_on_fire = 0 + VAR_PRIVATE/burn_time = 20 //if the rag burns for too long it turns to ashes /obj/item/chems/glass/rag/Initialize() . = ..() @@ -28,20 +28,23 @@ STOP_PROCESSING(SSobj, src) //so we don't continue turning to ash while gc'd . = ..() +/obj/item/chems/glass/rag/is_on_fire() + return _on_fire + /obj/item/chems/glass/rag/attack_self(mob/user) - if(on_fire && user.try_unequip(src)) + if(is_on_fire() && user.try_unequip(src)) user.visible_message(SPAN_NOTICE("\The [user] stamps out [src]."), SPAN_NOTICE("You stamp out [src].")) - extinguish() + extinguish_fire() else remove_contents(user) /obj/item/chems/glass/rag/attackby(obj/item/W, mob/user) if(W.isflamesource()) - if(on_fire) + if(is_on_fire()) to_chat(user, SPAN_WARNING("\The [src] is already blazing merrily!")) return TRUE - ignite() - if(on_fire) + ignite_fire() + if(is_on_fire()) visible_message(SPAN_DANGER("\The [user] lights \the [src] with \the [W].")) else to_chat(user, SPAN_WARNING("You attempt to light \the [src] with \the [W], but it doesn't seem to be flammable.")) @@ -50,7 +53,7 @@ return ..() /obj/item/chems/glass/rag/update_name() - if(on_fire) + if(is_on_fire()) name_prefix = "burning" else if(reagents && reagents.total_volume) name_prefix = "damp" @@ -60,7 +63,7 @@ /obj/item/chems/glass/rag/on_update_icon() . = ..() - icon_state = "rag[on_fire? "lit" : ""]" + icon_state = "rag[is_on_fire()? "lit" : ""]" var/obj/item/chems/drinks/bottle/B = loc if(istype(B)) B.update_icon() @@ -93,14 +96,14 @@ /obj/item/chems/glass/rag/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(on_fire) + if(is_on_fire()) user.visible_message( SPAN_DANGER("\The [user] hits \the [target] with \the [src]!"), SPAN_DANGER("You hit \the [target] with \the [src]!") ) user.do_attack_animation(target) admin_attack_log(user, target, "used \the [src] (ignited) to attack", "was attacked using \the [src] (ignited)", "attacked with \the [src] (ignited)") - target.IgniteMob() + target.ignite_fire() return TRUE if(reagents.total_volume) @@ -150,7 +153,7 @@ update_name() return - if(!on_fire && istype(A) && (src in user)) + if(!is_on_fire() && istype(A) && (src in user)) if(ATOM_IS_OPEN_CONTAINER(A) && !(A in user)) remove_contents(user, A) else if(!ismob(A)) //mobs are handled in use_on_mob() - this prevents us from wiping down people while smothering them. @@ -159,7 +162,7 @@ /obj/item/chems/glass/rag/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature >= 50 + T0C) - ignite() + ignite_fire() if(exposed_temperature >= 900 + T0C) new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) @@ -168,7 +171,7 @@ //rag must have a minimum of 2 units welder fuel and at least 80% of the reagents must be welder fuel. //maybe generalize flammable reagents someday -/obj/item/chems/glass/rag/proc/can_ignite() +/obj/item/chems/glass/rag/can_ignite() var/total_fuel = 0 var/total_volume = 0 if(reagents) @@ -178,21 +181,21 @@ total_fuel += REAGENT_VOLUME(reagents, rtype) * R.accelerant_value . = (total_fuel >= 2 && total_fuel >= total_volume*0.5) -/obj/item/chems/glass/rag/proc/ignite() - if(on_fire) +/obj/item/chems/glass/rag/ignite_fire() + if(is_on_fire()) return if(!can_ignite()) return START_PROCESSING(SSobj, src) set_light(2, 1, "#e38f46") - on_fire = 1 + _on_fire = TRUE update_name() update_icon() -/obj/item/chems/glass/rag/proc/extinguish() +/obj/item/chems/glass/rag/extinguish_fire(mob/user, no_message = FALSE) STOP_PROCESSING(SSobj, src) set_light(0) - on_fire = 0 + _on_fire = FALSE //rags sitting around with 1 second of burn time left is dumb. //ensures players always have a few seconds of burn time left when they light their rag @@ -206,12 +209,11 @@ /obj/item/chems/glass/rag/Process() if(!can_ignite()) visible_message("\The [src] burns out.") - extinguish() + extinguish_fire() //copied from matches - if(isliving(loc)) - var/mob/living/M = loc - M.IgniteMob() + if(loc) + loc.ignite_fire() var/turf/location = get_turf(src) if(location) location.hotspot_expose(700, 5) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 4b12ce62dee..8a6a4d3b1ae 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -746,7 +746,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) // This doesn't apply to skin contact - this is for, e.g. extinguishers and sprays. The difference is that reagent is not directly on the mob's skin - it might just be on their clothing. /decl/material/proc/touch_mob(var/mob/living/M, var/amount, var/datum/reagents/holder) if(accelerant_value != FUEL_VALUE_NONE && amount && istype(M)) - M.fire_stacks += floor((amount * accelerant_value)/FLAMMABLE_LIQUID_DIVISOR) + M.adjust_fire_intensity(floor((amount * accelerant_value)/FLAMMABLE_LIQUID_DIVISOR)) #undef FLAMMABLE_LIQUID_DIVISOR /decl/material/proc/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) // Cleaner cleaning, lube lubbing, etc, all go here diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index 76caa77b46f..e9ca35c6c78 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -87,11 +87,11 @@ /decl/material/liquid/water/touch_mob(var/mob/living/M, var/amount, var/datum/reagents/holder) ..() if(istype(M)) - var/needed = M.fire_stacks * 10 + var/needed = M.get_fire_intensity() * 10 if(amount > needed) - M.fire_stacks = 0 - M.ExtinguishMob() + M.set_fire_intensity(0) + M.extinguish_fire() holder.remove_reagent(type, needed) else - M.adjust_fire_stacks(-(amount / 10)) + M.adjust_fire_intensity(-(amount / 10)) holder.remove_reagent(type, amount) diff --git a/code/modules/mob/living/human/examine.dm b/code/modules/mob/living/human/examine.dm index 389e209440c..ddcaa27e09f 100644 --- a/code/modules/mob/living/human/examine.dm +++ b/code/modules/mob/living/human/examine.dm @@ -83,12 +83,13 @@ else msg += "[use_He] [use_is] looking a bit damp.\n" - if(fire_stacks > 0) + var/fire_level = get_fire_intensity() + if(fire_level > 0) msg += "[use_He] [use_is] looking highly flammable!\n" - else if(fire_stacks < 0) + else if(fire_level < 0) msg += "[use_He] [use_is] looking rather damp.\n" - if(on_fire) + if(is_on_fire()) msg += "[use_He] [use_is] on fire!.\n" var/ssd_msg = species.get_ssd(src) diff --git a/code/modules/mob/living/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm index e88990677b4..83b036ada13 100644 --- a/code/modules/mob/living/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -99,7 +99,7 @@ if(user == src) check_self_injuries() return TRUE - if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !on_fire && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) + if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !is_on_fire() && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) if (performing_cpr) performing_cpr = FALSE else diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index b6a065fc2f7..1bb84a587db 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -258,7 +258,7 @@ return /mob/living/human/get_bodytemperature_difference() - if (on_fire) + if (is_on_fire()) return 0 //too busy for pesky metabolic regulation return ..() @@ -490,7 +490,7 @@ // Apply a fire overlay if we're burning. var/crit_markers = get_ui_icon(client?.prefs?.UI_style, UI_ICON_CRIT_MARKER) - if(on_fire) + if(is_on_fire()) health_images += image(crit_markers, "burning") // Show a general pain/crit indicator if needed. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 7bab0e45da2..df4f9b1c97d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -312,8 +312,8 @@ default behaviour is: BITSET(hud_updateflag, HEALTH_HUD) BITSET(hud_updateflag, STATUS_HUD) BITSET(hud_updateflag, LIFE_HUD) - ExtinguishMob() - fire_stacks = 0 + extinguish_fire() + set_fire_intensity(0) var/obj/item/cuffs = get_equipped_item(slot_handcuffed_str) if (cuffs) try_unequip(cuffs, get_turf(src)) @@ -551,8 +551,8 @@ default behaviour is: spawn() escape_buckle() return TRUE //drop && roll - else if(on_fire) - fire_stacks = max(0, fire_stacks-1.2) + else if(is_on_fire()) + set_fire_intensity(max(0, get_fire_intensity()-1.2)) SET_STATUS_MAX(src, STAT_WEAK, 3) spin(32,2) var/decl/pronouns/pronouns = get_pronouns() @@ -561,12 +561,12 @@ default behaviour is: SPAN_NOTICE("You stop, drop, and roll!") ) sleep(3 SECONDS) - if(fire_stacks <= 0) + if(get_fire_intensity() <= 0) visible_message( SPAN_NOTICE("\The [src] successfully extinguishes [pronouns.him][pronouns.self]!"), SPAN_NOTICE("You extinguish yourself.") ) - ExtinguishMob() + extinguish_fire() return TRUE //Breaking out of a structure? @@ -1079,17 +1079,19 @@ default behaviour is: ADJ_STATUS(src, STAT_STUN, -3) ADJ_STATUS(src, STAT_WEAK, -3) - if(fire_stacks >= target.fire_stacks + 3) - target.fire_stacks += 1 - fire_stacks -= 1 - else if(target.fire_stacks >= fire_stacks + 3) - fire_stacks += 1 - target.fire_stacks -= 1 - - if(on_fire && !target.on_fire) - target.IgniteMob() - else if(!on_fire && target.on_fire) - IgniteMob() + var/fire_level = get_fire_intensity() + var/target_fire_level = target.get_fire_intensity() + if(fire_level >= target_fire_level + 3) + target.adjust_fire_intensity(1) + adjust_fire_intensity(-1) + else if(target_fire_level >= fire_level + 3) + adjust_fire_intensity(1) + target.adjust_fire_intensity(-1) + + if(is_on_fire() && !target.is_on_fire()) + target.ignite_fire() + else if(!is_on_fire() && target.is_on_fire()) + ignite_fire() /mob/living/proc/jump_layer_shift() jumping = TRUE diff --git a/code/modules/mob/living/living_attackhand.dm b/code/modules/mob/living/living_attackhand.dm index e7a7ae239f9..055b82d84bf 100644 --- a/code/modules/mob/living/living_attackhand.dm +++ b/code/modules/mob/living/living_attackhand.dm @@ -52,11 +52,11 @@ // Returns TRUE if further interactions should be halted, FALSE otherwise. /mob/living/proc/try_extinguish(mob/living/user) - if (!on_fire || !istype(user)) + if (!is_on_fire() || !istype(user)) return FALSE playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if (user.on_fire) + if (user.is_on_fire()) user.visible_message( SPAN_WARNING("\The [user] tries to pat out \the [src]'s flames, but to no avail!"), SPAN_WARNING("You try to pat out [src]'s flames, but to no avail! Put yourself out first!") @@ -71,25 +71,25 @@ if(!do_mob(user, src, 15)) return TRUE - fire_stacks -= 0.5 - if (prob(10) && (user.fire_stacks <= 0)) - user.fire_stacks += 1 - user.IgniteMob() - if (user.on_fire) + adjust_fire_intensity(-0.5) + if (prob(10) && (user.get_fire_intensity() <= 0)) + user.adjust_fire_intensity(1) + user.ignite_fire() + if (user.is_on_fire()) user.visible_message( SPAN_DANGER("The fire spreads from \the [src] to \the [user]!"), SPAN_DANGER("The fire spreads to you as well!") ) return TRUE - fire_stacks -= 0.5 //Less effective than stop, drop, and roll - also accounting for the fact that it takes half as long. - if (fire_stacks <= 0) + adjust_fire_intensity(-0.5) //Less effective than stop, drop, and roll - also accounting for the fact that it takes half as long. + if (get_fire_intensity() <= 0) user.visible_message( SPAN_NOTICE("\The [user] successfully pats out \the [src]'s flames."), SPAN_NOTICE("You successfully pat out \the [src]'s flames.") ) - ExtinguishMob() - fire_stacks = 0 + extinguish_fire() + set_fire_intensity(0) return TRUE diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 97fe9281e2c..a74526afdd4 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -291,91 +291,6 @@ user.do_attack_animation(src) return 1 -/mob/living/proc/can_ignite() - return fire_stacks > 0 && !on_fire - -/mob/living/proc/IgniteMob() - if(can_ignite()) - on_fire = TRUE - set_light(4, l_color = COLOR_ORANGE) - update_fire() - -/mob/living/proc/ExtinguishMob() - if(on_fire) - on_fire = FALSE - fire_stacks = 0 - set_light(0) - update_fire() - -/mob/living/proc/update_fire(var/update_icons=1) - if(on_fire) - var/decl/bodytype/mob_bodytype = get_bodytype() - var/image/standing = overlay_image(mob_bodytype?.get_ignited_icon(src) || 'icons/mob/OnFire.dmi', mob_bodytype?.get_ignited_icon_state(src) || "Generic_mob_burning", RESET_COLOR) - set_current_mob_overlay(HO_FIRE_LAYER, standing, update_icons) - else - set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) - -/mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person - fire_stacks = clamp(fire_stacks + add_fire_stacks, FIRE_MIN_STACKS, FIRE_MAX_STACKS) - -/mob/living/proc/handle_fire() - if(fire_stacks < 0) - fire_stacks = min(0, ++fire_stacks) //If we've doused ourselves in water to avoid fire, dry off slowly - - if(!on_fire) - return TRUE - else if(fire_stacks <= 0) - ExtinguishMob() //Fire's been put out. - return TRUE - - fire_stacks = max(0, fire_stacks - 0.2) //I guess the fire runs out of fuel eventually - - var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(G.get_by_flag(XGM_GAS_OXIDIZER) < 1) - ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire - return TRUE - - var/turf/location = get_turf(src) - location.hotspot_expose(fire_burn_temperature(), 50, 1) - - var/burn_temperature = fire_burn_temperature() - var/thermal_protection = get_heat_protection(burn_temperature) - - if (thermal_protection < 1 && bodytemperature < burn_temperature) - bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1) - - var/species_heat_mod = 1 - - var/protected_limbs = get_heat_protection_flags(burn_temperature) - - if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_2)) - species_heat_mod = 0.5 - else if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_3)) - species_heat_mod = 0.75 - - burn_temperature -= get_mob_temperature_threshold(HEAT_LEVEL_1) - - if(burn_temperature < 1) - return - - if(has_external_organs()) - for(var/obj/item/organ/external/E in get_external_organs()) - if(!(E.body_part & protected_limbs) && prob(20)) - E.take_external_damage(burn = round(species_heat_mod * log(10, (burn_temperature + 10)), 0.1), used_weapon = "fire") - else // fallback for simplemobs - take_damage(round(species_heat_mod * log(10, (burn_temperature + 10))), 0.1, BURN, DAM_DISPERSED) - -/mob/living/proc/increase_fire_stacks(exposed_temperature) - if(fire_stacks <= 4 || fire_burn_temperature() < exposed_temperature) - adjust_fire_stacks(2) - -/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - //once our fire_burn_temperature has reached the temperature of the fire that's giving fire_stacks, stop adding them. - //allow fire_stacks to go up to 4 for fires cooler than 700 K, since are being immersed in flame after all. - increase_fire_stacks(exposed_temperature) - IgniteMob() - return ..() - /mob/living/proc/get_cold_protection() return 0 @@ -384,12 +299,12 @@ //Finds the effective temperature that the mob is burning at. /mob/living/proc/fire_burn_temperature() - if (fire_stacks <= 0) + var/fire_level = get_fire_intensity() + if (fire_level <= 0) return 0 - //Scale quadratically so that single digit numbers of fire stacks don't burn ridiculously hot. //lower limit of 700 K, same as matches and roughly the temperature of a cool flame. - return max(2.25*round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_stacks/FIRE_MAX_FIRESUIT_STACKS)**2), 700) + return max(2.25*round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_level/FIRE_MAX_FIRESUIT_STACKS)**2), 700) /mob/living/proc/reagent_permeability() return 1 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 8d8270d0854..4d894ca4fa9 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -29,8 +29,8 @@ var/mob/living/cameraFollow = null var/list/datum/action/actions = list() - var/on_fire = 0 //The "Are we on fire?" var - var/fire_stacks + VAR_PRIVATE/_on_fire = 0 //The "Are we on fire?" var + VAR_PRIVATE/_fire_intensity var/ticks_since_last_successful_breath = 0 //if we failed to breathe last tick var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. diff --git a/code/modules/mob/living/living_fires.dm b/code/modules/mob/living/living_fires.dm new file mode 100644 index 00000000000..5711910fe86 --- /dev/null +++ b/code/modules/mob/living/living_fires.dm @@ -0,0 +1,96 @@ +/mob/living/is_on_fire() + return _on_fire + +/mob/living/set_fire_intensity(amount) + _fire_intensity = amount + +/mob/living/get_fire_intensity() + return _fire_intensity + +//Adjusting the amount of fire stacks we have on person +/mob/living/adjust_fire_intensity(amount) + _fire_intensity = clamp(_fire_intensity + amount, FIRE_MIN_STACKS, FIRE_MAX_STACKS) + +/mob/living/can_ignite() + return get_fire_intensity() > 0 && !is_on_fire() + +/mob/living/ignite_fire() + if(can_ignite()) + _on_fire = TRUE + set_light(4, l_color = COLOR_ORANGE) + update_fire() + +/mob/living/extinguish_fire(mob/user, no_message = FALSE) + if(is_on_fire()) + _on_fire = FALSE + set_fire_intensity(0) + set_light(0) + update_fire() + +/mob/living/proc/update_fire(var/update_icons=1) + if(is_on_fire()) + var/decl/bodytype/mob_bodytype = get_bodytype() + var/image/standing = overlay_image(mob_bodytype?.get_ignited_icon(src) || 'icons/mob/OnFire.dmi', mob_bodytype?.get_ignited_icon_state(src) || "Generic_mob_burning", RESET_COLOR) + set_current_mob_overlay(HO_FIRE_LAYER, standing, update_icons) + else + set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) + +/mob/living/proc/handle_fire() + var/fire_level = get_fire_intensity() + if(fire_level < 0) + set_fire_intensity(min(0, ++fire_level)) //If we've doused ourselves in water to avoid fire, dry off slowly + fire_level = get_fire_intensity() + + if(!is_on_fire()) + return TRUE + if(fire_level <= 0) + extinguish_fire() //Fire's been put out. + return TRUE + + set_fire_intensity(max(0, fire_level - 0.2)) //I guess the fire runs out of fuel eventually + + var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment + if(G.get_by_flag(XGM_GAS_OXIDIZER) < 1) + extinguish_fire() //If there's no oxygen in the tile we're on, put out the fire + return TRUE + + var/turf/location = get_turf(src) + location.hotspot_expose(fire_burn_temperature(), 50, 1) + + var/burn_temperature = fire_burn_temperature() + var/thermal_protection = get_heat_protection(burn_temperature) + + if (thermal_protection < 1 && bodytemperature < burn_temperature) + bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1) + + var/species_heat_mod = 1 + + var/protected_limbs = get_heat_protection_flags(burn_temperature) + + if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_2)) + species_heat_mod = 0.5 + else if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_3)) + species_heat_mod = 0.75 + + burn_temperature -= get_mob_temperature_threshold(HEAT_LEVEL_1) + + if(burn_temperature < 1) + return + + if(has_external_organs()) + for(var/obj/item/organ/external/E in get_external_organs()) + if(!(E.body_part & protected_limbs) && prob(20)) + E.take_external_damage(burn = round(species_heat_mod * log(10, (burn_temperature + 10)), 0.1), used_weapon = "fire") + else // fallback for simplemobs + take_damage(round(species_heat_mod * log(10, (burn_temperature + 10))), 0.1, BURN, DAM_DISPERSED) + +/mob/living/proc/increase_fire_intensity(exposed_temperature) + if(get_fire_intensity() <= 4 || fire_burn_temperature() < exposed_temperature) + adjust_fire_intensity(2) + +/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + //once our fire_burn_temperature has reached the temperature of the fire that's giving fire intensity, stop adding them. + //allow fire intensity to go up to 4 for fires cooler than 700 K, since are being immersed in flame after all. + increase_fire_intensity(exposed_temperature) + ignite_fire() + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index a8da2261da4..4e2bc0fe3cf 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -258,12 +258,12 @@ /mob/living/silicon/robot/update_fire() overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") - if(on_fire) + if(is_on_fire()) overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") //Silicons don't gain stacks from hotspots, but hotspots can ignite them -/mob/living/silicon/increase_fire_stacks(exposed_temperature) +/mob/living/silicon/increase_fire_intensity(exposed_temperature) return /mob/living/silicon/can_ignite() - return !on_fire + return !is_on_fire() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm index 0541018c1de..d8443751980 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm @@ -188,8 +188,8 @@ /mob/living/simple_animal/hostile/beast/charbaby/apply_attack_effects(mob/living/target) . = ..() if(prob(10)) - target.adjust_fire_stacks(1) - target.IgniteMob() + target.adjust_fire_intensity(1) + target.ignite_fire() /mob/living/simple_animal/hostile/beast/shantak/lava desc = "A vaguely canine looking beast. It looks as though its fur is made of stone wool." diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm index d1c38e68b5b..0d185bbe9ae 100644 --- a/code/modules/organs/external/_external_damage.dm +++ b/code/modules/organs/external/_external_damage.dm @@ -89,7 +89,7 @@ if(laser) created_wound = createwound(LASER, burn) if(prob(40)) - owner.IgniteMob() + owner.ignite_fire() else created_wound = createwound(BURN, burn) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index d9cde61e7df..dc643dcdc3b 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -354,9 +354,9 @@ ..() if(isliving(target)) var/mob/living/L = target - L.adjust_fire_stacks(rand(2,4)) - if(L.fire_stacks >= 3) - L.IgniteMob() + L.adjust_fire_intensity(rand(2,4)) + if(L.get_fire_intensity() >= 3) + L.ignite_fire() /obj/item/projectile/beam/pop icon_state = "bluelaser" diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 01404109510..d648f6d70c3 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -206,5 +206,5 @@ if(isliving(target)) var/mob/living/L = target to_chat(target, SPAN_WARNING("You feel a wave of heat wash over you!")) - L.adjust_fire_stacks(rand(5,8)) - L.IgniteMob() \ No newline at end of file + L.adjust_fire_intensity(rand(5,8)) + L.ignite_fire() \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index 6c93e2c79a2..242cd0583be 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -41,7 +41,7 @@ /obj/item/chems/drinks/bottle/proc/smash_check(var/distance) if(!material?.is_brittle()) return 0 - if(rag && rag.on_fire) // Molotovs should be somewhat reliable, they're a pain to make. + if(rag?.is_on_fire()) // Molotovs should be somewhat reliable, they're a pain to make. return TRUE if(!smash_duration) return 0 @@ -68,13 +68,13 @@ if(rag) rag.dropInto(T) while(T) + if(!rag || QDELETED(src) || !HasBelow(T.z) || !T.is_open()) + break rag.forceMove(T) - if(rag.on_fire) + if(rag.is_on_fire()) T.hotspot_expose(700, 5) for(var/mob/living/M in T.contents) - M.IgniteMob() - if(!rag || QDELETED(src) || !HasBelow(T.z) || !T.is_open()) - break + M.ignite_fire() T = GetBelow(T) rag = null @@ -148,7 +148,7 @@ . = ..() underlays.Cut() if(rag) - var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.on_fire? "[rag_underlay]_lit" : rag_underlay) + var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.is_on_fire()? "[rag_underlay]_lit" : rag_underlay) underlays += underlay_image set_light(rag.light_range, 0.1, rag.light_color) else @@ -178,8 +178,8 @@ if(reagents) user.visible_message(SPAN_NOTICE("The contents of \the [src] splash all over [target]!")) reagents.splash(target, reagents.total_volume) - if(rag && rag.on_fire && istype(target)) - target.IgniteMob() + if(rag?.is_on_fire() && istype(target)) + target.ignite_fire() //Finally, smash the bottle. This kills (qdel) the bottle. var/obj/item/broken_bottle/B = smash(target.loc, target) diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm index fdccd1ce64d..55a0ed83359 100644 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ b/code/modules/spells/targeted/ethereal_jaunt.dm @@ -31,7 +31,7 @@ animation.anchored = TRUE animation.icon = 'icons/mob/mob.dmi' animation.layer = FLY_LAYER - target.ExtinguishMob() + target.extinguish_fire() if(target.buckled) target.buckled = null jaunt_disappear(animation, target) diff --git a/mods/gamemodes/cult/runes.dm b/mods/gamemodes/cult/runes.dm index 11fd2e328ed..161d225a648 100644 --- a/mods/gamemodes/cult/runes.dm +++ b/mods/gamemodes/cult/runes.dm @@ -481,8 +481,8 @@ if(casters.len < 3) break //T.turf_animation('icons/effects/effects.dmi', "rune_sac") - victim.fire_stacks = max(2, victim.fire_stacks) - victim.IgniteMob() + victim.set_fire_intensity(max(2, victim.get_fire_intensity())) + victim.ignite_fire() var/dam_amt = 2 + length(casters) victim.take_organ_damage(dam_amt, dam_amt) // This is to speed up the process and also damage mobs that don't take damage from being on fire, e.g. borgs if(ishuman(victim)) @@ -505,10 +505,9 @@ to_chat(victim, SPAN_OCCULT("The Geometer of Blood claims your body.")) victim.dust() if(victim) - victim.ExtinguishMob() // Technically allows them to put the fire out by sacrificing them and stopping immediately, but I don't think it'd have much effect + victim.extinguish_fire() // Technically allows them to put the fire out by sacrificing them and stopping immediately, but I don't think it'd have much effect victim = null - /obj/effect/rune/drain cultname = "blood drain" strokes = 3 diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm index e58789252fc..86d5ae09208 100644 --- a/mods/species/serpentid/datum/species.dm +++ b/mods/species/serpentid/datum/species.dm @@ -84,8 +84,8 @@ #undef SERPENTID_FLIGHT_PRESSURE_THRESHOLD /decl/species/serpentid/handle_environment_special(var/mob/living/human/H) - if(!H.on_fire && H.fire_stacks < 2) - H.fire_stacks += 0.2 + if(!H.is_on_fire() && H.get_fire_intensity() < 2) + H.adjust_fire_intensity(0.2) return /decl/species/serpentid/handle_fall_special(var/mob/living/human/H, var/turf/landing) diff --git a/nebula.dme b/nebula.dme index 354c22a8b18..95b6436de7a 100644 --- a/nebula.dme +++ b/nebula.dme @@ -739,6 +739,7 @@ #include "code\game\atom_material.dm" #include "code\game\atoms.dm" #include "code\game\atoms_damage.dm" +#include "code\game\atoms_fires.dm" #include "code\game\atoms_fluids.dm" #include "code\game\atoms_init.dm" #include "code\game\atoms_layering.dm" @@ -2862,6 +2863,7 @@ #include "code\modules\mob\living\living_dreams.dm" #include "code\modules\mob\living\living_eating.dm" #include "code\modules\mob\living\living_electrocution.dm" +#include "code\modules\mob\living\living_fires.dm" #include "code\modules\mob\living\living_genetics.dm" #include "code\modules\mob\living\living_give.dm" #include "code\modules\mob\living\living_grabs.dm" From 646054c87f94550eff28a76b677fba258e450026 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Dec 2024 12:54:18 +1100 Subject: [PATCH 178/554] Relaxing default click cooldowns after feedback from Scav. --- code/_onclick/click.dm | 8 ++++---- code/_onclick/cyborg.dm | 4 ++-- code/_onclick/rig.dm | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 045bb1e7b33..7e4d29c799a 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -124,10 +124,10 @@ var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) else if(ismob(A)) // No instant mob attacking - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) trigger_aiming(TARGET_CAN_CLICK) @@ -151,10 +151,10 @@ var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1: clicking something Adjacent - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) else if(ismob(A)) // No instant mob attacking - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) trigger_aiming(TARGET_CAN_CLICK) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 4cb41e5b2bb..45b5e45bf42 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -69,7 +69,7 @@ var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) return if(!isturf(loc)) @@ -81,7 +81,7 @@ var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) else holding.afterattack(A, src, 0, params) return diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index 9c1802edd7a..3b7d5f0d8ac 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -46,6 +46,6 @@ return 0 rig.selected_module.engage(A, alert_ai) if(ismob(A)) // No instant mob attacking - though modules have their own cooldowns - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) return 1 return 0 \ No newline at end of file From 3f34489072699b8483ac0612e2e20ffe9c643f56 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Dec 2024 13:42:11 +1100 Subject: [PATCH 179/554] Fixes to fabricator intake. --- code/modules/fabrication/fabricator_bioprinter.dm | 5 +---- code/modules/fabrication/fabricator_books.dm | 7 +++++++ code/modules/fabrication/fabricator_food.dm | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/code/modules/fabrication/fabricator_bioprinter.dm b/code/modules/fabrication/fabricator_bioprinter.dm index 2d5ac4cd4ee..305322cb3d6 100644 --- a/code/modules/fabrication/fabricator_bioprinter.dm +++ b/code/modules/fabrication/fabricator_bioprinter.dm @@ -12,7 +12,7 @@ var/datum/mob_snapshot/loaded_dna //DNA for biological organs /obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) - . = istype(thing, /obj/item/organ) || istype(thing, /obj/item/food/butchery) || ..() + . = istype(thing, /obj/item/organ) || istype(thing, /obj/item/food/butchery) || istype(thing?.material, /decl/material/solid/organic/meat) || ..() /obj/machinery/fabricator/bioprinter/get_nano_template() return "fabricator_bioprinter.tmpl" @@ -23,9 +23,6 @@ order.set_data("dna", loaded_dna) return order -/obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) - return istype(thing?.material, /decl/material/solid/organic/meat) || ..() - /obj/machinery/fabricator/bioprinter/do_build(datum/fabricator_build_order/order) . = ..() //Fetch params as they were when the order was passed diff --git a/code/modules/fabrication/fabricator_books.dm b/code/modules/fabrication/fabricator_books.dm index e69f24ea5ce..b5861f87858 100644 --- a/code/modules/fabrication/fabricator_books.dm +++ b/code/modules/fabrication/fabricator_books.dm @@ -10,6 +10,13 @@ fabricator_class = FABRICATOR_CLASS_BOOKS color_selectable = TRUE +/obj/machinery/fabricator/book/can_ingest(obj/item/thing) + var/static/list/paper_types = list( + /obj/item/paper, + /obj/item/shreddedp + ) + . = is_type_in_list(thing, paper_types) || ..() + /obj/machinery/fabricator/book/make_order(datum/fabricator_recipe/recipe, multiplier) var/datum/fabricator_build_order/order = ..() LAZYSET(order.data, "selected_color", selected_color) diff --git a/code/modules/fabrication/fabricator_food.dm b/code/modules/fabrication/fabricator_food.dm index ed677a64e9a..cf6486e3701 100644 --- a/code/modules/fabrication/fabricator_food.dm +++ b/code/modules/fabrication/fabricator_food.dm @@ -33,7 +33,7 @@ break ..() -/obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) +/obj/machinery/fabricator/replicator/can_ingest(var/obj/item/thing) return istype(thing, /obj/item/food) || ..() /obj/machinery/fabricator/replicator/proc/state_status() From cc9569af430179f673457e2064f8bdad3d26ab97 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Dec 2024 13:47:44 +1100 Subject: [PATCH 180/554] Dirt fixes. --- code/game/objects/effects/dirty_floor.dm | 4 + code/game/objects/random/subtypes/misc.dm | 2 +- code/game/objects/structures/flora/potted.dm | 2 +- code/game/turfs/turf_effects.dm | 1 + code/modules/reagents/Chemistry-Holder.dm | 7 +- code/procs/hud.dm | 54 +- maps/away/bearcat/bearcat-1.dmm | 46 +- maps/away/bearcat/bearcat-2.dmm | 62 +- maps/away/liberia/liberia.dmm | 4 +- maps/away/mining/mining-signal.dmm | 318 ++++---- maps/away/slavers/slavers_base.dmm | 176 ++--- maps/away/smugglers/smugglers.dmm | 48 +- maps/away/yacht/yacht.dmm | 230 +++--- maps/exodus/exodus-2.dmm | 6 +- maps/ministation/ministation-0.dmm | 126 ++-- maps/ministation/ministation-1.dmm | 100 +-- maps/ministation/ministation-2.dmm | 62 +- .../crashed_pod/crashed_pod.dmm | 162 ++--- .../exoplanet_ruins/oldpod/oldpod.dmm | 158 ++-- .../exoplanet_ruins/playablecolony/colony.dmm | 238 +++--- maps/tradeship/tradeship-0.dmm | 56 +- maps/tradeship/tradeship-1.dmm | 70 +- maps/tradeship/tradeship-2.dmm | 78 +- .../government/away_sites/icarus/icarus-1.dmm | 678 +++++++++--------- .../government/away_sites/icarus/icarus-2.dmm | 46 +- mods/gamemodes/heist/heist_base.dmm | 16 +- tools/map_migrations/4647_dirt.txt | 2 + 27 files changed, 1376 insertions(+), 1376 deletions(-) create mode 100644 tools/map_migrations/4647_dirt.txt diff --git a/code/game/objects/effects/dirty_floor.dm b/code/game/objects/effects/dirty_floor.dm index ef76cb06830..e56eaa02ad8 100644 --- a/code/game/objects/effects/dirty_floor.dm +++ b/code/game/objects/effects/dirty_floor.dm @@ -9,9 +9,13 @@ alpha = 0 var/dirt_amount = 0 +/obj/effect/decal/cleanable/dirt/visible + dirt_amount = 60 + /obj/effect/decal/cleanable/dirt/Initialize() . = ..() verbs.Cut() + update_icon() /obj/effect/decal/cleanable/dirt/on_update_icon() . = ..() diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index a4356724b35..e0b87069d00 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -164,7 +164,7 @@ /obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/generic, /obj/effect/decal/cleanable/flour, - /obj/effect/decal/cleanable/dirt, + /obj/effect/decal/cleanable/dirt/visible, /obj/item/remains/robot ) return spawnable_choices diff --git a/code/game/objects/structures/flora/potted.dm b/code/game/objects/structures/flora/potted.dm index 5984436d57e..b046efc7a54 100644 --- a/code/game/objects/structures/flora/potted.dm +++ b/code/game/objects/structures/flora/potted.dm @@ -9,7 +9,7 @@ anchored = FALSE layer = ABOVE_HUMAN_LAYER w_class = ITEM_SIZE_LARGE - remains_type = /obj/effect/decal/cleanable/dirt + remains_type = /obj/effect/decal/cleanable/dirt/visible hitsound = 'sound/effects/glass_crack2.ogg' snd_cut = 'sound/effects/break_ceramic.ogg' material = /decl/material/solid/stone/pottery diff --git a/code/game/turfs/turf_effects.dm b/code/game/turfs/turf_effects.dm index 84aaba661be..93e5da6a91e 100644 --- a/code/game/turfs/turf_effects.dm +++ b/code/game/turfs/turf_effects.dm @@ -37,6 +37,7 @@ if(!dirt) dirt = new(src) dirt.dirt_amount = min(dirt.dirt_amount + amount, MAX_DIRT) + dirt.update_icon() return TRUE #undef MAX_DIRT diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 4357110ccbb..d35715d884a 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -815,12 +815,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new target.remove_cleanables() if(dirtiness != DIRTINESS_NEUTRAL) if(dirtiness > DIRTINESS_NEUTRAL) - var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate() in target - if (!dirtoverlay) - dirtoverlay = new /obj/effect/decal/cleanable/dirt(target) - dirtoverlay.alpha = total_volume * dirtiness - else - dirtoverlay.alpha = min(dirtoverlay.alpha + total_volume * dirtiness, 255) + target.add_dirt(ceil(total_volume * dirtiness)) else if(dirtiness <= DIRTINESS_STERILE) target.germ_level -= min(total_volume*20, target.germ_level) diff --git a/code/procs/hud.dm b/code/procs/hud.dm index 5f4c5580e92..49286df1000 100644 --- a/code/procs/hud.dm +++ b/code/procs/hud.dm @@ -13,73 +13,71 @@ the HUD updates properly! */ if(!can_process_hud(M)) return var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.med_hud_users) - for(var/mob/living/human/patient in P.Mob.in_view(P.Turf)) + for(var/mob/living/human/patient in P.hud_mob.in_view(P.hud_turf)) - if(patient.is_invisible_to(P.Mob)) + if(patient.is_invisible_to(P.hud_mob)) continue if(local_scanner) - P.Client.images += patient.hud_list[HEALTH_HUD] + P.hud_client.images += patient.hud_list[HEALTH_HUD] if(network) var/record = network.get_crew_record_by_name(patient.get_visible_name()) if(!record) return - P.Client.images += patient.hud_list[STATUS_HUD] + P.hud_client.images += patient.hud_list[STATUS_HUD] else var/sensor_level = getsensorlevel(patient) if(sensor_level >= VITALS_SENSOR_VITAL) - P.Client.images += patient.hud_list[HEALTH_HUD] + P.hud_client.images += patient.hud_list[HEALTH_HUD] if(sensor_level >= VITALS_SENSOR_BINARY) - P.Client.images += patient.hud_list[LIFE_HUD] + P.hud_client.images += patient.hud_list[LIFE_HUD] //Security HUDs. Pass a value for the second argument to enable implant viewing or other special features. /proc/process_sec_hud(var/mob/M, var/advanced_mode, var/mob/Alt, datum/computer_network/network) if(!can_process_hud(M)) return var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.sec_hud_users) - for(var/mob/living/human/perp in P.Mob.in_view(P.Turf)) + for(var/mob/living/human/perp in P.hud_mob.in_view(P.hud_turf)) - if(perp.is_invisible_to(P.Mob)) + if(perp.is_invisible_to(P.hud_mob)) continue if(network) var/record = network.get_crew_record_by_name(perp.get_visible_name()) if(!record) return - P.Client.images += perp.hud_list[ID_HUD] + P.hud_client.images += perp.hud_list[ID_HUD] if(advanced_mode) - P.Client.images += perp.hud_list[WANTED_HUD] - P.Client.images += perp.hud_list[IMPTRACK_HUD] - P.Client.images += perp.hud_list[IMPLOYAL_HUD] - P.Client.images += perp.hud_list[IMPCHEM_HUD] + P.hud_client.images += perp.hud_list[WANTED_HUD] + P.hud_client.images += perp.hud_list[IMPTRACK_HUD] + P.hud_client.images += perp.hud_list[IMPLOYAL_HUD] + P.hud_client.images += perp.hud_list[IMPCHEM_HUD] /proc/process_jani_hud(var/mob/M, var/mob/Alt) var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.jani_hud_users) - for (var/obj/effect/decal/cleanable/dirtyfloor in view(P.Mob)) - P.Client.images += dirtyfloor.hud_overlay + for (var/obj/effect/decal/cleanable/dirtyfloor in view(P.hud_mob)) + if(istype(dirtyfloor, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = dirtyfloor + if(dirt.alpha <= 0) + continue + P.hud_client.images += dirtyfloor.hud_overlay /datum/arranged_hud_process - var/client/Client - var/mob/Mob - var/turf/Turf + var/client/hud_client + var/mob/hud_mob + var/turf/hud_turf /proc/arrange_hud_process(var/mob/M, var/mob/Alt, var/list/hud_list) hud_list |= M var/datum/arranged_hud_process/P = new - P.Client = M.client - P.Mob = Alt ? Alt : M - P.Turf = get_turf(P.Mob) + P.hud_client = M.client + P.hud_mob = Alt ? Alt : M + P.hud_turf = get_turf(P.hud_mob) return P /proc/can_process_hud(var/mob/M) - if(!M) - return 0 - if(!M.client) - return 0 - if(M.stat != CONSCIOUS) - return 0 - return 1 + return M?.client && M.stat == CONSCIOUS //Deletes the current HUD images so they can be refreshed with new ones. /mob/proc/handle_hud_glasses() //Used in the life.dm of mobs that can use HUDs. diff --git a/maps/away/bearcat/bearcat-1.dmm b/maps/away/bearcat/bearcat-1.dmm index 947b876eee6..fa760ad0906 100644 --- a/maps/away/bearcat/bearcat-1.dmm +++ b/maps/away/bearcat/bearcat-1.dmm @@ -145,7 +145,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "aw" = ( @@ -253,11 +253,11 @@ pixel_x = -24; dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "aG" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) @@ -335,7 +335,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "aP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -724,7 +724,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/lower) "bF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -24; @@ -830,7 +830,7 @@ /area/ship/scrap/cargo/lower) "bQ" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/shuttle_control/lift, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) @@ -1111,7 +1111,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "ct" = ( @@ -1283,7 +1283,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "cQ" = ( @@ -1540,16 +1540,16 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "dp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "dq" = ( /obj/machinery/light/small, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "dr" = ( @@ -1561,7 +1561,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "ds" = ( @@ -1957,7 +1957,7 @@ icon_state = "bulb1" }, /obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/deck/second{ pixel_y = 32 }, @@ -1973,7 +1973,7 @@ dir = 8; pixel_x = 22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/usedup, /area/ship/scrap/maintenance/storage) "ej" = ( @@ -1983,7 +1983,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/eva) "ek" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 1; icon_state = "bulb1" @@ -2060,7 +2060,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -2073,7 +2073,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "es" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -2090,7 +2090,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "eu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -2130,7 +2130,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/eva) "ey" = ( @@ -2306,7 +2306,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "eK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -2319,7 +2319,7 @@ /obj/structure/cable{ icon_state = "5-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/usedup, /area/ship/scrap/maintenance/storage) "eM" = ( @@ -2330,14 +2330,14 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/usedup, /area/ship/scrap/maintenance/eva) "eN" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/eva) "eO" = ( diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index c167b8ef9e0..62ededfcaf0 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -587,7 +587,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/dock) "bo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -654,7 +654,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/dock) "bt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, @@ -773,7 +773,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 @@ -912,7 +912,7 @@ /turf/floor/usedup, /area/ship/scrap/dock) "bM" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -1234,7 +1234,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/white/diagonal, /turf/floor/tiled/usedup, /area/ship/scrap/crew/toilets) @@ -1554,7 +1554,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/white/diagonal, /turf/floor/tiled/usedup, /area/ship/scrap/crew/toilets) @@ -1571,7 +1571,7 @@ icon_state = "twindow" }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc/derelict{ dir = 4; @@ -1592,7 +1592,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4; icon_state = "conpipe-c" @@ -1608,7 +1608,7 @@ /turf/wall, /area/ship/scrap/crew/saloon) "dn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -1668,7 +1668,7 @@ dir = 4; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/floor/tiled/usedup, @@ -1824,13 +1824,13 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "dL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/portable_atmospherics/canister/air, /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "dM" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/floor_decal/corner/beige{ dir = 6 @@ -1940,7 +1940,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/crew/hallway/port) "dX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -24; @@ -1954,7 +1954,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "dZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -1973,7 +1973,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "eb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 4; icon_state = "bulb1" @@ -2055,7 +2055,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/crew/kitchen) "ek" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, @@ -2173,7 +2173,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "es" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -2386,7 +2386,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "eJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4; @@ -2418,7 +2418,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "eM" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc/derelict{ dir = 4; @@ -2568,7 +2568,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "fb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/floor_decal/industrial/warning, /obj/machinery/computer/shuttle_control/lift, @@ -2585,7 +2585,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "fd" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/floor_decal/industrial/warning, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -2972,7 +2972,7 @@ /area/ship/scrap/cargo) "fO" = ( /obj/structure/emergency_dispenser/west, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/fuel, @@ -3090,7 +3090,7 @@ dir = 4; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/fuel, @@ -3348,7 +3348,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/fire) "gD" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -3486,7 +3486,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/hallway) "gO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -3756,8 +3756,8 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) "ho" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ pixel_y = 20 }, @@ -3792,7 +3792,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) "hq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -3962,7 +3962,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /obj/structure/cable{ icon_state = "1-8" @@ -3981,7 +3981,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -4140,7 +4140,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) "hU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/yellow{ dir = 10 }, diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index 35999ef09ff..83a7106382f 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -1095,7 +1095,7 @@ pixel_x = -6; pixel_y = 28 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "merchant_ship_vent" }, @@ -5774,7 +5774,7 @@ pixel_x = -28; pixel_y = -10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /obj/structure/cable/blue{ icon_state = "1-4" diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 9876407c368..a31448f055d 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -339,22 +339,22 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/purple{ dir = 5 }, /turf/floor/tiled/white, /area/outpost/abandoned) "bu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/purple{ dir = 5 }, /turf/floor/tiled/white, /area/outpost/abandoned) "bv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 1 }, @@ -377,7 +377,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "by" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "bz" = ( @@ -407,7 +407,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/noticeboard/anomaly{ default_pixel_y = 32 }, @@ -420,22 +420,22 @@ /obj/effect/floor_decal/corner/purple{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bD" = ( /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "bE" = ( /obj/effect/floor_decal/corner/purple{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bF" = ( @@ -459,13 +459,13 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/cigbutt/cigarbutt, /turf/floor, /area/outpost/abandoned) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bK" = ( @@ -473,8 +473,8 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bM" = ( @@ -482,7 +482,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /turf/floor/tiled/white, /area/outpost/abandoned) @@ -497,14 +497,14 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/purple{ dir = 10 }, /turf/floor/tiled/white, /area/outpost/abandoned) "bR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small, /turf/floor, /area/outpost/abandoned) @@ -525,7 +525,7 @@ /obj/effect/floor_decal/corner/purple{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bV" = ( @@ -570,7 +570,7 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cc" = ( @@ -582,7 +582,7 @@ dir = 1; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cd" = ( @@ -590,8 +590,8 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "ce" = ( @@ -604,7 +604,7 @@ /obj/effect/floor_decal/corner/red/three_quarters{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /turf/floor/tiled/dark, /area/outpost/abandoned) @@ -612,7 +612,7 @@ /obj/effect/floor_decal/corner/red{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /turf/floor/tiled/dark, /area/outpost/abandoned) @@ -632,8 +632,8 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "ck" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "cl" = ( @@ -663,12 +663,12 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/broken/three, /area/outpost/abandoned) "co" = ( /obj/structure/table/woodentable, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/floor/wood, /area/outpost/abandoned) @@ -692,7 +692,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood, /area/outpost/abandoned) "ct" = ( @@ -710,13 +710,13 @@ /area/outpost/abandoned) "cv" = ( /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cx" = ( @@ -730,35 +730,35 @@ /turf/wall/titanium, /area/outpost/abandoned) "cG" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall/titanium, /area/outpost/abandoned) "cH" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood, /area/outpost/abandoned) "cI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood, /area/outpost/abandoned) "cJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/broken/four, /area/outpost/abandoned) "cK" = ( /obj/effect/floor_decal/plaque, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood, /area/outpost/abandoned) "cL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/floor/wood/broken, /area/outpost/abandoned) @@ -801,19 +801,19 @@ /area/outpost/abandoned) "cU" = ( /obj/effect/floor_decal/corner/paleblue/three_quarters, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cV" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cX" = ( @@ -821,7 +821,7 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/loot, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -829,12 +829,12 @@ /obj/effect/floor_decal/corner/paleblue/three_quarters{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cZ" = ( /obj/effect/floor_decal/corner/red/three_quarters, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "da" = ( @@ -844,7 +844,7 @@ /obj/effect/floor_decal/corner/red{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "db" = ( @@ -866,7 +866,7 @@ /area/outpost/abandoned) "dd" = ( /obj/structure/barricade, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "de" = ( @@ -889,7 +889,7 @@ /area/outpost/abandoned) "df" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/blast/regular{ id_tag = "mars_blast" }, @@ -899,31 +899,31 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet, /area/outpost/abandoned) "dh" = ( /turf/floor/carpet/broken, /area/outpost/abandoned) "di" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/broken, /area/outpost/abandoned) "dj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet, /area/outpost/abandoned) "dk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/broken, /area/outpost/abandoned) "dl" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet, /area/outpost/abandoned) "dm" = ( @@ -1021,7 +1021,7 @@ /obj/item/shard{ icon_state = "shardlarge" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dF" = ( @@ -1032,7 +1032,7 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dG" = ( @@ -1121,16 +1121,16 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/broken, /area/outpost/abandoned) "dW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dY" = ( @@ -1143,7 +1143,7 @@ dir = 4; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dZ" = ( @@ -1154,18 +1154,18 @@ /turf/wall/titanium, /area/outpost/abandoned) "ea" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/tiled/airless, /area/outpost/abandoned) "eb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/mop, /turf/floor/plating/broken/two, /area/outpost/abandoned) "ec" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -1199,7 +1199,7 @@ /turf/floor/barren, /area/mine/explored) "ej" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "ek" = ( @@ -1244,13 +1244,13 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "es" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "et" = ( @@ -1260,15 +1260,15 @@ dir = 1 }, /obj/item/shard, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "eu" = ( /obj/abstract/landmark/mapped_fluid/fuel, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/bot/medbot, /turf/floor/tiled/white/airless, /area/outpost/abandoned) @@ -1289,13 +1289,13 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "ez" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/broken/one, /area/outpost/abandoned) "eA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/gibspawner/human, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -1322,7 +1322,7 @@ /area/outpost/abandoned) "eF" = ( /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, @@ -1340,7 +1340,7 @@ /turf/floor/plating, /area/outpost/abandoned) "eI" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/airlock/external, /turf/floor/plating, /area/outpost/abandoned) @@ -1348,27 +1348,27 @@ /obj/item/shard{ icon_state = "shardsmall" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "eK" = ( /obj/item/shard{ icon_state = "piecesmall" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "eL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "eM" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "eO" = ( @@ -1381,7 +1381,7 @@ /turf/floor/tiled/white/airless, /area/outpost/abandoned) "eP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/broken/four, /area/outpost/abandoned) "eQ" = ( @@ -1423,15 +1423,15 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, /turf/floor/plating/broken/one, /area/outpost/abandoned) "eW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 @@ -1439,9 +1439,9 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/generic, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 @@ -1449,8 +1449,8 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/wrench, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 @@ -1458,7 +1458,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, @@ -1472,7 +1472,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, @@ -1481,7 +1481,7 @@ /turf/floor/plating/broken/one, /area/outpost/abandoned) "fc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /obj/item/ammo_magazine/pistol/small, /turf/floor/tiled/airless, @@ -1495,25 +1495,25 @@ /turf/floor/tiled/airless, /area/mine/explored) "ff" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, /turf/floor/barren, /area/mine/explored) "fg" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/cee, /turf/floor/plating, /area/outpost/abandoned) "fh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "fi" = ( /obj/item/pen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "fj" = ( @@ -1539,8 +1539,8 @@ /area/outpost/abandoned) "fo" = ( /obj/random/medical, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "fq" = ( @@ -1560,33 +1560,33 @@ /turf/floor/fake_grass, /area/outpost/abandoned) "fs" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/vomit, /turf/floor/tiled/airless, /area/outpost/abandoned) "ft" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/medical, /turf/floor/plating/broken/four, /area/outpost/abandoned) "fu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/mopbucket, /turf/floor/tiled/airless, /area/outpost/abandoned) "fv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/remains, /turf/floor/tiled/airless, /area/outpost/abandoned) "fw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/floor/plating/broken/one, /area/outpost/abandoned) "fx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_magazine/pistol/small, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -1638,8 +1638,8 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "fG" = ( @@ -1647,8 +1647,8 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "fH" = ( @@ -1659,7 +1659,7 @@ /turf/floor/fake_grass, /area/outpost/abandoned) "fJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/window/basic{ dir = 4 }, @@ -1695,7 +1695,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ dir = 4; icon_state = "0-2" @@ -1707,7 +1707,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small/emergency, /obj/structure/cable{ dir = 4; @@ -1720,7 +1720,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/mine/explored) "fS" = ( @@ -1729,7 +1729,7 @@ /turf/floor/tiled/dark, /area/outpost/abandoned) "fT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/firealarm{ dir = 1; icon_state = "firex"; @@ -1783,7 +1783,7 @@ /obj/structure/bed/chair{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "gb" = ( @@ -1791,7 +1791,7 @@ /area/mine/explored) "gc" = ( /obj/item/solar_assembly, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "gd" = ( @@ -1822,17 +1822,17 @@ /turf/floor/plating, /area/outpost/abandoned) "gi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/proc_caller/floor_breaker, /turf/floor/tiled/airless/broken, /area/mine/explored) "gj" = ( /obj/machinery/door/airlock/hatch, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/outpost/abandoned) "gk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/terminal{ dir = 1 }, @@ -1849,7 +1849,7 @@ /turf/floor/plating/broken/two, /area/outpost/abandoned) "gn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 4; icon_state = "warning" @@ -1891,16 +1891,16 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "gt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "gu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/outpost/abandoned) "gv" = ( @@ -1927,7 +1927,7 @@ /turf/floor/plating, /area/outpost/abandoned) "gy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small/emergency{ dir = 8; icon_state = "bulb1" @@ -1966,7 +1966,7 @@ /area/outpost/abandoned) "gE" = ( /obj/effect/decal/cleanable/blood/tracks/footprints, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "gF" = ( @@ -1996,8 +1996,8 @@ /turf/floor/plating, /area/outpost/abandoned) "gK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/orange{ icon_state = "2-8" }, @@ -2012,7 +2012,7 @@ /turf/floor/barren, /area/mine/explored) "gN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/firedoor, /obj/structure/cable/orange{ icon_state = "1-2" @@ -2021,7 +2021,7 @@ /area/outpost/abandoned) "gO" = ( /obj/effect/decal/cleanable/blood/tracks/footprints, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/firedoor_assembly{ anchored = 1 }, @@ -2040,7 +2040,7 @@ /turf/floor/barren, /area/outpost/abandoned) "gR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/orange{ icon_state = "1-2" }, @@ -2210,7 +2210,7 @@ /turf/floor/plating, /area/outpost/abandoned) "hp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/plating, /area/outpost/abandoned) @@ -2311,7 +2311,7 @@ /area/outpost/abandoned) "hD" = ( /obj/random/junk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/plating, /area/outpost/abandoned) @@ -2339,7 +2339,7 @@ /turf/floor/plating, /area/outpost/abandoned) "hL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/overmap/visitable/sector/away, /turf/floor/tiled/white, /area/outpost/abandoned) @@ -2382,7 +2382,7 @@ /obj/effect/floor_decal/corner/red{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/dark, @@ -2392,9 +2392,9 @@ dir = 4 }, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /turf/floor/tiled/dark, /area/outpost/abandoned) @@ -2429,10 +2429,10 @@ dir = 4 }, /obj/effect/decal/cleanable/vomit, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "wb" = ( @@ -2454,7 +2454,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small/emergency{ dir = 4; icon_state = "bulb1" @@ -2462,8 +2462,8 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "HD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "IX" = ( diff --git a/maps/away/slavers/slavers_base.dmm b/maps/away/slavers/slavers_base.dmm index f9648ba2863..c91c5aa8e39 100644 --- a/maps/away/slavers/slavers_base.dmm +++ b/maps/away/slavers/slavers_base.dmm @@ -220,7 +220,7 @@ /turf/floor/plating/airless, /area/slavers_base/cells) "aT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /obj/structure/cable{ icon_state = "1-2" @@ -230,7 +230,7 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "aU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/cells) "aV" = ( @@ -262,7 +262,7 @@ /turf/floor/plating/airless, /area/slavers_base/cells) "bb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -332,7 +332,7 @@ /turf/floor/plating/airless, /area/slavers_base/cells) "bm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -345,7 +345,7 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "bn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -361,7 +361,7 @@ /obj/machinery/door/airlock{ name = "Cell block B" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -377,7 +377,7 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "bp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, @@ -396,14 +396,14 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "bq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "4-8" }, /turf/floor/tiled/airless, /area/slavers_base/cells) "br" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "2-8" }, @@ -420,14 +420,14 @@ id_tag = "permentryflash"; name = "Floor mounted flash" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "4-8" }, /turf/floor/tiled/airless, /area/slavers_base/cells) "bt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "2-8" }, @@ -453,7 +453,7 @@ /turf/floor/plating/airless, /area/slavers_base/cells) "bx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "1-2" }, @@ -466,7 +466,7 @@ /area/slavers_base/powatm) "bz" = ( /obj/structure/closet/crate/plastic/rations, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -477,14 +477,14 @@ /area/slavers_base/cells) "bA" = ( /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "1-2" }, /turf/floor/tiled/airless, /area/slavers_base/cells) "bB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/remains/human, /turf/floor/tiled/airless, /area/slavers_base/cells) @@ -492,7 +492,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "1-2" }, @@ -507,7 +507,7 @@ /turf/floor/plating/airless, /area/slavers_base/cells) "bF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable{ @@ -589,11 +589,11 @@ dir = 8; icon_state = "tube1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/cells) "bS" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "1-4" }, @@ -603,7 +603,7 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "bT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "4-8" }, @@ -623,7 +623,7 @@ /area/slavers_base/cells) "bV" = ( /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "4-8" }, @@ -640,7 +640,7 @@ id_tag = "permentryflash"; name = "Floor mounted flash" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/shotgun/beanbag{ pixel_x = -8; pixel_y = -4 @@ -666,7 +666,7 @@ /obj/machinery/door/airlock{ name = "Dens block" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -679,7 +679,7 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "bY" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /obj/structure/cable{ icon_state = "1-2" @@ -697,7 +697,7 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "bZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /obj/structure/cable/cyan{ icon_state = "1-2" @@ -729,7 +729,7 @@ /turf/floor/plating/airless, /area/slavers_base/cells) "cc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -787,7 +787,7 @@ /turf/floor/plating/airless, /area/slavers_base/cells) "cl" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -800,7 +800,7 @@ /turf/wall, /area/slavers_base/hangar) "cn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/shotgun/beanbag, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -820,7 +820,7 @@ /obj/machinery/door/airlock{ name = "Cell block A" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -836,7 +836,7 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "cp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, @@ -855,7 +855,7 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "cq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "4-8" }, @@ -868,7 +868,7 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "cr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/cyan{ icon_state = "1-8" }, @@ -897,7 +897,7 @@ /turf/floor/plating/airless, /area/slavers_base/cells) "cw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/shotgun/beanbag, /obj/structure/cable{ icon_state = "1-2" @@ -916,7 +916,7 @@ /turf/floor/plating/airless, /area/slavers_base/cells) "cz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/structure/cable{ icon_state = "0-2" @@ -929,7 +929,7 @@ /turf/floor/tiled/airless, /area/slavers_base/cells) "cA" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "0-8" }, @@ -1044,7 +1044,7 @@ /turf/wall, /area/slavers_base/secwing) "cT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -1056,7 +1056,7 @@ /turf/floor/tiled/airless, /area/slavers_base/hallway) "cU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/airlock{ name = "Slave hold hallway" }, @@ -1193,7 +1193,7 @@ /turf/floor/tiled/airless, /area/slavers_base/secwing) "ds" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, @@ -1209,7 +1209,7 @@ /turf/floor/tiled/airless, /area/slavers_base/hallway) "dt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1256,7 +1256,7 @@ /turf/floor/tiled/airless, /area/slavers_base/med) "dw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "0-8" }, @@ -1268,18 +1268,18 @@ /turf/floor/tiled/airless, /area/slavers_base/med) "dx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/med) "dy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light{ dir = 1 }, /turf/floor/tiled/airless, /area/slavers_base/med) "dz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/hygiene/shower{ pixel_y = 30 }, @@ -1401,41 +1401,41 @@ /turf/floor/tiled/airless, /area/slavers_base/secwing) "dT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/shotgun/beanbag, /obj/structure/cable{ icon_state = "1-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, /turf/floor/tiled/airless, /area/slavers_base/hallway) "dU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, /turf/floor/tiled/airless, /area/slavers_base/hallway) "dV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, /turf/floor/tiled/airless, /area/slavers_base/med) "dW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/junk, /turf/floor/tiled/airless, /area/slavers_base/med) "dX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/medical/lite, /turf/floor/tiled/airless, /area/slavers_base/med) @@ -1545,12 +1545,12 @@ "er" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "es" = ( /obj/item/ammo_casing/shotgun/beanbag, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "et" = ( @@ -1564,7 +1564,7 @@ /obj/structure/window/basic{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/corpse/slavers_base/slaver5, /obj/effect/decal/cleanable/blood, /turf/floor/tiled/airless, @@ -1579,11 +1579,11 @@ /obj/structure/window/basic{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/med) "ex" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/shotgun/beanbag, /turf/floor/tiled/airless, /area/slavers_base/med) @@ -1738,7 +1738,7 @@ /area/slavers_base/secwing) "eT" = ( /obj/item/gun/projectile/shotgun/pump, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "eU" = ( @@ -1882,7 +1882,7 @@ /turf/floor/tiled/airless, /area/slavers_base/secwing) "fo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fp" = ( @@ -1932,7 +1932,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless, /area/slavers_base/hallway) "fu" = ( @@ -1948,7 +1948,7 @@ /obj/structure/cable/green{ icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fv" = ( @@ -1961,7 +1961,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fw" = ( @@ -1977,7 +1977,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fx" = ( @@ -1986,8 +1986,8 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fy" = ( @@ -2000,7 +2000,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fz" = ( @@ -2138,7 +2138,7 @@ /obj/machinery/door/airlock{ name = "Power/atmos" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless, /area/slavers_base/hallway) "fS" = ( @@ -2147,31 +2147,31 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fT" = ( /obj/item/wrench, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fU" = ( /obj/machinery/light, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fV" = ( /obj/machinery/door/airlock{ name = "West hallway" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "fX" = ( @@ -2408,11 +2408,11 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "gG" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -2588,7 +2588,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "hc" = ( @@ -2947,7 +2947,7 @@ /turf/floor/tiled, /area/slavers_base/dorms) "id" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/generic, /turf/floor/tiled/airless, /area/slavers_base/hallway) @@ -3106,7 +3106,7 @@ /area/slavers_base/dorms) "iG" = ( /obj/random/junk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "iH" = ( @@ -3121,19 +3121,19 @@ /turf/floor/plating/airless, /area/slavers_base/maint) "iI" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/demo) "iJ" = ( /obj/machinery/light{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/demo) "iK" = ( /obj/item/clothing/suit/nun, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/demo) "iL" = ( @@ -3141,7 +3141,7 @@ dir = 1 }, /obj/item/clothing/suit/robe/yellowed, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/demo) "iM" = ( @@ -3281,7 +3281,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -3289,13 +3289,13 @@ /area/slavers_base/demo) "ja" = ( /obj/item/clothing/shoes/color/brown, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/demo) "jb" = ( /obj/item/clothing/pants/pj/blue, /obj/item/clothing/shirt/pj/blue, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/demo) "jc" = ( @@ -3405,7 +3405,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/apc{ dir = 8; name = "west bump"; @@ -3417,7 +3417,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "jv" = ( @@ -3487,11 +3487,11 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/slavers_base/hallway) "jH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -3892,7 +3892,7 @@ /turf/floor/tiled/white, /area/slavers_base/dorms) "nm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/floor/tiled/airless, /area/slavers_base/demo) diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index 808d13e1443..12cf197b3ee 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -204,7 +204,7 @@ /turf/floor, /area/smugglers/base) "aF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 }, @@ -367,7 +367,7 @@ /turf/floor, /area/smugglers/base) "aW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/smugglers/base) "aX" = ( @@ -607,7 +607,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/office) "bD" = ( @@ -661,7 +661,7 @@ /turf/floor, /area/smugglers/base) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/office) "bK" = ( @@ -777,8 +777,8 @@ /turf/wall, /area/smugglers/dorms) "cd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -788,7 +788,7 @@ /obj/structure/noticeboard{ default_pixel_y = 30 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /obj/machinery/microwave{ pixel_y = 10 @@ -796,7 +796,7 @@ /turf/floor/tiled, /area/smugglers/dorms) "cf" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/crate, /obj/random/snack, /obj/random/snack, @@ -806,21 +806,21 @@ /turf/floor/tiled, /area/smugglers/dorms) "cg" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/crate, /obj/random/drinkbottle, /obj/random/drinkbottle, /turf/floor/tiled, /area/smugglers/dorms) "ch" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/arcade, /turf/floor/tiled, /area/smugglers/dorms) "ci" = ( /obj/structure/closet/crate/plastic/rations, /obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cj" = ( @@ -828,8 +828,8 @@ /turf/floor/plating/airless, /area/smugglers/dorms) "cl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc{ dir = 8; @@ -839,12 +839,12 @@ /turf/floor/tiled, /area/smugglers/dorms) "cm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "co" = ( @@ -874,7 +874,7 @@ /area/smugglers/dorms) "cs" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/paper/smug_3, /obj/item/flame/fuelled/lighter, /obj/random/coin, @@ -882,7 +882,7 @@ /area/smugglers/dorms) "ct" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/cash/c10, /obj/random/smokes, /obj/random/snack, @@ -897,7 +897,7 @@ /area/smugglers/dorms) "cv" = ( /obj/structure/closet, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/medical, /obj/random/medical, /obj/random/tech_supply, @@ -910,29 +910,29 @@ /area/smugglers/dorms) "cx" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cy" = ( /obj/structure/closet/smuggler, /obj/random/suit, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cz" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/hostile/malf_drone, /turf/floor/tiled, /area/smugglers/dorms) "cA" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/floor/tiled, /area/smugglers/dorms) "cB" = ( /obj/machinery/light/small, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cC" = ( diff --git a/maps/away/yacht/yacht.dmm b/maps/away/yacht/yacht.dmm index 3e56a19c9e6..1d699946793 100644 --- a/maps/away/yacht/yacht.dmm +++ b/maps/away/yacht/yacht.dmm @@ -15,7 +15,7 @@ /turf/floor/tiled/airless/broken, /area/yacht/bridge) "ae" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/walnut, /area/yacht/bridge) "af" = ( @@ -30,7 +30,7 @@ /turf/wall/titanium, /area/yacht/bridge) "ai" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/ship/helm, /turf/floor/wood/walnut, /area/yacht/bridge) @@ -43,8 +43,8 @@ "ak" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/structure/bed/chair/comfy/captain, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/walnut, /area/yacht/bridge) "al" = ( @@ -60,7 +60,7 @@ /obj/item/chems/drinks/glass2/coffeecup, /obj/item/newspaper, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/energy, /obj/item/paper{ info = "I used up all of my energy. I am hopelessly lost. This ship has become my grave. They did it. The intelligence agency that no one ever talks about. Sol Gov wanted their revenge, and they got it. They easily could have killed me on my ship, or tortured me, but they knew that floating here through space would be the worst possible torture. " @@ -70,19 +70,19 @@ "an" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/hostile/giant_spider/hunter, /turf/floor/wood/walnut, /area/yacht/bridge) "ao" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/maintenance/clean, /turf/floor/wood/walnut, /area/yacht/bridge) "ap" = ( /obj/structure/filing_cabinet/chestdrawer, /obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/walnut, /area/yacht/bridge) "aq" = ( @@ -94,7 +94,7 @@ /obj/item/rig/medical/equipped, /obj/item/gun/energy/captain, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/walnut, /area/yacht/bridge) "ar" = ( @@ -102,7 +102,7 @@ dir = 1; pixel_y = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/walnut, /area/yacht/bridge) "as" = ( @@ -111,7 +111,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/walnut, /area/yacht/bridge) "at" = ( @@ -122,7 +122,7 @@ name = "Yacht bridge"; pixel_y = -24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/walnut, /area/yacht/bridge) "au" = ( @@ -131,7 +131,7 @@ icon_state = "tube1" }, /obj/structure/reagent_dispensers/water_cooler, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/walnut, /area/yacht/bridge) "av" = ( @@ -179,7 +179,7 @@ /obj/structure/hygiene/shower{ pixel_y = 20 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "aE" = ( @@ -188,14 +188,14 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "aF" = ( /obj/structure/bed/chair/wood/wings{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "aG" = ( @@ -205,7 +205,7 @@ /obj/structure/table/marble, /obj/item/trash/snack_bowl, /obj/machinery/reagentgrinder/juicer, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/paper{ info = "Tonight I woke up to a sound I hoped to have never heard, a small explosion. I rushed to the bridge to diagnose the damage and saw the worst possible news. My solar tracker is gone, and so is the fucking computer. No way to override the settings now, because the assholes EMPd the computer. No way to charge my SMES reliably, and no way to heat the fuel. I am stuck in the water! Unheated, this gas will not be enough to get absolutely anywhere near a port. This is bad. Real bad. The current charge on SMES is 20 percent, so I'll just try and orient the ship to hit the current star at maximum efficiency so we will charge at 100, and maybe make it to the next solar system. The next port is in the orbit of a Gas giant named Duma. Maybe I can dock there and repair my array. I freaking knew I needed to get a generator. I spent all of the money the Terrans gave me, and this piece of shit is all I could get. " }, @@ -220,14 +220,14 @@ /area/yacht/living) "aI" = ( /obj/item/towel/random, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "aJ" = ( /obj/structure/hygiene/toilet{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "aK" = ( @@ -239,22 +239,22 @@ /obj/machinery/light{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "aL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "aM" = ( /obj/structure/table/marble, /obj/item/pizzabox/vegetable, /obj/item/chems/glass/rag, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "aN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/junk, /turf/floor/wood/yew, /area/yacht/living) @@ -270,18 +270,18 @@ /obj/structure/table/marble, /obj/item/deck/cards, /obj/item/dice, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "aR" = ( /obj/effect/decal/cleanable/blood/gibs/robot/up, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "aS" = ( /obj/structure/table/marble, /obj/machinery/microwave, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "aT" = ( @@ -327,7 +327,7 @@ }, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "aY" = ( @@ -337,7 +337,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "aZ" = ( @@ -350,7 +350,7 @@ /obj/structure/table/marble, /obj/item/book/manual/chef_recipes, /obj/item/chems/drinks/pitcher, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/drinkbottle, /turf/floor/wood/yew, /area/yacht/living) @@ -360,7 +360,7 @@ }, /obj/effect/decal/cleanable/blood/gibs/robot/down, /obj/effect/decal/cleanable/blood/gibs/robot/up, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bb" = ( @@ -369,7 +369,7 @@ icon_state = "tube1" }, /obj/machinery/vending/dinnerware, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bc" = ( @@ -384,12 +384,12 @@ /area/yacht/living) "bf" = ( /obj/effect/decal/cleanable/blood/gibs/robot/limb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bg" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bh" = ( @@ -399,7 +399,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bk" = ( @@ -419,7 +419,7 @@ /area/yacht/living) "bn" = ( /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "bo" = ( @@ -427,7 +427,7 @@ /turf/floor/tiled/freezer, /area/yacht/living) "bp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/paper{ info = "I have accepted my fate. I will go into EVA with one of the cyanide pills in my mouth, and I will float off. I want a military funeral, and I will arrange it myself. Good bye all. I have earned and sealed my fate. " }, @@ -454,7 +454,7 @@ dir = 4; icon_state = "tube1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bu" = ( @@ -478,7 +478,7 @@ /turf/floor/rock/sand/water, /area/yacht/living) "bz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "bA" = ( @@ -492,7 +492,7 @@ dir = 8 }, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bB" = ( @@ -503,7 +503,7 @@ dir = 4 }, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bC" = ( @@ -556,7 +556,7 @@ "bI" = ( /obj/machinery/light, /obj/item/clothing/shoes/swimmingfins, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "bJ" = ( @@ -566,12 +566,12 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/blood/gibs/robot/limb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bK" = ( /obj/effect/decal/cleanable/blood/gibs/robot/down, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/floodlight, /turf/floor/wood/yew, /area/yacht/living) @@ -609,24 +609,24 @@ /area/yacht/engine) "bR" = ( /obj/machinery/atmospherics/unary/tank/air, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "bS" = ( /obj/structure/tank_rack/oxygen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "bT" = ( /obj/item/cell/hyper, /obj/item/book/manual/engineering_guide, /obj/item/rcd, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/ship/engines, /turf/floor/plating, /area/yacht/engine) "bU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/smes/buildable, /obj/structure/cable{ icon_state = "0-4" @@ -645,40 +645,40 @@ name = "Yacht engine"; pixel_y = 24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "bW" = ( /obj/item/chems/spray/extinguisher, /obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bX" = ( /obj/machinery/vending/hydronutrients, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bY" = ( /obj/machinery/seed_storage/garden, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "bZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/supply, /turf/floor/plating, /area/yacht/engine) "ca" = ( /obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cb" = ( /obj/machinery/atmospherics/binary/pump, /obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cc" = ( @@ -691,14 +691,14 @@ /area/yacht/engine) "cd" = ( /obj/structure/closet/crate/hydroponics, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "ce" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stock_parts/circuitboard/broken, /turf/floor/plating, /area/yacht/engine) @@ -728,7 +728,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cj" = ( @@ -739,19 +739,19 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "ck" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cl" = ( /obj/structure/janitorialcart, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cm" = ( @@ -762,21 +762,21 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "co" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/cyan{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/powered/pump, /turf/floor/plating, /area/yacht/engine) @@ -843,7 +843,7 @@ /turf/floor/plating/airless, /area/yacht/engine) "cu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -857,22 +857,22 @@ pixel_x = -24 }, /obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cE" = ( /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cF" = ( /obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cG" = ( @@ -880,7 +880,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cJ" = ( @@ -904,12 +904,12 @@ /area/yacht/engine) "cN" = ( /obj/structure/closet/toolcloset, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cQ" = ( @@ -921,7 +921,7 @@ pixel_x = -23 }, /obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cR" = ( @@ -931,32 +931,32 @@ }, /obj/item/tool/spade, /obj/item/chems/glass/bucket, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cS" = ( /obj/machinery/light, /obj/structure/reagent_dispensers/beerkeg, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cW" = ( /obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "cY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cZ" = ( @@ -966,7 +966,7 @@ "da" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/item/caution/cone, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "db" = ( @@ -975,12 +975,12 @@ /area/yacht/engine) "dc" = ( /obj/structure/closet/wardrobe/pjs, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "dd" = ( /obj/structure/closet/wardrobe/suit, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) "df" = ( @@ -989,7 +989,7 @@ /area/yacht/engine) "dg" = ( /obj/structure/closet/crate/plastic/rations, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dh" = ( @@ -997,7 +997,7 @@ dir = 1; level = 2 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "di" = ( @@ -1010,11 +1010,11 @@ /area/yacht/engine) "dk" = ( /obj/machinery/atmospherics/unary/heater, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1; level = 2 @@ -1025,7 +1025,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "do" = ( @@ -1034,7 +1034,7 @@ dir = 4; pixel_y = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/meter, /turf/floor/plating, /area/yacht/engine) @@ -1080,7 +1080,7 @@ /area/yacht/engine) "dt" = ( /obj/machinery/atmospherics/pipe/manifold4w/visible/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/meter, /obj/machinery/light/small{ dir = 8 @@ -1088,7 +1088,7 @@ /turf/floor/plating, /area/yacht/engine) "du" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 10 }, @@ -1096,21 +1096,21 @@ /area/yacht/engine) "dv" = ( /obj/machinery/atmospherics/pipe/simple/visible/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dw" = ( /obj/machinery/atmospherics/unary/heater{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dx" = ( /turf/floor/reinforced/carbon_dioxide, /area/yacht/engine) "dy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/black, /turf/floor/plating, /area/yacht/engine) @@ -1119,7 +1119,7 @@ dir = 8 }, /obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dA" = ( @@ -1127,7 +1127,7 @@ dir = 10 }, /obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/recharge_station, /turf/floor/plating, /area/yacht/engine) @@ -1188,7 +1188,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/constructable_frame/computerframe, /obj/machinery/button/access/interior{ id_tag = "yacht_airlock"; @@ -1205,7 +1205,7 @@ icon_state = "0-2" }, /obj/item/toolbox/electrical, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1218,7 +1218,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 }, @@ -1228,7 +1228,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/airlock/external/bolted{ id_tag = "yacht_outer" }, @@ -1238,7 +1238,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ id_tag = "yacht_airlock"; pixel_y = 24; @@ -1262,7 +1262,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -1278,7 +1278,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 1 }, @@ -1288,7 +1288,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump{ dir = 8 }, @@ -1298,8 +1298,8 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/universal{ dir = 4 }, @@ -1311,7 +1311,7 @@ dir = 8; pixel_x = 24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, @@ -1324,7 +1324,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "rb" = ( @@ -1334,7 +1334,7 @@ /turf/floor/plating, /area/yacht/engine) "sb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, @@ -1342,7 +1342,7 @@ /area/yacht/engine) "tb" = ( /obj/structure/closet/firecloset, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, @@ -1350,14 +1350,14 @@ /area/yacht/engine) "ub" = ( /obj/structure/closet/secure_closet/freezer/meat, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "vb" = ( /obj/machinery/atmospherics/portables_connector{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/floor/plating, /area/yacht/engine) @@ -1369,7 +1369,7 @@ pixel_y = 20 }, /obj/item/bikehorn/rubberducky, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/soap, /turf/floor/tiled/freezer, /area/yacht/living) @@ -1378,7 +1378,7 @@ /area/yacht/living) "Hj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -1386,8 +1386,8 @@ /area/yacht/engine) "Ty" = ( /obj/structure/closet/secure_closet/freezer/meat, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/yew, /area/yacht/living) diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 1b0190807cf..480196711f2 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -63651,7 +63651,7 @@ /obj/machinery/conveyor_switch{ id_tag = "cargo_mining_conveyor" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/miningdock) @@ -64224,7 +64224,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/starboard) "nIv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -65001,7 +65001,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/central_two) "xpO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/fabricator/industrial, /obj/item/stack/material/ingot/mapped/osmium/ten, /obj/effect/floor_decal/industrial/outline/yellow, diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index c715e45dc03..64dc3698f28 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -455,7 +455,7 @@ /turf/floor/plating/airless, /area/space) "cl" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/loading{ dir = 8 }, @@ -469,7 +469,7 @@ /turf/floor/plating/airless, /area/space) "cp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-4" }, @@ -815,7 +815,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/cargo) "dF" = ( @@ -944,7 +944,7 @@ /turf/floor/tiled, /area/ministation/janitor) "ej" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/cargo) "ek" = ( @@ -1103,7 +1103,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/junction, /obj/structure/cable{ icon_state = "2-8" @@ -1267,7 +1267,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/tiled, /area/ministation/cargo) @@ -1319,7 +1319,7 @@ /turf/floor/plating, /area/ministation/engine) "ft" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/hologram/holopad, /obj/item/radio/intercom/locked{ dir = 4; @@ -1506,7 +1506,7 @@ /turf/floor/plating, /area/ministation/ai_sat) "fW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden, /turf/floor/tiled, /area/ministation/engine) @@ -1592,7 +1592,7 @@ /turf/floor/tiled, /area/ministation/cargo) "gk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 @@ -1601,7 +1601,7 @@ /area/ministation/cargo) "gl" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -1903,7 +1903,7 @@ /turf/floor/tiled, /area/ministation/cargo) "hq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1936,7 +1936,7 @@ dir = 1; pixel_y = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -2059,7 +2059,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -2229,7 +2229,7 @@ /area/ministation/dorms) "iU" = ( /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump/on{ target_pressure = 200; dir = 8 @@ -2569,7 +2569,7 @@ /turf/floor/tiled/techfloor, /area/ministation/atmospherics) "kw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -2634,7 +2634,7 @@ /obj/structure/window/reinforced/tinted{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/start{ name = "Deck Hand" }, @@ -2747,7 +2747,7 @@ /turf/floor/tiled, /area/ministation/hall/n) "ln" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /turf/floor/tiled, /area/ministation/engine) @@ -2767,7 +2767,7 @@ /turf/floor/tiled, /area/ministation/cargo) "lr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -3183,7 +3183,7 @@ dir = 1 }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random_multi/single_item/captains_spare_id, /obj/structure/window/reinforced/tinted{ dir = 8 @@ -3718,7 +3718,7 @@ /turf/floor/wood/walnut, /area/ministation/dorms) "qo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -4861,7 +4861,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/eastatmos) "vz" = ( @@ -4926,7 +4926,7 @@ /area/ministation/engine) "vK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/bed/chair/wood{ dir = 8 }, @@ -5060,7 +5060,7 @@ /turf/floor/plating, /area/ministation/maint/l1ne) "wt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood, /area/ministation/engine) "wu" = ( @@ -5252,7 +5252,7 @@ /turf/floor/plating, /area/ministation/maint/l1central) "xr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/department/eva{ pixel_y = 30 }, @@ -5275,7 +5275,7 @@ /turf/floor/plating, /area/ministation/maint/westatmos) "xE" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, @@ -6722,7 +6722,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-8" }, @@ -7037,7 +7037,7 @@ /turf/floor/tiled, /area/ministation/hall/s1) "Eg" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, @@ -7095,7 +7095,7 @@ /turf/floor/tiled, /area/ministation/engine) "En" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Eo" = ( @@ -7243,7 +7243,7 @@ /area/ministation/engine) "EK" = ( /obj/effect/decal/cleanable/blood/oil, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, @@ -7343,7 +7343,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 2; icon_state = "pipe-c" @@ -7432,7 +7432,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/opossum/poppy, /obj/item/stool/padded, /obj/abstract/landmark/start{ @@ -7491,7 +7491,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood, /area/ministation/engine) "Fn" = ( @@ -7935,7 +7935,7 @@ /area/ministation/trash) "Ge" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/tiled, /area/ministation/engine) @@ -8088,7 +8088,7 @@ /area/ministation/engine) "Gy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Gz" = ( @@ -8339,7 +8339,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Hd" = ( @@ -8383,7 +8383,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Hj" = ( @@ -8511,7 +8511,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light{ dir = 1 }, @@ -8526,7 +8526,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-4" }, @@ -8567,7 +8567,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "HD" = ( @@ -8848,7 +8848,7 @@ /turf/floor/plating, /area/ministation/ai_sat) "Iq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-8" }, @@ -10506,7 +10506,7 @@ pixel_x = -32; pixel_y = -32 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, @@ -11145,7 +11145,7 @@ /turf/floor, /area/ministation/maint/eastatmos) "OY" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/n) @@ -11185,7 +11185,7 @@ /turf/floor/plating, /area/ministation/ai_upload) "Pe" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/tiled, /area/ministation/cargo) @@ -11246,7 +11246,7 @@ /turf/space, /area/ministation/supply_dock) "Pq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /obj/item/megaphone, /obj/item/box, @@ -11561,7 +11561,7 @@ /area/ministation/smcontrol) "QG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s1) "QH" = ( @@ -11776,7 +11776,7 @@ /turf/floor/plating/airless, /area/ministation/mining) "Rr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s1) "Rs" = ( @@ -11790,7 +11790,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s1) "Ru" = ( @@ -12020,7 +12020,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -12039,7 +12039,7 @@ /area/ministation/atmospherics) "So" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n) "Sp" = ( @@ -12062,7 +12062,7 @@ /turf/floor, /area/ministation/maint/eastatmos) "Ss" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -12106,7 +12106,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 10 }, @@ -12197,7 +12197,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -12497,7 +12497,7 @@ /turf/floor/tiled, /area/ministation/engine) "TP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -12609,7 +12609,7 @@ /turf/floor/tiled, /area/ministation/engine) "Ul" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -12745,7 +12745,7 @@ /turf/floor/tiled, /area/ministation/engine) "UT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump/on{ target_pressure = 200; dir = 1 @@ -12927,7 +12927,7 @@ /turf/floor/plating, /area/ministation/supermatter) "VF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/s1) @@ -13117,7 +13117,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/eastatmos) "Wn" = ( @@ -13261,7 +13261,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -13274,7 +13274,7 @@ /turf/space, /area/space) "Xb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, @@ -13344,7 +13344,7 @@ dir = 1 }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -13384,7 +13384,7 @@ /turf/floor/plating, /area/ministation/mining) "Xx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n) "Xz" = ( @@ -13581,7 +13581,7 @@ /turf/floor/plating, /area/ministation/engine) "Yu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-8" }, @@ -14017,7 +14017,7 @@ /area/ministation/engine) "ZR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/s1) diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index ce6e50124ac..770583a5752 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -242,7 +242,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/passive/mouse/brown/Tom, /turf/floor/lino, /area/ministation/cafe) @@ -329,7 +329,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped{ dir = 1 }, @@ -434,7 +434,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l2centrals) "cq" = ( @@ -611,7 +611,7 @@ /area/ministation/hall/w2) "dn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/hygiene/drain, /turf/floor/tiled/stone, /area/ministation/hall/e2) @@ -895,7 +895,7 @@ /turf/floor/plating, /area/ministation/maint/l2centrals) "ey" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 @@ -999,7 +999,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "fm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/borderfloorblack{ dir = 8 }, @@ -1673,7 +1673,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "in" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -1715,7 +1715,7 @@ dir = 4; pixel_x = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, @@ -2453,7 +2453,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "lN" = ( @@ -3052,7 +3052,7 @@ /turf/floor/plating/airless, /area/space) "ps" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall, /area/ministation/hall/w2) "pu" = ( @@ -3678,7 +3678,7 @@ /turf/floor/tiled, /area/ministation/hop) "rE" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -3910,7 +3910,7 @@ /area/ministation/medical) "ss" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "st" = ( @@ -4291,7 +4291,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/e2) "tE" = ( @@ -4383,7 +4383,7 @@ dir = 4; pixel_x = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/cooker/fryer, /turf/floor/lino, /area/ministation/cafe) @@ -4473,7 +4473,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "ub" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -4497,7 +4497,7 @@ /area/ministation/hall/w2) "ud" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/ss13/l6, /turf/floor/tiled, /area/ministation/hall/w2) @@ -4562,7 +4562,7 @@ /area/ministation/hall/e2) "uq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/stone, /area/ministation/hall/e2) "us" = ( @@ -4628,7 +4628,7 @@ /area/ministation/hall/w2) "uD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "uG" = ( @@ -4900,7 +4900,7 @@ /area/ministation/cafe) "vw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/corner/paleblue/diagonal, /turf/floor/tiled/dark, @@ -5006,7 +5006,7 @@ /turf/floor/tiled/dark, /area/ministation/medical) "vO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning, /obj/machinery/light{ dir = 8 @@ -5093,7 +5093,7 @@ /turf/space, /area/space) "wk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/paleblue/diagonal, /turf/floor/tiled/dark, /area/ministation/cafe) @@ -5234,7 +5234,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "wD" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/e2) "wE" = ( @@ -5488,7 +5488,7 @@ /turf/floor/tiled, /area/ministation/hydro) "xy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/green/half{ dir = 1 }, @@ -5597,7 +5597,7 @@ /area/ministation/security) "xQ" = ( /obj/item/stool/padded, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/paleblue/diagonal, /turf/floor/tiled/dark, /area/ministation/cafe) @@ -5793,7 +5793,7 @@ /turf/floor/tiled/dark, /area/ministation/cafe) "yw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -5807,7 +5807,7 @@ /obj/machinery/camera/autoname{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, @@ -6132,7 +6132,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/lino, /area/ministation/cafe) "zF" = ( @@ -6173,7 +6173,7 @@ /turf/floor/lino, /area/ministation/cafe) "zK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/floor/lino, @@ -6244,7 +6244,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "Ae" = ( @@ -6446,7 +6446,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/stone, /area/ministation/hall/e2) "AJ" = ( @@ -6473,7 +6473,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "AK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 10 }, @@ -6776,7 +6776,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "CL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7274,7 +7274,7 @@ /turf/floor/tiled, /area/ministation/hydro) "FJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7411,7 +7411,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/borderfloorblack{ dir = 8 }, @@ -7476,7 +7476,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "GZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "Hd" = ( @@ -7489,7 +7489,7 @@ /obj/effect/floor_decal/industrial/firstaid{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/ministation/hall/e2) "Hn" = ( @@ -7800,7 +7800,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "IX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7903,7 +7903,7 @@ /area/ministation/hall/e2) "Jz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped, /obj/effect/floor_decal/borderfloorblack/corner{ dir = 4 @@ -7929,7 +7929,7 @@ /turf/floor/tiled, /area/ministation/hall/e2) "JJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/universal{ dir = 4 }, @@ -8530,7 +8530,7 @@ /turf/floor/fake_grass, /area/ministation/hall/e2) "Nh" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/effect/floor_decal/industrial/warning/corner{ dir = 4; @@ -8961,7 +8961,7 @@ "Ps" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ministation/cafe) "Pw" = ( @@ -9259,7 +9259,7 @@ /area/ministation/hall/w2) "QO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/lino, /area/ministation/cafe) "QP" = ( @@ -9329,7 +9329,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/lino, /area/ministation/cafe) "Rx" = ( @@ -9471,7 +9471,7 @@ /turf/floor/plating, /area/ministation/arrival) "Sy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /obj/effect/floor_decal/industrial/warning{ dir = 1; @@ -9520,7 +9520,7 @@ /turf/floor/plating, /area/ministation/arrival) "SF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/floor_decal/ss13/l4, /turf/floor/tiled, @@ -9623,7 +9623,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "To" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/corner/paleblue/diagonal, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -9775,7 +9775,7 @@ /turf/floor/tiled/dark, /area/ministation/cafe) "Ug" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped, /obj/structure/cable{ icon_state = "4-8" @@ -10239,7 +10239,7 @@ /turf/floor/plating, /area/ministation/arrival) "WC" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -10446,7 +10446,7 @@ /turf/floor/tiled/white, /area/ministation/detective) "XK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/ss13/l14, /turf/floor/tiled, /area/ministation/hall/w2) @@ -10515,7 +10515,7 @@ pixel_x = 32; pixel_y = 32 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index 12a062972d2..89d145de056 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -791,7 +791,7 @@ /area/ministation/science) "cJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/n3) @@ -1123,7 +1123,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n3) "et" = ( @@ -1363,7 +1363,7 @@ /turf/floor/tiled/white, /area/ministation/science) "fi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 4 }, @@ -1628,7 +1628,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/n3) @@ -3062,7 +3062,7 @@ /turf/floor/plating, /area/ministation/hall/s3) "nL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/network/relay{ initial_network_id = "molluscnet" }, @@ -3207,7 +3207,7 @@ /turf/floor/tiled/white, /area/ministation/science) "oN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s3) "oP" = ( @@ -3226,7 +3226,7 @@ /turf/floor/wood/mahogany, /area/ministation/library) "oR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3263,7 +3263,7 @@ /turf/floor/tiled, /area/ministation/bridge) "pi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -3509,7 +3509,7 @@ /turf/space, /area/space) "sh" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3998,7 +3998,7 @@ /turf/floor/tiled/white, /area/ministation/science) "vJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/apc{ dir = 1; name = "_North APC"; @@ -4151,7 +4151,7 @@ /turf/floor/lino, /area/ministation/telecomms) "xr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -4168,7 +4168,7 @@ /area/ministation/library) "xH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -4374,7 +4374,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -4539,7 +4539,7 @@ /turf/floor/wood/mahogany, /area/ministation/library) "AH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall, /area/ministation/hall/n3) "AK" = ( @@ -4651,7 +4651,7 @@ /turf/floor/plating, /area/ministation/maint/l3central) "Bk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -4972,7 +4972,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/plating, /area/ministation/maint/l3sw) @@ -5328,7 +5328,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l3sw) "Ee" = ( @@ -5554,7 +5554,7 @@ /turf/floor/wood/mahogany, /area/ministation/library) "Gh" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, @@ -5687,7 +5687,7 @@ /turf/wall/r_wall/prepainted, /area/space) "HB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l3sw) "HK" = ( @@ -6472,7 +6472,7 @@ /turf/floor/wood/yew, /area/ministation/court) "NF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -6491,7 +6491,7 @@ /turf/floor/tiled, /area/ministation/bridge) "NJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/flora/pottedplant/aquatic, /turf/floor/lino, @@ -6758,7 +6758,7 @@ /area/space) "Pw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/techfloor/orange, /turf/floor/tiled, /area/ministation/hall/n3) @@ -6839,7 +6839,7 @@ /turf/floor/plating, /area/ministation/maint/l3sw) "PR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n3) "PT" = ( @@ -6985,7 +6985,7 @@ /area/space) "QG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/s3) @@ -7098,7 +7098,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s3) "Rv" = ( @@ -7299,7 +7299,7 @@ /area/ministation/science) "So" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n3) "Sq" = ( @@ -7682,7 +7682,7 @@ /turf/floor/tiled/white, /area/ministation/science) "UK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ pixel_x = -3 }, @@ -8114,7 +8114,7 @@ /turf/floor/tiled/white, /area/ministation/science) "XA" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /obj/effect/floor_decal/industrial/warning, /obj/structure/railing/mapped, @@ -8223,7 +8223,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l3sw) "Yj" = ( @@ -8439,7 +8439,7 @@ /turf/floor/plating, /area/ministation/maint/l3sw) "Zj" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/universal, /turf/floor/plating, /area/ministation/maint/l3sw) @@ -8542,7 +8542,7 @@ /area/ministation/court) "ZR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s3) "ZS" = ( diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index 421efa39271..b944f249800 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -55,18 +55,18 @@ pixel_x = -25 }, /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ai" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/raisins, /obj/item/chems/drinks/glass2/fitnessflask, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ak" = ( @@ -77,8 +77,8 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "al" = ( @@ -88,21 +88,21 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "am" = ( /obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "an" = ( /obj/machinery/atmospherics/omni/filter, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) @@ -110,15 +110,15 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/tastybread, /obj/item/chems/drinks/cans/speer, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ap" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/vomit, /obj/effect/decal/cleanable/filth, /obj/structure/curtain/open/shower/engineering, @@ -134,7 +134,7 @@ "aq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/hydrant{ pixel_x = -27; dir = 4 @@ -147,7 +147,7 @@ icon_state = "4-8" }, /obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "as" = ( @@ -160,7 +160,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/floor/tiled/techfloor, @@ -169,7 +169,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/smes/buildable{ charge = 50000; inputting = 1; @@ -182,13 +182,13 @@ dir = 8 }, /obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "av" = ( /obj/machinery/atmospherics/omni/filter, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) @@ -196,7 +196,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) @@ -217,7 +217,7 @@ /obj/machinery/door/airlock/engineering, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aB" = ( @@ -233,7 +233,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aD" = ( @@ -261,7 +261,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aG" = ( @@ -285,7 +285,7 @@ /obj/item/clothing/costume/savage_hunter, /obj/item/clothing/costume/savage_hunter/female, /obj/item/clothing/jumpsuit/wetsuit, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/trash/liquidfood, /obj/item/stock_parts/matter_bin/super, @@ -303,7 +303,7 @@ dir = 8 }, /obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aI" = ( @@ -313,8 +313,8 @@ /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /obj/structure/curtain/open/shower/engineering, /obj/structure/hygiene/shower{ @@ -334,7 +334,7 @@ dir = 1 }, /obj/item/mop, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/trash/liquidfood, /obj/item/box/detergent, @@ -348,7 +348,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aM" = ( @@ -366,19 +366,19 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/cyan, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /obj/item/solar_assembly, /obj/item/solar_assembly, @@ -388,7 +388,7 @@ /area/map_template/crashed_pod) "aQ" = ( /obj/machinery/atmospherics/pipe/manifold/hidden, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aR" = ( @@ -407,7 +407,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/tastybread, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) @@ -418,16 +418,16 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aV" = ( /obj/machinery/atmospherics/binary/pump{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aW" = ( @@ -435,7 +435,7 @@ dir = 1 }, /obj/machinery/portable_atmospherics/canister/empty, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aX" = ( @@ -443,14 +443,14 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/visible/red, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/civilian, /obj/machinery/atmospherics/pipe/simple/hidden/universal, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aZ" = ( @@ -462,13 +462,13 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "ba" = ( /obj/machinery/atmospherics/pipe/manifold/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bb" = ( @@ -479,7 +479,7 @@ "bc" = ( /obj/abstract/submap_landmark/spawnpoint/crashed_pod_survivor, /obj/structure/bed/chair/shuttle/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "bd" = ( @@ -490,7 +490,7 @@ /obj/item/radio, /obj/item/radio, /obj/random/plushie, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "be" = ( @@ -502,7 +502,7 @@ pixel_x = -27; dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bf" = ( @@ -514,14 +514,14 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "bg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bh" = ( @@ -529,37 +529,37 @@ dir = 8 }, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bi" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bj" = ( /obj/structure/table/steel_reinforced, /obj/machinery/recharger, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/chems/drinks/glass2/coffeecup/metal, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "bk" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bl" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bm" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/trash/liquidfood, /turf/floor/tiled/dark, @@ -569,12 +569,12 @@ dir = 4 }, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bp" = ( @@ -603,7 +603,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bu" = ( @@ -627,7 +627,7 @@ /area/map_template/crashed_pod) "bw" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bx" = ( @@ -639,14 +639,14 @@ /obj/structure/bed/chair{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "by" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bz" = ( @@ -662,7 +662,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bB" = ( @@ -679,9 +679,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bD" = ( @@ -695,8 +695,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bF" = ( @@ -713,7 +713,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) @@ -745,13 +745,13 @@ /obj/machinery/light/small, /obj/effect/decal/cleanable/ash, /obj/item/trash/cigbutt/cigarbutt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bL" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bM" = ( @@ -782,7 +782,7 @@ /obj/item/clothing/jumpsuit/orange, /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/jumpsuit/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bN" = ( @@ -793,10 +793,10 @@ /obj/effect/floor_decal/industrial/warning, /obj/structure/table/steel_reinforced, /obj/item/binoculars, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/chems/drinks/cans/speer, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bP" = ( @@ -830,16 +830,16 @@ /obj/item/clothing/jumpsuit/orange, /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/jumpsuit/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bR" = ( /obj/structure/table/steel_reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/tastybread, /obj/item/geiger, /obj/item/geiger, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bS" = ( @@ -884,7 +884,7 @@ /obj/item/clothing/jumpsuit/orange, /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/jumpsuit/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bV" = ( @@ -979,7 +979,7 @@ /obj/item/ashtray, /obj/item/paper_bin, /obj/item/chems/drinks/cans/speer, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/pen, /turf/floor/tiled/dark, /area/map_template/crashed_pod) diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm b/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm index ed155d0788a..366a84d6ba3 100644 --- a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm +++ b/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm @@ -40,13 +40,13 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/plating, /area/map_template/oldpod) "ai" = ( /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aj" = ( @@ -65,25 +65,25 @@ /obj/structure/bed, /obj/abstract/landmark/corpse/doctor, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "al" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "am" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "an" = ( /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "ao" = ( @@ -93,7 +93,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "ap" = ( @@ -103,7 +103,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aq" = ( @@ -112,8 +112,8 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /turf/floor/tiled/monotile, /area/map_template/oldpod) @@ -121,30 +121,30 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "as" = ( /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "at" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "au" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/monotile, /area/map_template/oldpod) @@ -152,8 +152,8 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/monotile, /area/map_template/oldpod) @@ -162,52 +162,52 @@ dir = 4 }, /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "ax" = ( /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced/hull, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/map_template/oldpod) "ay" = ( /obj/item/frame/air_alarm, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stock_parts/circuitboard/air_alarm, /turf/floor/tiled/monotile, /area/map_template/oldpod) "az" = ( /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aA" = ( /obj/random/firstaid, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aB" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aC" = ( /obj/item/clothing/head/helmet/space/emergency, /obj/item/clothing/suit/space/emergency, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aD" = ( @@ -223,26 +223,26 @@ /obj/random/tech_supply, /obj/random/tech_supply, /obj/item/tool/pickaxe, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aE" = ( /obj/structure/window/reinforced{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aG" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aH" = ( @@ -250,7 +250,7 @@ icon_state = "0-4" }, /obj/item/frame/apc, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/cell/crap/empty, /obj/item/stock_parts/circuitboard/apc, /turf/floor/tiled/monotile, @@ -260,29 +260,29 @@ icon_state = "2-8" }, /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aJ" = ( /obj/abstract/landmark/corpse/pirate, /obj/item/gun/energy/captain, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aK" = ( /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aL" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aM" = ( @@ -290,7 +290,7 @@ /obj/item/baton/cattleprod, /obj/item/shard, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aN" = ( @@ -327,7 +327,7 @@ /turf/floor/plating, /area/map_template/oldpod) "aQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aR" = ( @@ -345,16 +345,16 @@ name = "plastic table frame" }, /obj/item/firstaid/surgery, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aS" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aT" = ( @@ -366,7 +366,7 @@ dir = 1 }, /obj/structure/closet/crate/plastic/rations, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/gun/projectile/zipgun, /obj/item/gun/projectile/zipgun, /obj/item/gun/projectile/zipgun, @@ -411,16 +411,16 @@ dir = 8 }, /obj/machinery/optable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aZ" = ( @@ -433,7 +433,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "ba" = ( @@ -475,14 +475,14 @@ }, /obj/random/firstaid, /obj/random/firstaid, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "bf" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "bg" = ( @@ -493,9 +493,9 @@ dir = 6; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 624c04bfc64..782dcad5380 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -922,7 +922,7 @@ /area/map_template/colony/atmospherics) "cf" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/emitter/gyrotron, /turf/floor/concrete, /area/template_noop) @@ -1415,7 +1415,7 @@ "dn" = ( /obj/structure/catwalk, /obj/machinery/rad_collector, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "do" = ( @@ -1576,7 +1576,7 @@ /obj/machinery/light/spot{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/surgery) "dG" = ( @@ -1853,7 +1853,7 @@ "eh" = ( /obj/structure/catwalk, /obj/structure/closet/crate/solar_assembly, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "ei" = ( @@ -2075,8 +2075,8 @@ /area/map_template/colony/messhall) "eD" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/command) "eE" = ( @@ -2342,8 +2342,8 @@ /area/map_template/colony/medbay) "eZ" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "fa" = ( @@ -2361,7 +2361,7 @@ /area/map_template/colony) "fc" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "fd" = ( @@ -3204,7 +3204,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/green, /area/map_template/colony/messhall) "gt" = ( @@ -3411,7 +3411,7 @@ /turf/floor/tiled/techfloor, /area/map_template/colony/atmospherics) "gP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/green, /area/map_template/colony/messhall) "gQ" = ( @@ -3429,7 +3429,7 @@ /turf/floor/tiled/steel_ridged, /area/map_template/colony/airlock) "gR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "playablecolonymain_pump_out_external" }, @@ -4724,7 +4724,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/walnut, /area/map_template/colony/commons) "jm" = ( @@ -4796,7 +4796,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/wood/walnut, /area/map_template/colony/commons) "jt" = ( @@ -4981,7 +4981,7 @@ /obj/machinery/light/spot{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/messhall) "jL" = ( @@ -5586,11 +5586,11 @@ /obj/effect/floor_decal/industrial/loading{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "kL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "kM" = ( @@ -5598,7 +5598,7 @@ id_tag = "playablecolony_crematorium" }, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "kN" = ( @@ -5607,7 +5607,7 @@ pixel_y = 25; req_access = list() }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table/steel_reinforced, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/recharger, @@ -5713,15 +5713,15 @@ /area/map_template/colony/airlock) "kZ" = ( /obj/structure/table/steel_reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped{ dir = 8 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "la" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lb" = ( @@ -5771,7 +5771,7 @@ /area/map_template/colony) "lg" = ( /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lh" = ( @@ -5792,7 +5792,7 @@ id_tag = "colonymine" }, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_ridged, /area/map_template/colony/mineralprocessing) "lj" = ( @@ -5839,7 +5839,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lo" = ( @@ -5879,7 +5879,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lu" = ( @@ -5890,12 +5890,12 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lv" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lw" = ( @@ -5934,8 +5934,8 @@ dir = 8 }, /obj/structure/table/steel_reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lA" = ( @@ -5946,7 +5946,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lB" = ( @@ -5976,7 +5976,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lD" = ( @@ -5984,7 +5984,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lG" = ( @@ -6026,8 +6026,8 @@ /turf/floor/tiled/white, /area/map_template/colony/bathroom) "lJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ cycle_to_external_air = 1; id_tag = "playablecolonymain"; @@ -6070,7 +6070,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "playablecolonymain_pump"; power_rating = 25000 @@ -6127,7 +6127,7 @@ dir = 8; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) "lR" = ( @@ -6142,7 +6142,7 @@ name = "Colonial suit cycler"; req_access = list() }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) "lS" = ( @@ -6150,13 +6150,13 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lT" = ( /obj/structure/catwalk, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lU" = ( @@ -6164,15 +6164,15 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lV" = ( /obj/effect/floor_decal/industrial/warning/dust{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lW" = ( @@ -6205,7 +6205,7 @@ /area/map_template/colony) "lX" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/item/radio/intercom{ dir = 8; @@ -6232,8 +6232,8 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "ma" = ( @@ -6256,8 +6256,8 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -6268,8 +6268,8 @@ /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "mb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold4w/hidden, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) @@ -6319,7 +6319,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "mh" = ( @@ -6329,7 +6329,7 @@ /obj/machinery/door/airlock/external{ id_tag = "playablecolonymain_interior_door" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "mi" = ( @@ -6353,7 +6353,7 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "ml" = ( @@ -6385,8 +6385,8 @@ /obj/structure/railing/mapped{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "mo" = ( @@ -6422,14 +6422,14 @@ dir = 8; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) "ms" = ( /obj/effect/floor_decal/techfloor{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump/high_power/on{ dir = 8; target_pressure = 500 @@ -6521,8 +6521,8 @@ name = "Hard Equipment Storage"; pixel_y = 28 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/command) "mD" = ( @@ -6683,19 +6683,19 @@ /obj/effect/floor_decal/techfloor{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "mP" = ( /obj/structure/table/steel_reinforced, /obj/machinery/cell_charger, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/flashlight/lamp/floodlamp, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "mQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped, /obj/structure/railing/mapped{ dir = 8 @@ -6789,7 +6789,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 }, @@ -7208,9 +7208,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; id_tag = "playablecolonymain_pump_out_internal"; @@ -7262,8 +7262,8 @@ icon_state = "4-8" }, /obj/machinery/light, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 1; id_tag = "playablecolonymain_pump"; @@ -7283,7 +7283,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 1; id_tag = "playablecolonymain_pump"; @@ -7306,7 +7306,7 @@ dir = 8; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) @@ -7348,7 +7348,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "ob" = ( @@ -7361,7 +7361,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "oc" = ( @@ -7374,7 +7374,7 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ dir = 8; pixel_x = 22 @@ -7388,33 +7388,33 @@ /obj/effect/floor_decal/industrial/loading{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oe" = ( /obj/structure/railing/mapped, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "of" = ( /obj/structure/railing/mapped, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "og" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oh" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oi" = ( @@ -7506,9 +7506,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) @@ -7520,9 +7520,9 @@ dir = 1 }, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) @@ -7539,9 +7539,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) @@ -7560,7 +7560,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "oq" = ( @@ -7568,7 +7568,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "or" = ( @@ -7579,7 +7579,7 @@ /obj/structure/sign/warning/high_voltage{ pixel_y = 28 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "os" = ( @@ -7587,7 +7587,7 @@ icon_state = "4-8" }, /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "ot" = ( @@ -7595,16 +7595,16 @@ /obj/machinery/light/spot{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/hydroponics) "ou" = ( /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -7621,8 +7621,8 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -7646,9 +7646,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; id_tag = "playablecolonymain_pump_out_internal"; @@ -7661,38 +7661,38 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 1 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 5 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 }, @@ -7814,8 +7814,8 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "vt" = ( @@ -7936,9 +7936,9 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "Kn" = ( @@ -7954,7 +7954,7 @@ /area/map_template/colony/hydroponics) "Kz" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/spot{ dir = 1 }, diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index 4ff16d85d3a..09ad5b87a1d 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -108,7 +108,7 @@ /turf/floor/tiled/steel_grid, /area/ship/trade/loading_bay) "ap" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -188,7 +188,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/button/access/interior{ dir = 1; id_tag = "lower_cargo"; @@ -198,7 +198,7 @@ /area/ship/trade/loading_bay) "ax" = ( /obj/item/stool/padded, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -322,7 +322,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_grid, /area/ship/trade/loading_bay) "aI" = ( @@ -598,7 +598,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "bj" = ( @@ -609,7 +609,7 @@ /area/ship/trade/fore_port_underside_maint) "bk" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /obj/item/paicard, /turf/floor, @@ -618,7 +618,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ level = 2 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/mollusc_shell/clam, /turf/floor, /area/ship/trade/disused) @@ -741,7 +741,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "bG" = ( @@ -752,7 +752,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/vending/cola{ dir = 4 }, @@ -886,7 +886,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "bW" = ( @@ -1000,7 +1000,7 @@ dir = 8; flickering = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -1061,7 +1061,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/hygiene/drain, /turf/floor/tiled, /area/ship/trade/loading_bay) @@ -1101,7 +1101,7 @@ /turf/floor, /area/ship/trade/loading_bay) "iy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1156,7 +1156,7 @@ /area/ship/trade/loading_bay) "lg" = ( /obj/item/stool/bar/padded, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1182,7 +1182,7 @@ /turf/floor, /area/ship/trade/aft_port_underside_maint) "lv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/bluegrid, /area/ship/trade/undercomms) "lA" = ( @@ -1248,7 +1248,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "oO" = ( @@ -1280,7 +1280,7 @@ /turf/floor, /area/ship/trade/loading_bay) "pi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "pG" = ( @@ -1301,7 +1301,7 @@ /turf/floor/plating, /area/ship/trade/loading_bay) "qt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "qK" = ( @@ -1319,7 +1319,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/backpack/dufflebag, /obj/item/chems/glass/rag, /obj/item/chems/glass/bucket, @@ -1530,7 +1530,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -1637,7 +1637,7 @@ /turf/floor/tiled/steel_grid, /area/ship/trade/loading_bay) "DT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1651,7 +1651,7 @@ dir = 4 }, /obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "Ff" = ( @@ -1659,7 +1659,7 @@ /turf/floor/carpet/red, /area/ship/trade/disused) "Ft" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1669,7 +1669,7 @@ /turf/floor, /area/ship/trade/undercomms) "Fy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/loot_pile/maint/trash, /turf/floor/tiled, /area/ship/trade/disused) @@ -1751,7 +1751,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "Iv" = ( @@ -2030,7 +2030,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/firealarm{ dir = 8; pixel_x = -24 @@ -2054,7 +2054,7 @@ "QW" = ( /obj/item/stack/tile/floor/five, /obj/item/crowbar/red, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /turf/floor, /area/ship/trade/disused) @@ -2094,7 +2094,7 @@ /obj/item/radio/intercom{ pixel_y = 20 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/loot_pile/maint/junk, /turf/floor, /area/ship/trade/disused) diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index e72c0805f17..57e51cb711c 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -292,7 +292,7 @@ /turf/floor/plating, /area/ship/trade/cargo/lower) "aH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ dir = 8 }, @@ -486,7 +486,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ship/trade/maintenance/lower) "bd" = ( @@ -655,7 +655,7 @@ /obj/structure/cable{ icon_state = "6-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/cargo/lower) "bw" = ( @@ -739,7 +739,7 @@ /turf/floor/tiled, /area/ship/trade/maintenance/lower) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -24 @@ -828,7 +828,7 @@ /area/ship/trade/cargo/lower) "bV" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/powered/scrubber, /turf/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) @@ -1024,7 +1024,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) "cC" = ( @@ -1144,7 +1144,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped{ dir = 4 }, @@ -1337,11 +1337,11 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) "du" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/cargo/lower) "dv" = ( @@ -1357,7 +1357,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/corner{ dir = 1; icon_state = "warningcorner" @@ -1400,14 +1400,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "dB" = ( /obj/structure/table, /obj/random/plushie, /obj/item/synthesized_instrument/violin, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "dD" = ( @@ -1608,7 +1608,7 @@ icon_state = "bulb1" }, /obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/deck/second{ pixel_y = 32 }, @@ -1619,7 +1619,7 @@ dir = 8; pixel_x = 22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/firealarm{ pixel_y = 24 }, @@ -1638,7 +1638,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/eva) "ep" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light{ dir = 1; icon_state = "bulb1" @@ -1687,7 +1687,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "ew" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1714,7 +1714,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "ez" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1751,7 +1751,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/eva) "eD" = ( @@ -1776,7 +1776,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "eQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light_switch{ pixel_x = 24; @@ -1795,14 +1795,14 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ship/trade/maintenance/eva) "eS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/eva) "eV" = ( @@ -1849,7 +1849,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/storage) "fa" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "fb" = ( @@ -1981,7 +1981,7 @@ /turf/floor, /area/ship/trade/science/fabricaton) "hI" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1; icon_state = "warning" @@ -2151,7 +2151,7 @@ /obj/machinery/conveyor_switch{ id_tag = "con" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled, /area/ship/trade/cargo/lower) @@ -2340,7 +2340,7 @@ /turf/wall/r_wall/hull, /area/ship/trade/maintenance/techstorage) "rB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/iron, /obj/item/stack/material/ore/coal{ pixel_x = 3; @@ -2443,7 +2443,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "un" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/fabricator/industrial, /obj/item/stack/material/ingot/mapped/osmium/ten, /obj/effect/floor_decal/industrial/outline/yellow, @@ -2562,7 +2562,7 @@ }, /obj/item/bedsheet/mime, /obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "xa" = ( @@ -2672,7 +2672,7 @@ /turf/floor/tiled/dark, /area/ship/trade/crew/dorms1) "Bq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 5 }, @@ -2737,7 +2737,7 @@ dir = 4; level = 2 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/cargo/lower) "DQ" = ( @@ -2864,7 +2864,7 @@ /area/ship/trade/science/fabricaton) "IU" = ( /obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 5 }, @@ -2948,7 +2948,7 @@ /turf/floor/lino, /area/ship/trade/crew/dorms2) "Lx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /turf/floor/tiled, /area/ship/trade/cargo/lower) @@ -2968,7 +2968,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "LN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 5 }, @@ -2991,7 +2991,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/maintenance/lower) "Mx" = ( @@ -2999,7 +2999,7 @@ /turf/wall, /area/ship/trade/escape_port) "Nb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ pixel_y = 20 }, @@ -3376,7 +3376,7 @@ /turf/floor/tiled/white, /area/ship/trade/science/fabricaton) "Zv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/alarm{ dir = 4; diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index 5861bc931e5..c2475414d42 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -275,7 +275,7 @@ /turf/floor/tiled/white, /area/ship/trade/crew/medbay/chemistry) "aB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/emcloset, /obj/random/voidsuit, /obj/random/voidhelmet, @@ -528,7 +528,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 @@ -645,7 +645,7 @@ /turf/wall/r_wall, /area/ship/trade/dock) "bn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -21 @@ -676,7 +676,7 @@ /turf/floor/plating, /area/ship/trade/shuttle/outgoing/general) "br" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/emergency_dispenser/north, /turf/floor/tiled/monotile, /area/ship/trade/dock) @@ -733,7 +733,7 @@ "bv" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -820,7 +820,7 @@ /turf/floor/plating, /area/ship/trade/dock) "bB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/warning/vacuum{ dir = 4; pixel_x = -34 @@ -828,7 +828,7 @@ /turf/floor/tiled/monotile, /area/ship/trade/dock) "bC" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -990,7 +990,7 @@ /turf/floor/tiled/monotile, /area/ship/trade/dock) "bO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/steeldecal/steel_decals6, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8; @@ -1340,7 +1340,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/start{ name = "Deck Hand" }, @@ -1647,7 +1647,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random_multi/single_item/captains_spare_id, /turf/floor/tiled/freezer, /area/ship/trade/crew/toilets) @@ -1664,7 +1664,7 @@ icon_state = "twindow" }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc{ dir = 4; @@ -1681,7 +1681,7 @@ /turf/floor/tiled/freezer, /area/ship/trade/crew/toilets) "dO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4; icon_state = "conpipe-c" @@ -1700,7 +1700,7 @@ /turf/wall, /area/ship/trade/crew/saloon) "dQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 9 }, @@ -1730,7 +1730,7 @@ /turf/floor/tiled, /area/ship/trade/crew/saloon) "dV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ @@ -1869,7 +1869,7 @@ /area/ship/trade/crew/kitchen) "ez" = ( /obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/crew/kitchen) "eA" = ( @@ -1920,7 +1920,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/cargo) "eF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -1933,7 +1933,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/cargo) "eH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light{ dir = 4; icon_state = "bulb1" @@ -2005,7 +2005,7 @@ /turf/floor/tiled, /area/ship/trade/crew/kitchen) "eQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, @@ -2223,7 +2223,7 @@ /turf/floor/tiled/white, /area/ship/trade/crew/medbay) "fp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/open, /area/ship/trade/cargo) @@ -2624,7 +2624,7 @@ /area/ship/trade/cargo) "gt" = ( /obj/structure/emergency_dispenser/west, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable{ @@ -2817,7 +2817,7 @@ /turf/floor/tiled, /area/ship/trade/garden) "hi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -2904,7 +2904,7 @@ /turf/floor/plating, /area/ship/trade/crew/hallway/starboard) "ht" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -3187,7 +3187,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "hV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -3345,7 +3345,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "ij" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -3365,7 +3365,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /obj/structure/cable{ icon_state = "1-8" @@ -3387,7 +3387,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -3532,7 +3532,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "iz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/yellow{ dir = 10 }, @@ -3654,7 +3654,7 @@ /area/ship/trade/maintenance/atmos) "iN" = ( /obj/machinery/light, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "iQ" = ( @@ -4863,8 +4863,8 @@ /turf/floor/plating, /area/ship/trade/shieldbay) "pT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ pixel_y = 20 }, @@ -4973,7 +4973,7 @@ /turf/floor/plating, /area/ship/trade/shuttle/rescue) "qO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/computer/modular/preset/merchant/tradeship, /obj/machinery/light_switch{ @@ -6414,7 +6414,7 @@ pixel_x = 30; pixel_y = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "GO" = ( @@ -6659,7 +6659,7 @@ /area/ship/trade/crew/saloon) "Jp" = ( /obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/meat_hook, /obj/machinery/newscaster{ pixel_y = -32; @@ -7277,7 +7277,7 @@ /turf/floor/bluegrid, /area/ship/trade/command/bridge) "Qc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/fuel, @@ -7359,7 +7359,7 @@ dir = 1; pixel_y = -24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "Rb" = ( @@ -7420,7 +7420,7 @@ /turf/floor/carpet/blue, /area/ship/trade/command/captain) "Rv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/start{ name = "Cargo Technician" }, @@ -7699,7 +7699,7 @@ /turf/wall/titanium, /area/ship/trade/shuttle/outgoing/general) "UV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/ship/trade/dock) "UY" = ( @@ -7918,7 +7918,7 @@ /turf/floor/tiled, /area/ship/trade/shuttle/outgoing/general) "Xz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "XG" = ( @@ -7951,7 +7951,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/engine/aft) "Ya" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning, /obj/structure/catwalk, /obj/structure/railing/mapped, diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index b04503e9333..e42c91b348e 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -221,23 +221,23 @@ /turf/wall, /area/icarus/vessel) "aY" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aZ" = ( /obj/random/obstruction, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "ba" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, /area/icarus/vessel) "bb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "bc" = ( @@ -395,7 +395,7 @@ /area/icarus/vessel) "bE" = ( /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bF" = ( @@ -405,21 +405,21 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bH" = ( /obj/structure/hygiene/shower{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bI" = ( /obj/structure/hygiene/shower{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bJ" = ( @@ -514,7 +514,7 @@ /turf/floor/tiled, /area/icarus/vessel) "bX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bY" = ( @@ -528,14 +528,14 @@ dir = 4 }, /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "ca" = ( /obj/effect/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/tiled/white, /area/icarus/vessel) @@ -625,7 +625,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "cq" = ( @@ -633,7 +633,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "cr" = ( @@ -652,7 +652,7 @@ /obj/effect/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "ct" = ( @@ -699,7 +699,7 @@ /obj/effect/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/corpse/chef, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/tiled/white, @@ -784,7 +784,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "cO" = ( @@ -878,14 +878,14 @@ /obj/structure/broken_cryo/icarus{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dd" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -921,8 +921,8 @@ "dj" = ( /obj/structure/table, /obj/item/towel, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -937,7 +937,7 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dm" = ( @@ -971,7 +971,7 @@ /turf/floor/tiled, /area/icarus/vessel) "dr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall, /area/icarus/vessel) "ds" = ( @@ -983,13 +983,13 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "du" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dv" = ( @@ -1030,13 +1030,13 @@ dir = 4; icon_state = "tube1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dC" = ( /obj/structure/table, /obj/random/accessory, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -1098,7 +1098,7 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1125,7 +1125,7 @@ /area/icarus/open) "dR" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/open) "dS" = ( @@ -1136,7 +1136,7 @@ /turf/floor/tiled, /area/icarus/open) "dU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "dV" = ( @@ -1145,7 +1145,7 @@ /turf/floor/tiled, /area/icarus/open) "dW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/abstract/landmark/allowed_leak, @@ -1204,41 +1204,41 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ee" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ef" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "eg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "eh" = ( /obj/random/tank, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/open) "ei" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ej" = ( /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ek" = ( @@ -1246,38 +1246,38 @@ /turf/floor/tiled, /area/icarus/open) "el" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "em" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "en" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/open) "ep" = ( /obj/structure/filing_cabinet/tall, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "eq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless/broken, /area/icarus/open) "er" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/tiled, /area/icarus/open) @@ -1290,7 +1290,7 @@ /area/icarus/open) "eu" = ( /obj/item/clothing/mask/smokable/cigarette/killthroat, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ev" = ( @@ -1298,9 +1298,9 @@ /turf/floor/tiled, /area/icarus/open) "ew" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/clothing/mask/breath/emergency, /turf/unsimulated/floor/sand, /area/icarus/open) @@ -1314,394 +1314,394 @@ /turf/floor/tiled, /area/icarus/open) "ez" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless/broken, /area/icarus/open) "eA" = ( /turf/floor/plating/airless/broken, /area/icarus/open) "eB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/scalpel, /turf/unsimulated/floor/sand, /area/icarus/open) "eC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/bedsheet/orange, /turf/unsimulated/floor/sand, /area/icarus/open) "eE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "eF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/grass/wild, /area/icarus/open) "eG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/clothing/mask/surgical, /turf/unsimulated/floor/sand, /area/icarus/open) "eH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/plate, /turf/unsimulated/floor/sand, /area/icarus/open) "eJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/utensil/knife, /turf/unsimulated/floor/sand, /area/icarus/open) "eK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/bed/padded, /turf/unsimulated/floor/sand, /area/icarus/open) "eL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/snack, /turf/unsimulated/floor/sand, /area/icarus/open) "eM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/plate, /turf/unsimulated/floor/sand, /area/icarus/open) "eO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/bed/chair{ dir = 1 }, /turf/unsimulated/floor/sand, /area/icarus/open) "eP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "eQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/rods, /turf/unsimulated/floor/sand, /area/icarus/open) "eR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "eS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "eU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "eV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/rods, /turf/unsimulated/floor/sand, /area/icarus/open) "eW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/snack, /turf/unsimulated/floor/sand, /area/icarus/open) "eX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "eY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "eZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/rods, /turf/unsimulated/floor/sand, /area/icarus/open) "fa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/pill_bottle/antibiotics, /turf/unsimulated/floor/sand, /area/icarus/open) "fb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/bag/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ff" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "fg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/rods, /turf/unsimulated/floor/sand, /area/icarus/open) "fh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/chems/drinks/cans/waterbottle, /turf/unsimulated/floor/sand, /area/icarus/open) "fi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/rods, /turf/unsimulated/floor/sand, /area/icarus/open) "fj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/rods, /turf/unsimulated/floor/sand, /area/icarus/open) "fk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "fl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "fm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/material, /turf/unsimulated/floor/sand, /area/icarus/open) "fp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/rods, /turf/unsimulated/floor/sand, /area/icarus/open) "fq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "fr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/material, /turf/unsimulated/floor/sand, /area/icarus/open) "fs" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "ft" = ( /obj/effect/icarus/irradiate, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "fv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "fw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless/broken, /area/icarus/open) "fx" = ( @@ -1714,13 +1714,13 @@ /turf/floor/tiled, /area/icarus/open) "fz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fB" = ( @@ -1736,10 +1736,10 @@ /turf/floor/tiled, /area/icarus/vessel) "fE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fF" = ( @@ -1747,12 +1747,12 @@ /turf/floor/plating, /area/icarus/vessel) "fG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/vessel) @@ -1904,10 +1904,10 @@ /turf/floor/plating, /area/icarus/vessel) "gj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/vessel) @@ -2478,7 +2478,7 @@ /area/icarus/vessel) "hW" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "hX" = ( @@ -2487,8 +2487,8 @@ /area/icarus/open) "hY" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "hZ" = ( @@ -2505,17 +2505,17 @@ /area/icarus/vessel) "ib" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ic" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "id" = ( @@ -2525,52 +2525,52 @@ /turf/wall/r_wall, /area/icarus/open) "ie" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "if" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "ig" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "ih" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/vehicle/train/cargo/trolley, /turf/unsimulated/floor/sand, /area/icarus/open) "ii" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "ij" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/engine{ anchored = 0 }, @@ -2578,28 +2578,28 @@ /area/icarus/open) "ik" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "il" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "im" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) @@ -2608,8 +2608,8 @@ /turf/floor/grass/wild, /area/icarus/open) "ip" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/grass/wild, /area/icarus/open) "jb" = ( @@ -2654,7 +2654,7 @@ pixel_y = 2 }, /obj/random/soap, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "rK" = ( diff --git a/mods/content/government/away_sites/icarus/icarus-2.dmm b/mods/content/government/away_sites/icarus/icarus-2.dmm index e32afe37e27..69426580ee2 100644 --- a/mods/content/government/away_sites/icarus/icarus-2.dmm +++ b/mods/content/government/away_sites/icarus/icarus-2.dmm @@ -27,7 +27,7 @@ /turf/floor/plating, /area/icarus/vessel) "ai" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aj" = ( @@ -45,7 +45,7 @@ /area/icarus/vessel) "am" = ( /obj/item/stack/material/ore/slag, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "an" = ( @@ -86,13 +86,13 @@ /turf/floor/tiled, /area/icarus/vessel) "au" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /turf/floor/tiled, /area/icarus/vessel) "av" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aw" = ( @@ -122,7 +122,7 @@ /turf/floor/tiled, /area/icarus/vessel) "aB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/overmap/visitable/sector/icarus, /turf/floor/tiled, /area/icarus/vessel) @@ -143,7 +143,7 @@ /area/icarus/vessel) "aG" = ( /obj/random/loot, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aH" = ( @@ -462,7 +462,7 @@ /turf/floor/tiled, /area/icarus/vessel) "bF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -585,7 +585,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, @@ -635,7 +635,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cj" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -678,7 +678,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 @@ -781,8 +781,8 @@ /turf/floor/tiled, /area/icarus/vessel) "cF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -1054,7 +1054,7 @@ /turf/floor/tiled, /area/icarus/vessel) "dr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -1114,7 +1114,7 @@ dir = 4; icon_state = "tube1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dC" = ( @@ -1176,7 +1176,7 @@ /turf/wall, /area/icarus/open) "dL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -1209,7 +1209,7 @@ /turf/floor/tiled, /area/icarus/open) "dP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "dQ" = ( @@ -1249,7 +1249,7 @@ /turf/floor/tiled, /area/icarus/open) "dX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -1285,9 +1285,9 @@ /turf/floor/plating, /area/icarus/open) "ed" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ee" = ( @@ -1296,8 +1296,8 @@ /turf/floor/tiled, /area/icarus/open) "ef" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "eg" = ( diff --git a/mods/gamemodes/heist/heist_base.dmm b/mods/gamemodes/heist/heist_base.dmm index cd92f5dc909..81cc7795bc7 100644 --- a/mods/gamemodes/heist/heist_base.dmm +++ b/mods/gamemodes/heist/heist_base.dmm @@ -160,7 +160,7 @@ /area/map_template/syndicate_mothership/raider_base) "aK" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/painting/monkey_painting{ pixel_x = -28; pixel_y = 4 @@ -317,7 +317,7 @@ /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bf" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bg" = ( @@ -421,7 +421,7 @@ /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/portable_atmospherics/canister/air/airlock, /obj/structure/window/reinforced{ @@ -435,7 +435,7 @@ /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/unsimulated/floor/plating, @@ -529,12 +529,12 @@ /turf/unsimulated/floor/wood/broken6, /area/map_template/syndicate_mothership/raider_base) "bO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/washing_machine, /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ dir = 4 }, @@ -558,14 +558,14 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ dir = 8 }, /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bS" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/unsimulated/floor/plating, diff --git a/tools/map_migrations/4647_dirt.txt b/tools/map_migrations/4647_dirt.txt new file mode 100644 index 00000000000..262db2c52ce --- /dev/null +++ b/tools/map_migrations/4647_dirt.txt @@ -0,0 +1,2 @@ +/obj/effect/decal/cleanable/dirt/@SUBTYPES : /obj/effect/decal/cleanable/dirt/visible/@SUBTYPES{@OLD} + From b81311253942b9966a2a2c3f9c1f87921f7ac3c9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Dec 2024 14:08:54 +1100 Subject: [PATCH 181/554] Updated persistence handler to handle dirt. --- code/game/objects/effects/dirty_floor.dm | 1 + code/modules/persistence/persistence_datum.dm | 7 +++---- code/modules/persistence/persistence_datum_book.dm | 2 +- .../modules/persistence/persistence_datum_filth.dm | 14 ++++++++++++-- .../persistence/persistence_datum_graffiti.dm | 2 +- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/code/game/objects/effects/dirty_floor.dm b/code/game/objects/effects/dirty_floor.dm index e56eaa02ad8..ae0c3c0cd9b 100644 --- a/code/game/objects/effects/dirty_floor.dm +++ b/code/game/objects/effects/dirty_floor.dm @@ -11,6 +11,7 @@ /obj/effect/decal/cleanable/dirt/visible dirt_amount = 60 + persistent = FALSE // This is a subtype for mapping. /obj/effect/decal/cleanable/dirt/Initialize() . = ..() diff --git a/code/modules/persistence/persistence_datum.dm b/code/modules/persistence/persistence_datum.dm index fc2a819e8b2..0c9e0aedca6 100644 --- a/code/modules/persistence/persistence_datum.dm +++ b/code/modules/persistence/persistence_datum.dm @@ -63,9 +63,8 @@ else return - . = GetValidTurf(locate(tokens["x"], tokens["y"], tokens["z"]), tokens) - if(.) - CreateEntryInstance(., tokens) + if(GetValidTurf(locate(tokens["x"], tokens["y"], tokens["z"]), tokens)) + return CreateEntryInstance(., tokens) /decl/persistence_handler/proc/IsValidEntry(var/atom/entry) if(!istype(entry)) @@ -92,7 +91,7 @@ .["age"] = GetEntryAge(entry) /decl/persistence_handler/proc/FinalizeTokens(var/list/tokens) - . = tokens + . = tokens || list() /decl/persistence_handler/Initialize() diff --git a/code/modules/persistence/persistence_datum_book.dm b/code/modules/persistence/persistence_datum_book.dm index e55a5cc9427..479a9c8cb45 100644 --- a/code/modules/persistence/persistence_datum_book.dm +++ b/code/modules/persistence/persistence_datum_book.dm @@ -17,7 +17,7 @@ if(case) book.forceMove(case) case.update_icon() - . = book + return book /decl/persistence_handler/book/IsValidEntry(var/atom/entry) . = ..() diff --git a/code/modules/persistence/persistence_datum_filth.dm b/code/modules/persistence/persistence_datum_filth.dm index 53c8ac5307d..9f877efeab0 100644 --- a/code/modules/persistence/persistence_datum_filth.dm +++ b/code/modules/persistence/persistence_datum_filth.dm @@ -15,11 +15,16 @@ . = ..() if(.["path"] && !ispath(.["path"])) .["path"] = text2path(.["path"]) - . = tokens + if(isnull(.["filthiness"])) + .["filthiness"] = 0 /decl/persistence_handler/filth/CreateEntryInstance(var/turf/creating, var/list/tokens) var/_path = tokens["path"] - new _path(creating, tokens["age"]+1) + var/obj/effect/decal/cleanable/dirt/dirt = new _path(creating, tokens["age"]+1) + if(istype(dirt)) + dirt.dirt_amount = tokens["filthiness"] + dirt.update_icon() + return dirt /decl/persistence_handler/filth/GetEntryAge(var/atom/entry) var/obj/effect/decal/cleanable/filth = entry @@ -32,3 +37,8 @@ /decl/persistence_handler/filth/CompileEntry(var/atom/entry) . = ..() .["path"] = "[GetEntryPath(entry)]" + if(istype(entry, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = entry + .["filthiness"] = dirt.dirt_amount + else + .["filthiness"] = 0 diff --git a/code/modules/persistence/persistence_datum_graffiti.dm b/code/modules/persistence/persistence_datum_graffiti.dm index de71177f2fc..83861418d67 100644 --- a/code/modules/persistence/persistence_datum_graffiti.dm +++ b/code/modules/persistence/persistence_datum_graffiti.dm @@ -17,7 +17,7 @@ return TRUE /decl/persistence_handler/graffiti/CreateEntryInstance(var/turf/creating, var/list/tokens) - new /obj/effect/decal/writing(creating, tokens["age"]+1, tokens["message"], tokens["author"]) + return new /obj/effect/decal/writing(creating, tokens["age"]+1, tokens["message"], tokens["author"]) /decl/persistence_handler/graffiti/IsValidEntry(var/atom/entry) . = ..() From ea3b1a88fb74c98b886cf450dbfd761ccf2554b9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Dec 2024 14:27:18 +1100 Subject: [PATCH 182/554] Shaded Hills will default to all in hand instead of none for job cash. --- maps/shaded_hills/shaded_hills_currency.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maps/shaded_hills/shaded_hills_currency.dm b/maps/shaded_hills/shaded_hills_currency.dm index f1c06d4735e..7c3efd6cbea 100644 --- a/maps/shaded_hills/shaded_hills_currency.dm +++ b/maps/shaded_hills/shaded_hills_currency.dm @@ -1,7 +1,7 @@ /datum/map/shaded_hills starting_cash_choices = list( - /decl/starting_cash_choice/none, - /decl/starting_cash_choice/cash + /decl/starting_cash_choice/cash, + /decl/starting_cash_choice/none ) default_currency = /decl/currency/imperial salary_modifier = 0.05 // turn the 300-400 base into 15-20 base From 42794e1477ac7c006dc5d93ce18f3b19e746f3a9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Dec 2024 14:44:22 +1100 Subject: [PATCH 183/554] Adds lockpicks to crafting. --- .../crafting/stack_recipes/recipes_hardness_integrity.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm index 92e580a6d0e..a20bdb56b3d 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm @@ -76,6 +76,9 @@ /decl/stack_recipe/hardness/integrity/lock result_type = /obj/item/lock_construct +/decl/stack_recipe/hardness/integrity/lockpick + result_type = /obj/item/lockpick + /decl/stack_recipe/hardness/integrity/key result_type = /obj/item/key From 382e4b94106aacfa266a47c4dffccdeffde6be8f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Dec 2024 14:50:26 +1100 Subject: [PATCH 184/554] Added skill checks and cooldown setting to lockpicking. --- code/modules/locks/lock.dm | 7 ++++--- mods/content/fantasy/datum/skills.dm | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/locks/lock.dm b/code/modules/locks/lock.dm index 82692f60586..20f148f194c 100644 --- a/code/modules/locks/lock.dm +++ b/code/modules/locks/lock.dm @@ -20,6 +20,7 @@ var/lock_data = "" //basically a randomized string. The longer the string the more complex the lock. var/atom/holder var/material + var/lockpicking_skill = SKILL_DEVICES /datum/lock/New(var/atom/h, var/complexity = 1, var/mat) holder = h @@ -77,9 +78,9 @@ if(!unlock_power) return FALSE user.visible_message("\The [user] begins to pick \the [holder]'s lock with \the [I].", SPAN_NOTICE("You begin picking \the [holder]'s lock.")) - if(!do_after(user, 2 SECONDS, holder)) + if(!user.do_skilled(2 SECONDS, lockpicking_skill, holder, check_holding = TRUE, set_cooldown = TRUE)) return FALSE - if(prob(20*(unlock_power/getComplexity()))) + if(!user.skill_fail_prob(lockpicking_skill, 100 - (20*(unlock_power/getComplexity())), SKILL_EXPERT)) to_chat(user, SPAN_NOTICE("You pick open \the [holder]'s lock!")) unlock(lock_data) return TRUE @@ -88,4 +89,4 @@ I.take_damage(rand(5,10)) else to_chat(user, SPAN_WARNING("You fail to pick open \the [holder].")) - return FALSE \ No newline at end of file + return FALSE diff --git a/mods/content/fantasy/datum/skills.dm b/mods/content/fantasy/datum/skills.dm index 164ade162b6..2fb92c6f9e1 100644 --- a/mods/content/fantasy/datum/skills.dm +++ b/mods/content/fantasy/datum/skills.dm @@ -306,3 +306,6 @@ "Experienced" = "You work as an pharmacist, or else you are a doctor with training in chemistry. If you are a pharmacist, you can make most medications. At this stage, you're working mostly by-the-book.
- You can examine held containers for some reagents.", "Master" = "You specialized in chemistry or pharmaceuticals; you are either a medical researcher or professional chemist. You can create custom mixes and make even the trickiest of medications easily. You understand how your pharmaceuticals interact with the bodies of your patients. You are probably the originator of at least one new chemical innovation.
- You can examine held containers for all reagents." ) + +/datum/lock + lockpicking_skill = SKILL_ARTIFICE From 32e1bcb3c850449a33d25dee22a66042b176c1af Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Dec 2024 14:56:56 +1100 Subject: [PATCH 185/554] Applying end table alpha/color fix. --- code/game/objects/structures/_structure_icon.dm | 2 +- code/game/objects/structures/_structure_materials.dm | 4 ++-- code/game/objects/structures/bookcase.dm | 2 +- code/game/objects/structures/tables.dm | 7 +------ 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/code/game/objects/structures/_structure_icon.dm b/code/game/objects/structures/_structure_icon.dm index 8dad14601ba..3f3c7e7e4ec 100644 --- a/code/game/objects/structures/_structure_icon.dm +++ b/code/game/objects/structures/_structure_icon.dm @@ -7,7 +7,7 @@ var/global/list/default_noblend_objects = list(/obj/machinery/door/window, /obj/ /obj/structure/on_update_icon() ..() if(material_alteration & MAT_FLAG_ALTERATION_COLOR) - update_material_colour() + update_material_color() cut_overlays() if(istype(lock)) update_lock_overlay() diff --git a/code/game/objects/structures/_structure_materials.dm b/code/game/objects/structures/_structure_materials.dm index 2c50f024bbe..3245a10faa2 100644 --- a/code/game/objects/structures/_structure_materials.dm +++ b/code/game/objects/structures/_structure_materials.dm @@ -17,7 +17,7 @@ if(material_alteration & MAT_FLAG_ALTERATION_DESC) update_material_desc() if(material_alteration & MAT_FLAG_ALTERATION_COLOR) - update_material_colour() + update_material_color() if((alpha / 255) < 0.5) set_opacity(FALSE) else @@ -49,7 +49,7 @@ else desc = base_desc -/obj/structure/proc/update_material_colour() +/obj/structure/proc/update_material_color() color = get_color() if(istype(material)) alpha = clamp((50 + material.opacity * 255), 0, 255) diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index 0c65b53c9c6..c5d0750a47b 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -213,7 +213,7 @@ var/global/list/station_bookcases = list() /obj/structure/bookcase/cart/on_update_icon() // We don't (can't) call parent, so we have to do this here if(material_alteration & MAT_FLAG_ALTERATION_COLOR) - update_material_colour() + update_material_color() cut_overlays() if(istype(lock)) update_lock_overlay() diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index e71f8b9df64..a03268a8146 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -293,14 +293,9 @@ if(additional_reinf_material) desc = "[desc] It has been reinforced with [additional_reinf_material.solid_name]." -/obj/structure/table/update_material_colour() - if(is_flipped) - return ..() - alpha = 255 - reset_color() - /obj/structure/table/proc/handle_normal_icon() color = null // Don't double-apply our color, clear the map preview. + alpha = 255 icon_state = "blank" var/image/I // Base frame shape. From 4fb506777e73f6427c7502b263ff7e3299ac8d4a Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:17:12 -0500 Subject: [PATCH 186/554] Add new rough-hewn wood plank turfs --- .../items/stacks/tiles/tile_types_wooden.dm | 10 ++++ code/game/turfs/flooring/flooring_wood.dm | 41 +++++++++++++++ code/game/turfs/floors/subtypes/floor_wood.dm | 48 ++++++++++-------- icons/turf/flooring/wood_alt.dmi | Bin 0 -> 1814 bytes 4 files changed, 77 insertions(+), 22 deletions(-) create mode 100644 icons/turf/flooring/wood_alt.dmi diff --git a/code/game/objects/items/stacks/tiles/tile_types_wooden.dm b/code/game/objects/items/stacks/tiles/tile_types_wooden.dm index fc9ec6517d7..a184391251f 100644 --- a/code/game/objects/items/stacks/tiles/tile_types_wooden.dm +++ b/code/game/objects/items/stacks/tiles/tile_types_wooden.dm @@ -28,6 +28,9 @@ /obj/item/stack/tile/wood/laminate abstract_type = /obj/item/stack/tile/wood/laminate +/obj/item/stack/tile/wood/rough + abstract_type = /obj/item/stack/tile/wood/rough + WOOD_TILE_SUBTYPE("oak", oak, oak) WOOD_TILE_SUBTYPE("mahogany", mahogany, mahogany) WOOD_TILE_SUBTYPE("maple", maple, maple) @@ -35,6 +38,13 @@ WOOD_TILE_SUBTYPE("ebony", ebony, ebony) WOOD_TILE_SUBTYPE("walnut", walnut, walnut) WOOD_TILE_SUBTYPE("bamboo", bamboo, bamboo) WOOD_TILE_SUBTYPE("yew", yew, yew) +WOOD_TILE_SUBTYPE("rough oak", rough/oak, oak) +WOOD_TILE_SUBTYPE("rough mahogany", rough/mahogany, mahogany) +WOOD_TILE_SUBTYPE("rough maple", rough/maple, maple) +WOOD_TILE_SUBTYPE("rough ebony", rough/ebony, ebony) +WOOD_TILE_SUBTYPE("rough walnut", rough/walnut, walnut) +WOOD_TILE_SUBTYPE("rough bamboo", rough/bamboo, bamboo) +WOOD_TILE_SUBTYPE("rough yew", rough/yew, yew) WOOD_TILE_SUBTYPE("oak laminate", laminate/oak, chipboard) WOOD_TILE_SUBTYPE("mahogany laminate", laminate/mahogany, chipboard/mahogany) WOOD_TILE_SUBTYPE("maple laminate", laminate/maple, chipboard/maple) diff --git a/code/game/turfs/flooring/flooring_wood.dm b/code/game/turfs/flooring/flooring_wood.dm index 9b2b75b0ffd..b5fc086d42f 100644 --- a/code/game/turfs/flooring/flooring_wood.dm +++ b/code/game/turfs/flooring/flooring_wood.dm @@ -53,6 +53,47 @@ build_type = /obj/item/stack/tile/wood/yew force_material = /decl/material/solid/organic/wood/yew +// Rough-hewn floors. +/decl/flooring/wood/rough + + name = "rough wooden floor" + desc = "A stretch of loosely-fitted, rough-hewn wooden planks." + icon = 'icons/turf/flooring/wood_alt.dmi' + icon_base = "wood_peasant" + has_base_range = 3 + build_type = /obj/item/stack/tile/wood/rough + broken_states = null + +/decl/flooring/wood/rough/mahogany + color = /decl/material/solid/organic/wood/mahogany::color + build_type = /obj/item/stack/tile/wood/rough/mahogany + force_material = /decl/material/solid/organic/wood/mahogany + +/decl/flooring/wood/rough/maple + color = /decl/material/solid/organic/wood/maple::color + build_type = /obj/item/stack/tile/wood/rough/maple + force_material = /decl/material/solid/organic/wood/maple + +/decl/flooring/wood/rough/ebony + color = /decl/material/solid/organic/wood/ebony::color + build_type = /obj/item/stack/tile/wood/rough/ebony + force_material = /decl/material/solid/organic/wood/ebony + +/decl/flooring/wood/rough/walnut + color = /decl/material/solid/organic/wood/walnut::color + build_type = /obj/item/stack/tile/wood/rough/walnut + force_material = /decl/material/solid/organic/wood/walnut + +/decl/flooring/wood/rough/bamboo + color = /decl/material/solid/organic/wood/bamboo::color + build_type = /obj/item/stack/tile/wood/rough/bamboo + force_material = /decl/material/solid/organic/wood/bamboo + +/decl/flooring/wood/rough/yew + color = /decl/material/solid/organic/wood/yew::color + build_type = /obj/item/stack/tile/wood/rough/yew + force_material = /decl/material/solid/organic/wood/yew + // Chipboard/wood laminate floors. Uses older icons. /decl/flooring/laminate name = "wooden laminate floor" diff --git a/code/game/turfs/floors/subtypes/floor_wood.dm b/code/game/turfs/floors/subtypes/floor_wood.dm index d5fa771be77..eff98a2a117 100644 --- a/code/game/turfs/floors/subtypes/floor_wood.dm +++ b/code/game/turfs/floors/subtypes/floor_wood.dm @@ -5,6 +5,12 @@ color = /decl/material/solid/organic/wood/oak::color _flooring = /decl/flooring/wood +#define WOOD_FLOOR_SUBTYPE(BASE, WOOD) \ +/turf/floor/##BASE/##WOOD { \ + color = /decl/material/solid/organic/wood/##WOOD::color; \ + _flooring = /decl/flooring/##BASE/##WOOD; \ +} + /turf/floor/wood/broken icon_state = "wood_broken0" _floor_broken = TRUE @@ -31,29 +37,27 @@ icon_state = "wood_broken4" _floor_broken = "broken4" -/turf/floor/wood/mahogany - color = /decl/material/solid/organic/wood/mahogany::color - _flooring = /decl/flooring/wood/mahogany - -/turf/floor/wood/maple - color = /decl/material/solid/organic/wood/maple::color - _flooring = /decl/flooring/wood/maple - -/turf/floor/wood/ebony - color = /decl/material/solid/organic/wood/ebony::color - _flooring = /decl/flooring/wood/ebony - -/turf/floor/wood/walnut - color = /decl/material/solid/organic/wood/walnut::color - _flooring = /decl/flooring/wood/walnut - -/turf/floor/wood/bamboo - color = /decl/material/solid/organic/wood/bamboo::color - _flooring = /decl/flooring/wood/bamboo +WOOD_FLOOR_SUBTYPE(wood, mahogany) +WOOD_FLOOR_SUBTYPE(wood, maple) +WOOD_FLOOR_SUBTYPE(wood, ebony) +WOOD_FLOOR_SUBTYPE(wood, walnut) +WOOD_FLOOR_SUBTYPE(wood, bamboo) +WOOD_FLOOR_SUBTYPE(wood, yew) + +// Rough wood floors; lower skill requirement, more wasteful to craft. +/turf/floor/wood/rough + name = "rough-hewn wooden floor" + icon = 'icons/turf/flooring/wood_alt.dmi' + icon_state = "wood_peasant0" + color = /decl/material/solid/organic/wood/oak::color + _flooring = /decl/flooring/wood -/turf/floor/wood/yew - color = /decl/material/solid/organic/wood/yew::color - _flooring = /decl/flooring/wood/yew +WOOD_FLOOR_SUBTYPE(wood/rough, mahogany) +WOOD_FLOOR_SUBTYPE(wood/rough, maple) +WOOD_FLOOR_SUBTYPE(wood/rough, ebony) +WOOD_FLOOR_SUBTYPE(wood/rough, walnut) +WOOD_FLOOR_SUBTYPE(wood/rough, bamboo) +WOOD_FLOOR_SUBTYPE(wood/rough, yew) // Laminate floor; basically identical to wood, but uses older smoother icons. /turf/floor/laminate diff --git a/icons/turf/flooring/wood_alt.dmi b/icons/turf/flooring/wood_alt.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2f55a0fb6c4db73750af523aeaca370d05370a89 GIT binary patch literal 1814 zcmV+x2kH2UP)sOZ(?wKaD2nV zwaFvW=Kufz0d!JMQvg8b*k%9#0EK!~Sad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1 zv)zWcDwhQix@LFpvshrCnx{R%(i_HMQvXg;vuK1|i==Wt9^=#<8 z0w}`VR1FOK4Q+riwP*H?`Ge*G_@JEhGS#*i|FI-1UGHsEt7ZAmP6aL3dpYph^zYjdD{+hebm>-cr*HUr4>Ecm{Kqz3Cpygr^V`j%eAYK?aqrmnt* zhvm{PV%!T9^Je#u$qCRHovo{Zt3`05_7K*;@xs|efEio_MVfmd(}qZS;Jxa%Yynx|gNJdN)&d89MWnQP#qREtD%AVF-}X8kErpixDO_#sTsY-%ttDU%al<0DTt>9aZ= zv*sOla*M>pwRxD%9;)prBUj@VIwZ20BzG!VyEw;5c-+XYr>|KZ1h?5~23;q_3L*$> zQ!@a-3F4fgUz@jCjn>U!@&HpXr znL5}L#GW$T*Nblgxsf>p@|x2YKr#g0Ms~Q)-c7V%?596jW#EC6@l|dB^R$H$IA|X7 z0C`%H<(9jdJ5}?BgE^tl&N=70Zx!wH0nl|@XqLGHI9)WW2cKm`2D_ih`vdNSw*2S^#o1sM(l%4A9UHIU z9cxJwtJv`Y=?|#o6hK#hEz`?ZQ(YkCDt1e&*Ni3=+~j3)&_?ipY4FkCQ*T6cImVom-LC(?8Xu%}h%~!7o)2>349M(i zob>;@P&<)Ihx<--bn@58uTy| zMoRTC5f7Oye<(+LE}{7~fcSxgHQHh-*R(C*Vd~%(StYc)XCjY1R##l=mX5vCm*Ju4 z;wZZW_~67^znuVvKwj5)>JlKM9tsPod0>c|%}U?T2bTbGu8J71hvnInAUaRa2iF>S zIqGq~BgX8lVmh1;++XQd9@xpTN^n{YUJFvgdb$Um4|qy4KlmBo5}=$8bKzS*BL@va zI=S9-a`aQ{q)X%Q+n6kJU=*$%Zl^C9jfpaymNtf`T*z& z*A)r50{EtGXfT9O_w62Fkh5?ZfT#CO4aTaN^1J44B4H8R$(4;(lwKeJ#Vv1cIN6^pwmSI>tN(Y*yj5d=e2)<01_1hd1yG23XoaGf zm9(y9l~E`zzXT8u3-jAr(&yl-t5Vl6nCvhv0fNbF{WacOeGZEONoW24rHQEO*Z%&p z|GzfT$EnU+Ts?U8CTlO3kZTpX1{i53cME6K>gY}QesN3@+}~<`$5(jK-^Z(xh?0A%=JPWXq&2><{907*qoM6N<$ Ef-fh0I{*Lx literal 0 HcmV?d00001 From 21854d52b6d5ad490b8a1742e46e2e5a6c80e063 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:17:30 -0500 Subject: [PATCH 187/554] Add rough-hewn wood floors to Shaded Hills maps --- maps/shaded_hills/shaded_hills-grassland.dmm | 8 +- maps/shaded_hills/shaded_hills-inn.dmm | 239 ++++++++++-------- maps/shaded_hills/shaded_hills-swamp.dmm | 28 +- maps/shaded_hills/shaded_hills-woods.dmm | 26 +- .../woods/chemistry_shack/chemistry_shack.dmm | 24 +- .../submaps/woods/old_cabin/old_cabin.dmm | 30 +-- 6 files changed, 192 insertions(+), 163 deletions(-) diff --git a/maps/shaded_hills/shaded_hills-grassland.dmm b/maps/shaded_hills/shaded_hills-grassland.dmm index ac9e42b9c2d..b885f19cf3f 100644 --- a/maps/shaded_hills/shaded_hills-grassland.dmm +++ b/maps/shaded_hills/shaded_hills-grassland.dmm @@ -110,7 +110,7 @@ "nl" = ( /obj/structure/door/walnut, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside) "oo" = ( /obj/item/stack/material/ore/handful/sand, @@ -144,7 +144,7 @@ /area/shaded_hills/caves/unexplored) "ul" = ( /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside) "vX" = ( /turf/floor/path/running_bond/basalt, @@ -159,7 +159,7 @@ /turf/floor/dirt, /area/shaded_hills/outside) "xC" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside) "yA" = ( /obj/abstract/landmark/latejoin/observer, @@ -188,7 +188,7 @@ /turf/floor/woven, /area/shaded_hills/outside) "EE" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/river) "EL" = ( /obj/abstract/exterior_marker/inside, diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index a2ee7dff5e4..62e2a71efb3 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -24,7 +24,7 @@ /area/shaded_hills/outside/downlands) "bu" = ( /obj/structure/table/desk/dresser, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "bv" = ( /obj/structure/bed/chair/rustic{ @@ -45,11 +45,11 @@ /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/handmade/cup/wood, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "cl" = ( /obj/structure/table/wood/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "cq" = ( /obj/structure/table/wood/ebony, @@ -89,11 +89,11 @@ /area/shaded_hills/general_store) "dK" = ( /obj/structure/table/wood/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "dL" = ( /obj/structure/reagent_dispensers/barrel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "dN" = ( /obj/structure/wall_sconce/lantern{ @@ -107,7 +107,7 @@ /area/shaded_hills/shrine) "eD" = ( /obj/structure/working/loom/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "eG" = ( /obj/structure/door/walnut, @@ -149,7 +149,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) "fR" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "fS" = ( /obj/structure/table/marble, @@ -176,14 +176,14 @@ /turf/floor/path/basalt, /area/shaded_hills/slaughterhouse) "ge" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "gg" = ( /obj/structure/wall_sconce/lantern{ dir = 4 }, /obj/structure/table/wood/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "gn" = ( /obj/item/flame/candle/handmade, @@ -200,7 +200,7 @@ /obj/structure/wall_sconce/lantern{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "gA" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -212,7 +212,7 @@ /obj/structure/wall_sconce/lantern{ start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "gL" = ( /obj/structure/reagent_dispensers/barrel/ebony/oil, @@ -246,7 +246,7 @@ /obj/structure/bed/chair/bench/ebony{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "hu" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -256,7 +256,7 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "hE" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -267,7 +267,7 @@ /area/shaded_hills/outside/downlands) "hJ" = ( /obj/item/stool/rustic, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "hU" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -280,7 +280,7 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "id" = ( /obj/structure/table/wood/ebony, @@ -313,6 +313,12 @@ /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn) +"iJ" = ( +/obj/structure/wall_sconce/lantern{ + dir = 4 + }, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/shrine) "iK" = ( /turf/wall/brick/basalt{ unique_merge_identifier = "shrine wall" @@ -329,17 +335,17 @@ /obj/structure/wall_sconce/lantern{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "jk" = ( /obj/structure/bed/chair/bench/pew/mahogany{ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/cleric, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "js" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "jx" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -357,7 +363,7 @@ "jA" = ( /obj/structure/bed/simple/ebony, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "jI" = ( /obj/structure/wall_sconce/lantern{ @@ -381,11 +387,11 @@ /obj/structure/banner_frame/wall/ebony/green{ pixel_y = 32 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "kE" = ( /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "kI" = ( /obj/structure/bed/chair/bench/pew/ebony{ @@ -405,7 +411,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "lE" = ( /obj/abstract/level_data_spawner/shaded_hills_downlands, @@ -419,7 +425,7 @@ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/farmer, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "me" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -438,13 +444,13 @@ "ml" = ( /obj/structure/table/wood/ebony, /obj/item/shears, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "mG" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "mJ" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -454,8 +460,14 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) +"mK" = ( +/obj/structure/door/walnut{ + dir = 4 + }, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/farmhouse) "nn" = ( /turf/wall/log/walnut, /area/shaded_hills/stable) @@ -507,7 +519,7 @@ /obj/structure/bed/chair/bench/pew/mahogany{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "pi" = ( /obj/structure/table/wood/ebony, @@ -522,13 +534,13 @@ /obj/structure/bed/simple/ebony, /obj/abstract/landmark/start/shaded_hills/shrine_attendant, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "qf" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "qG" = ( /turf/wall/brick/basalt, @@ -556,7 +568,7 @@ /obj/structure/table/wood/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "rc" = ( /obj/structure/railing/mapped/wooden/walnut, @@ -596,7 +608,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "rC" = ( /obj/structure/table/marble, @@ -614,7 +626,7 @@ /obj/structure/wall_sconce/lantern{ start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "rY" = ( /obj/effect/floor_decal/spline/fancy/wood/corner/walnut, @@ -625,6 +637,10 @@ /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) +"sz" = ( +/obj/structure/door/walnut, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/shrine) "sJ" = ( /obj/structure/closet/cabinet/wooden/ebony, /turf/floor/wood/walnut, @@ -672,7 +688,7 @@ /obj/structure/bed/chair/rustic{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "uk" = ( /obj/structure/bed/chair/bench/pew/ebony{ @@ -710,13 +726,13 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "vz" = ( /obj/structure/table/wood/ebony, /obj/item/chems/cooking_vessel/baking_dish/earthenware, /obj/item/chems/cooking_vessel/baking_dish/earthenware, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "vA" = ( /obj/structure/table/marble, @@ -764,7 +780,7 @@ /obj/item/chems/condiment/large/salt, /obj/item/chems/condiment/flour, /obj/item/chems/condiment/sugar, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "xk" = ( /obj/structure/flora/tree/dead/mahogany, @@ -789,7 +805,7 @@ /area/shaded_hills/outside/downlands) "ya" = ( /obj/structure/reagent_dispensers/barrel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "yn" = ( /obj/structure/door/walnut, @@ -807,7 +823,7 @@ /obj/item/seeds/extracted/cabbage, /obj/item/seeds/extracted/cabbage, /obj/item/seeds/extracted/cabbage, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "yx" = ( /obj/structure/table/marble, @@ -822,11 +838,11 @@ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/farmer, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "yN" = ( /obj/structure/closet/crate/chest/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "yY" = ( /turf/floor/grass, @@ -866,7 +882,7 @@ /turf/floor/wood/walnut, /area/shaded_hills/inn) "zQ" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/general_store/porch) "Ak" = ( /turf/floor/path/basalt, @@ -878,7 +894,8 @@ /area/shaded_hills/inn) "Aq" = ( /obj/structure/working/loom/ebony, -/turf/floor/wood/walnut, +/obj/structure/wall_sconce/lantern, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "Aw" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -907,7 +924,7 @@ "AG" = ( /obj/structure/table/wood/ebony, /obj/item/bag/sack, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "AW" = ( /obj/structure/railing/mapped/wooden/walnut, @@ -918,11 +935,11 @@ /obj/structure/wall_sconce/lantern{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "Bp" = ( /obj/structure/working/butter_churn/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "Br" = ( /turf/floor/path/basalt, @@ -952,7 +969,7 @@ /area/shaded_hills/general_store) "BX" = ( /obj/structure/wall_sconce/lantern, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "Cj" = ( /obj/item/stack/material/log/mapped/walnut/twenty, @@ -964,10 +981,13 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine/kitchen) "CR" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, +/area/shaded_hills/shrine) +"CV" = ( +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Dl" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "Dn" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -979,7 +999,7 @@ /obj/item/seeds/extracted/wheat, /obj/item/seeds/extracted/wheat, /obj/item/seeds/extracted/wheat, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "Dr" = ( /obj/structure/bed/simple/ebony/cloth, @@ -990,7 +1010,7 @@ /obj/structure/bed/simple/ebony/cloth, /obj/abstract/landmark/start/shaded_hills/shrine_keeper, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Ee" = ( /turf/wall/log/walnut, @@ -1045,7 +1065,7 @@ /obj/structure/wall_sconce/lantern{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "FD" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -1093,7 +1113,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/general_store/porch) "Gu" = ( /obj/structure/table/marble, @@ -1153,7 +1173,7 @@ /area/shaded_hills/stable) "HF" = ( /obj/structure/working/spinning_wheel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "HI" = ( /turf/floor/grass, @@ -1175,7 +1195,7 @@ /obj/item/flame/candle/handmade{ pixel_y = 12 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "Ic" = ( /turf/floor/path/running_bond/basalt, @@ -1184,7 +1204,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Im" = ( /obj/structure/wall_sconce/lantern{ @@ -1199,7 +1219,7 @@ "IB" = ( /obj/structure/door/walnut, /obj/abstract/landmark/lock_preset/shaded_hills/shrine, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "IC" = ( /obj/structure/bookcase/ebony, @@ -1209,7 +1229,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "IQ" = ( /turf/wall/log/walnut/shutter/open, @@ -1246,11 +1266,11 @@ /area/shaded_hills/inn) "Jt" = ( /obj/structure/closet/cabinet/wooden/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Jw" = ( /obj/structure/bed/chair/rustic, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Jz" = ( /obj/structure/door/walnut{ @@ -1268,11 +1288,12 @@ /obj/structure/table/wood/ebony, /obj/item/ancient_surgery/cautery, /obj/item/ancient_surgery/scalpel, +/obj/structure/wall_sconce/lantern, /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine) "JU" = ( /obj/structure/railing/mapped/wooden/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Ka" = ( /mob/living/simple_animal/cow, @@ -1317,7 +1338,7 @@ "LH" = ( /obj/structure/table/wood/ebony, /obj/item/chems/glass/bucket/wood, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "LK" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -1392,7 +1413,7 @@ "Ot" = ( /obj/structure/table/wood/ebony, /obj/item/chems/cooking_vessel/pot/iron, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "ON" = ( /obj/structure/table/marble, @@ -1424,7 +1445,7 @@ /area/shaded_hills/stable) "PG" = ( /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "PQ" = ( /obj/item/food/butchery/meat/beef, @@ -1436,7 +1457,7 @@ /area/shaded_hills/slaughterhouse) "PS" = ( /obj/structure/reagent_dispensers/barrel/ebony/oil, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "Qb" = ( /turf/floor/carpet, @@ -1464,7 +1485,7 @@ dir = 8; start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "QQ" = ( /turf/wall/log/walnut, @@ -1473,7 +1494,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/general_store/porch) "QW" = ( /turf/floor/path/herringbone/basalt, @@ -1536,11 +1557,11 @@ /obj/structure/bed/chair/rustic{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Sy" = ( /obj/structure/working/spinning_wheel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "SB" = ( /obj/structure/door/walnut{ @@ -1614,7 +1635,7 @@ /obj/item/food/grown/carrot, /obj/item/food/grown/carrot, /obj/item/food/grown/cabbage, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "TR" = ( /turf/floor/dirt, @@ -1624,10 +1645,15 @@ /obj/abstract/landmark/lock_preset/shaded_hills/shrine, /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine) +"Ue" = ( +/obj/structure/door/walnut, +/obj/abstract/landmark/lock_preset/shaded_hills/farmhouse, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/farmhouse) "UD" = ( /obj/item/flame/candle/handmade, /obj/structure/table/end/alt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "US" = ( /obj/structure/bed/chair/rustic{ @@ -1649,7 +1675,7 @@ /area/shaded_hills/shrine) "VE" = ( /obj/structure/cask_rack/large/mapped, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "VM" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -1657,11 +1683,14 @@ }, /turf/floor/dirt, /area/shaded_hills/outside/shrine) +"VO" = ( +/turf/floor/wood/rough/walnut, +/area/shaded_hills/farmhouse) "VU" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "VW" = ( /obj/structure/table/marble, @@ -1680,7 +1709,7 @@ /obj/structure/table/wood/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "Wk" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -1704,7 +1733,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "WE" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -1762,7 +1791,7 @@ pixel_y = 10; start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "XM" = ( /turf/floor/carpet/red, @@ -1774,7 +1803,7 @@ /turf/wall/brick/basalt, /area/shaded_hills/shrine) "Yg" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Yj" = ( /obj/structure/meat_hook, @@ -13289,8 +13318,8 @@ EV TR LN cl -qP -qP +VO +VO yN LN TR @@ -13442,7 +13471,7 @@ TR IQ LH yJ -qP +VO yN LN TR @@ -13593,8 +13622,8 @@ EV TR LN ml -qP -qP +VO +VO gB LN TR @@ -13745,8 +13774,8 @@ EV TR LN AG -qP -qP +VO +VO ya LN zH @@ -13897,7 +13926,7 @@ VU VU LN LN -Ti +mK LN LN LN @@ -14048,8 +14077,8 @@ Ic Dl BX LN -qP -qP +VO +VO hJ Bp IQ @@ -14199,12 +14228,12 @@ EV EV Dl Dl -WO -qP -qP -qP -qP -WO +Ue +VO +VO +VO +VO +Ue TR Rl GW @@ -14353,9 +14382,9 @@ Dl lL LN hJ -qP -qP -qP +VO +VO +VO LN xW Rl @@ -18706,7 +18735,7 @@ By iK QB Dt -CR +CV QB QB QB @@ -18858,13 +18887,13 @@ By iK QB Jt -CR -PG -CR -CR -AX -CR -CR +CV +sz +CV +CV +iJ +CV +CV IB CR CR @@ -19164,10 +19193,10 @@ iK kv kv Kh -CR +CV rS QB -CR +CV rS QB CR diff --git a/maps/shaded_hills/shaded_hills-swamp.dmm b/maps/shaded_hills/shaded_hills-swamp.dmm index 0ac1cb7ad18..bbd09a8b228 100644 --- a/maps/shaded_hills/shaded_hills-swamp.dmm +++ b/maps/shaded_hills/shaded_hills-swamp.dmm @@ -3,7 +3,7 @@ /turf/wall/log/walnut/shutter/open, /area/shaded_hills/witch_hut) "bg" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "cE" = ( /turf/floor/mud/water, @@ -12,7 +12,7 @@ /obj/structure/bed/chair/wood/ebony{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "fG" = ( /obj/item/seeds/extracted/aloe, @@ -27,7 +27,7 @@ /obj/item/seeds/extracted/yarrow, /obj/item/seeds/extracted/yarrow, /obj/item/seeds/extracted/yarrow, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "hT" = ( /turf/floor/mud/water/deep, @@ -55,7 +55,7 @@ /obj/structure/closet/crate/chest/ebony, /obj/item/rock/hematite, /obj/item/rock/flint, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "oF" = ( /turf/unsimulated/dark_filler, @@ -65,7 +65,7 @@ /area/shaded_hills/caves/swamp) "pl" = ( /obj/structure/drying_rack/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "rP" = ( /obj/structure/reagent_dispensers/barrel/ebony/water, @@ -86,7 +86,7 @@ start_lit = 1 }, /obj/structure/table/end/alt/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "vZ" = ( /turf/floor/mud/water, @@ -110,7 +110,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/path/basalt, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "BY" = ( /obj/machinery/portable_atmospherics/hydroponics/soil, @@ -118,7 +118,7 @@ /area/shaded_hills/outside/swamp) "Dh" = ( /obj/item/stool/rustic, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Do" = ( /turf/unsimulated/dark_filler, @@ -135,14 +135,14 @@ /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/bucket/wood, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Ic" = ( /turf/floor/clay, /area/shaded_hills/outside/river/swamp) "KA" = ( /obj/abstract/landmark/start/shaded_hills/herbalist, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "LF" = ( /turf/wall/natural/basalt/shaded_hills, @@ -156,7 +156,7 @@ /area/shaded_hills/outside/swamp) "SE" = ( /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Ty" = ( /obj/abstract/landmark/start/shaded_hills/traveller, @@ -172,7 +172,7 @@ /obj/structure/table/desk/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Vl" = ( /obj/structure/wall_sconce/lantern{ @@ -180,7 +180,7 @@ start_lit = 1 }, /obj/structure/closet/crate/chest/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "VA" = ( /turf/wall/brick/basalt, @@ -198,7 +198,7 @@ /obj/structure/bed/simple/ebony, /obj/item/bedsheet/furs, /obj/abstract/landmark/start/shaded_hills/herbalist, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) (1,1,1) = {" diff --git a/maps/shaded_hills/shaded_hills-woods.dmm b/maps/shaded_hills/shaded_hills-woods.dmm index 569bfe9a2d1..66168daa63f 100644 --- a/maps/shaded_hills/shaded_hills-woods.dmm +++ b/maps/shaded_hills/shaded_hills-woods.dmm @@ -9,7 +9,7 @@ /area/shaded_hills/outside/woods) "cN" = ( /obj/item/bladed/knife, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "dp" = ( /turf/wall/log/walnut, @@ -41,7 +41,7 @@ /turf/wall/natural/basalt/shaded_hills, /area/shaded_hills/caves/river/woods) "lb" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "lC" = ( /turf/unsimulated/dark_filler, @@ -54,7 +54,7 @@ /area/shaded_hills/outside/river/lake) "mo" = ( /obj/structure/door/walnut, -/turf/floor/path/basalt, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "nl" = ( /turf/wall/natural/basalt/shaded_hills, @@ -80,7 +80,7 @@ "wD" = ( /obj/item/fishing_rod, /obj/structure/table/end/alt/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "xn" = ( /turf/unsimulated/mask, @@ -99,7 +99,7 @@ /area/shaded_hills/caves/unexplored/woods) "AN" = ( /obj/structure/railing/mapped/wooden/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/river/woods) "Co" = ( /obj/abstract/landmark/start/shaded_hills/traveller/learned, @@ -124,7 +124,7 @@ "Fz" = ( /obj/structure/fire_source/stove, /obj/item/stack/material/log/mapped/walnut/ten, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "GB" = ( /turf/floor/carpet/rustic, @@ -139,17 +139,17 @@ /obj/structure/bed/simple/ebony, /obj/item/bedsheet/furs, /obj/abstract/landmark/start/shaded_hills/forester, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "JI" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/river/woods) "JJ" = ( /obj/structure/meat_hook, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "LJ" = ( /turf/floor/path/running_bond/basalt, @@ -159,7 +159,7 @@ /obj/item/stack/material/bundle/grass/dry{ amount = 5 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "My" = ( /turf/floor/grass, @@ -168,14 +168,14 @@ /obj/structure/wall_sconce/lantern{ start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "MU" = ( /turf/wall/log/walnut/shutter/open, /area/shaded_hills/forester_hut) "Oi" = ( /obj/structure/closet/crate/chest/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "PO" = ( /turf/floor/mud/water/deep, @@ -185,7 +185,7 @@ /area/shaded_hills/forester_hut) "TP" = ( /obj/structure/table/desk/dresser/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "Uz" = ( /obj/effect/departure_signpost/north, diff --git a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm b/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm index d5bf78ffb07..fa4f65d3fd7 100644 --- a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm +++ b/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm @@ -4,7 +4,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "h" = ( /obj/abstract/exterior_marker/inside, @@ -40,12 +40,12 @@ /obj/item/chems/cooking_vessel/pot/iron, /obj/item/chems/glass/handmade/teapot, /obj/abstract/landmark/organize/vertical, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "m" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/oil, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "n" = ( /obj/structure/wall_sconce/lantern{ @@ -59,7 +59,7 @@ /obj/structure/table/wood/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "q" = ( /obj/structure/drying_rack/ebony, @@ -80,7 +80,7 @@ "C" = ( /obj/abstract/exterior_marker/inside, /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "F" = ( /obj/abstract/exterior_marker/inside, @@ -93,17 +93,17 @@ "I" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/water, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "J" = ( /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "K" = ( /obj/abstract/exterior_marker/inside, /obj/structure/bed/simple/ebony/cloth, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "L" = ( /obj/abstract/exterior_marker/inside, @@ -114,12 +114,12 @@ /obj/item/food/grown/carrot, /obj/item/food/grown/carrot, /obj/item/kitchen/rollingpin, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "M" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/wine, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "N" = ( /obj/abstract/exterior_marker/inside, @@ -129,7 +129,7 @@ /obj/abstract/exterior_marker/inside, /obj/structure/closet/crate/chest/ebony, /obj/random/jewelry, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) "U" = ( /obj/abstract/exterior_marker/inside, @@ -160,7 +160,7 @@ "Y" = ( /obj/abstract/exterior_marker/inside, /obj/structure/fire_source/stove, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/chemistry_shack) (1,1,1) = {" diff --git a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm b/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm index e6b329c0e90..84ac9a1af5e 100644 --- a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm +++ b/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm @@ -2,12 +2,12 @@ "a" = ( /obj/structure/door/walnut, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "g" = ( /obj/abstract/exterior_marker/inside, /obj/structure/table/end, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "h" = ( /turf/template_noop, @@ -18,17 +18,17 @@ "k" = ( /obj/structure/closet/crate/chest/ebony, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "o" = ( /obj/structure/drying_rack/ebony, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "u" = ( /obj/structure/reagent_dispensers/barrel/ebony/beer, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "x" = ( /obj/structure/table/wood/ebony, @@ -37,7 +37,7 @@ /obj/item/rock/flint, /obj/item/rock/hematite, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "z" = ( /obj/effect/spider/spiderling/mundane, @@ -47,19 +47,19 @@ pixel_y = 24 }, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "B" = ( /obj/effect/decal/cleanable/blood, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "D" = ( /obj/effect/spider/spiderling/mundane, /obj/structure/table/wood/ebony, /obj/item/food/grown/carrot, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "G" = ( /obj/abstract/exterior_marker/inside, @@ -72,16 +72,16 @@ /obj/item/food/grown/potato, /obj/item/food/grown/carrot, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "I" = ( /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "L" = ( /obj/effect/spider/spiderling/mundane, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "M" = ( /obj/abstract/exterior_marker/inside, @@ -90,12 +90,12 @@ "N" = ( /obj/abstract/exterior_marker/inside, /obj/structure/coatrack/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "T" = ( /obj/abstract/exterior_marker/inside, /obj/structure/table/desk/dresser, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) "W" = ( /obj/structure/wall_sconce/torch{ @@ -111,7 +111,7 @@ /obj/effect/decal/cleanable/blood, /obj/random/jewelry, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/point_of_interest/old_cabin) (1,1,1) = {" From 39d4960b3d50459196803c21cc99ce2c181e7aca Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 18 Dec 2024 16:16:44 +1100 Subject: [PATCH 188/554] Moving standard SS13 jobs and departments into a modpack. --- maps/exodus/exodus.dm | 22 +-- maps/exodus/exodus_departments.dm | 98 -------------- .../{jobs/_goals.dm => exodus_goals.dm} | 0 maps/ministation/jobs/civilian.dm | 67 +-------- maps/ministation/jobs/command.dm | 128 +----------------- maps/ministation/jobs/engineering.dm | 55 +------- maps/ministation/jobs/medical.dm | 26 +--- maps/ministation/jobs/science.dm | 53 +------- maps/ministation/jobs/security.dm | 49 +------ maps/ministation/jobs/synthetics.dm | 79 ----------- maps/ministation/jobs/tradehouse.dm | 2 +- maps/ministation/ministation.dm | 2 +- maps/ministation/ministation_departments.dm | 74 +--------- maps/ministation/ministation_jobs.dm | 38 +++--- maps/tradeship/jobs/_goals.dm | 5 +- maps/tradeship/jobs/civilian.dm | 17 +-- maps/tradeship/jobs/command.dm | 25 +--- maps/tradeship/jobs/engineering.dm | 120 +--------------- maps/tradeship/jobs/medical.dm | 65 +-------- maps/tradeship/jobs/science.dm | 111 +-------------- maps/tradeship/jobs/synthetics.dm | 31 ----- maps/tradeship/tradeship.dm | 3 +- maps/tradeship/tradeship_jobs.dm | 22 +-- maps/tradeship/tradeship_spawnpoints.dm | 4 +- mods/content/standard_jobs/_standard_jobs.dm | 2 + mods/content/standard_jobs/_standard_jobs.dme | 30 ++++ .../standard_jobs/departments/civilian.dm | 4 + .../standard_jobs/departments/command.dm | 14 ++ .../standard_jobs/departments/engineering.dm | 12 ++ .../standard_jobs/departments/medical.dm | 13 ++ .../departments/miscellaneous.dm | 4 + .../standard_jobs/departments/science.dm | 18 +++ .../standard_jobs/departments/security.dm | 12 ++ .../standard_jobs/departments/service.dm | 6 + .../standard_jobs/departments/supply.dm | 8 ++ .../content/standard_jobs}/jobs/captain.dm | 0 .../content/standard_jobs}/jobs/civilian.dm | 5 + .../standard_jobs}/jobs/engineering.dm | 0 .../content/standard_jobs}/jobs/medical.dm | 3 +- .../content/standard_jobs}/jobs/science.dm | 0 .../content/standard_jobs}/jobs/security.dm | 0 .../content/standard_jobs}/jobs/synthetics.dm | 0 .../content/standard_jobs}/outfits/cargo.dm | 0 .../standard_jobs}/outfits/civilian.dm | 0 .../content/standard_jobs}/outfits/command.dm | 0 .../standard_jobs}/outfits/engineering.dm | 0 .../content/standard_jobs}/outfits/medical.dm | 0 .../content/standard_jobs/outfits/pda.dm | 0 .../content/standard_jobs}/outfits/science.dm | 0 .../standard_jobs}/outfits/security.dm | 0 50 files changed, 206 insertions(+), 1021 deletions(-) delete mode 100644 maps/exodus/exodus_departments.dm rename maps/exodus/{jobs/_goals.dm => exodus_goals.dm} (100%) delete mode 100644 maps/ministation/jobs/synthetics.dm delete mode 100644 maps/tradeship/jobs/synthetics.dm create mode 100644 mods/content/standard_jobs/_standard_jobs.dm create mode 100644 mods/content/standard_jobs/_standard_jobs.dme create mode 100644 mods/content/standard_jobs/departments/civilian.dm create mode 100644 mods/content/standard_jobs/departments/command.dm create mode 100644 mods/content/standard_jobs/departments/engineering.dm create mode 100644 mods/content/standard_jobs/departments/medical.dm create mode 100644 mods/content/standard_jobs/departments/miscellaneous.dm create mode 100644 mods/content/standard_jobs/departments/science.dm create mode 100644 mods/content/standard_jobs/departments/security.dm create mode 100644 mods/content/standard_jobs/departments/service.dm create mode 100644 mods/content/standard_jobs/departments/supply.dm rename {maps/exodus => mods/content/standard_jobs}/jobs/captain.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/jobs/civilian.dm (98%) rename {maps/exodus => mods/content/standard_jobs}/jobs/engineering.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/jobs/medical.dm (99%) rename {maps/exodus => mods/content/standard_jobs}/jobs/science.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/jobs/security.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/jobs/synthetics.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/outfits/cargo.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/outfits/civilian.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/outfits/command.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/outfits/engineering.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/outfits/medical.dm (100%) rename maps/exodus/outfits/_pda.dm => mods/content/standard_jobs/outfits/pda.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/outfits/science.dm (100%) rename {maps/exodus => mods/content/standard_jobs}/outfits/security.dm (100%) diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index a8aee1db817..9372a9368a7 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -25,6 +25,9 @@ // Must come after borers for compatibility. #include "../../mods/content/psionics/_psionics.dme" + // Must come after psionics for counsellor compatibility. + #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/species/ascent/_ascent.dme" #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/species/serpentid/_serpentid.dme" @@ -49,30 +52,13 @@ #include "../away/unishi/unishi.dm" #include "../away/yacht/yacht.dm" - #include "jobs/_goals.dm" - #include "jobs/captain.dm" - #include "jobs/civilian.dm" - #include "jobs/engineering.dm" - #include "jobs/medical.dm" - #include "jobs/science.dm" - #include "jobs/security.dm" - #include "jobs/synthetics.dm" - - #include "outfits/_pda.dm" - #include "outfits/cargo.dm" - #include "outfits/civilian.dm" - #include "outfits/command.dm" - #include "outfits/engineering.dm" - #include "outfits/medical.dm" - #include "outfits/science.dm" - #include "outfits/security.dm" + #include "exodus_goals.dm" #include "exodus_announcements.dm" #include "exodus_antagonism.dm" #include "exodus_cameras.dm" #include "exodus_areas.dm" #include "exodus_elevator.dm" - #include "exodus_departments.dm" #include "exodus_jobs.dm" #include "exodus_loadout.dm" #include "exodus_overmap.dm" diff --git a/maps/exodus/exodus_departments.dm b/maps/exodus/exodus_departments.dm deleted file mode 100644 index 3a76c9b958f..00000000000 --- a/maps/exodus/exodus_departments.dm +++ /dev/null @@ -1,98 +0,0 @@ -/decl/department/engineering - name = "Engineering" - announce_channel = "Engineering" - colour = "#ffa500" - display_priority = 4 - display_color = "#fff5cc" - -/obj/item/robot_module/engineering - associated_department = /decl/department/engineering - -/obj/machinery/network/pager/engineering - department = /decl/department/engineering - -/decl/department/security - name = "Security" - announce_channel = "Security" - colour = "#dd0000" - display_priority = 3 - display_color = "#ffddf0" - -/obj/item/robot_module/security - associated_department = /decl/department/security - -/obj/machinery/network/pager/security - department = /decl/department/security - -/decl/department/medical - name = "Medical" - goals = list(/datum/goal/department/medical_fatalities) - announce_channel = "Medical" - colour = "#008000" - display_priority = 2 - display_color = "#ffeef0" - -/obj/item/robot_module/medical - associated_department = /decl/department/medical - -/obj/machinery/network/pager/medical - department = /decl/department/medical - -/decl/department/science - name = "Science" - goals = list(/datum/goal/department/extract_slime_cores) - announce_channel = "Science" - colour = "#a65ba6" - display_color = "#e79fff" - -/obj/item/robot_module/research - associated_department = /decl/department/science - -/obj/machinery/network/pager/science - department = /decl/department/science - -/decl/department/civilian - name = "Civilian" - display_priority = 1 - display_color = "#dddddd" - -/decl/department/command - name = "Command" - colour = "#800080" - display_priority = 5 - display_color = "#ccccff" - -/obj/machinery/network/pager - department = /decl/department/command - -/decl/department/miscellaneous - name = "Misc" - display_priority = -1 - display_color = "#ccffcc" - -/decl/department/service - name = "Service" - announce_channel = "Service" - colour = "#88b764" - display_color = "#d0f0c0" - -/decl/department/supply - name = "Supply" - announce_channel = "Supply" - colour = "#bb9040" - display_color = "#f0e68c" - -/obj/machinery/network/pager/cargo - department = /decl/department/supply - -/decl/department/support - name = "Support" - announce_channel = "Command" - colour = "#800080" - display_color = "#87ceeb" - -/decl/department/exploration - name = "Exploration" - announce_channel = "Exploration" - colour = "#68099e" - display_color = "#b784a7" diff --git a/maps/exodus/jobs/_goals.dm b/maps/exodus/exodus_goals.dm similarity index 100% rename from maps/exodus/jobs/_goals.dm rename to maps/exodus/exodus_goals.dm diff --git a/maps/ministation/jobs/civilian.dm b/maps/ministation/jobs/civilian.dm index 432d3455d21..3d1601530d6 100644 --- a/maps/ministation/jobs/civilian.dm +++ b/maps/ministation/jobs/civilian.dm @@ -1,26 +1,15 @@ -/datum/job/ministation/assistant +/datum/job/assistant/ministation title = "Recruit" - total_positions = -1 - spawn_positions = -1 supervisors = "absolutely everyone" - economic_power = 1 - access = list() - minimal_access = list() - hud_icon = "hudassistant" alt_titles = list("Technical Recruit","Medical Recruit","Research Recruit","Visitor") outfit_type = /decl/outfit/job/ministation_assistant - department_types = list(/decl/department/civilian) event_categories = list(ASSIGNMENT_GARDENER) - -/datum/job/ministation/assistant/get_access() - if(get_config_value(/decl/config/toggle/assistant_maint)) - return list(access_maint_tunnels) - return list() + hud_icon = "hudassistant" /decl/outfit/job/ministation_assistant name = "Job - Ministation Assistant" -/datum/job/ministation/bartender +/datum/job/bartender/ministation title = "Bartender" alt_titles = list("Cook","Barista") supervisors = "the Lieutenant and the Captain" @@ -30,16 +19,6 @@ department_types = list(/decl/department/service) selection_color = "#3fbe4a" economic_power = 5 - access = list( - access_hydroponics, - access_bar, - access_kitchen - ) - minimal_access = list( - access_hydroponics, - access_bar, - access_kitchen - ) min_skill = list( SKILL_COOKING = SKILL_ADEPT, SKILL_BOTANY = SKILL_BASIC, @@ -51,14 +30,13 @@ ) skill_points = 30 -/datum/job/ministation/cargo +/datum/job/cargo_tech/ministation title = "Cargo Technician" alt_titles = list("Shaft Miner","Drill Technician","Prospector") supervisors = "the Lieutenant and the Captain" total_positions = 3 spawn_positions = 1 outfit_type = /decl/outfit/job/ministation/cargo - department_types = list(/decl/department/service) selection_color = "#8a7c00" economic_power = 5 access = list( @@ -94,57 +72,24 @@ SKILL_FINANCE = SKILL_MAX ) skill_points = 30 - software_on_spawn = list( - /datum/computer_file/program/supply, - /datum/computer_file/program/deck_management, - /datum/computer_file/program/reports - ) -/datum/job/ministation/janitor - title = "Janitor" - event_categories = list(ASSIGNMENT_JANITOR) - department_types = list(/decl/department/service) +/datum/job/janitor/ministation total_positions = 2 - spawn_positions = 1 supervisors = "the Lieutenant and the Captain" economic_power = 3 selection_color = "#940088" - access = list( - access_janitor, - access_maint_tunnels, - access_engine, - access_research, - access_sec_doors, - access_medical - ) - minimal_access = list( - access_janitor, - access_maint_tunnels, - access_engine, - access_research, - access_sec_doors, - access_medical - ) - alt_titles = list( - "Custodian", - "Sanitation Technician" - ) outfit_type = /decl/outfit/job/ministation/janitor min_skill = list( SKILL_HAULING = SKILL_BASIC ) skill_points = 28 -/datum/job/ministation/librarian - title = "Librarian" - department_types = list(/decl/department/service) - total_positions = 1 +/datum/job/librarian/ministation spawn_positions = 2 supervisors = "the Lieutenant, the Captain, and the smell of old paper" economic_power = 5 selection_color = "#008800" access = list(access_library) - minimal_access = list(access_library) alt_titles = list( "Curator", "Archivist" diff --git a/maps/ministation/jobs/command.dm b/maps/ministation/jobs/command.dm index 7424f7724a5..a823a716095 100644 --- a/maps/ministation/jobs/command.dm +++ b/maps/ministation/jobs/command.dm @@ -1,5 +1,4 @@ -/datum/job/ministation/captain - title = "Captain" +/datum/job/captain/ministation supervisors = "your profit margin, your conscience, and the watchful eye of the Tradehouse Rep" outfit_type = /decl/outfit/job/ministation/captain min_skill = list( @@ -13,30 +12,12 @@ SKILL_WEAPONS = SKILL_MAX ) skill_points = 40 - head_position = 1 - department_types = list(/decl/department/command) - total_positions = 1 - spawn_positions = 1 - selection_color = "#1d1d4f" - hud_icon = "hudcaptain" - req_admin_notify = 1 - access = list() - minimal_access = list() - minimal_player_age = 14 - economic_power = 20 - ideal_character_age = 70 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 -/datum/job/ministation/captain/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/captain/ministation/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/freetradeunion_rename_company -/datum/job/ministation/captain/get_access() - return get_all_station_access() - /mob/proc/freetradeunion_rename_company() set name = "Defect from Tradehouse" set category = "Captain's Powers" @@ -52,113 +33,10 @@ command_announcement.Announce("Congratulations to all members of [capitalize(global.using_map.company_name)] on the new name. Their rebranding has changed the [global.using_map.company_short] market value by [0.01*rand(-10,10)]%.", "Trade Union Name Change") verbs -= /mob/proc/freetradeunion_rename_company -/datum/job/ministation/hop +/datum/job/hop/ministation title = "Lieutenant" - supervisors = "the Captain" outfit_type = /decl/outfit/job/ministation/hop - head_position = 1 - department_types = list( - /decl/department/command, - /decl/department/civilian - ) - total_positions = 1 - spawn_positions = 1 - selection_color = "#2f2f7f" hud_icon = "hudlieutenant" - req_admin_notify = 1 - minimal_player_age = 14 - economic_power = 10 - ideal_character_age = 50 - guestbanned = 1 - not_random_selectable = 1 - access = list( - access_security, - access_sec_doors, - access_brig, - access_forensics_lockers, - access_armory, - access_heads, - access_medical, - access_engine, - access_atmospherics, - access_change_ids, - access_ai_upload, - access_eva, - access_bridge, - access_all_personal_lockers, - access_maint_tunnels, - access_bar, - access_janitor, - access_construction, - access_morgue, - access_crematorium, - access_kitchen, - access_mining, - access_xenobiology, - access_robotics, - access_engine_equip, - access_cargo, - access_cargo_bot, - access_mailsorting, - access_qm, - access_hydroponics, - access_lawyer, - access_chapel_office, - access_library, - access_research, - access_mining, - access_heads_vault, - access_mining_station, - access_hop, - access_RC_announce, - access_keycard_auth, - access_gateway, - access_cameras - ) - minimal_access = list( - access_security, - access_sec_doors, - access_brig, - access_forensics_lockers, - access_armory, - access_heads, - access_medical, - access_engine, - access_atmospherics, - access_change_ids, - access_ai_upload, - access_eva, - access_bridge, - access_all_personal_lockers, - access_maint_tunnels, - access_bar, - access_janitor, - access_construction, - access_mining, - access_xenobiology, - access_robotics, - access_engine_equip, - access_morgue, - access_crematorium, - access_kitchen, - access_cargo, - access_cargo_bot, - access_mailsorting, - access_qm, - access_hydroponics, - access_lawyer, - access_chapel_office, - access_library, - access_research, - access_mining, - access_heads_vault, - access_mining_station, - access_hop, - access_RC_announce, - access_keycard_auth, - access_gateway, - access_cameras - ) min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_WEAPONS = SKILL_BASIC, diff --git a/maps/ministation/jobs/engineering.dm b/maps/ministation/jobs/engineering.dm index b3d12fd6afa..d780f2353d2 100644 --- a/maps/ministation/jobs/engineering.dm +++ b/maps/ministation/jobs/engineering.dm @@ -1,12 +1,9 @@ -/datum/job/ministation/engineer +/datum/job/engineer/ministation title = "Station Engineer" supervisors = "the Head Engineer" total_positions = 2 spawn_positions = 2 outfit_type = /decl/outfit/job/ministation/engineer - department_types = list(/decl/department/engineering) - selection_color = "#5b4d20" - economic_power = 5 minimal_player_age = 3 access = list( access_eva, @@ -32,41 +29,11 @@ access_emergency_storage, access_cameras ) - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_EVA = SKILL_BASIC, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_BASIC, - SKILL_ATMOS = SKILL_BASIC, - SKILL_ENGINES = SKILL_BASIC - ) - max_skill = list( - SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX - ) skill_points = 30 alt_titles = list("Atmospheric Technician", "Electrician", "Maintenance Technician") - event_categories = list(ASSIGNMENT_ENGINEER) -/datum/job/ministation/engineer/head +/datum/job/chief_engineer/ministation title = "Head Engineer" - head_position = 1 - department_types = list( - /decl/department/engineering, - /decl/department/command - ) - total_positions = 1 - spawn_positions = 1 - selection_color = "#7f6e2c" - req_admin_notify = 1 - economic_power = 10 - ideal_character_age = 50 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 hud_icon = "hudchiefengineer" access = list( access_engine, @@ -116,24 +83,6 @@ access_ai_upload, access_cameras ) - minimal_player_age = 14 - supervisors = "the Captain" outfit_type = /decl/outfit/job/ministation/chief_engineer - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_ADEPT, - SKILL_EVA = SKILL_ADEPT, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_ADEPT, - SKILL_ATMOS = SKILL_ADEPT, - SKILL_ENGINES = SKILL_EXPERT - ) - max_skill = list( - SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX - ) skill_points = 40 alt_titles = list("Chief of Engineering") - event_categories = list(ASSIGNMENT_ENGINEER) \ No newline at end of file diff --git a/maps/ministation/jobs/medical.dm b/maps/ministation/jobs/medical.dm index 00c298a4c01..0e91a2d945b 100644 --- a/maps/ministation/jobs/medical.dm +++ b/maps/ministation/jobs/medical.dm @@ -1,7 +1,5 @@ -/datum/job/ministation/doctor +/datum/job/doctor/ministation title = "Medical Doctor" - department_types = list(/decl/department/medical) - head_position = 0 supervisors = "the Head Doctor" total_positions = 2 spawn_positions = 2 @@ -18,8 +16,6 @@ SKILL_ANATOMY = SKILL_MAX, SKILL_CHEMISTRY = SKILL_MAX ) - selection_color = "#013d3b" - economic_power = 7 access = list( access_medical, access_medical_equip, @@ -38,28 +34,13 @@ access_cameras ) outfit_type = /decl/outfit/job/ministation/doctor - minimal_player_age = 3 - event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/ministation/doctor/head +/datum/job/cmo/ministation title = "Head Doctor" - head_position = 1 - department_types = list( - /decl/department/medical, - /decl/department/command - ) supervisors = "the Captain and your own ethics" outfit_type = /decl/outfit/job/ministation/doctor/head alt_titles = list("Chief Medical Officer", "Head Surgeon") - total_positions = 1 - spawn_positions = 1 skill_points = 38 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - selection_color = "#026865" - req_admin_notify = 1 - economic_power = 10 hud_icon = "hudheaddoctor" access = list( access_medical, @@ -113,6 +94,3 @@ access_external_airlocks, access_cameras ) - minimal_player_age = 14 - ideal_character_age = 50 - event_categories = list(ASSIGNMENT_MEDICAL) \ No newline at end of file diff --git a/maps/ministation/jobs/science.dm b/maps/ministation/jobs/science.dm index f9bcb575468..f2d80cbe65f 100644 --- a/maps/ministation/jobs/science.dm +++ b/maps/ministation/jobs/science.dm @@ -1,49 +1,15 @@ -/datum/job/ministation/scientist +/datum/job/scientist/ministation title = "Researcher" alt_titles = list("Scientist","Xenobiologist","Roboticist","Xenobotanist") supervisors = "the Head Researcher" spawn_positions = 1 total_positions = 2 - department_types = list(/decl/department/science) outfit_type = /decl/outfit/job/ministation/scientist hud_icon = "hudscientist" - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_DEVICES = SKILL_BASIC, - SKILL_SCIENCE = SKILL_ADEPT - ) - max_skill = list( - SKILL_ANATOMY = SKILL_MAX, - SKILL_DEVICES = SKILL_MAX, - SKILL_SCIENCE = SKILL_MAX - ) skill_points = 34 - access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - minimal_access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - selection_color = "#633d63" - economic_power = 7 - event_categories = list(ASSIGNMENT_SCIENTIST) -/datum/job/ministation/scientist/head +/datum/job/rd/ministation title = "Research Director" - supervisors = "the Captain" - spawn_positions = 1 - total_positions = 1 alt_titles = list("Head Researcher", "Chief Researcher") outfit_type = /decl/outfit/job/ministation/scientist/head min_skill = list( @@ -61,14 +27,6 @@ SKILL_SCIENCE = SKILL_MAX ) skill_points = 40 - head_position = 1 - department_types = list( - /decl/department/science, - /decl/department/command - ) - selection_color = "#ad6bad" - req_admin_notify = 1 - economic_power = 15 hud_icon = "hudheadscientist" access = list( access_rd, @@ -124,10 +82,3 @@ access_network, access_cameras ) - minimal_player_age = 14 - ideal_character_age = 50 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - event_categories = list(ASSIGNMENT_SCIENTIST) - diff --git a/maps/ministation/jobs/security.dm b/maps/ministation/jobs/security.dm index ac68182cff2..55ea8e841e2 100644 --- a/maps/ministation/jobs/security.dm +++ b/maps/ministation/jobs/security.dm @@ -1,14 +1,10 @@ -/datum/job/ministation/security +/datum/job/officer/ministation title = "Security Officer" alt_titles = list("Warden") - supervisors = "the Head of Security" spawn_positions = 1 total_positions = 2 outfit_type = /decl/outfit/job/ministation/security - department_types = list(/decl/department/security) - selection_color = "#990000" economic_power = 7 - minimal_player_age = 7 access = list( access_security, access_brig, @@ -24,28 +20,14 @@ access_brig, access_cameras ) - min_skill = list( - SKILL_LITERACY = SKILL_BASIC, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_COMBAT = SKILL_BASIC, - SKILL_WEAPONS = SKILL_BASIC - ) - max_skill = list( - SKILL_COMBAT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX - ) skill_points = 30 - event_categories = list(ASSIGNMENT_SECURITY) -/datum/job/ministation/detective - title = "Detective" +/datum/job/detective/ministation alt_titles = list("Inspector") supervisors = "Justice... and the Trademaster" spawn_positions = 1 total_positions = 1 outfit_type = /decl/outfit/job/ministation/detective - department_types = list(/decl/department/security) - selection_color = "#630000" economic_power = 7 minimal_player_age = 3 access = list( @@ -71,31 +53,10 @@ SKILL_WEAPONS = SKILL_BASIC, SKILL_FORENSICS = SKILL_ADEPT ) - max_skill = list( - SKILL_COMBAT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX, - SKILL_FORENSICS = SKILL_MAX - ) skill_points = 34 -/datum/job/ministation/security/head - title = "Head of Security" - supervisors = "the Captain" +/datum/job/hos/ministation outfit_type = /decl/outfit/job/ministation/security/head - head_position = 1 - department_types = list( - /decl/department/security, - /decl/department/command - ) - total_positions = 1 - spawn_positions = 1 - selection_color = "#9d2300" - req_admin_notify = 1 - minimal_player_age = 14 - economic_power = 10 - ideal_character_age = 50 - guestbanned = 1 - not_random_selectable = 1 hud_icon = "hudhos" access = list( access_security, @@ -139,9 +100,5 @@ SKILL_COMBAT = SKILL_ADEPT, SKILL_WEAPONS = SKILL_ADEPT ) - max_skill = list( - SKILL_COMBAT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX - ) skill_points = 40 alt_titles = list("Security Commander") diff --git a/maps/ministation/jobs/synthetics.dm b/maps/ministation/jobs/synthetics.dm deleted file mode 100644 index 1aea5738c90..00000000000 --- a/maps/ministation/jobs/synthetics.dm +++ /dev/null @@ -1,79 +0,0 @@ -/datum/job/ministation/robot - title = "Robot" - event_categories = list(ASSIGNMENT_ROBOT) - total_positions = 1 - spawn_positions = 1 - supervisors = "your laws, the Lieutenant, and the Captain" - selection_color = "#254c25" - minimal_player_age = 7 - account_allowed = 0 - economic_power = 0 - loadout_allowed = FALSE - outfit_type = /decl/outfit/job/silicon/cyborg - hud_icon = "hudblank" - skill_points = 0 - no_skill_buffs = TRUE - guestbanned = 1 - not_random_selectable = 1 - skip_loadout_preview = TRUE - department_types = list(/decl/department/miscellaneous) - -/datum/job/ministation/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) - if(H) - return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) - -/datum/job/ministation/robot/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) - return !!H - -/datum/job/ministation/robot/New() - ..() - alt_titles = SSrobots.robot_alt_titles.Copy() - alt_titles -= title - -/datum/job/computer - title = "Computer" - event_categories = list(ASSIGNMENT_COMPUTER) - total_positions = 0 // Not used for AI, see is_position_available below and modules/mob/living/silicon/ai/latejoin.dm - spawn_positions = 1 - selection_color = "#3f823f" - supervisors = "your laws" - req_admin_notify = 1 - minimal_player_age = 7 - account_allowed = 0 - economic_power = 0 - outfit_type = /decl/outfit/job/silicon/ai - loadout_allowed = FALSE - hud_icon = "hudblank" - skill_points = 0 - no_skill_buffs = TRUE - guestbanned = 1 - not_random_selectable = 1 - skip_loadout_preview = TRUE - department_types = list(/decl/department/miscellaneous) - -/datum/job/computer/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) - return !!H - -/datum/job/computer/is_position_available() - return (empty_playable_ai_cores.len != 0) - -/datum/job/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) - return H - -/datum/job/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) - character = character.AIize(move = FALSE) - - // is_available for AI checks that there is an empty core available in this list - var/obj/structure/aicore/deactivated/C = empty_playable_ai_cores[1] - empty_playable_ai_cores -= C - - character.forceMove(C.loc) - var/mob/living/silicon/ai/A = character - A.on_mob_init() - - if(latejoin) - new_player_mob.AnnounceCyborg(character, title, "has been downloaded to the empty core in \the [get_area_name(src)]") - SSticker.mode.handle_latejoin(character) - - qdel(C) - return TRUE diff --git a/maps/ministation/jobs/tradehouse.dm b/maps/ministation/jobs/tradehouse.dm index ed057b4fb20..1e167615cf8 100644 --- a/maps/ministation/jobs/tradehouse.dm +++ b/maps/ministation/jobs/tradehouse.dm @@ -1,4 +1,4 @@ -/datum/job/ministation/tradehouse/rep +/datum/job/tradehouse_rep title = "Tradehouse Representative" alt_titles = list("Narc") hud_icon = "hudnarc" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 84b2105a501..2ecca91fa60 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -25,6 +25,7 @@ Twice... #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/content/corporate/_corporate.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" @@ -84,7 +85,6 @@ Twice... #include "jobs/security.dm" #include "jobs/science.dm" #include "jobs/tradehouse.dm" - #include "jobs/synthetics.dm" #include "outfits/_outfits.dm" #include "outfits/command.dm" diff --git a/maps/ministation/ministation_departments.dm b/maps/ministation/ministation_departments.dm index 06aa658ad79..206042093ee 100644 --- a/maps/ministation/ministation_departments.dm +++ b/maps/ministation/ministation_departments.dm @@ -1,78 +1,6 @@ -/decl/department/service - name = "Service" - announce_channel = "Service" - colour = "#88b764" - display_color = "#d0f0c0" - -/decl/department/command - name = "Command" - colour = "#800080" - display_priority = 5 - display_color = "#ccccff" - -/obj/machinery/network/pager - department = /decl/department/command - -/decl/department/civilian - name = "Civilian" - display_priority = 1 - display_color = "#dddddd" - -/decl/department/engineering - name = "Engineering" - announce_channel = "Engineering" - colour = "#ffa500" - display_priority = 2 - display_color = "#fff5cc" - -/decl/department/medical - name = "Medical" - goals = list(/datum/goal/department/medical_fatalities) - announce_channel = "Medical" - colour = "#008000" - display_priority = 3 - display_color = "#ffeef0" - -/obj/item/robot_module/medical - associated_department = /decl/department/medical - -/obj/machinery/network/pager/medical - department = /decl/department/medical - -/decl/department/science - name = "Science" - goals = list(/datum/goal/department/extract_slime_cores) - announce_channel = "Science" - colour = "#a65ba6" - display_color = "#e79fff" - -/obj/item/robot_module/research - associated_department = /decl/department/science - -/obj/machinery/network/pager/science - department = /decl/department/science - -/decl/department/security - name = "Security" - announce_channel = "Security" - colour = "#dd0000" - display_priority = 4 - display_color = "#ffddf0" - -/obj/item/robot_module/security - associated_department = /decl/department/security - -/obj/machinery/network/pager/security - department = /decl/department/security - -/decl/department/miscellaneous - name = "Misc" - display_priority = -1 - display_color = "#ccffcc" - /decl/department/tradehouse name = "Tradehouse" announce_channel = "Tradehouse" colour = "#b98f03" display_priority = 4 - display_color = "#ffddf0" \ No newline at end of file + display_color = "#ffddf0" diff --git a/maps/ministation/ministation_jobs.dm b/maps/ministation/ministation_jobs.dm index b8db846a435..92e28630c1f 100644 --- a/maps/ministation/ministation_jobs.dm +++ b/maps/ministation/ministation_jobs.dm @@ -1,25 +1,25 @@ /datum/map/ministation - default_job_type = /datum/job/ministation/assistant + default_job_type = /datum/job/assistant/ministation default_department_type = /decl/department/civilian id_hud_icons = 'maps/ministation/hud.dmi' allowed_jobs = list( - /datum/job/ministation/assistant, - /datum/job/ministation/bartender, - /datum/job/ministation/captain, - /datum/job/ministation/cargo, - /datum/job/ministation/robot, + /datum/job/assistant/ministation, + /datum/job/bartender/ministation, + /datum/job/captain/ministation, + /datum/job/cargo_tech/ministation, + /datum/job/robot, /datum/job/computer, - /datum/job/ministation/detective, - /datum/job/ministation/doctor, - /datum/job/ministation/doctor/head, - /datum/job/ministation/engineer, - /datum/job/ministation/engineer/head, - /datum/job/ministation/hop, - /datum/job/ministation/janitor, - /datum/job/ministation/scientist, - /datum/job/ministation/scientist/head, - /datum/job/ministation/security, - /datum/job/ministation/security/head, - /datum/job/ministation/librarian, - /datum/job/ministation/tradehouse/rep + /datum/job/detective/ministation, + /datum/job/doctor/ministation, + /datum/job/cmo/ministation, + /datum/job/engineer/ministation, + /datum/job/chief_engineer/ministation, + /datum/job/hop/ministation, + /datum/job/janitor/ministation, + /datum/job/scientist/ministation, + /datum/job/rd/ministation, + /datum/job/officer/ministation, + /datum/job/hos/ministation, + /datum/job/librarian/ministation, + /datum/job/tradehouse_rep ) \ No newline at end of file diff --git a/maps/tradeship/jobs/_goals.dm b/maps/tradeship/jobs/_goals.dm index c0c13ad937d..e9d719bd211 100644 --- a/maps/tradeship/jobs/_goals.dm +++ b/maps/tradeship/jobs/_goals.dm @@ -25,7 +25,10 @@ var/global/list/tradeship_paperwork_end_areas = list() /datum/goal/department/paperwork/tradeship paperwork_types = list(/obj/item/paperwork/tradeship) - signatory_job_list = list(/datum/job/tradeship_captain, /datum/job/tradeship_first_mate) + signatory_job_list = list( + /datum/job/captain/tradeship, + /datum/job/tradeship_first_mate + ) /datum/goal/department/paperwork/tradeship/get_paper_spawn_turfs() return global.tradeship_paperwork_spawn_turfs diff --git a/maps/tradeship/jobs/civilian.dm b/maps/tradeship/jobs/civilian.dm index c15bb5c5a77..f491bc953a3 100644 --- a/maps/tradeship/jobs/civilian.dm +++ b/maps/tradeship/jobs/civilian.dm @@ -1,21 +1,10 @@ -/datum/job/tradeship_deckhand +/datum/job/assistant/tradeship title = "Deck Hand" - total_positions = -1 - spawn_positions = -1 supervisors = "literally everyone, you bottom feeder" outfit_type = /decl/outfit/job/tradeship/hand alt_titles = list( "Cook" = /decl/outfit/job/tradeship/hand/cook, "Cargo Hand", - "Passenger") - department_types = list(/decl/department/civilian) - economic_power = 1 - access = list() - minimal_access = list() + "Passenger" + ) event_categories = list(ASSIGNMENT_GARDENER, ASSIGNMENT_JANITOR) - -/datum/job/tradeship_deckhand/get_access() - if(get_config_value(/decl/config/toggle/assistant_maint)) - return list(access_maint_tunnels) - else - return list() diff --git a/maps/tradeship/jobs/command.dm b/maps/tradeship/jobs/command.dm index a6d37fe665e..0d124a9841e 100644 --- a/maps/tradeship/jobs/command.dm +++ b/maps/tradeship/jobs/command.dm @@ -1,4 +1,4 @@ -/datum/job/tradeship_captain +/datum/job/captain/tradeship title = "Captain" supervisors = "your profit margin, your conscience, and the Trademaster" outfit_type = /decl/outfit/job/tradeship/captain @@ -8,36 +8,15 @@ SKILL_SCIENCE = SKILL_ADEPT, SKILL_PILOT = SKILL_ADEPT ) - max_skill = list( - SKILL_PILOT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX - ) - skill_points = 30 - head_position = 1 - department_types = list(/decl/department/command) - total_positions = 1 - spawn_positions = 1 - selection_color = "#1d1d4f" - req_admin_notify = 1 - access = list() - minimal_access = list() - minimal_player_age = 14 - economic_power = 20 ideal_character_age = 70 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 forced_spawnpoint = /decl/spawnpoint/cryo/captain -/datum/job/tradeship_captain/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/captain/tradeship/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/tradehouse_rename_ship H.verbs |= /mob/proc/tradehouse_rename_company -/datum/job/tradeship_captain/get_access() - return get_all_station_access() - /mob/proc/tradehouse_rename_ship() set name = "Rename Tradeship" set category = "Captain's Powers" diff --git a/maps/tradeship/jobs/engineering.dm b/maps/tradeship/jobs/engineering.dm index 1586944c1bf..1938f034a31 100644 --- a/maps/tradeship/jobs/engineering.dm +++ b/maps/tradeship/jobs/engineering.dm @@ -1,126 +1,10 @@ -/datum/job/tradeship_engineer +/datum/job/engineer/tradeship title = "Junior Engineer" supervisors = "the Head Engineer" outfit_type = /decl/outfit/job/tradeship/hand/engine - department_types = list(/decl/department/engineering) - total_positions = 8 - spawn_positions = 7 - selection_color = "#5b4d20" - economic_power = 5 - minimal_player_age = 7 - access = list( - access_eva, - access_engine, - access_engine_equip, - access_tech_storage, - access_maint_tunnels, - access_external_airlocks, - access_construction, - access_atmospherics, - access_emergency_storage - ) - minimal_access = list( - access_eva, - access_engine, - access_engine_equip, - access_tech_storage, - access_maint_tunnels, - access_external_airlocks, - access_construction, - access_atmospherics, - access_emergency_storage - ) - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_EVA = SKILL_BASIC, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_BASIC, - SKILL_ATMOS = SKILL_BASIC, - SKILL_ENGINES = SKILL_BASIC - ) - max_skill = list( - SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX - ) - skill_points = 20 alt_titles = list() - event_categories = list(ASSIGNMENT_ENGINEER) -/datum/job/tradeship_engineer/head +/datum/job/chief_engineer/tradeship title = "Head Engineer" - head_position = 1 - department_types = list( - /decl/department/engineering, - /decl/department/command - ) - total_positions = 1 - spawn_positions = 1 - selection_color = "#7f6e2c" - req_admin_notify = 1 - economic_power = 10 - ideal_character_age = 50 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - access = list( - access_engine, - access_engine_equip, - access_tech_storage, - access_maint_tunnels, - access_heads, - access_teleporter, - access_external_airlocks, - access_atmospherics, - access_emergency_storage, - access_eva, - access_bridge, - access_construction, access_sec_doors, - access_ce, - access_RC_announce, - access_keycard_auth, - access_tcomsat, - access_ai_upload - ) - minimal_access = list( - access_engine, - access_engine_equip, - access_tech_storage, - access_maint_tunnels, - access_heads, - access_teleporter, - access_external_airlocks, - access_atmospherics, - access_emergency_storage, - access_eva, - access_bridge, - access_construction, - access_sec_doors, - access_ce, access_RC_announce, - access_keycard_auth, - access_tcomsat, - access_ai_upload - ) - minimal_player_age = 14 - supervisors = "the Captain" outfit_type = /decl/outfit/job/tradeship/chief_engineer - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_ADEPT, - SKILL_EVA = SKILL_ADEPT, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_ADEPT, - SKILL_ATMOS = SKILL_ADEPT, - SKILL_ENGINES = SKILL_EXPERT - ) - max_skill = list( - SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX - ) - skill_points = 30 alt_titles = list() - event_categories = list(ASSIGNMENT_ENGINEER) diff --git a/maps/tradeship/jobs/medical.dm b/maps/tradeship/jobs/medical.dm index 55ff9ea2f1c..03b480321b8 100644 --- a/maps/tradeship/jobs/medical.dm +++ b/maps/tradeship/jobs/medical.dm @@ -1,9 +1,8 @@ -/datum/job/tradeship_doctor +/datum/job/doctor/tradeship title = "Junior Doctor" - department_types = list(/decl/department/medical) - head_position = 0 supervisors = "the Head Doctor and the Captain" alt_titles = list() + // Slightly beefier skills due to smaller crew. skill_points = 24 min_skill = list( SKILL_LITERACY = SKILL_ADEPT, @@ -16,11 +15,6 @@ SKILL_ANATOMY = SKILL_MAX, SKILL_CHEMISTRY = SKILL_MAX ) - minimal_player_age = 3 - total_positions = 5 - spawn_positions = 3 - selection_color = "#013d3b" - economic_power = 7 access = list( access_medical, access_medical_equip, @@ -39,61 +33,10 @@ outfit_type = /decl/outfit/job/tradeship/doc/junior event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/tradeship_doctor/head +/datum/job/cmo/tradeship title = "Head Doctor" - head_position = 1 - department_types = list( - /decl/department/medical, - /decl/department/command - ) supervisors = "the Captain and your own ethics" outfit_type = /decl/outfit/job/tradeship/doc alt_titles = list("Surgeon") - total_positions = 1 - spawn_positions = 1 + // Slightly beefier skills due to smaller crew. skill_points = 28 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - selection_color = "#026865" - req_admin_notify = 1 - economic_power = 10 - access = list( - access_medical, - access_medical_equip, - access_morgue, - access_bridge, - access_heads, - access_chemistry, - access_virology, - access_cmo, - access_surgery, - access_RC_announce, - access_keycard_auth, - access_sec_doors, - access_psychiatrist, - access_eva, - access_maint_tunnels, - access_external_airlocks - ) - minimal_access = list( - access_medical, - access_medical_equip, - access_morgue, - access_bridge, - access_heads, - access_chemistry, - access_virology, - access_cmo, - access_surgery, - access_RC_announce, - access_keycard_auth, - access_sec_doors, - access_psychiatrist, - access_eva, - access_maint_tunnels, - access_external_airlocks - ) - minimal_player_age = 14 - ideal_character_age = 50 - event_categories = list(ASSIGNMENT_MEDICAL) diff --git a/maps/tradeship/jobs/science.dm b/maps/tradeship/jobs/science.dm index 4c6e5555d8e..c14bb9e5b92 100644 --- a/maps/tradeship/jobs/science.dm +++ b/maps/tradeship/jobs/science.dm @@ -1,119 +1,14 @@ -/datum/job/tradeship_researcher +/datum/job/scientist/tradeship title = "Junior Researcher" supervisors = "the Head Researcher and the Captain" total_positions = 2 spawn_positions = 1 alt_titles = list() outfit_type = /decl/outfit/job/tradeship/hand/researcher/junior - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_DEVICES = SKILL_BASIC, - SKILL_SCIENCE = SKILL_ADEPT - ) - max_skill = list( - SKILL_ANATOMY = SKILL_MAX, - SKILL_DEVICES = SKILL_MAX, - SKILL_SCIENCE = SKILL_MAX - ) + // Smaller crew, more points. skill_points = 24 - department_types = list(/decl/department/science) - selection_color = "#633d63" - economic_power = 7 - minimal_player_age = 7 - access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - minimal_access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - event_categories = list(ASSIGNMENT_SCIENTIST) -/datum/job/tradeship_researcher/head +/datum/job/rd/tradeship title = "Head Researcher" - supervisors = "the Captain" - spawn_positions = 1 - total_positions = 1 alt_titles = list() outfit_type = /decl/outfit/job/tradeship/hand/researcher - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_FINANCE = SKILL_ADEPT, - SKILL_BOTANY = SKILL_BASIC, - SKILL_ANATOMY = SKILL_BASIC, - SKILL_DEVICES = SKILL_BASIC, - SKILL_SCIENCE = SKILL_ADEPT - ) - max_skill = list( - SKILL_ANATOMY = SKILL_MAX, - SKILL_DEVICES = SKILL_MAX, - SKILL_SCIENCE = SKILL_MAX - ) - skill_points = 30 - head_position = 1 - department_types = list( - /decl/department/science, - /decl/department/command - ) - selection_color = "#ad6bad" - req_admin_notify = 1 - economic_power = 15 - access = list( - access_rd, - access_bridge, - access_tox, - access_morgue, - access_tox_storage, - access_teleporter, - access_sec_doors, - access_heads, - access_research, - access_robotics, - access_xenobiology, - access_ai_upload, - access_tech_storage, - access_RC_announce, - access_keycard_auth, - access_tcomsat, - access_gateway, - access_xenoarch, - access_network - ) - minimal_access = list( - access_rd, - access_bridge, - access_tox, - access_morgue, - access_tox_storage, - access_teleporter, - access_sec_doors, - access_heads, - access_research, - access_robotics, - access_xenobiology, - access_ai_upload, - access_tech_storage, - access_RC_announce, - access_keycard_auth, - access_tcomsat, - access_gateway, - access_xenoarch, - access_network - ) - minimal_player_age = 14 - ideal_character_age = 50 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - event_categories = list(ASSIGNMENT_SCIENTIST) diff --git a/maps/tradeship/jobs/synthetics.dm b/maps/tradeship/jobs/synthetics.dm deleted file mode 100644 index e10101d48a2..00000000000 --- a/maps/tradeship/jobs/synthetics.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/job/tradeship_robot - title = "Robot" - event_categories = list(ASSIGNMENT_ROBOT) - total_positions = 1 - spawn_positions = 1 - supervisors = "your laws and the Captain" - selection_color = "#254c25" - minimal_player_age = 7 - account_allowed = 0 - economic_power = 0 - loadout_allowed = FALSE - outfit_type = /decl/outfit/job/silicon/cyborg - hud_icon = "hudblank" - skill_points = 0 - no_skill_buffs = TRUE - guestbanned = 1 - not_random_selectable = 1 - skip_loadout_preview = TRUE - department_types = list(/decl/department/miscellaneous) - -/datum/job/tradeship_robot/handle_variant_join(var/mob/living/human/H, var/alt_title) - if(H) - return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) - -/datum/job/tradeship_robot/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) - return !!H - -/datum/job/tradeship_robot/New() - ..() - alt_titles = SSrobots.robot_alt_titles.Copy() - alt_titles -= title diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 4ebf5e3219b..32eeb975e2c 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -17,6 +17,7 @@ #include "../../mods/content/government/away_sites/icarus/icarus.dm" #include "../../mods/content/corporate/away_sites/lar_maria/lar_maria.dm" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/mundane.dm" #include "../../mods/content/bigpharma/_bigpharma.dme" @@ -58,7 +59,6 @@ #include "tradeship_antagonists.dm" #include "tradeship_areas.dm" - #include "tradeship_departments.dm" #include "tradeship_documents.dm" #include "tradeship_jobs.dm" #include "tradeship_loadouts.dm" @@ -78,7 +78,6 @@ #include "jobs/engineering.dm" #include "jobs/medical.dm" #include "jobs/science.dm" - #include "jobs/synthetics.dm" #include "outfits/_outfits.dm" #include "outfits/command.dm" diff --git a/maps/tradeship/tradeship_jobs.dm b/maps/tradeship/tradeship_jobs.dm index 37acc966563..61b526624e0 100644 --- a/maps/tradeship/tradeship_jobs.dm +++ b/maps/tradeship/tradeship_jobs.dm @@ -1,19 +1,19 @@ /datum/map/tradeship - default_job_type = /datum/job/tradeship_deckhand + default_job_type = /datum/job/assistant/tradeship default_department_type = /decl/department/civilian default_law_type = /datum/ai_laws/corporate id_hud_icons = 'maps/tradeship/hud.dmi' allowed_jobs = list( - /datum/job/tradeship_deckhand, - /datum/job/tradeship_captain, + /datum/job/assistant/tradeship, + /datum/job/captain/tradeship, /datum/job/tradeship_first_mate, - /datum/job/tradeship_doctor/head, - /datum/job/tradeship_doctor, - /datum/job/tradeship_engineer/head, - /datum/job/tradeship_engineer, - /datum/job/tradeship_researcher/head, - /datum/job/tradeship_researcher, - /datum/job/tradeship_robot + /datum/job/cmo/tradeship, + /datum/job/doctor/tradeship, + /datum/job/chief_engineer/tradeship, + /datum/job/engineer/tradeship, + /datum/job/rd/tradeship, + /datum/job/scientist/tradeship, + /datum/job/robot ) /obj/machinery/suit_cycler/tradeship @@ -39,4 +39,4 @@ /obj/item/clothing/head/helmet/space/void/excavation, /obj/item/clothing/head/helmet/space/void/engineering/salvage )) - . = ..() \ No newline at end of file + . = ..() diff --git a/maps/tradeship/tradeship_spawnpoints.dm b/maps/tradeship/tradeship_spawnpoints.dm index 054216b46fe..c4be5d21c35 100644 --- a/maps/tradeship/tradeship_spawnpoints.dm +++ b/maps/tradeship/tradeship_spawnpoints.dm @@ -9,7 +9,7 @@ /decl/spawnpoint/cryo name = "Port Cryogenic Storage" spawn_announcement = "has completed revival in the port cryogenics bay" - disallow_job = list(/datum/job/tradeship_robot) + disallow_job = list(/datum/job/robot) /decl/spawnpoint/cryo/two name = "Starboard Cryogenic Storage" @@ -22,7 +22,7 @@ /decl/spawnpoint/cryo/captain name = "Captain Compartment" spawn_announcement = "has completed revival in the captain compartment" - restrict_job = list(/datum/job/tradeship_captain) + restrict_job = list(/datum/job/captain/tradeship) uid = "spawn_cryo_captain" /obj/abstract/landmark/latejoin/cryo_captain diff --git a/mods/content/standard_jobs/_standard_jobs.dm b/mods/content/standard_jobs/_standard_jobs.dm new file mode 100644 index 00000000000..f19759923d4 --- /dev/null +++ b/mods/content/standard_jobs/_standard_jobs.dm @@ -0,0 +1,2 @@ +/decl/modpack/standard_jobs + name = "Standard SS13 Jobs" diff --git a/mods/content/standard_jobs/_standard_jobs.dme b/mods/content/standard_jobs/_standard_jobs.dme new file mode 100644 index 00000000000..cbba09eacef --- /dev/null +++ b/mods/content/standard_jobs/_standard_jobs.dme @@ -0,0 +1,30 @@ +#ifndef MODPACK_STANDARD_JOBS +#define MODPACK_STANDARD_JOBS +// BEGIN_INCLUDE +#include "_standard_jobs.dm" +#include "departments\civilian.dm" +#include "departments\command.dm" +#include "departments\engineering.dm" +#include "departments\medical.dm" +#include "departments\miscellaneous.dm" +#include "departments\science.dm" +#include "departments\security.dm" +#include "departments\service.dm" +#include "departments\supply.dm" +#include "jobs\captain.dm" +#include "jobs\civilian.dm" +#include "jobs\engineering.dm" +#include "jobs\medical.dm" +#include "jobs\science.dm" +#include "jobs\security.dm" +#include "jobs\synthetics.dm" +#include "outfits\cargo.dm" +#include "outfits\civilian.dm" +#include "outfits\command.dm" +#include "outfits\engineering.dm" +#include "outfits\medical.dm" +#include "outfits\pda.dm" +#include "outfits\science.dm" +#include "outfits\security.dm" +// END_INCLUDE +#endif diff --git a/mods/content/standard_jobs/departments/civilian.dm b/mods/content/standard_jobs/departments/civilian.dm new file mode 100644 index 00000000000..3cda485f4bb --- /dev/null +++ b/mods/content/standard_jobs/departments/civilian.dm @@ -0,0 +1,4 @@ +/decl/department/civilian + name = "Civilian" + display_priority = 1 + display_color = "#dddddd" diff --git a/mods/content/standard_jobs/departments/command.dm b/mods/content/standard_jobs/departments/command.dm new file mode 100644 index 00000000000..fa842fb881c --- /dev/null +++ b/mods/content/standard_jobs/departments/command.dm @@ -0,0 +1,14 @@ +/decl/department/command + name = "Command" + colour = "#800080" + display_priority = 5 + display_color = "#ccccff" + +/obj/machinery/network/pager + department = /decl/department/command + +/decl/department/support + name = "Support" + announce_channel = "Command" + colour = "#800080" + display_color = "#87ceeb" diff --git a/mods/content/standard_jobs/departments/engineering.dm b/mods/content/standard_jobs/departments/engineering.dm new file mode 100644 index 00000000000..252b4de16a6 --- /dev/null +++ b/mods/content/standard_jobs/departments/engineering.dm @@ -0,0 +1,12 @@ +/decl/department/engineering + name = "Engineering" + announce_channel = "Engineering" + colour = "#ffa500" + display_priority = 4 + display_color = "#fff5cc" + +/obj/item/robot_module/engineering + associated_department = /decl/department/engineering + +/obj/machinery/network/pager/engineering + department = /decl/department/engineering diff --git a/mods/content/standard_jobs/departments/medical.dm b/mods/content/standard_jobs/departments/medical.dm new file mode 100644 index 00000000000..01506ddd5d4 --- /dev/null +++ b/mods/content/standard_jobs/departments/medical.dm @@ -0,0 +1,13 @@ +/decl/department/medical + name = "Medical" + goals = list(/datum/goal/department/medical_fatalities) + announce_channel = "Medical" + colour = "#008000" + display_priority = 2 + display_color = "#ffeef0" + +/obj/item/robot_module/medical + associated_department = /decl/department/medical + +/obj/machinery/network/pager/medical + department = /decl/department/medical diff --git a/mods/content/standard_jobs/departments/miscellaneous.dm b/mods/content/standard_jobs/departments/miscellaneous.dm new file mode 100644 index 00000000000..19149216fdb --- /dev/null +++ b/mods/content/standard_jobs/departments/miscellaneous.dm @@ -0,0 +1,4 @@ +/decl/department/miscellaneous + name = "Misc" + display_priority = -1 + display_color = "#ccffcc" diff --git a/mods/content/standard_jobs/departments/science.dm b/mods/content/standard_jobs/departments/science.dm new file mode 100644 index 00000000000..47ebb9c2130 --- /dev/null +++ b/mods/content/standard_jobs/departments/science.dm @@ -0,0 +1,18 @@ +/decl/department/science + name = "Science" + goals = list(/datum/goal/department/extract_slime_cores) + announce_channel = "Science" + colour = "#a65ba6" + display_color = "#e79fff" + +/obj/item/robot_module/research + associated_department = /decl/department/science + +/obj/machinery/network/pager/science + department = /decl/department/science + +/decl/department/exploration + name = "Exploration" + announce_channel = "Exploration" + colour = "#68099e" + display_color = "#b784a7" diff --git a/mods/content/standard_jobs/departments/security.dm b/mods/content/standard_jobs/departments/security.dm new file mode 100644 index 00000000000..e758218721b --- /dev/null +++ b/mods/content/standard_jobs/departments/security.dm @@ -0,0 +1,12 @@ +/decl/department/security + name = "Security" + announce_channel = "Security" + colour = "#dd0000" + display_priority = 3 + display_color = "#ffddf0" + +/obj/item/robot_module/security + associated_department = /decl/department/security + +/obj/machinery/network/pager/security + department = /decl/department/security diff --git a/mods/content/standard_jobs/departments/service.dm b/mods/content/standard_jobs/departments/service.dm new file mode 100644 index 00000000000..b82c1c6deaf --- /dev/null +++ b/mods/content/standard_jobs/departments/service.dm @@ -0,0 +1,6 @@ + +/decl/department/service + name = "Service" + announce_channel = "Service" + colour = "#88b764" + display_color = "#d0f0c0" diff --git a/mods/content/standard_jobs/departments/supply.dm b/mods/content/standard_jobs/departments/supply.dm new file mode 100644 index 00000000000..c71d4327554 --- /dev/null +++ b/mods/content/standard_jobs/departments/supply.dm @@ -0,0 +1,8 @@ +/decl/department/supply + name = "Supply" + announce_channel = "Supply" + colour = "#bb9040" + display_color = "#f0e68c" + +/obj/machinery/network/pager/cargo + department = /decl/department/supply diff --git a/maps/exodus/jobs/captain.dm b/mods/content/standard_jobs/jobs/captain.dm similarity index 100% rename from maps/exodus/jobs/captain.dm rename to mods/content/standard_jobs/jobs/captain.dm diff --git a/maps/exodus/jobs/civilian.dm b/mods/content/standard_jobs/jobs/civilian.dm similarity index 98% rename from maps/exodus/jobs/civilian.dm rename to mods/content/standard_jobs/jobs/civilian.dm index 90d800d0b6b..af71d84e536 100644 --- a/maps/exodus/jobs/civilian.dm +++ b/mods/content/standard_jobs/jobs/civilian.dm @@ -53,6 +53,11 @@ access_bar, access_kitchen ) + minimal_access = list( + access_hydroponics, + access_bar, + access_kitchen + ) minimal_access = list(access_bar) alt_titles = list("Barista") outfit_type = /decl/outfit/job/service/bartender diff --git a/maps/exodus/jobs/engineering.dm b/mods/content/standard_jobs/jobs/engineering.dm similarity index 100% rename from maps/exodus/jobs/engineering.dm rename to mods/content/standard_jobs/jobs/engineering.dm diff --git a/maps/exodus/jobs/medical.dm b/mods/content/standard_jobs/jobs/medical.dm similarity index 99% rename from maps/exodus/jobs/medical.dm rename to mods/content/standard_jobs/jobs/medical.dm index 4d37a277fa1..14e68446da0 100644 --- a/maps/exodus/jobs/medical.dm +++ b/mods/content/standard_jobs/jobs/medical.dm @@ -124,7 +124,6 @@ /datum/computer_file/program/camera_monitor ) skill_points = 22 - title = "Paramedic" event_categories = list(ASSIGNMENT_MEDICAL) /datum/job/chemist @@ -200,12 +199,14 @@ ) give_psionic_implant_on_join = FALSE +#ifdef MODPACK_PSIONICS /datum/job/counselor/equip_job(var/mob/living/human/H) if(H.mind.role_alt_title == "Counselor") psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) if(H.mind.role_alt_title == "Mentalist") psi_faculties = list("[PSI_COERCION]" = PSI_RANK_OPERANT) return ..() +#endif // Department-flavor IDs /obj/item/card/id/medical diff --git a/maps/exodus/jobs/science.dm b/mods/content/standard_jobs/jobs/science.dm similarity index 100% rename from maps/exodus/jobs/science.dm rename to mods/content/standard_jobs/jobs/science.dm diff --git a/maps/exodus/jobs/security.dm b/mods/content/standard_jobs/jobs/security.dm similarity index 100% rename from maps/exodus/jobs/security.dm rename to mods/content/standard_jobs/jobs/security.dm diff --git a/maps/exodus/jobs/synthetics.dm b/mods/content/standard_jobs/jobs/synthetics.dm similarity index 100% rename from maps/exodus/jobs/synthetics.dm rename to mods/content/standard_jobs/jobs/synthetics.dm diff --git a/maps/exodus/outfits/cargo.dm b/mods/content/standard_jobs/outfits/cargo.dm similarity index 100% rename from maps/exodus/outfits/cargo.dm rename to mods/content/standard_jobs/outfits/cargo.dm diff --git a/maps/exodus/outfits/civilian.dm b/mods/content/standard_jobs/outfits/civilian.dm similarity index 100% rename from maps/exodus/outfits/civilian.dm rename to mods/content/standard_jobs/outfits/civilian.dm diff --git a/maps/exodus/outfits/command.dm b/mods/content/standard_jobs/outfits/command.dm similarity index 100% rename from maps/exodus/outfits/command.dm rename to mods/content/standard_jobs/outfits/command.dm diff --git a/maps/exodus/outfits/engineering.dm b/mods/content/standard_jobs/outfits/engineering.dm similarity index 100% rename from maps/exodus/outfits/engineering.dm rename to mods/content/standard_jobs/outfits/engineering.dm diff --git a/maps/exodus/outfits/medical.dm b/mods/content/standard_jobs/outfits/medical.dm similarity index 100% rename from maps/exodus/outfits/medical.dm rename to mods/content/standard_jobs/outfits/medical.dm diff --git a/maps/exodus/outfits/_pda.dm b/mods/content/standard_jobs/outfits/pda.dm similarity index 100% rename from maps/exodus/outfits/_pda.dm rename to mods/content/standard_jobs/outfits/pda.dm diff --git a/maps/exodus/outfits/science.dm b/mods/content/standard_jobs/outfits/science.dm similarity index 100% rename from maps/exodus/outfits/science.dm rename to mods/content/standard_jobs/outfits/science.dm diff --git a/maps/exodus/outfits/security.dm b/mods/content/standard_jobs/outfits/security.dm similarity index 100% rename from maps/exodus/outfits/security.dm rename to mods/content/standard_jobs/outfits/security.dm From 81a65fea49289844582510a321af91fb58923a47 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Wed, 18 Dec 2024 10:48:22 -0600 Subject: [PATCH 189/554] Ignore .DS_Store --- .gitignore | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 52ee73c3835..b7e92fbae53 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ # ignore misc BYOND files -Thumbs.db -Thumbs.db:encryptable *.log *.int *.rsc @@ -22,6 +20,11 @@ atupdate config/* sql/test_db +# misc OS garbage +Thumbs.db +Thumbs.db:encryptable +.DS_Store + # vscode .vscode/* *.code-workspace From 40390355845535b96e778d3a5fdbc5931251f5ab Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 19 Dec 2024 10:38:25 +1100 Subject: [PATCH 190/554] Struts are now largely replaced by rods. --- code/game/machinery/constructable_frame.dm | 2 +- code/game/objects/items/stacks/rods.dm | 69 ++++++++----------- code/game/objects/random/subtypes/misc.dm | 4 +- .../crates_lockers/closets/syndicate.dm | 2 +- code/game/objects/structures/girders.dm | 10 +-- code/game/objects/structures/racks.dm | 2 +- code/game/objects/structures/railing.dm | 2 +- .../stool_bed_chair_nest_sofa/bed.dm | 2 +- code/game/objects/structures/tables.dm | 2 +- code/game/objects/structures/wall_frame.dm | 2 +- code/modules/butchery/butchery_data_misc.dm | 2 +- code/modules/butchery/butchery_hook.dm | 2 +- .../{recipes_struts.dm => recipes_rods.dm} | 36 ++++++---- .../designs/general/designs_general.dm | 8 +-- .../materials/material_sheets_mapping.dm | 5 ++ code/modules/materials/material_stack_misc.dm | 11 --- .../robot/flying/module_flying_repair.dm | 2 - .../robot/modules/module_engineering.dm | 2 - .../robot/modules/module_maintenance_drone.dm | 2 - maps/antag_spawn/mercenary/mercenary_base.dmm | 8 +-- maps/away/bearcat/bearcat-1.dmm | 2 +- maps/away/bearcat/bearcat-2.dmm | 14 ++-- maps/away/casino/casino.dmm | 2 +- maps/away/liberia/liberia.dmm | 8 +-- .../lost_supply_base/lost_supply_base.dmm | 6 +- maps/away/magshield/magshield.dmm | 12 ++-- maps/exodus/exodus-1.dmm | 2 +- maps/ministation/ministation-0.dmm | 10 +-- .../exoplanet_ruins/marooned/marooned.dmm | 4 +- .../exoplanet_ruins/oldpod/oldpod.dmm | 8 +-- .../exoplanet_ruins/playablecolony/colony.dmm | 8 +-- maps/tradeship/tradeship-1.dmm | 2 +- maps/tradeship/tradeship-3.dmm | 2 +- mods/content/dungeon_loot/subtypes/maint.dm | 2 +- .../government/away_sites/icarus/icarus-1.dmm | 14 ++-- mods/gamemodes/heist/heist_base.dmm | 2 +- mods/species/ascent/mobs/drone.dm | 2 - nebula.dme | 2 +- tools/map_migrations/4651_rods.txt | 2 + 39 files changed, 131 insertions(+), 148 deletions(-) rename code/modules/crafting/stack_recipes/{recipes_struts.dm => recipes_rods.dm} (72%) create mode 100644 tools/map_migrations/4651_rods.txt diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 11c41dca7ca..df5391cc06d 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -19,7 +19,7 @@ update_icon() /obj/machinery/constructable_frame/dismantle() - SSmaterials.create_object(/decl/material/solid/metal/steel, loc, 5, object_type = /obj/item/stack/material/strut) + SSmaterials.create_object(/decl/material/solid/metal/steel, loc, 5, object_type = /obj/item/stack/material/rods) qdel(src) return TRUE diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 86363f815e9..7e244c18453 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -1,45 +1,37 @@ /obj/item/stack/material/rods - name = "rod" - desc = "Some rods. Can be used for building, or something." - singular_name = "rod" - plural_name = "rods" - icon_state = "rod" - plural_icon_state = "rod-mult" - max_icon_state = "rod-max" - w_class = ITEM_SIZE_LARGE - attack_cooldown = 21 + name = "rod" + desc = "Some rods. Can be used for building, or something." + singular_name = "rod" + plural_name = "rods" + icon_state = "rod" + plural_icon_state = "rod-mult" + max_icon_state = "rod-max" + w_class = ITEM_SIZE_LARGE + attack_cooldown = 21 melee_accuracy_bonus = -20 - throw_speed = 5 - throw_range = 20 - max_amount = 100 - attack_verb = list("hit", "bludgeoned", "whacked") - lock_picking_level = 3 - matter_multiplier = 0.3 - material = /decl/material/solid/metal/steel - is_spawnable_type = TRUE - - pickup_sound = 'sound/foley/tooldrop3.ogg' - drop_sound = 'sound/foley/tooldrop2.ogg' + throw_speed = 5 + throw_range = 20 + max_amount = 100 + attack_verb = list("hit", "bludgeoned", "whacked") + lock_picking_level = 3 + matter_multiplier = 0.3 + material = /decl/material/solid/metal/steel + crafting_stack_type = /obj/item/stack/material/rods + pickup_sound = 'sound/foley/tooldrop3.ogg' + drop_sound = 'sound/foley/tooldrop2.ogg' /obj/item/stack/material/rods/get_autopsy_descriptors() . = ..() . += "narrow" -/obj/item/stack/material/rods/ten - amount = 10 - -/obj/item/stack/material/rods/fifty - amount = 50 - /obj/item/stack/material/rods/cyborg - name = "metal rod synthesizer" - desc = "A device that makes metal rods." - gender = NEUTER - matter = null - uses_charge = 1 - charge_costs = list(500) - max_health = ITEM_HEALTH_NO_DAMAGE - is_spawnable_type = FALSE + name = "metal rod synthesizer" + desc = "A device that makes metal rods." + gender = NEUTER + matter = null + uses_charge = 1 + charge_costs = list(500) + max_health = ITEM_HEALTH_NO_DAMAGE /obj/item/stack/material/rods/Initialize() . = ..() @@ -54,12 +46,14 @@ else icon_state = base_state +// TODO: slapcrafting recipes to replace this block. /obj/item/stack/material/rods/attackby(obj/item/W, mob/user) + if(IS_WELDER(W)) var/obj/item/weldingtool/WT = W if(!can_use(2)) - to_chat(user, "You need at least two rods to do this.") + to_chat(user, SPAN_WARNING("You need at least two rods to do this.")) return TRUE if(WT.weld(0,user)) @@ -87,8 +81,3 @@ src.use(1) return TRUE return ..() - -/obj/item/stack/material/rods/attack_self(mob/user) - add_fingerprint(user) - if(isturf(user.loc)) - place_grille(user, user.loc, src) diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index e0003d62ef8..0cf2714e816 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -210,8 +210,8 @@ /obj/item/stack/material/plank/mapped/wood/fifty, /obj/item/stack/material/cardstock/mapped/cardboard/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, - /obj/item/stack/material/rods/ten, - /obj/item/stack/material/rods/fifty + /obj/item/stack/material/rods/mapped/steel/ten, + /obj/item/stack/material/rods/mapped/steel/fifty ) return spawnable_choices diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 798d8f65c49..6d3bec631ee 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -128,7 +128,7 @@ /obj/item/stack/material/puck/mapped/uranium/fifty, /obj/item/stack/material/gemstone/mapped/diamond/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, - /obj/item/stack/material/rods/fifty + /obj/item/stack/material/rods/mapped/steel/fifty ) for(var/i = 0, i < 2, i++) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 4a9c41b13ed..c508eb305f9 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -10,7 +10,7 @@ tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) max_health = 100 parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/cover = 50 var/prepped_for_fakewall @@ -30,9 +30,9 @@ if(reinf_material) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - visible_message(SPAN_NOTICE("\The [user] begins unscrewing \the [reinf_material.solid_name] struts from \the [src].")) + visible_message(SPAN_NOTICE("\The [user] begins unscrewing \the [reinf_material.solid_name] rods from \the [src].")) if(do_after(user, 5 SECONDS, src) || QDELETED(src) || !reinf_material) - visible_message(SPAN_NOTICE("\The [user] unscrews and removes \the [reinf_material.solid_name] struts from \the [src].")) + visible_message(SPAN_NOTICE("\The [user] unscrews and removes \the [reinf_material.solid_name] rods from \the [src].")) reinf_material.place_dismantled_product(get_turf(src)) reinf_material = null return TRUE @@ -85,7 +85,7 @@ /obj/structure/girder/can_unanchor(var/mob/user) if(anchored && reinf_material) - to_chat(user, SPAN_WARNING("You must remove the support struts before you can dislodge \the [src].")) + to_chat(user, SPAN_WARNING("You must remove the support rods before you can dislodge \the [src].")) return FALSE . = ..() @@ -182,7 +182,7 @@ if(!istype(M) || M.integrity < 50) to_chat(user, SPAN_WARNING("You cannot reinforce \the [src] with [M.solid_name]; it is too soft.")) return TRUE - visible_message(SPAN_NOTICE("\The [user] begins installing [M.solid_name] struts into \the [src].")) + visible_message(SPAN_NOTICE("\The [user] begins installing [M.solid_name] rods into \the [src].")) if (!do_after(user, 4 SECONDS, src) || !S.use(2)) return TRUE visible_message(SPAN_NOTICE("\The [user] finishes reinforcing \the [src] with [M.solid_name].")) diff --git a/code/game/objects/structures/racks.dm b/code/game/objects/structures/racks.dm index 7f1c77404ec..3ade37d94fe 100644 --- a/code/game/objects/structures/racks.dm +++ b/code/game/objects/structures/racks.dm @@ -10,7 +10,7 @@ atom_flags = ATOM_FLAG_CLIMBABLE throwpass = TRUE parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods density = TRUE anchored = TRUE structure_flags = STRUCTURE_FLAG_SURFACE diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 93926bd3e51..66f0afe1785 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -14,7 +14,7 @@ material_alteration = MAT_FLAG_ALTERATION_ALL max_health = 100 parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/broken = FALSE var/neighbor_status = 0 diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm index 771e8594213..f1ec03d9f7c 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm @@ -22,7 +22,7 @@ material_alteration = MAT_FLAG_ALTERATION_ALL tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods user_comfort = 1 obj_flags = OBJ_FLAG_SUPPORT_MOB var/base_icon = "bed" diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index bec89bbb2ef..8302b97bfec 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -19,7 +19,7 @@ tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods structure_flags = STRUCTURE_FLAG_SURFACE can_support_butchery = TRUE diff --git a/code/game/objects/structures/wall_frame.dm b/code/game/objects/structures/wall_frame.dm index 850fc4d7c58..3aaf589d466 100644 --- a/code/game/objects/structures/wall_frame.dm +++ b/code/game/objects/structures/wall_frame.dm @@ -18,7 +18,7 @@ tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) max_health = 40 parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/stripe_color var/list/connections var/list/other_connections diff --git a/code/modules/butchery/butchery_data_misc.dm b/code/modules/butchery/butchery_data_misc.dm index 60aa3f2e6ff..54720ce3b74 100644 --- a/code/modules/butchery/butchery_data_misc.dm +++ b/code/modules/butchery/butchery_data_misc.dm @@ -4,7 +4,7 @@ meat_type = /obj/item/stack/material/rods bone_material = /decl/material/solid/metal/titanium - bone_type = /obj/item/stack/material/strut + bone_type = /obj/item/stack/material/rods skin_material = /decl/material/solid/metal/aluminium skin_type = /obj/item/stack/material/sheet/shiny diff --git a/code/modules/butchery/butchery_hook.dm b/code/modules/butchery/butchery_hook.dm index ae3ea54b8dd..0cc357e6f75 100644 --- a/code/modules/butchery/butchery_hook.dm +++ b/code/modules/butchery/butchery_hook.dm @@ -19,7 +19,7 @@ ) tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/mob/living/occupant var/occupant_state = CARCASS_EMPTY diff --git a/code/modules/crafting/stack_recipes/recipes_struts.dm b/code/modules/crafting/stack_recipes/recipes_rods.dm similarity index 72% rename from code/modules/crafting/stack_recipes/recipes_struts.dm rename to code/modules/crafting/stack_recipes/recipes_rods.dm index fced999502f..c010556a990 100644 --- a/code/modules/crafting/stack_recipes/recipes_struts.dm +++ b/code/modules/crafting/stack_recipes/recipes_rods.dm @@ -1,6 +1,7 @@ -/decl/stack_recipe/strut - abstract_type = /decl/stack_recipe/strut +/decl/stack_recipe/rods + abstract_type = /decl/stack_recipe/rods craft_stack_types = list( + /obj/item/stack/material/rods, /obj/item/stack/material/strut, /obj/item/stack/material/bone ) @@ -10,64 +11,69 @@ available_to_map_tech_level = MAP_TECH_LEVEL_MEDIEVAL category = "structures" -/decl/stack_recipe/strut/stick +/decl/stack_recipe/rods/stick result_type = /obj/item/stick one_per_turf = FALSE on_floor = FALSE difficulty = MAT_VALUE_EASY_DIY category = "items" -/decl/stack_recipe/strut/stick/staff +/decl/stack_recipe/rods/stick/staff result_type = /obj/item/staff difficulty = MAT_VALUE_NORMAL_DIY -/decl/stack_recipe/strut/stick/cane +/decl/stack_recipe/rods/stick/cane result_type = /obj/item/cane difficulty = MAT_VALUE_NORMAL_DIY -/decl/stack_recipe/strut/railing +/decl/stack_recipe/rods/railing result_type = /obj/structure/railing -/decl/stack_recipe/strut/ladder +/decl/stack_recipe/rods/ladder result_type = /obj/structure/ladder on_floor = FALSE required_wall_support_value = 10 -/decl/stack_recipe/strut/girder +/decl/stack_recipe/rods/girder result_type = /obj/structure/girder required_wall_support_value = 10 req_amount = 5 * SHEET_MATERIAL_AMOUNT // Arbitrary value since girders return weird matter values. available_to_map_tech_level = MAP_TECH_LEVEL_SPACE -/decl/stack_recipe/strut/wall_frame +/decl/stack_recipe/rods/wall_frame result_type = /obj/structure/wall_frame available_to_map_tech_level = MAP_TECH_LEVEL_SPACE -/decl/stack_recipe/strut/table_frame +/decl/stack_recipe/rods/table_frame result_type = /obj/structure/table/frame category = "furniture" -/decl/stack_recipe/strut/rack +/decl/stack_recipe/rods/rack result_type = /obj/structure/rack category = "furniture" -/decl/stack_recipe/strut/butcher_hook +/decl/stack_recipe/rods/butcher_hook result_type = /obj/structure/meat_hook one_per_turf = TRUE difficulty = MAT_VALUE_NORMAL_DIY category = "furniture" -/decl/stack_recipe/strut/bed +/decl/stack_recipe/rods/bed result_type = /obj/structure/bed required_integrity = 50 required_min_hardness = MAT_VALUE_FLEXIBLE + 10 category = "furniture" -/decl/stack_recipe/strut/machine +/decl/stack_recipe/rods/machine result_type = /obj/machinery/constructable_frame/machine_frame req_amount = 5 * SHEET_MATERIAL_AMOUNT // Arbitrary value since machines don't handle matter properly yet. required_material = /decl/material/solid/metal/steel available_to_map_tech_level = MAP_TECH_LEVEL_SPACE -/decl/stack_recipe/strut/machine/spawn_result(mob/user, location, amount, decl/material/mat, decl/material/reinf_mat, paint_color, spent_type, spent_amount = 1) +/decl/stack_recipe/rods/machine/spawn_result(mob/user, location, amount, decl/material/mat, decl/material/reinf_mat, paint_color, spent_type, spent_amount = 1) return ..(user, location, amount, null, null, paint_color, spent_type, spent_amount) + +/decl/stack_recipe/rods/grille + result_type = /obj/structure/grille + one_per_turf = TRUE + difficulty = MAT_VALUE_NORMAL_DIY diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 64adcc09ac3..69b99bda0b9 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -118,7 +118,7 @@ /datum/fabricator_recipe/struts name = "strut, steel" - path = /obj/item/stack/material/strut/mapped/steel + path = /obj/item/stack/material/rods/mapped/steel /datum/fabricator_recipe/struts/get_resources() resources = list( @@ -127,7 +127,7 @@ /datum/fabricator_recipe/struts/plastic name = "strut, plastic" - path = /obj/item/stack/material/strut/mapped/plastic + path = /obj/item/stack/material/rods/mapped/plastic /datum/fabricator_recipe/struts/plastic/get_resources() resources = list( @@ -136,7 +136,7 @@ /datum/fabricator_recipe/struts/aluminium name = "strut, aluminium" - path = /obj/item/stack/material/strut/mapped/aluminium + path = /obj/item/stack/material/rods/mapped/aluminium fabricator_types = list(FABRICATOR_CLASS_INDUSTRIAL) /datum/fabricator_recipe/struts/aluminium/get_resources() @@ -146,7 +146,7 @@ /datum/fabricator_recipe/struts/titanium name = "strut, titanium" - path = /obj/item/stack/material/strut/mapped/titanium + path = /obj/item/stack/material/rods/mapped/titanium fabricator_types = list(FABRICATOR_CLASS_INDUSTRIAL) /datum/fabricator_recipe/struts/titanium/get_resources() diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index 2f857da4e95..1e17f9f3851 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -114,6 +114,11 @@ STACK_SUBTYPES(plastic, "plastic", solid/organic/pl STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, strut, null) STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, strut, null) +STACK_SUBTYPES(steel, "steel", solid/metal/steel, rods, null) +STACK_SUBTYPES(plastic, "plastic", solid/organic/plastic, rods, null) +STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, rods, null) +STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, rods, null) + STACK_SUBTYPES(cotton, "cotton", solid/organic/cloth, thread, null) STACK_SUBTYPES(dried_gut, "dried gut", solid/organic/leather/gut, thread, null) diff --git a/code/modules/materials/material_stack_misc.dm b/code/modules/materials/material_stack_misc.dm index cf8ddd36474..afabc40873b 100644 --- a/code/modules/materials/material_stack_misc.dm +++ b/code/modules/materials/material_stack_misc.dm @@ -160,14 +160,3 @@ max_icon_state = "sheet-strut-max" stack_merge_type = /obj/item/stack/material/strut crafting_stack_type = /obj/item/stack/material/strut - -/obj/item/stack/material/strut/cyborg - name = "metal strut synthesizer" - desc = "A device that makes metal strut." - gender = NEUTER - matter = null - uses_charge = 1 - charge_costs = list(500) - material = /decl/material/solid/metal/steel - max_health = ITEM_HEALTH_NO_DAMAGE - is_spawnable_type = FALSE diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm index 2711d4981b8..8a060e833c2 100644 --- a/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm +++ b/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm @@ -34,7 +34,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -70,7 +69,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/code/modules/mob/living/silicon/robot/modules/module_engineering.dm b/code/modules/mob/living/silicon/robot/modules/module_engineering.dm index c334d6c8bb2..d79de772719 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_engineering.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_engineering.dm @@ -47,7 +47,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -87,7 +86,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm index eeb10eae170..fe58498a36e 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm @@ -31,7 +31,6 @@ /obj/item/matter_decompiler, /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -84,7 +83,6 @@ for(var/thing in list( /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/maps/antag_spawn/mercenary/mercenary_base.dmm b/maps/antag_spawn/mercenary/mercenary_base.dmm index 86f6f092e57..f75023f8eb7 100644 --- a/maps/antag_spawn/mercenary/mercenary_base.dmm +++ b/maps/antag_spawn/mercenary/mercenary_base.dmm @@ -1209,7 +1209,7 @@ /obj/item/stack/material/sheet/reinforced/mapped/plasteel/ten, /obj/item/stack/material/ingot/mapped/copper/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/pane/mapped/rglass/fifty, /obj/item/stack/material/pane/mapped/rborosilicate/ten, /obj/structure/cable{ @@ -2751,9 +2751,9 @@ /obj/item/stack/material/sheet/mapped/steel/ten, /obj/item/stack/material/sheet/mapped/steel/ten, /obj/item/stack/material/sheet/mapped/steel/ten, -/obj/item/stack/material/rods/ten, -/obj/item/stack/material/rods/ten, -/obj/item/stack/material/rods/ten, +/obj/item/stack/material/rods/mapped/steel/ten, +/obj/item/stack/material/rods/mapped/steel/ten, +/obj/item/stack/material/rods/mapped/steel/ten, /obj/item/stack/material/pane/mapped/glass/ten, /obj/item/stack/material/pane/mapped/glass/ten, /obj/item/stack/material/pane/mapped/glass/ten, diff --git a/maps/away/bearcat/bearcat-1.dmm b/maps/away/bearcat/bearcat-1.dmm index 947b876eee6..8de6dcd2a17 100644 --- a/maps/away/bearcat/bearcat-1.dmm +++ b/maps/away/bearcat/bearcat-1.dmm @@ -2384,7 +2384,7 @@ /obj/item/stack/tape_roll/duct_tape, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/panel/mapped/plastic/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index 9fd790d88df..2af993e9ca4 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -4058,7 +4058,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/power) "hM" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/structure/lattice, /turf/space, /area/ship/scrap/maintenance/atmos) @@ -4542,13 +4542,13 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/power) "iO" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /mob/living/simple_animal/hostile/carp, /turf/space, /area/ship/scrap/maintenance/atmos) "iP" = ( /obj/item/stack/material/sheet/mapped/steel, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/ship/scrap/maintenance/atmos) "iQ" = ( @@ -4686,7 +4686,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/power) "jc" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/structure/lattice, /turf/space, /area/ship/scrap/maintenance/power) @@ -4861,7 +4861,7 @@ /turf/wall, /area/ship/scrap/maintenance/power) "jB" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "jC" = ( @@ -4939,7 +4939,7 @@ /area/ship/scrap/maintenance/engine/aft) "jN" = ( /obj/item/stack/material/sheet/mapped/steel, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/structure/lattice, /turf/space, /area/ship/scrap/maintenance/engine/aft) @@ -5003,7 +5003,7 @@ /turf/floor/plating/airless, /area/ship/scrap/maintenance/engine/aft) "jX" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/ship/scrap/maintenance/engine/aft) "jY" = ( diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index 44ea8318132..f9fa8619ce6 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -152,7 +152,7 @@ /area/casino/casino_bridge) "aw" = ( /obj/item/wirecutters, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "ax" = ( diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index e136fdc492c..b3922665c29 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -2340,8 +2340,8 @@ /obj/item/stack/material/pane/mapped/glass/fifty, /obj/item/stack/material/pane/mapped/glass/fifty, /obj/item/stack/material/sheet/reinforced/mapped/fiberglass/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/forty, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, @@ -7523,8 +7523,8 @@ /obj/structure/closet/crate, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/panel/mapped/plastic/fifty, /obj/item/stack/material/sheet/reinforced/mapped/titanium/fifty, /obj/item/stack/material/sheet/reinforced/mapped/ocp/fifty, diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm index 94c58cd1b3f..aac57b9b881 100644 --- a/maps/away/lost_supply_base/lost_supply_base.dmm +++ b/maps/away/lost_supply_base/lost_supply_base.dmm @@ -117,14 +117,14 @@ /turf/floor/plating/airless, /area/space) "aq" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "ar" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel, /turf/floor/plating/airless, /area/space) @@ -760,7 +760,7 @@ /turf/floor/plating/airless, /area/lost_supply_base) "cf" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/item/stack/material/sheet/mapped/steel, /turf/floor/plating/airless, /area/lost_supply_base) diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index 9148970f57f..de625ae9346 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -106,7 +106,7 @@ /turf/floor/plating/airless, /area/space) "ao" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "ap" = ( @@ -529,7 +529,7 @@ /turf/space, /area/magshield/smes_storage) "bF" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/magshield/smes_storage) "bG" = ( @@ -1265,7 +1265,7 @@ /turf/floor/plating/airless, /area/magshield/north) "dF" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/floor/plating/airless, /area/magshield/north) "dG" = ( @@ -2750,11 +2750,11 @@ /turf/floor/carpet/blue, /area/magshield/west) "ic" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/floor/tiled/dark, /area/magshield/west) "id" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/magshield/west) "ie" = ( @@ -3769,7 +3769,7 @@ /turf/floor/tiled, /area/magshield/south) "lg" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/magshield/south) "lh" = ( diff --git a/maps/exodus/exodus-1.dmm b/maps/exodus/exodus-1.dmm index baed72f3aae..df58cbab4de 100644 --- a/maps/exodus/exodus-1.dmm +++ b/maps/exodus/exodus-1.dmm @@ -2424,7 +2424,7 @@ /turf/floor/plating, /area/exodus/maintenance/sub/central) "gJ" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "gK" = ( diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index 5e3a75b879e..ea0d6d4886c 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -422,7 +422,7 @@ /turf/floor/tiled, /area/ministation/cargo) "cd" = ( -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /turf/floor/plating/airless, /area/space) "ce" = ( @@ -4268,8 +4268,8 @@ /obj/structure/closet/crate, /obj/item/stack/material/sheet/shiny/mapped/aluminium/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, /obj/item/stack/material/pane/mapped/glass/fifty, @@ -4755,7 +4755,7 @@ /turf/floor/tiled/monotile, /area/ministation/atmospherics) "va" = ( -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/pane/mapped/glass/fifty, /obj/item/stock_parts/circuitboard/airlock_electronics, /obj/item/stock_parts/circuitboard/airlock_electronics, @@ -8632,7 +8632,7 @@ /obj/structure/table, /obj/item/folder/yellow, /obj/item/clothing/head/earmuffs, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/cash/scavbucks, /turf/floor/tiled, /area/ministation/engine) diff --git a/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm b/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm index 29714944a16..13485f43f12 100644 --- a/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm +++ b/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm @@ -3,11 +3,11 @@ /turf/template_noop, /area/template_noop) "ac" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/template_noop, /area/template_noop) "ad" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/item/stack/material/sheet/reinforced/mapped/ocp, /turf/template_noop, /area/template_noop) diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm b/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm index ed155d0788a..ff7f8833e26 100644 --- a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm +++ b/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm @@ -297,10 +297,10 @@ /obj/machinery/door/firedoor, /obj/structure/wall_frame/hull, /obj/structure/grille, -/obj/item/stack/material/rods, -/obj/item/stack/material/rods, -/obj/item/stack/material/rods, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, +/obj/item/stack/material/rods/mapped/steel, +/obj/item/stack/material/rods/mapped/steel, +/obj/item/stack/material/rods/mapped/steel, /obj/item/shard, /obj/item/shard, /obj/item/shard, diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 808e62d51a2..1d8a6189f4d 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -7421,10 +7421,10 @@ /obj/structure/railing/mapped, /obj/effect/floor_decal/industrial/warning/dust, /obj/structure/rack, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/tool/pickaxe, /obj/item/tool/pickaxe, /obj/item/tool/shovel, diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index e72c0805f17..7b18e350e4b 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -3279,7 +3279,7 @@ /obj/item/stack/tape_roll/duct_tape, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/panel/mapped/plastic/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, diff --git a/maps/tradeship/tradeship-3.dmm b/maps/tradeship/tradeship-3.dmm index eba7b7f15ab..1a4f81e3fb3 100644 --- a/maps/tradeship/tradeship-3.dmm +++ b/maps/tradeship/tradeship-3.dmm @@ -870,7 +870,7 @@ /turf/floor/tiled/techfloor/grid, /area/ship/trade/comms) "yM" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/floor/plating, /area/ship/trade/bridge_unused) diff --git a/mods/content/dungeon_loot/subtypes/maint.dm b/mods/content/dungeon_loot/subtypes/maint.dm index 1063d1d165f..cea9732ac81 100644 --- a/mods/content/dungeon_loot/subtypes/maint.dm +++ b/mods/content/dungeon_loot/subtypes/maint.dm @@ -146,7 +146,7 @@ /obj/item/food/old/hotdog, /obj/item/food/old/pizza, /obj/item/ammo_casing, - /obj/item/stack/material/rods/ten, + /obj/item/stack/material/rods/mapped/steel/ten, /obj/item/stack/material/sheet/mapped/steel/five, /obj/item/stack/material/cardstock/mapped/cardboard/five, /obj/item/poster, diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index 1be37c41159..41b34e8350c 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -1442,7 +1442,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "eR" = ( @@ -1492,7 +1492,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "eW" = ( @@ -1518,7 +1518,7 @@ /area/icarus/open) "eZ" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fa" = ( @@ -1589,7 +1589,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fh" = ( @@ -1604,13 +1604,13 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fk" = ( @@ -1669,7 +1669,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fq" = ( diff --git a/mods/gamemodes/heist/heist_base.dmm b/mods/gamemodes/heist/heist_base.dmm index 737f150b57e..a98ec66d529 100644 --- a/mods/gamemodes/heist/heist_base.dmm +++ b/mods/gamemodes/heist/heist_base.dmm @@ -1149,7 +1149,7 @@ "dB" = ( /obj/structure/rack, /obj/item/gun/launcher/bow/crossbow/powered, -/obj/item/stack/material/rods/ten, +/obj/item/stack/material/rods/mapped/steel/ten, /obj/machinery/light/small{ dir = 8 }, diff --git a/mods/species/ascent/mobs/drone.dm b/mods/species/ascent/mobs/drone.dm index f2f94d499de..2294585ee15 100644 --- a/mods/species/ascent/mobs/drone.dm +++ b/mods/species/ascent/mobs/drone.dm @@ -35,7 +35,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -96,7 +95,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/nebula.dme b/nebula.dme index bff888b711e..f1e76027c30 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2234,10 +2234,10 @@ #include "code\modules\crafting\stack_recipes\recipes_panels.dm" #include "code\modules\crafting\stack_recipes\recipes_planks.dm" #include "code\modules\crafting\stack_recipes\recipes_reinforced.dm" +#include "code\modules\crafting\stack_recipes\recipes_rods.dm" #include "code\modules\crafting\stack_recipes\recipes_soft.dm" #include "code\modules\crafting\stack_recipes\recipes_stacks.dm" #include "code\modules\crafting\stack_recipes\recipes_steel.dm" -#include "code\modules\crafting\stack_recipes\recipes_struts.dm" #include "code\modules\crafting\stack_recipes\recipes_textiles.dm" #include "code\modules\crafting\stack_recipes\recipes_turfs.dm" #include "code\modules\crafting\working\_working.dm" diff --git a/tools/map_migrations/4651_rods.txt b/tools/map_migrations/4651_rods.txt new file mode 100644 index 00000000000..e7d5bffba5e --- /dev/null +++ b/tools/map_migrations/4651_rods.txt @@ -0,0 +1,2 @@ +/obj/item/stack/material/rods/@SUBTYPES : /obj/item/stack/material/rods/mapped/steel/@SUBTYPES{@OLD} + From 75f6d6c55da8740ef93087bd56ba44af84d1ce11 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 19 Dec 2024 03:10:55 -0500 Subject: [PATCH 191/554] Add particle-based rain --- code/game/turfs/turf.dm | 1 + code/modules/weather/_weather.dm | 39 +++++++++++++++ code/modules/weather/weather_fsm_states.dm | 53 +++++++++++++++++++-- code/modules/weather/weather_init.dm | 4 ++ code/modules/weather/weather_wind.dm | 5 ++ icons/effects/weather.dmi | Bin 11805 -> 12238 bytes 6 files changed, 99 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a034ac913ee..18bd63adae1 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -637,6 +637,7 @@ LAZYDISTINCTADD(., air_graphic) if(length(weather?.vis_contents_additions)) LAZYADD(., weather.vis_contents_additions) + . += pick(weather.particle_sources) // we know . is never null here if(flooded) var/flood_object = get_flood_overlay(flooded) if(flood_object) diff --git a/code/modules/weather/_weather.dm b/code/modules/weather/_weather.dm index dd78d0d269b..9c1a6493a53 100644 --- a/code/modules/weather/_weather.dm +++ b/code/modules/weather/_weather.dm @@ -43,6 +43,13 @@ var/obj/abstract/lightning_overlay/lightning_overlay // A visible atom used for animated lighting effects. var/tmp/list/vis_contents_additions // Holder for a list used to add required atoms to turf vis_contents. + /// A list of particle sources to randomize particle-based effects per-turf. + var/list/obj/abstract/weather_particles/particle_sources = newlist( + /obj/abstract/weather_particles, + /obj/abstract/weather_particles, + /obj/abstract/weather_particles, + /obj/abstract/weather_particles + ) // Main heartbeat proc, called by SSweather. /obj/abstract/weather_system/proc/tick() @@ -106,3 +113,35 @@ invisibility = INVISIBILITY_NONE is_spawnable_type = FALSE appearance_flags = RESET_COLOR | KEEP_APART + +// Dummy object for weather particles. +/obj/abstract/weather_particles + // plane = EMISSIVE_PLANE + // layer = ABOVE_LIGHTING_LAYER + icon = null + invisibility = INVISIBILITY_NONE + is_spawnable_type = FALSE + appearance_flags = RESET_COLOR | KEEP_APART + layer = ABOVE_HUMAN_LAYER + +/obj/abstract/weather_particles/proc/update_particle_system(obj/abstract/weather_system/holder) + if(!istype(particles, /particles/weather)) + return + var/particles/weather/weather_particles = particles + weather_particles.color = holder.color // sync color + alpha = holder.alpha // sync alpha + // reset rotation and velocity + weather_particles.rotation = 0 + weather_particles.velocity = generator("vector", weather_particles.base_velocity[1], weather_particles.base_velocity[2], NORMAL_RAND) + if(holder.wind_direction != 0 && holder.wind_strength != 0) // direction is set + // rain always falls down, but if the wind is east or west + // then it also gets a little bit of side momentum + // based on the horizontal component of the direction + var/wind_angle = 90 - dir2angle(holder.wind_direction) // byond's coordinate axis is fucky + var/x_wind_vel = cos(wind_angle) * holder.wind_strength + var/z_wind_vel = sin(wind_angle) * holder.wind_strength // experimental! + // tilt to an angle that makes sense for our min/max velocity + // 0 is south, but if our velocity is pure south we get -90, so add 90 + // and then invert it, because byond uses counter-clockwise and we want clockwise + weather_particles.rotation = generator("num", 90 - arctan(x_wind_vel * 0.50, weather_particles.base_velocity[1][2]), 90 - arctan(x_wind_vel, weather_particles.base_velocity[2][2]), NORMAL_RAND) + weather_particles.velocity += generator("vector", list(0, 0, 0), list(x_wind_vel, 0, z_wind_vel), NORMAL_RAND) \ No newline at end of file diff --git a/code/modules/weather/weather_fsm_states.dm b/code/modules/weather/weather_fsm_states.dm index 6c80309d357..e44f43efa8e 100644 --- a/code/modules/weather/weather_fsm_states.dm +++ b/code/modules/weather/weather_fsm_states.dm @@ -12,8 +12,9 @@ var/icon = 'icons/effects/weather.dmi' var/icon_state + var/particles/weather/particle_system - var/alpha = 210 + var/alpha = 170 var/minimum_time = 2 MINUTES var/maximum_time = 10 MINUTES var/is_liquid = FALSE @@ -22,6 +23,30 @@ var/list/ambient_sounds var/list/ambient_indoors_sounds +/particles/weather + width = 32 + height = 32 + bound1 = list(-16, -16, -20) + bound2 = list(20, 20, 20) + count = 100 + spawning = 2 + lifespan = 2 SECONDS // they'll hopefully hit the bounds long before this runs out + // basic 3d projection matrix + // 16px in the z axis = 1 in the y axis, because perspective memes i guess? + transform = list( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 1/16, 0, 0, + 0, 0, 0, 1, + ) + fadein = 1 + position = generator("box", list(-16, 16, -16), list(20, 20, 20)) // start at the top in the Y axis + /// How much does (east/west) wind affect the horizontal component of the particles? + var/wind_intensity = 2 + /// What is the non-wind-affected velocity component of the particles? + /// A list of two lists (minimum and maximum velocities) passed to a generator. + var/list/base_velocity = list(list(0, -6, 0), list(0, -10, 0)) + /decl/state/weather/entered_state(datum/holder) . = ..() @@ -41,6 +66,15 @@ else weather.color = COLOR_WHITE + if(ispath(particle_system)) + for(var/obj/abstract/weather_particles/particle_source in weather.particle_sources) + particle_source.particles = new particle_system // separate datums so that you could make some turfs have special effects in the future + weather.update_particle_system() // sync wind, etc. + else + for(var/obj/abstract/weather_particles/particle_source in weather.particle_sources) + if(particle_source.particles) + QDEL_NULL(particle_source.particles) + /decl/state/weather/proc/tick(var/obj/abstract/weather_system/weather) return @@ -148,7 +182,8 @@ /decl/state/weather/rain name = "Light Rain" - icon_state = "rain" + icon_state = null//"rain" + particle_system = /particles/weather/rain descriptor = "It is raining gently." cosmetic_span_class = "notice" is_liquid = TRUE @@ -162,13 +197,19 @@ protected_messages = list("Raindrops patter against $ITEM$.") var/list/roof_messages = list("Rain patters against the roof.") +/particles/weather/rain + icon = 'icons/effects/weather.dmi' + icon_state = "rain_particle" // animated particles don't seem to work... + wind_intensity = 1 + /decl/state/weather/rain/handle_roofed_effects(var/mob/living/M, var/obj/abstract/weather_system/weather) if(length(roof_messages) && prob(cosmetic_message_chance)) to_chat(M, "[pick(roof_messages)]") /decl/state/weather/rain/storm name = "Heavy Rain" - icon_state = "storm" + icon_state = null // "storm" + particle_system = /particles/weather/rain/storm descriptor = "It is raining heavily." cosmetic_span_class = "warning" transitions = list( @@ -180,6 +221,11 @@ roof_messages = list("Torrential rain thunders against the roof.") ambient_sounds = list('sound/effects/weather/rain_heavy.ogg') +/particles/weather/rain/storm + wind_intensity = 3 + spawning = 5 + count = 200 + /decl/state/weather/rain/storm/tick(var/obj/abstract/weather_system/weather) ..() if(prob(0.5)) @@ -188,6 +234,7 @@ /decl/state/weather/rain/hail name = "Hail" icon_state = "hail" + particle_system = null descriptor = "It is hailing." cosmetic_span_class = "danger" is_liquid = FALSE diff --git a/code/modules/weather/weather_init.dm b/code/modules/weather/weather_init.dm index 276b6ce614a..48b8e16f3cd 100644 --- a/code/modules/weather/weather_init.dm +++ b/code/modules/weather/weather_init.dm @@ -6,6 +6,10 @@ INITIALIZE_IMMEDIATE(/obj/abstract/weather_system) set_invisibility(INVISIBILITY_NONE) + if(prob(20)) // arbitrary chance to already have some degree of wind when the weather system starts + wind_direction = pick(global.alldirs) + wind_strength = rand(1,5) + banned_weather_conditions = banned // Bookkeeping/rightclick guards. diff --git a/code/modules/weather/weather_wind.dm b/code/modules/weather/weather_wind.dm index c363f20e36e..dc95fdd4f73 100644 --- a/code/modules/weather/weather_wind.dm +++ b/code/modules/weather/weather_wind.dm @@ -23,6 +23,11 @@ wind_direction = turn(wind_direction, 180) if(old_strength != wind_strength) mob_shown_wind.Cut() + update_particle_system() + +/obj/abstract/weather_system/proc/update_particle_system() + for(var/obj/abstract/weather_particles/particle_source in particle_sources) + particle_source.update_particle_system(src) /obj/abstract/weather_system/proc/show_wind(var/mob/M, var/force = FALSE) var/mob_ref = weakref(M) diff --git a/icons/effects/weather.dmi b/icons/effects/weather.dmi index 01aa9d456f4208a31f3f3eabcace8c2072008c79..aa4438a638dc8cac216050ccc45eb43e06c5fa59 100644 GIT binary patch literal 12238 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 literal 11805 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 From 5c034727c7feda95e170b2d163cdc6c6eb99fb65 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 10 Dec 2024 00:21:39 -0500 Subject: [PATCH 192/554] Fix strings that misspell separate as seperate --- code/game/turfs/walls/_wall.dm | 2 +- code/modules/clothing/spacesuits/rig/modules/utility.dm | 2 +- code/modules/codex/entries/atmospherics.dm | 2 +- code/modules/reagents/reactions/reaction_compounds.dm | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index 084fb135e17..9689cf629ae 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -18,7 +18,7 @@ var/global/list/wall_fullblend_objects = list( /turf/wall name = "wall" - desc = "A huge chunk of metal used to seperate rooms." + desc = "A huge chunk of metal used to separate rooms." icon = 'icons/turf/walls/_previews.dmi' icon_state = "solid" opacity = TRUE diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index b3d1533d3b6..7626ac00c32 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -368,7 +368,7 @@ deactivate_string = "Deactivate Thrusters" interface_name = "maneuvering jets" - interface_desc = "An inbuilt EVA maneuvering system that runs off a seperate gas supply." + interface_desc = "An inbuilt EVA maneuvering system that runs off a separate gas supply." origin_tech = @'{"materials":6,"engineering":7}' material = /decl/material/solid/metal/steel matter = list( diff --git a/code/modules/codex/entries/atmospherics.dm b/code/modules/codex/entries/atmospherics.dm index ccc05138738..5b0b67fb8fb 100644 --- a/code/modules/codex/entries/atmospherics.dm +++ b/code/modules/codex/entries/atmospherics.dm @@ -19,7 +19,7 @@ //Normal valves /datum/codex_entry/atmos_valve associated_paths = list(/obj/machinery/atmospherics/valve) - mechanics_text = "Click this to turn the valve. If red, the pipes on each end are seperated. Otherwise, they are connected." + mechanics_text = "Click this to turn the valve. If red, the pipes on each end are separated. Otherwise, they are connected." disambiguator = "atmospherics" available_to_map_tech_level = MAP_TECH_LEVEL_SPACE diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index a2126b561d7..528b85dbcbc 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -151,7 +151,7 @@ name = "Condensed Capsaicin" minimum_temperature = 100 CELSIUS maximum_temperature = 200 CELSIUS // To avoid cooking chili creating condensed capsaicin. - mix_message = "darkens and thickens as it seperates from its water content" + mix_message = "darkens and thickens as it separates from its water content" required_reagents = list(/decl/material/liquid/capsaicin = 2) result = list(/decl/material/liquid/capsaicin/condensed = 1) From bf0700f25c1b81fa11e572f54e6176dee3cc21b6 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 10 Dec 2024 00:24:17 -0500 Subject: [PATCH 193/554] Update cabinet sprites --- icons/obj/closets/bases/cabinet.dmi | Bin 1904 -> 2350 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/closets/bases/cabinet.dmi b/icons/obj/closets/bases/cabinet.dmi index 236b164ca6efcaf049aac254340983f4fb938b26..603874dd3c1891d1178073dd336c580505df5289 100644 GIT binary patch delta 2157 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 From ecbae5b87ab171d17d7fb1e0c9aea397ee086535 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 10 Dec 2024 00:24:05 -0500 Subject: [PATCH 194/554] Add wattle, daubed, plastered, and timber-framed walls --- code/game/turfs/walls/_wall.dm | 2 + code/game/turfs/walls/wall_icon.dm | 27 ++- code/game/turfs/walls/wall_wattle.dm | 158 ++++++++++++++++++ code/modules/materials/_material_stack.dm | 5 + code/modules/materials/_materials.dm | 17 +- .../solids/materials_solid_wood.dm | 8 + code/unit_tests/turf_icons.dm | 13 +- icons/turf/walls/_previews.dmi | Bin 4162 -> 6424 bytes icons/turf/walls/plaster.dmi | Bin 0 -> 1911 bytes icons/turf/walls/reinforced_timber.dmi | Bin 0 -> 1512 bytes icons/turf/walls/reinforced_timber_alt_1.dmi | Bin 0 -> 1668 bytes icons/turf/walls/reinforced_timber_alt_2.dmi | Bin 0 -> 1643 bytes icons/turf/walls/reinforced_timber_alt_3.dmi | Bin 0 -> 1645 bytes icons/turf/walls/reinforced_timber_alt_4.dmi | Bin 0 -> 1655 bytes icons/turf/walls/square_shutter.dmi | Bin 0 -> 951 bytes icons/turf/walls/wattle.dmi | Bin 0 -> 2996 bytes icons/turf/walls/wattledaub.dmi | Bin 0 -> 4213 bytes nebula.dme | 1 + 18 files changed, 214 insertions(+), 17 deletions(-) create mode 100644 code/game/turfs/walls/wall_wattle.dm create mode 100644 icons/turf/walls/plaster.dmi create mode 100644 icons/turf/walls/reinforced_timber.dmi create mode 100644 icons/turf/walls/reinforced_timber_alt_1.dmi create mode 100644 icons/turf/walls/reinforced_timber_alt_2.dmi create mode 100644 icons/turf/walls/reinforced_timber_alt_3.dmi create mode 100644 icons/turf/walls/reinforced_timber_alt_4.dmi create mode 100644 icons/turf/walls/square_shutter.dmi create mode 100644 icons/turf/walls/wattle.dmi create mode 100644 icons/turf/walls/wattledaub.dmi diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index 9689cf629ae..973d7105635 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -51,6 +51,8 @@ var/global/list/wall_fullblend_objects = list( var/handle_structure_blending = TRUE var/min_dismantle_amount = 2 var/max_dismantle_amount = 2 + /// The reinforcement icon to use. Set in update_material() based on reinf_material. + var/reinf_icon /// Icon to use if shutter state is non-null. var/shutter_icon = 'icons/turf/walls/shutter.dmi' diff --git a/code/game/turfs/walls/wall_icon.dm b/code/game/turfs/walls/wall_icon.dm index c682d4f266f..08732bbecaf 100644 --- a/code/game/turfs/walls/wall_icon.dm +++ b/code/game/turfs/walls/wall_icon.dm @@ -12,8 +12,12 @@ if(material) explosion_resistance = material.explosion_resistance hitsound = material.hitsound - if(reinf_material && reinf_material.explosion_resistance > explosion_resistance) - explosion_resistance = reinf_material.explosion_resistance + if(reinf_material) + reinf_icon = islist(reinf_material.icon_reinf) ? pick(reinf_material.icon_reinf) : reinf_material.icon_reinf + if(reinf_material.explosion_resistance > explosion_resistance) + explosion_resistance = reinf_material.explosion_resistance + else + reinf_icon = null update_strings() refresh_opacity() SSradiation.resistance_cache.Remove(src) @@ -52,7 +56,16 @@ . = (istype(material) && material.icon_base) || 'icons/turf/walls/solid.dmi' /turf/wall/proc/apply_reinf_overlay() - . = istype(reinf_material) + . = istype(reinf_material) && reinf_icon + +/// Gets the base wall colour for icon rendering. Can be overridden on wall subtypes. Not equivalent to get_color(). +/// Should only be used in places where material is known to be set, e.g. update_wall_icon(). +/turf/wall/proc/get_base_color() + return material.color + +/// Gets the reinforcement colour. Can be overridden so that some wall types don't apply paint colour to their reinforcements. +/turf/wall/proc/get_reinf_color() + return paint_color || reinf_material?.color /turf/wall/proc/refresh_connections() if(wall_connections && other_connections) @@ -100,7 +113,7 @@ /turf/wall/proc/update_wall_icon() var/material_icon_base = get_wall_icon() - var/base_color = material.color + var/base_color = get_base_color() var/new_icon var/new_icon_state @@ -124,17 +137,17 @@ if(apply_reinf_overlay()) var/image/I - var/reinf_color = paint_color ? paint_color : reinf_material.color + var/reinf_color = get_reinf_color() if(construction_stage != null && construction_stage < 6) I = image('icons/turf/walls/_construction_overlays.dmi', "[construction_stage]") I.color = reinf_color add_overlay(I) else if(reinf_material.use_reinf_state) - I = image(reinf_material.icon_reinf, reinf_material.use_reinf_state) + I = image(reinf_icon, reinf_material.use_reinf_state) I.color = reinf_color else - I = image(_get_wall_subicon(reinf_material.icon_reinf, wall_connections, reinf_color)) + I = image(_get_wall_subicon(reinf_icon, wall_connections, reinf_color)) add_overlay(I) // Update icon on ambient light change, for shutter overlays. diff --git a/code/game/turfs/walls/wall_wattle.dm b/code/game/turfs/walls/wall_wattle.dm new file mode 100644 index 00000000000..42a93e90fc0 --- /dev/null +++ b/code/game/turfs/walls/wall_wattle.dm @@ -0,0 +1,158 @@ +/turf/wall/wattle + icon_state = "wattle" + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + girder_material = null + floor_type = /turf/floor/dirt + min_dismantle_amount = 3 + max_dismantle_amount = 5 + shutter_icon = 'icons/turf/walls/square_shutter.dmi' + var/decl/skill/daubing_skill = SKILL_CONSTRUCTION + var/decl/material/daubing_material // todo: daubing as a material made from clay/soil and plant matter? + var/const/matter_to_daub = MATTER_AMOUNT_REINFORCEMENT + // Currently, plastering is done via painting... undecided if that should change in the future. + +/turf/wall/wattle/Initialize(ml, materialtype, rmaterialtype) + if(ispath(daubing_material)) + daubing_material = GET_DECL(daubing_material) + return ..() + +/turf/wall/wattle/get_turf_validation_corner_states() + return list("", "paint") // paint should always be available because of plastering! + +// Daubing with clay or soil +/turf/wall/wattle/attackby(obj/item/W, mob/user, click_params) + if(isnull(daubing_material)) + var/static/list/daub_materials = list( // Does not include subtypes. + /decl/material/solid/soil = TRUE, + /decl/material/solid/clay = TRUE + ) + if(istype(W, /obj/item/stack/material) && daub_materials[W.material?.type]) + if(!user.check_dexterity(DEXTERITY_WIELD_ITEM)) + return TRUE + var/obj/item/stack/material/stack = W + var/sheets_to_use = stack.matter_units_to_sheets(matter_to_daub) + if(stack.can_use(sheets_to_use) && user.do_skilled(1 SECOND, daubing_skill, target = src) && stack.can_use(sheets_to_use)) + to_chat(user, SPAN_NOTICE("You daub \the [src] with \the [stack].")) + daubing_material = stack.material + stack.use(sheets_to_use) + else if(stack.can_use(sheets_to_use)) // failed the do_skilled + to_chat(user, SPAN_WARNING("You have to stay still to daub \the [src] with \the [stack].")) + else + to_chat(user, SPAN_WARNING("You need [stack.get_string_for_amount(sheets_to_use)] to daub \the [src].")) + return TRUE + return ..() + +/turf/wall/wattle/get_dismantle_stack_type() + return /obj/item/stack/material/log // temp? + +// daubed walls have the color of their daubing +/turf/wall/wattle/get_base_color() + if(daubing_material) + return "#ae9f70" // daubing_material.color // sorry, but using the daubing material color looks bad + return ..() + +// don't plaster over our damn reinforcements +/turf/wall/wattle/get_reinf_color() + return reinf_material?.color + +/turf/wall/wattle/get_wall_icon() + if(isnull(daubing_material)) + return 'icons/turf/walls/wattle.dmi' + else + return 'icons/turf/walls/wattledaub.dmi' + +/turf/wall/wattle/get_dismantle_sound() + return 'sound/foley/wooden_drop.ogg' + +/turf/wall/wattle/update_strings() + if(isnull(daubing_material)) + if(reinf_material) + SetName("[reinf_material.solid_name]-framed [material.adjective_name] wattle wall") + desc = "A wattle wall made of [material.adjective_name] strips and framed with [reinf_material.solid_name]." + else + SetName("[material.solid_name] wattle wall") + desc = "A wattle wall made of [material.adjective_name] strips." + else if(paint_color) + if(reinf_material) + SetName("[reinf_material.solid_name]-framed plastered wall") + else + SetName("plastered wall") + else + if(reinf_material) + SetName("[reinf_material.solid_name]-framed [material.adjective_name] wattle and daub wall") + desc = "A daubed wattle wall made of [material.adjective_name] strips and framed with [reinf_material.solid_name]." + else + SetName("[material.solid_name] wattle and daub wall") + desc = "A daubed wattle wall made of [material.adjective_name] strips." + +/turf/wall/wattle/daubed + icon_state = "wattledaub" + daubing_material = /decl/material/solid/clay + // the daub is lost when destroyed/deconstructed, since it's dried anyway + +/turf/wall/wattle/daubed/plastered + icon_state = "plaster" + paint_color = "#c2b8a1" // this is what applies the plaster... icky + color = "#c2b8a1" // preview color for plaster + +/turf/wall/wattle/daubed/plastered/framed + icon_state = "framed" + reinf_material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color // preview, still painted + +// Subtypes. +#define WATTLE_WALL_SUBTYPE(material_name) \ +/turf/wall/wattle/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +}; \ +/turf/wall/wattle/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/##material_name/shutter/open { \ + shutter_state = TRUE; \ +}; \ +/turf/wall/wattle/daubed/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +}; \ +/turf/wall/wattle/daubed/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/daubed/##material_name/shutter/open { \ + shutter_state = TRUE; \ +}; \ +/turf/wall/wattle/daubed/plastered/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ +}; \ +/turf/wall/wattle/daubed/plastered/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/daubed/plastered/##material_name/shutter/open { \ + shutter_state = TRUE; \ +}; \ +/turf/wall/wattle/daubed/plastered/framed/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + reinf_material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +}; \ +/turf/wall/wattle/daubed/plastered/framed/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/daubed/plastered/framed/##material_name/shutter/open { \ + shutter_state = TRUE; \ +} +WATTLE_WALL_SUBTYPE(fungal) +WATTLE_WALL_SUBTYPE(ebony) +WATTLE_WALL_SUBTYPE(walnut) +WATTLE_WALL_SUBTYPE(maple) +WATTLE_WALL_SUBTYPE(mahogany) +WATTLE_WALL_SUBTYPE(bamboo) +WATTLE_WALL_SUBTYPE(yew) + +#undef WATTLE_WALL_SUBTYPE \ No newline at end of file diff --git a/code/modules/materials/_material_stack.dm b/code/modules/materials/_material_stack.dm index ac7fc8ae449..f5286e91141 100644 --- a/code/modules/materials/_material_stack.dm +++ b/code/modules/materials/_material_stack.dm @@ -219,3 +219,8 @@ . += " [singular_name]" return indefinite_article ? "[indefinite_article] [.]" : ADD_ARTICLE(.) return "[amount] [.] [plural_name]" + +/obj/item/stack/material/proc/matter_units_to_sheets(used) + if(!material || get_reinforced_material()) + return 0 + return ceil(used / matter_per_piece[material.type]) \ No newline at end of file diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 8a6a4d3b1ae..f4a057dd411 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -125,6 +125,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) // Icons var/icon_base = 'icons/turf/walls/solid.dmi' var/icon_base_natural = 'icons/turf/walls/natural.dmi' + /// Either the icon used for reinforcement, or a list of icons to pick from. var/icon_reinf = 'icons/turf/walls/reinforced_metal.dmi' var/wall_flags = 0 var/list/wall_blend_icons = list() // Which wall icon types walls of this material type will consider blending with. Assoc list (icon path = TRUE/FALSE) @@ -563,13 +564,15 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) . += "'[icon_base_natural]' - missing natural shine icon state 'shine[i]'" if(icon_reinf) - if(use_reinf_state) - if(!check_state_in_icon(use_reinf_state, icon_reinf)) - . += "'[icon_reinf]' - missing reinf icon state '[use_reinf_state]'" - else - for(var/i = 0 to 7) - if(!check_state_in_icon("[i]", icon_reinf)) - . += "'[icon_reinf]' - missing directional reinf icon state '[i]'" + var/list/all_reinf_icons = islist(icon_reinf) ? icon_reinf : list(icon_reinf) + for(var/sub_icon in all_reinf_icons) + if(use_reinf_state) + if(!check_state_in_icon(use_reinf_state, sub_icon)) + . += "'[sub_icon]' - missing reinf icon state '[use_reinf_state]'" + else + for(var/i = 0 to 7) + if(!check_state_in_icon(num2text(i), sub_icon)) + . += "'[sub_icon]' - missing directional reinf icon state '[i]'" if(length(color) != 7) . += "invalid color (not #RRGGBB)" diff --git a/code/modules/materials/definitions/solids/materials_solid_wood.dm b/code/modules/materials/definitions/solids/materials_solid_wood.dm index ac5c1372920..e4cb6575b1c 100644 --- a/code/modules/materials/definitions/solids/materials_solid_wood.dm +++ b/code/modules/materials/definitions/solids/materials_solid_wood.dm @@ -12,6 +12,14 @@ 'icons/turf/walls/log.dmi' = TRUE, 'icons/turf/walls/metal.dmi' = TRUE ) + icon_reinf = list( + 'icons/turf/walls/reinforced_timber.dmi', + 'icons/turf/walls/reinforced_timber_alt_1.dmi', + 'icons/turf/walls/reinforced_timber_alt_2.dmi', + 'icons/turf/walls/reinforced_timber_alt_3.dmi', + 'icons/turf/walls/reinforced_timber_alt_4.dmi' + ) + use_reinf_state = null table_icon_base = "wood" bench_icon = 'icons/obj/structures/wood_benches.dmi' pew_icon = 'icons/obj/structures/wood_pews.dmi' diff --git a/code/unit_tests/turf_icons.dm b/code/unit_tests/turf_icons.dm index e0b6a7e17ae..5cf5cb9dce7 100644 --- a/code/unit_tests/turf_icons.dm +++ b/code/unit_tests/turf_icons.dm @@ -127,15 +127,22 @@ ) /turf/wall/proc/get_turf_validation_corner_states() - . = list("", "other") - if(paint_color) + . = list("") + if(!material) + CRASH("[type] lacks a material!") + if(material?.wall_flags & WALL_HAS_EDGES) + . |= "other" + if(paint_color || (material?.wall_flags & PAINT_PAINTABLE)) . |= "paint" - if(stripe_color) + if(stripe_color || (material?.wall_flags & PAINT_STRIPABLE)) . |= "stripe" /turf/wall/natural/get_turf_validation_corner_states() return list("", "shine") +/turf/wall/log/get_turf_validation_corner_states() + return list("", "other") + /turf/wall/validate_turf() // Walls generate their own icons, icon/icon_state are largely irrelevant other than map previews. diff --git a/icons/turf/walls/_previews.dmi b/icons/turf/walls/_previews.dmi index 02e2637c0c77f5c1655d2d83394cb327e5628dd6..59e03e52b4d6c9868d9761dc09c80c5bbbf79b65 100644 GIT binary patch literal 6424 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 msFdsLULF4R34G(__5TA*OVnnEj99?{0000 literal 4162 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 literal 0 HcmV?d00001 diff --git a/icons/turf/walls/reinforced_timber.dmi b/icons/turf/walls/reinforced_timber.dmi new file mode 100644 index 0000000000000000000000000000000000000000..46e537f04e0847544f60e45c76a0edd0ad641cf6 GIT binary patch literal 1512 zcmX|Bdo+}J82)`T!(eD!Yh*N|6pf|Ps3ezfWC|Xgc zvLw0IOono4sNABqjub1ai)37yjM>?>Xa9KL=e+Oxoag!DIp2#rSGjQ=T>N_l*t>^gE7 z^Ib-UV%(hF0X+3GNH$zN@8KO|7Z~jy6&eu}8h!?VxMFv&h^W{lk$c44!X)KqW6HC> z=k9f$)B)P~`=6dWZGQryGB355)7)r7G)Hpr`|QWr9%T0?aC!!9>%B?>H!*`&V`#cZ z>+x>8N~(Tk$3>2ke-gz>;Wl+^Wk)7QDLRRg9i={BuXbD6)nmI+i?|g@)&^;DtY-9G zZV~{PcMf)RkGSH`MeWY7VbxUQvWOj8{Lvo!R##MwIeKq}qF1iYp_>iG)gwZj$6jnf z$lIo~^#sk?KATrQhdtu5igXjkbmN0p9n={|7rP2$E_^tL4Gy&^4t%v3m-jT=jDO)W zDA*;h%6K$;@73b+>BW8No0ao@&ZbkMYyErf0mji}Y9 zA0DY82>8SZS8RT(>3nNha}OcfMCDs$KF{i*Z`WO)uEsgxpxI{!h<~#FQCppwZgNMe z!A^l+hi~#cpU`u%zjXlqzDWy|F=X(8%wliXARBZqiBC1Hu%^C3KKT#uE7<*W8ME$pR4;qnlqF3s470g z=%z(W`ziO^SY2hf5z`>1D}6lUsUDG zb4C4-ju=W

eE5DpecT32=}em#gb)PTe9od{wo7S;@~5m^Dk2$&a*nad7lejEv7q zeiJ85S(B|f*ZsdZpD|eM^jF%U$UeYbu(?HYgh#1I_2qcR83ubeD=A*^;QbIGTt z*Sv4JOsAm8gZNtsU65f36HKW~nBsfD(LfVPx3kGv#S=LPMQ}%5QfYh~FJ*a$w{=`vVqQLq*? zhDhvCgt7D3RuKc?wcyrYi85|{pyT~(#VG!_(qkXwEBZb{-cXsw2qLleYZv8VnHKF$ zVdJ5vE}nG>%yF&*-eWt|kU>Q^I1@NIn-oo$lQ>i6qhqs$)~oUXGb8w1S4lz@8~G>3 z>oZtoa)S2e>Q6k#O#&e9x^uC171xNWr-nh7%P-L<=xjNpE7@r#jfr%*Z<8@Q|5H+EWN_J6 zz{}OPU7pTCvQ+J5wjoI)M+8P-g~r5%K*k)o24sCd>IjSrk^j0OwH8xA!sa>39x!lV LINR0QvXcG=eE63pfMJZ# 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 B3Z(!5 literal 0 HcmV?d00001 diff --git a/icons/turf/walls/square_shutter.dmi b/icons/turf/walls/square_shutter.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d0729a887bebae9227a27c9013cf36cac5b3475b GIT binary patch literal 951 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#kZdsfwzQh!U67;^d;tf|AVqJfO&& z)>C`A8Wcp>F5LVrBEQYO{&nmjj`pf{2k(XQ0V}WPXJm98V^(**{k5t^%4DvYOZ}S! zlS;=&pVTZ3UUju>t}A@$=o7pt;e^v913MQ3DWT#SX3_^W?g#$sOSN6Me#$~=(JKpH zvISXaXI)(OOPqm$>6fRAV@SoEw|6%B-FA>U{;^)GUnfO9S&cuWWb-G6)Dz58j6N!S zah>siQ(}&((5|&BcqZ<$u8uHrTNJ!1NOjx!b2nq^?w?QM{Jli@SKa7j^!V5MGyGLzc*N0Q!KBc~(4h=s?pPt^XgCvS=Dy6DP-uXU~pJbN%>EBFRUZ#X*KqAiSF2;PmJ1yS`>dirDn^wtQDBFq%1K zUVT+nmW^b|d25EpA9sAQVeIHGXQ;b#Z`!=~zs%U)R%7eFE^t=2exr9lR@oPxwpPJ)KGjF9?RR=OLWo}~nwlS+n zT;ZHH!|6pUbQn9h*SB^*jzsnd&`)}^raS$#bC9^ma-ioubBlwrhfFm?A=u6C3`Yc^ zOz}`<4YeA12bufq4Yqc6w>D|qlXdRNYz7C&54#47_r3|CzO($6_o_F)3uHP{xt?ME z`SZ?am~B7u9auko`lZi*$_rvLSXj5*<AUyw7m76Ie_U^=hNQ| zcUU_<|Fd%l<;>XiWug2YF}*$^c$h z!n5K|0r4fh3SkY0yYv_=bj%u2BMoc-%aqic-(!zE_h&Y{1t{F!_BCzuPQOV{{>^`U zFRXO3VeUpIPz>*x&-TgS*^Ua`yb!4?^8>@^(l`fv~<~=V*XsUmb^;V1?OTNPOKB<>lad3 m=gGN1u*9W8LIuNTznNv5Dqq^%IK&9di42~uelF{r5}E))x}6{Z literal 0 HcmV?d00001 diff --git a/icons/turf/walls/wattle.dmi b/icons/turf/walls/wattle.dmi new file mode 100644 index 0000000000000000000000000000000000000000..01ee0aadc3e9d7fefb10f22df131f4ae0807614e GIT binary patch literal 2996 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 literal 0 HcmV?d00001 diff --git a/icons/turf/walls/wattledaub.dmi b/icons/turf/walls/wattledaub.dmi new file mode 100644 index 0000000000000000000000000000000000000000..126f7829c7e9e37a06963820543d121c0aef7e31 GIT binary patch literal 4213 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 H3z7c^+&WX` literal 0 HcmV?d00001 diff --git a/nebula.dme b/nebula.dme index ba7a029e6eb..1dcdcdb621d 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1634,6 +1634,7 @@ #include "code\game\turfs\walls\wall_natural_subtypes.dm" #include "code\game\turfs\walls\wall_natural_xenoarch.dm" #include "code\game\turfs\walls\wall_types.dm" +#include "code\game\turfs\walls\wall_wattle.dm" #include "code\game\verbs\byond_membership.dm" #include "code\game\verbs\ignore.dm" #include "code\game\verbs\ooc.dm" From 053047b855c7e2771a5be1d21f26f1276a072800 Mon Sep 17 00:00:00 2001 From: HeyBanditoz Date: Thu, 19 Dec 2024 18:59:01 -0700 Subject: [PATCH 195/554] Initial 516 support Game compiles, runs, and UIs are working with my limited testing --- code/_helpers/unsorted.dm | 2 ++ code/datums/mind/mind.dm | 12 ++++++------ code/modules/admin/view_variables/topic.dm | 6 +++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 657d9e50035..45dc05bd2c8 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -169,8 +169,10 @@ Turf and target are seperate in case you want to teleport some distance from a t return 1 return 0 +#if DM_VERSION < 516 /proc/sign(x) return x!=0?x/abs(x):0 +#endif /proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm var/px=M.x //starting x diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index 377c2dced75..34bad84cb65 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -151,8 +151,8 @@ if(href_list["add_goal"]) - var/mob/caller = locate(href_list["add_goal_caller"]) - if(caller && caller == current) can_modify = TRUE + var/mob/calling_proc = locate(href_list["add_goal_caller"]) + if(calling_proc && calling_proc == current) can_modify = TRUE if(can_modify) if(is_admin) @@ -170,8 +170,8 @@ if(href_list["abandon_goal"]) var/datum/goal/goal = get_goal_from_href(href_list["abandon_goal"]) - var/mob/caller = locate(href_list["abandon_goal_caller"]) - if(caller && caller == current) can_modify = TRUE + var/mob/calling_proc = locate(href_list["abandon_goal_caller"]) + if(calling_proc && calling_proc == current) can_modify = TRUE if(goal && can_modify) if(usr == current) @@ -185,8 +185,8 @@ if(href_list["reroll_goal"]) var/datum/goal/goal = get_goal_from_href(href_list["reroll_goal"]) - var/mob/caller = locate(href_list["reroll_goal_caller"]) - if(caller && caller == current) can_modify = TRUE + var/mob/calling_proc = locate(href_list["reroll_goal_caller"]) + if(calling_proc && calling_proc == current) can_modify = TRUE if(goal && (goal in goals) && can_modify) qdel(goal) diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 9cec7322e10..f1118e682c9 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -599,9 +599,9 @@ href_list["datumrefresh"] = href_list["mobToDamage"] else if(href_list["call_proc"]) - var/datum/callee = locate(href_list["call_proc"]) - if(istype(callee) || istype(callee, /client)) // can call on clients too, not just datums - callproc_targetpicked(1, callee) + var/datum/called_proc = locate(href_list["call_proc"]) + if(istype(called_proc) || istype(called_proc, /client)) // can call on clients too, not just datums + callproc_targetpicked(1, called_proc) else if(href_list["addaura"]) if(!check_rights(R_DEBUG|R_ADMIN|R_FUN)) return var/mob/living/victim = locate(href_list["addaura"]) From 95d62d8e754bb4bc32714c8466f36820df0ed1f4 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 20 Dec 2024 22:49:21 +1100 Subject: [PATCH 196/554] Automatic changelog generation for PR #4654 [ci skip] --- html/changelogs/AutoChangeLog-pr-4654.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4654.yml diff --git a/html/changelogs/AutoChangeLog-pr-4654.yml b/html/changelogs/AutoChangeLog-pr-4654.yml new file mode 100644 index 00000000000..05d15519407 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4654.yml @@ -0,0 +1,4 @@ +author: Penelope Haze +changes: + - {tweak: Makes weather effects slightly more transparent.} +delete-after: true From 44b370dc6b35641426cf1cb332744fa94c76235f Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:18:21 -0500 Subject: [PATCH 197/554] Add new mud turf sprite and dirt color --- code/game/turfs/flooring/_flooring.dm | 2 +- code/game/turfs/flooring/flooring_mud.dm | 3 ++- .../turfs/floors/subtypes/floor_natural.dm | 3 ++- icons/turf/flooring/mud.dmi | Bin 1839 -> 2654 bytes 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index 9d3ce2f33cf..a02efe3cb84 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -78,7 +78,7 @@ var/global/list/flooring_cache = list() var/render_trenches = TRUE var/floor_layer = TURF_LAYER var/holographic = FALSE - var/dirt_color = "#7c5e42" + var/dirt_color = /decl/material/solid/soil::color var/list/burned_states var/list/broken_states diff --git a/code/game/turfs/flooring/flooring_mud.dm b/code/game/turfs/flooring/flooring_mud.dm index 59be34fdfad..fd4866144b9 100644 --- a/code/game/turfs/flooring/flooring_mud.dm +++ b/code/game/turfs/flooring/flooring_mud.dm @@ -3,6 +3,7 @@ desc = "A stretch of thick, waterlogged mud." icon = 'icons/turf/flooring/mud.dmi' icon_base = "mud" + color = null // autoset from material icon_edge_layer = FLOOR_EDGE_MUD footstep_type = /decl/footsteps/mud turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID @@ -45,7 +46,7 @@ icon = 'icons/turf/flooring/dirt.dmi' icon_base = "dirt" icon_edge_layer = FLOOR_EDGE_DIRT - color = "#41311b" + color = null // autoset from material footstep_type = /decl/footsteps/asteroid turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/soil diff --git a/code/game/turfs/floors/subtypes/floor_natural.dm b/code/game/turfs/floors/subtypes/floor_natural.dm index 4b2ddd092f9..09fbbcc07d2 100644 --- a/code/game/turfs/floors/subtypes/floor_natural.dm +++ b/code/game/turfs/floors/subtypes/floor_natural.dm @@ -8,7 +8,7 @@ name = "dirt" icon = 'icons/turf/flooring/dirt.dmi' icon_state = "dirt" - color = "#41311b" + color = /decl/material/solid/soil::color // preview color _base_flooring = /decl/flooring/dirt /turf/floor/chlorine_sand @@ -72,6 +72,7 @@ name = "mud" icon = 'icons/turf/flooring/mud.dmi' icon_state = "mud" + color = /decl/material/solid/soil::color // preview color _base_flooring = /decl/flooring/mud /turf/floor/mud/water diff --git a/icons/turf/flooring/mud.dmi b/icons/turf/flooring/mud.dmi index 738ae2dd4ef287787827d846b22df139c8df4f26..b73fcd5c76fb0a6a3f18208eac7011e49859c9b2 100644 GIT binary patch delta 2482 zcmV;j2~GB|4&D@yB!44NOjJd{z`&uQm~?M?aAqM50xrlFyksi~%RaeAVnnxdkc zcXE59qnmztfO~g-Wng=Sfrf~Lh=F~AfqjITmy&O1dS+pJVqSTTij19|m7kxLi-(G5 zVtagee|>m>jERegg@|%%d2?-fmX(o^j*X9ujE;+pb#QuXV}E^;kB($tdSzgGYGZt) zq@09+g@%HMaA|p;pO$iLd2woad31exb$)_=gm`m&iH3-hj*g3niqQTjRi{}_Aq*yFw;y7PcB4R)UiWw*{Vo^nz zjQm2Pe;pg$B$4X{*|Z@VPR&%;FNe{U+E=0d{V{ghtIK`o)2HgpPW2=)j2~JZVd3(E zkV$mD6H+QD5~CEEVD@_oW$|cs9RyGxm|9`bxVlPj0D`f3>e%U*Gq^pS9sKd2_^$k; zYyKAkA_;;Z7V)h`+Cm>X0suYk!ycphVe-%T$s+}2!0Fc4GUk0c)Q@i=FOxvx4 zk5~8rRZ=8^u*i#06eKD|giz$5P{ma!Ep)nm6h#1L_t6^IlPtFH%Hr^}HW?m*J)A95 zZUP}IN~D-!9zL@tDo9q9JquLoQ$=M8on+PEez+W{rv5BjdI5xIGfnT(9z-?2GMqN{ zfA|Ry39I0SDI6gRI!hD{)fGwnJ_kV2?`Jvzh+Yp1FG&0n@=FE9J$J~x3I z-2Nh|5-ffplCTdV6atB00qo>i$ZqaubEA7{1ZI+`C%Rthzt}^4m3a-g_=yB3+yv$p zVZ~?Ep3l!zAe6C)ND{rtMM=gY%=S9fe|iLlF>qu#e$nNA31B!g`|83iR{|v?zElwIXK;s2NIW_sgZZy798rYkM+iJ1-DjOv_iT<%pX=p@>}|MZ#xX zEzf_51)va>P!vN(Rhnz4)=`r+!ktp6@Cq~Ee1b`k)vjzHY)46LMXjq!>ukaTT2+@xt1*KT1O1TQ> z-54_EyoVWRidy&jIINDZI)khrHq1*lKYTC5* z*`fUi5*hlSn@-x9*p6`Ye}Z0QFT4Kj!4Q0GO>P1wMa(!3AoQ7{9fu0eMN}bu>zv9c zMkTRQsd)Fj<|Ysdc^`_H0g5V+p%I}uFj-}!pSNMq z?Vi-#36{W3?4(xes4t#}X7DC1TS2MO;1?np&A1p@SOX*?6p5e_f1)qQgjwiJtKhx< zU=7@IL)R0qb!X}}8jwWZ+v>5poXwUqZUQwIr&3Fju=gy?J`Mwgd?qF5`BcW5!4)K0 z*BuznAl_RwCU2eB*YInarnA!(7#G=)n?T*dB0RD3LXdL>$~}NmcZV_cHysE=_xN3f z#n|*3I1K`fs$-~Te=s@7!Vp#~ZUSdAmOwH1K8jN;K)jI{-(JN|>{T`GSo4$k9#$yC zQ2-FG-X7Cl74|_J-ZFk2@CrqRC@1K|BvA6*r!pFG?#N}#KzXn02Ue22>pdLEMgQK3 z{ON7Gb-E{p;6I+5{4?P=#v)`EPQZPX1vu`(-te|wnElggzdchVBPHUzWn zG@oA6UN#A2IE8?pK%Xc@B4hURJpxPbGA7K|<8rN@t=D6iub#Ts z?T0ypo!SD0pfsw09Gz9WYAoZ4sNOLfv$j&(1>dh6J5KBLM^-;sPtrGcA3&|uZugIF z*&+j{tA@Y*u~F-ttx9*b`g+|_wGp7~p4?pAcP-DmfASiuQrAmlzp{+vIz%O`gi;6g zo3`ER-j`k`j{Tt!nUPVL4Oqclz$87o4=!qO8SA%#5wHFc9<-L9Hak)NfdOAQqRtnt za}$_wMFYPS+g#C8elxn`Nr5xuKc1IVj^Or`pTOA_Pqf30z-u1P>g3H;f`{^I&72bD%=3?ZxK7 zgTLVW0X_ZpZR6l+=yDTC40ZEXD!;Tp{-+OMc-D5qjf3yL@)M}7f9P!SzfpSPC!qQq zGa2v%f5-8!JkbjO!KBOe2!qE+en)M+`9y?!!2f%}ns27jxCwBU@n6sdeBpQ81UP?n w;wP}h7F%qw#THv^vBef!Y_Y`_Tm0YSUl0l&f|7&K0{{R307*qoM6N<$f^gWsFaQ7m delta 1661 zcmV-@27>wC6t51DB!4VWOjJd{z`#a1C`mgmL^dKkFC0KKA3rl6LNp;kG$2PgB}O?U zNIE4&HzPtdAwe@BIWZr2u zG9E=YB1=3deQQ&5VMAJFdj@jDMBf!Iwnm&DrQzcR75X5FdaE78ALZFQA9OQKr3-#QC(3( zTTM1pMKE<_O*dpzJy}XLM>-{9Q#^2AM_WuaU{E@JZB&79R#HMOZe2xOPBuC&8&yUy zZCpiZSV6$Rz!)!=9g|Q2rhf$*Nkl5SFP9Pm^yprH8WWbb-!Q$<@^=s=0#gH5nW*7jAjR=f9%K`Gu{D1n5#O5jBk4Yi# zw{ZqjU;&q|uN5u;5P@;11}6GuZ7_z&ZP{&nS!wyD3Gd9_+$r&UhQhXojS#<%H_iH$ zq!R$+HL!&edGmbrT0sB+8!5d#_Ymf{UfsP7P%K_cU_3sPlV4rtzcnBl7awq!Vuvrx$1Nbl7v zx=+IaG}`yqsI>`$Kmak+u=nQ8x88n-ynt*mqyVqP7Qq0v*nj9}=|`|QCwFdZlI3uo zCRGOSZsvpw3b0B5oJ5~%)xcMZPQUJipCOa78C6i$J zi`>Hp?=R-KSE$Axr0Jv5i%uSuLo~w9fd&A>wSX1jyf@&jsKr5A=TN7QpNu~oKY9H0 zqwHe_@X3gr!GC@l>u7*CEYc+zvH}3(oPfvY{QuD6vvhi_0H8^He04qyjeieCUyNw?bFgF727W%rknr{S zi!T)bG&U!za{)TD1NlHsWv7XIfEy>(xlHiY*WmzI=j`>)J6@9x7(hYAhX}uB#h|=@ zr^YI@@&LX`GywQ6#56JB+X4h6#b};=o08Oc2*)!jjx#QX_~fM2a6*=Cq$GOvb5Ry2 z#B^63y?^+QBQW0PZLeAjSdA!P(ar|}M+8M=+Y^$U#qRegsu*Ae^xiP@J%Ls=6wULU zD zfBXr%f|&vUBcUhR$oRtCcEzITf--?5qMC}stbevYzx-t%TO<_#J`uI~n3cewoNG+Z zj?Y@3|0;#yXCK`gDBAN0DFvO*786;B?K+oZTF)6r zd4ENjEkB88{$_;_m}-_hY)QTVE%9Eq`Dfg*#!s{$KuE05*tQp(hLjFb)S0RL?Z#127F>)|d~3 zRdj{eDWKx00D=l|}^8uI}>|95BB zm=ECjKY&}I7KDYeLKv1I@-^lIL3_}c4`5>%z^pJI!1I3q0EPJg9d$Z0Ys?4e{NI^b zV?Gdc#@DEZc>eFstT7)*!vKWO2Lf9%jbaqStZzxmdg`gCo_gx(e^37aEo*5sNIp!O00000NkvXX Hu0mjf+`rD^ From debc2e8634b5a945a22343f9b4b1de603b359727 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:18:47 -0500 Subject: [PATCH 198/554] Adjust wood floor color ramp --- icons/turf/flooring/wood.dmi | Bin 2723 -> 2723 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/turf/flooring/wood.dmi b/icons/turf/flooring/wood.dmi index a93de0fefca62d4bc74c33f7ab8ee31f21eaa3a4..9e17d5cbeb4095a698d99cba5288022eae738b33 100644 GIT binary patch delta 48 zcmV-00MGxU6{8i9G977Qa=*H&r=y>#q@i0|Tb7oVa(RQOsHmHpo6gRWPc8()kJQ1j Gfg%b^x)_20 delta 48 zcmV-00MGxU6{8i9G96)Oa=)#rr=y>#q@i0|Tb7oVa(RQOsHmHpo6f|MPc8)cpFah$ Gfg%b+{TE*V From d4020b99553c372460a5a2353b77610f145da485 Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:19:43 -0500 Subject: [PATCH 199/554] Add temperature requirements to cooking recipes --- code/modules/food/cooking/recipes/recipe_baked.dm | 3 +++ code/modules/food/cooking/recipes/recipe_boiled.dm | 2 +- code/modules/food/cooking/recipes/recipe_fried.dm | 3 +++ code/modules/food/cooking/recipes/recipe_grilled.dm | 3 +++ code/modules/food/cooking/recipes/recipe_steamed.dm | 3 +++ 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/code/modules/food/cooking/recipes/recipe_baked.dm b/code/modules/food/cooking/recipes/recipe_baked.dm index 90bb8ad590d..a549e1b3f8a 100644 --- a/code/modules/food/cooking/recipes/recipe_baked.dm +++ b/code/modules/food/cooking/recipes/recipe_baked.dm @@ -4,6 +4,9 @@ RECIPE_CATEGORY_MICROWAVE, RECIPE_CATEGORY_BAKING_DISH ) + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS //cooking_heat_type = COOKING_HEAT_INDIRECT /decl/recipe/baked/pizzamargherita diff --git a/code/modules/food/cooking/recipes/recipe_boiled.dm b/code/modules/food/cooking/recipes/recipe_boiled.dm index d1f8f74207f..031bd5a164a 100644 --- a/code/modules/food/cooking/recipes/recipe_boiled.dm +++ b/code/modules/food/cooking/recipes/recipe_boiled.dm @@ -1,6 +1,6 @@ /decl/recipe/boiled abstract_type = /decl/recipe/boiled - //minimum_temperature = T100C + minimum_temperature = 80 CELSIUS // increase to /decl/material/liquid/water::boiling_point once microwaves are reworked //cooking_heat_type = COOKING_HEAT_INDIRECT //cooking_medium_type = /decl/material/liquid/water //cooking_medium_amount = 20 diff --git a/code/modules/food/cooking/recipes/recipe_fried.dm b/code/modules/food/cooking/recipes/recipe_fried.dm index 784b619335e..3d4af90fc98 100644 --- a/code/modules/food/cooking/recipes/recipe_fried.dm +++ b/code/modules/food/cooking/recipes/recipe_fried.dm @@ -1,5 +1,8 @@ /decl/recipe/fried abstract_type = /decl/recipe/fried + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS //cooking_heat_type = COOKING_HEAT_DIRECT //cooking_medium_type = /decl/material/liquid/oil container_categories = list( diff --git a/code/modules/food/cooking/recipes/recipe_grilled.dm b/code/modules/food/cooking/recipes/recipe_grilled.dm index d2e4e234090..cf6896a827c 100644 --- a/code/modules/food/cooking/recipes/recipe_grilled.dm +++ b/code/modules/food/cooking/recipes/recipe_grilled.dm @@ -5,6 +5,9 @@ RECIPE_CATEGORY_MICROWAVE, RECIPE_CATEGORY_SKILLET ) + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS completion_message = "The meat sizzles as it is cooked through." /decl/recipe/grilled/plainsteak diff --git a/code/modules/food/cooking/recipes/recipe_steamed.dm b/code/modules/food/cooking/recipes/recipe_steamed.dm index dacac34bed1..746439f6ac2 100644 --- a/code/modules/food/cooking/recipes/recipe_steamed.dm +++ b/code/modules/food/cooking/recipes/recipe_steamed.dm @@ -1,5 +1,8 @@ /decl/recipe/steamed abstract_type = /decl/recipe/steamed + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS /decl/recipe/steamed/chawanmushi fruit = list("mushroom" = 1) From 2ac7a44f1ced45e587b81d4fd2c4ac11d8afd22b Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Tue, 17 Dec 2024 16:20:55 -0500 Subject: [PATCH 200/554] Add doc comments to lighting_turf.dm --- code/modules/lighting/lighting_turf.dm | 28 ++++++++++++++++---------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index de8134d5e51..d4008f536a2 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -1,16 +1,22 @@ /turf var/dynamic_lighting = TRUE - var/ambient_light // If non-null, a hex RGB light color that should be applied to this turf. - var/ambient_light_multiplier = 0.3 // The power of the above is multiplied by this. Setting too high may drown out normal lights on the same turf. + /// If non-null, a hex RGB light color that should be applied to this turf. + var/ambient_light + /// The power of the above is multiplied by this. Setting too high may drown out normal lights on the same turf. + var/ambient_light_multiplier = 0.3 luminosity = 1 var/tmp/lighting_corners_initialised = FALSE - var/tmp/list/datum/light_source/affecting_lights // List of light sources affecting this turf. - var/tmp/atom/movable/lighting_overlay/lighting_overlay // Our lighting overlay. + /// List of light sources affecting this turf. + var/tmp/list/datum/light_source/affecting_lights + /// Our lighting overlay, used to apply multiplicative lighting to the tile and its contents. + var/tmp/atom/movable/lighting_overlay/lighting_overlay var/tmp/list/datum/lighting_corner/corners - var/tmp/has_opaque_atom = FALSE // Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile. - var/tmp/ambient_has_indirect = FALSE // If this is TRUE, an above turf's ambient light is affecting this turf. + /// Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile. + var/tmp/has_opaque_atom = FALSE + /// If this is TRUE, an above turf's ambient light is affecting this turf. + var/tmp/ambient_has_indirect = FALSE // Record-keeping, do not touch -- that means you, admins. var/tmp/ambient_light_old @@ -92,14 +98,14 @@ ambient_light_old = ambient_light -// Causes any affecting light sources to be queued for a visibility update, for example a door got opened. +/// Causes any affecting light sources to be queued for a visibility update, for example a door got opened. /turf/proc/reconsider_lights() var/datum/light_source/L for (var/thing in affecting_lights) L = thing L.vis_update() -// Forces a lighting update. Reconsider lights is preferred when possible. +/// Forces a lighting update. Reconsider lights is preferred when possible. /turf/proc/force_update_lights() var/datum/light_source/L for (var/thing in affecting_lights) @@ -137,7 +143,7 @@ C.active = TRUE -// Returns the average color of this tile. Roughly corresponds to the color of a single old-style lighting overlay. +/// Returns the average color of this tile. Roughly corresponds to the color of a single old-style lighting overlay. /turf/proc/get_avg_color() if (!lighting_overlay) return null @@ -159,7 +165,7 @@ #define SCALE(targ,min,max) (targ - min) / (max - min) -// Used to get a scaled lumcount. +/// Returns a lumcount (average intensity of color channels) scaled between minlum and maxlum. /turf/proc/get_lumcount(minlum = 0, maxlum = 1) if (!lighting_overlay) return 0.5 @@ -176,7 +182,7 @@ #undef SCALE -// Can't think of a good name, this proc will recalculate the has_opaque_atom variable. +/// Can't think of a good name, this proc will recalculate the has_opaque_atom variable. /turf/proc/recalc_atom_opacity() #ifdef AO_USE_LIGHTING_OPACITY var/old = has_opaque_atom From cc76d55872dcb2ab23aaf4e456932dd67a1dc27e Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Wed, 18 Dec 2024 19:28:27 -0500 Subject: [PATCH 201/554] Add Doe's new chest sprites --- .../structures/crates_lockers/crates.dm | 23 ++++++++++++++++++ icons/obj/closets/bases/chest.dmi | Bin 1415 -> 1872 bytes 2 files changed, 23 insertions(+) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index f9a8de10bf3..6df0fd7eb1c 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -324,6 +324,29 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/wood/oak color = /decl/material/solid/organic/wood/oak::color + var/icon/overlay_icon = 'icons/obj/closets/bases/chest.dmi' + // TODO: Rework chest crafting so that this can use reinf_material instead. + /// The material used for the opacity and color of the trim overlay. + var/decl/material/overlay_material = /decl/material/solid/metal/iron + +/obj/structure/closet/crate/chest/Initialize() + . = ..() + if(ispath(overlay_material)) + overlay_material = GET_DECL(overlay_material) + // icon update is already queued in parent because of closet appearance + +/obj/structure/closet/crate/chest/update_material_desc(override_desc) + ..() + if(overlay_material) + desc = "[desc] It has a trim made of [overlay_material.solid_name]." + +/obj/structure/closet/crate/chest/on_update_icon() + . = ..() + if(istype(overlay_material)) + var/overlay_state = opened ? "open-overlay" : "base-overlay" + var/image/trim = overlay_image(overlay_icon, overlay_state, overlay_material.color, RESET_COLOR|RESET_ALPHA) + trim.alpha = clamp((50 + overlay_material.opacity * 255), 0, 255) + add_overlay(trim) /obj/structure/closet/crate/chest/ebony material = /decl/material/solid/organic/wood/ebony diff --git a/icons/obj/closets/bases/chest.dmi b/icons/obj/closets/bases/chest.dmi index 491dcbd62c0485d89f2339333860f3722b42ccbe..bef40525584deb2103b95053b0fbaabd9801ca3b 100644 GIT binary patch delta 1796 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 R()0iT002ovPDHLkV1m>hruYB= From 9c958bf5831ce9a29e3566c914bb7d2b8ac7963e Mon Sep 17 00:00:00 2001 From: Noelle Lavenza Date: Thu, 19 Dec 2024 01:09:45 -0500 Subject: [PATCH 202/554] Add recipes for rough wooden tiles --- .../crafting/stack_recipes/recipes_stacks.dm | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/code/modules/crafting/stack_recipes/recipes_stacks.dm b/code/modules/crafting/stack_recipes/recipes_stacks.dm index c78160e09fc..06c19604fbf 100644 --- a/code/modules/crafting/stack_recipes/recipes_stacks.dm +++ b/code/modules/crafting/stack_recipes/recipes_stacks.dm @@ -26,6 +26,26 @@ result_type = /obj/item/stack/tile/wood/walnut required_material = /decl/material/solid/organic/wood/walnut +/decl/stack_recipe/tile/wood/mahogany/rough + crafting_extra_cost_factor = 2 // wasteful but easy + difficulty = MAT_VALUE_EASY_DIY + result_type = /obj/item/stack/tile/wood/rough/mahogany + +/decl/stack_recipe/tile/wood/maple/rough + crafting_extra_cost_factor = 2 + difficulty = MAT_VALUE_EASY_DIY + result_type = /obj/item/stack/tile/wood/rough/maple + +/decl/stack_recipe/tile/wood/ebony/rough + crafting_extra_cost_factor = 2 + difficulty = MAT_VALUE_HARD_DIY + result_type = /obj/item/stack/tile/wood/rough/ebony + +/decl/stack_recipe/tile/wood/walnut/rough + crafting_extra_cost_factor = 2 + difficulty = MAT_VALUE_EASY_DIY + result_type = /obj/item/stack/tile/wood/rough/walnut + /decl/stack_recipe/tile/wood/oak_laminate result_type = /obj/item/stack/tile/wood/laminate/oak required_material = /decl/material/solid/organic/wood/chipboard From d6cdb600bf3b271c56aafc4a92ba7234ed14b98f Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sat, 21 Dec 2024 00:49:02 +0000 Subject: [PATCH 203/554] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-4654.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4654.yml diff --git a/html/changelog.html b/html/changelog.html index 00a4fec35a0..d152fc17840 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->

+

21 December 2024

+

Penelope Haze updated:

+
    +
  • Makes weather effects slightly more transparent.
  • +
+

07 December 2024

MistakeNot4892 updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3906fe0882f..09a36ad2264 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14933,3 +14933,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. MistakeNot4892: - tweak: Most wooden floors and tables on space maps are now chipboard laminate instead. +2024-12-21: + Penelope Haze: + - tweak: Makes weather effects slightly more transparent. diff --git a/html/changelogs/AutoChangeLog-pr-4654.yml b/html/changelogs/AutoChangeLog-pr-4654.yml deleted file mode 100644 index 05d15519407..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4654.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Penelope Haze -changes: - - {tweak: Makes weather effects slightly more transparent.} -delete-after: true From ce03e41897c03892818414c61e60f7bc88a83371 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 30 May 2024 18:13:22 -0400 Subject: [PATCH 204/554] Add heights to mob inventory slots --- code/datums/inventory_slots/_inventory_slot.dm | 2 ++ code/datums/inventory_slots/slots/slot_back.dm | 1 + code/datums/inventory_slots/slots/slot_ears.dm | 1 + code/datums/inventory_slots/slots/slot_glasses.dm | 1 + code/datums/inventory_slots/slots/slot_head.dm | 1 + code/datums/inventory_slots/slots/slot_id.dm | 1 + code/datums/inventory_slots/slots/slot_mask.dm | 1 + code/datums/inventory_slots/slots/slot_shoes.dm | 1 + code/datums/inventory_slots/slots/slot_suit_storage.dm | 1 + 9 files changed, 10 insertions(+) diff --git a/code/datums/inventory_slots/_inventory_slot.dm b/code/datums/inventory_slots/_inventory_slot.dm index 204284e6f2c..cc8aa6ad420 100644 --- a/code/datums/inventory_slots/_inventory_slot.dm +++ b/code/datums/inventory_slots/_inventory_slot.dm @@ -19,6 +19,8 @@ var/requires_slot_flags var/requires_organ_tag var/quick_equip_priority = 0 // Higher priority means it will be checked first. If null, will not be considered for quick equip. + /// What depth of fluid is necessary for an item in this slot to be considered submerged? + var/fluid_height = FLUID_SHALLOW var/mob_overlay_layer var/alt_mob_overlay_layer diff --git a/code/datums/inventory_slots/slots/slot_back.dm b/code/datums/inventory_slots/slots/slot_back.dm index cc65742561b..7c2496867ed 100644 --- a/code/datums/inventory_slots/slots/slot_back.dm +++ b/code/datums/inventory_slots/slots/slot_back.dm @@ -7,6 +7,7 @@ requires_slot_flags = SLOT_BACK mob_overlay_layer = HO_BACK_LAYER quick_equip_priority = 14 + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level /datum/inventory_slot/back/simple requires_organ_tag = null diff --git a/code/datums/inventory_slots/slots/slot_ears.dm b/code/datums/inventory_slots/slots/slot_ears.dm index 295c24a5a89..1e905433cfc 100644 --- a/code/datums/inventory_slots/slots/slot_ears.dm +++ b/code/datums/inventory_slots/slots/slot_ears.dm @@ -10,6 +10,7 @@ requires_slot_flags = SLOT_EARS mob_overlay_layer = HO_L_EAR_LAYER quick_equip_priority = 7 + fluid_height = (FLUID_SHALLOW * 0.25 + FLUID_OVER_MOB_HEAD * 0.75) // 3/4 of the way between waist-level and the top of your head /datum/inventory_slot/ear/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) for(var/slot in global.airtight_slots) diff --git a/code/datums/inventory_slots/slots/slot_glasses.dm b/code/datums/inventory_slots/slots/slot_glasses.dm index 0068fac4a1e..d686ac93edb 100644 --- a/code/datums/inventory_slots/slots/slot_glasses.dm +++ b/code/datums/inventory_slots/slots/slot_glasses.dm @@ -11,6 +11,7 @@ mob_overlay_layer = HO_GLASSES_LAYER alt_mob_overlay_layer = HO_GOGGLES_LAYER quick_equip_priority = 5 + fluid_height = (FLUID_SHALLOW * 0.25 + FLUID_OVER_MOB_HEAD * 0.75) // 3/4 of the way between waist-level and the top of your head /datum/inventory_slot/glasses/get_examined_string(mob/owner, mob/user, distance, hideflags, decl/pronouns/pronouns) if(_holding && !(hideflags & HIDEEYES)) diff --git a/code/datums/inventory_slots/slots/slot_head.dm b/code/datums/inventory_slots/slots/slot_head.dm index dce1c5e4ab6..6c31459f016 100644 --- a/code/datums/inventory_slots/slots/slot_head.dm +++ b/code/datums/inventory_slots/slots/slot_head.dm @@ -9,6 +9,7 @@ requires_slot_flags = SLOT_HEAD mob_overlay_layer = HO_HEAD_LAYER quick_equip_priority = 9 + fluid_height = FLUID_OVER_MOB_HEAD /datum/inventory_slot/head/simple requires_organ_tag = null diff --git a/code/datums/inventory_slots/slots/slot_id.dm b/code/datums/inventory_slots/slots/slot_id.dm index 35d80c2c5a4..67b759c682c 100644 --- a/code/datums/inventory_slots/slots/slot_id.dm +++ b/code/datums/inventory_slots/slots/slot_id.dm @@ -6,6 +6,7 @@ requires_slot_flags = SLOT_ID mob_overlay_layer = HO_ID_LAYER quick_equip_priority = 13 + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level /datum/inventory_slot/id/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) var/obj/item/clothing/clothes = user.get_equipped_item(slot_w_uniform_str) diff --git a/code/datums/inventory_slots/slots/slot_mask.dm b/code/datums/inventory_slots/slots/slot_mask.dm index 33f44fa9044..53fa82f6421 100644 --- a/code/datums/inventory_slots/slots/slot_mask.dm +++ b/code/datums/inventory_slots/slots/slot_mask.dm @@ -10,6 +10,7 @@ can_be_hidden = TRUE mob_overlay_layer = HO_FACEMASK_LAYER quick_equip_priority = 10 + fluid_height = (FLUID_SHALLOW * 0.25 + FLUID_OVER_MOB_HEAD * 0.75) // 3/4 of the way between waist-level and the top of your head /datum/inventory_slot/mask/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) if(prop?.flags_inv & BLOCK_ALL_HAIR) diff --git a/code/datums/inventory_slots/slots/slot_shoes.dm b/code/datums/inventory_slots/slots/slot_shoes.dm index 02c47d26787..6fc4889be0b 100644 --- a/code/datums/inventory_slots/slots/slot_shoes.dm +++ b/code/datums/inventory_slots/slots/slot_shoes.dm @@ -10,6 +10,7 @@ ) requires_slot_flags = SLOT_FEET quick_equip_priority = 3 + fluid_height = 3 /datum/inventory_slot/shoes/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) var/obj/item/suit = user.get_equipped_item(slot_wear_suit_str) diff --git a/code/datums/inventory_slots/slots/slot_suit_storage.dm b/code/datums/inventory_slots/slots/slot_suit_storage.dm index 91a03c4610d..832a7256329 100644 --- a/code/datums/inventory_slots/slots/slot_suit_storage.dm +++ b/code/datums/inventory_slots/slots/slot_suit_storage.dm @@ -5,6 +5,7 @@ slot_id = slot_s_store_str requires_organ_tag = BP_CHEST mob_overlay_layer = HO_SUIT_STORE_LAYER + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level /datum/inventory_slot/suit_storage/can_equip_to_slot(var/mob/user, var/obj/item/prop, var/disable_warning, var/ignore_equipped) . = ..() From 14ba304d8d7d468fd1de5aa778d8a8b98097f08f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 30 May 2024 18:13:34 -0400 Subject: [PATCH 205/554] Add more slot helpers to items --- code/modules/mob/inventory.dm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 3dddd78aced..89f590dcecd 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -271,6 +271,9 @@ return 1 //already unequipped, so success return I.mob_can_unequip(src, slot) +/obj/item/proc/get_any_equipped_slot() + return get_equipped_slot() || get_held_slot() + /obj/item/proc/get_equipped_slot() if(!ismob(loc)) return null @@ -285,6 +288,12 @@ if(get_equipped_item(slot_str) == I) // slots[slot]._holding == I return slot_str +/obj/item/proc/get_held_slot() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_held_slot_for_item(src) + /mob/proc/get_held_slot_for_item(obj/item/I) var/list/slots = get_held_item_slots() if(!length(slots)) From dfa2dcbd1bdbe0173f842c1e2546dae52da91405 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 00:48:03 -0500 Subject: [PATCH 206/554] Make fluids check tables, floating/throwing, and turf height --- .../datums/inventory_slots/_inventory_slot.dm | 2 +- code/game/atoms_fluids.dm | 48 ++++++++++++++++++- code/game/turfs/turf_fluids.dm | 5 ++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/code/datums/inventory_slots/_inventory_slot.dm b/code/datums/inventory_slots/_inventory_slot.dm index cc8aa6ad420..6f23b1b51a1 100644 --- a/code/datums/inventory_slots/_inventory_slot.dm +++ b/code/datums/inventory_slots/_inventory_slot.dm @@ -20,7 +20,7 @@ var/requires_organ_tag var/quick_equip_priority = 0 // Higher priority means it will be checked first. If null, will not be considered for quick equip. /// What depth of fluid is necessary for an item in this slot to be considered submerged? - var/fluid_height = FLUID_SHALLOW + var/fluid_height = FLUID_SHALLOW // we're treating FLUID_SHALLOW as waist level, basically var/mob_overlay_layer var/alt_mob_overlay_layer diff --git a/code/game/atoms_fluids.dm b/code/game/atoms_fluids.dm index e69ed3bbfc3..d25bb595df6 100644 --- a/code/game/atoms_fluids.dm +++ b/code/game/atoms_fluids.dm @@ -23,19 +23,63 @@ var/turf/T = get_turf(src) return T?.is_flooded(lying_mob, absolute) -/atom/proc/submerged(depth) +/atom/proc/submerged(depth, above_turf) if(isnull(depth)) var/turf/T = get_turf(src) if(!istype(T)) return FALSE depth = T.get_fluid_depth() + var/turf_height = T.get_physical_height() + // If we're not on the surface of the turf (floating, leaping, or other sources) + // then we add the turf height to the depth, so you can jump over a water-filled pit + // or throw something over it + if(turf_height < 0 && above_turf) + depth += turf_height if(ismob(loc)) return depth >= FLUID_SHALLOW if(isturf(loc)) + if(locate(/obj/structure/table)) + return depth >= FLUID_SHALLOW return depth >= 3 return depth >= FLUID_OVER_MOB_HEAD -/turf/submerged(depth) +// This override exists purely because throwing is movable-level and not atom-level, +// for obvious reasons (that being that non-movable atoms cannot move). +/atom/movable/submerged(depth, above_turf) + above_turf ||= !!throwing + return ..() + +/obj/item/submerged(depth, above_turf) + var/datum/inventory_slot/slot = get_any_equipped_slot() + // we're in a mob and have a slot, so we bail early + if(istype(slot)) + var/mob/owner = loc // get_any_equipped_slot checks istype already + if(owner.current_posture.prone) + return ..() // treat us like an atom sitting on the ground (or table), really + if(isnull(depth)) // copied from base proc, since we aren't calling parent in this block + var/turf/T = get_turf(src) + if(!istype(T)) + return FALSE + depth = T.get_fluid_depth() + return depth >= slot.fluid_height + return ..() + +/mob/submerged(depth, above_turf) + above_turf ||= is_floating || !!throwing // check throwing here because of the table check coming before parent call + var/obj/structure/table/standing_on = locate(/obj/structure/table) in loc + // can't stand on a table if we're floating + if(!above_turf && standing_on && standing_on.mob_offset > 0) // standing atop a table that is a meaningful amount above the ground (not a bench) + if(isnull(depth)) // duplicated from atom because we don't call parent in this block + var/turf/T = get_turf(src) + if(!istype(T)) + return FALSE + depth = T.get_fluid_depth() + // assuming default tables are at waist height, this is a simple adjustment to scale it for taller/shorter ones + return depth >= floor(FLUID_SHALLOW * (standing_on.mob_offset / /obj/structure/table::mob_offset)) + return ..() + +// above_turf is nonsensical for turfs but I don't want the linter to complain +/turf/submerged(depth, above_turf) if(isnull(depth)) depth = get_fluid_depth() return depth >= FLUID_OVER_MOB_HEAD diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index e377ec4b32f..42220adc739 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -117,7 +117,12 @@ ..() if(!QDELETED(src) && fluids?.total_volume) fluids.touch_turf(src) + // technically, fluids might not be our own reagent holder + // so we factor in height ourselves + var/fluid_height = fluids.total_volume + get_physical_height() for(var/atom/movable/AM as anything in get_contained_external_atoms()) + if(!AM.submerged(fluid_height)) + continue AM.fluid_act(fluids) /turf/proc/remove_fluids(var/amount, var/defer_update) From fb4f7ac17a6f717d44bb563e4c1135d696c7c290 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 16:49:14 +1100 Subject: [PATCH 207/554] Bowls cannot be lidded. --- code/modules/crafting/handmade_items.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/crafting/handmade_items.dm b/code/modules/crafting/handmade_items.dm index d870d9ecf31..6a03aba8f7d 100644 --- a/code/modules/crafting/handmade_items.dm +++ b/code/modules/crafting/handmade_items.dm @@ -5,6 +5,9 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME presentation_flags = PRESENTATION_FLAG_NAME +/obj/item/chems/glass/handmade/can_lid() + return FALSE + /obj/item/chems/glass/handmade/on_reagent_change() if((. = ..())) update_icon() From fa74516b0d567673e36f43e3853b56205dc69870 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 16:49:56 +1100 Subject: [PATCH 208/554] Basic hammers can also be used as crowbars. --- code/modules/tools/subtypes/hammers.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/tools/subtypes/hammers.dm b/code/modules/tools/subtypes/hammers.dm index 20304b690e5..bb1c9ee58cd 100644 --- a/code/modules/tools/subtypes/hammers.dm +++ b/code/modules/tools/subtypes/hammers.dm @@ -29,7 +29,10 @@ return tool_properties /obj/item/tool/hammer/get_initial_tool_qualities() - var/static/list/tool_qualities = list(TOOL_HAMMER = TOOL_QUALITY_DEFAULT) + var/static/list/tool_qualities = list( + TOOL_HAMMER = TOOL_QUALITY_DEFAULT, + TOOL_CROWBAR = TOOL_QUALITY_WORST + ) return tool_qualities /obj/item/tool/hammer/sledge From 9cac761d303c1ed39942cdd3f689b42eb5d8089d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 17:09:33 +1100 Subject: [PATCH 209/554] Hammers now function as wrenches/crowbars for unanchoring/dismantling structures. --- code/game/objects/structures/__structure.dm | 8 ++-- .../structures/_structure_construction.dm | 39 +++++++++++++++++++ code/game/objects/structures/barrel.dm | 1 + code/game/objects/structures/tables.dm | 3 ++ code/game/objects/structures/window.dm | 3 ++ code/modules/multiz/ladder.dm | 6 +++ code/modules/reagents/reagent_dispenser.dm | 4 +- 7 files changed, 58 insertions(+), 6 deletions(-) diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index b65b704b302..b498045253d 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -88,19 +88,19 @@ if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) if(anchored) - to_chat(user, SPAN_SUBTLE("Can be unanchored with a wrench, and moved around.")) + to_chat(user, SPAN_SUBTLE("Can be unanchored with a wrench or hammer, and moved around.")) else - to_chat(user, SPAN_SUBTLE("Can be anchored in place with a wrench.")) + to_chat(user, SPAN_SUBTLE("Can be anchored in place with a wrench or hammer.")) if(tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) - var/removed_with = "a crowbar" + var/removed_with = "a crowbar or hammer" if(material && material.removed_by_welder) removed_with = "a welding torch" if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) if(anchored) to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with].")) else - to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with], if anchored down with a wrench first.")) + to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with], if anchored down with a wrench or hammer first.")) else to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with].")) diff --git a/code/game/objects/structures/_structure_construction.dm b/code/game/objects/structures/_structure_construction.dm index c367f6f1bf8..52816dad8a5 100644 --- a/code/game/objects/structures/_structure_construction.dm +++ b/code/game/objects/structures/_structure_construction.dm @@ -2,6 +2,43 @@ var/wired var/tool_interaction_flags +/obj/structure/proc/handle_default_hammer_attackby(var/mob/user, var/obj/item/hammer) + + // Resolve ambiguous interactions. + var/can_deconstruct = (tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) && can_dismantle(user) + var/can_unanchor = (tool_interaction_flags & TOOL_INTERACTION_ANCHOR) && can_unanchor(user) + if(can_deconstruct && can_unanchor) + var/choice = alert(user, "Do you wish to [anchored ? "unanchor" : "anchor"] or dismantle this structure?", "Tool Choice", (anchored ? "Unanchor" : "Anchor"), "Deconstruct", "Cancel") + if(!choice || choice == "Cancel" || QDELETED(src) || QDELETED(user) || QDELETED(hammer) || !CanPhysicallyInteract(user) || user.get_active_held_item() != hammer) + return TRUE + if(choice == "Deconstruct") + can_unanchor = FALSE + else + can_deconstruct = FALSE + + if(can_unanchor) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 100, 1) + visible_message(SPAN_NOTICE("\The [user] begins [anchored ? "unanchoring [src]" : "anchoring [src] in place"] with \the [hammer].")) + if(!do_after(user, 4 SECONDS, src) || QDELETED(src)) + return TRUE + playsound(src.loc, 'sound/items/Deconstruct.ogg', 100, 1) + anchored = !anchored + visible_message(SPAN_NOTICE("\The [user] has [anchored ? "anchored" : "unanchored"] \the [src] with \the [hammer].")) + update_icon() + return TRUE + + if(can_deconstruct) + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + visible_message(SPAN_NOTICE("\The [user] starts knocking apart \the [src] with \the [hammer].")) + if(!do_after(user, 5 SECONDS, src) || QDELETED(src)) + return TRUE + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [hammer].")) + dismantle_structure(user) + return TRUE + + return FALSE + /obj/structure/proc/handle_default_wrench_attackby(var/mob/user, var/obj/item/wrench) if((tool_interaction_flags & TOOL_INTERACTION_ANCHOR) && can_unanchor(user)) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) @@ -122,6 +159,8 @@ take_damage(force, used_item.atom_damage_type) . = TRUE + else if(IS_HAMMER(used_item)) + . = handle_default_hammer_attackby(user, used_item) else if(IS_WRENCH(used_item)) . = handle_default_wrench_attackby(user, used_item) else if(IS_SCREWDRIVER(used_item)) diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index 20d0c9d6eb2..25597a77ae7 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -16,6 +16,7 @@ volume = 7500 movable_flags = MOVABLE_FLAG_WHEELED throwpass = TRUE + tool_interaction_flags = TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT /obj/structure/reagent_dispensers/barrel/Initialize() ..() diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index a03268a8146..3299e142a70 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -636,6 +636,9 @@ return TRUE return FALSE +/obj/structure/table/handle_default_hammer_attackby(var/mob/user, var/obj/item/hammer) + return !reinf_material && ..() + /obj/structure/table/handle_default_wrench_attackby(var/mob/user, var/obj/item/wrench) return !reinf_material && ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 4ad6358add5..00e0d27d24f 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -207,6 +207,9 @@ playsound(loc, crowbar.get_tool_sound(TOOL_CROWBAR) || 'sound/items/Crowbar.ogg', 75, 1) return TRUE +/obj/structure/window/handle_default_hammer_attackby(mob/user, obj/item/hammer) + return FALSE + /obj/structure/window/handle_default_wrench_attackby(mob/user, obj/item/wrench) if(anchored || (reinf_material && construction_state > CONSTRUCTION_STATE_NO_FRAME)) return FALSE // ineligible, allow other interactions to proceed diff --git a/code/modules/multiz/ladder.dm b/code/modules/multiz/ladder.dm index e737b916454..10fc3c5a59a 100644 --- a/code/modules/multiz/ladder.dm +++ b/code/modules/multiz/ladder.dm @@ -23,6 +23,12 @@ var/static/list/radial_options = list("up" = radial_ladder_up, "down" = radial_ladder_down) +/obj/structure/ladder/handle_default_hammer_attackby() + var/last_anchored = anchored + . = ..() + if(anchored != last_anchored) + find_connections() + /obj/structure/ladder/handle_default_wrench_attackby() var/last_anchored = anchored . = ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 149d3b453de..196b1d55f7e 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -37,9 +37,9 @@ if(!(. = ..())) return if(reagents?.total_volume > 0) - tool_interaction_flags = 0 + tool_interaction_flags &= ~TOOL_INTERACTION_DECONSTRUCT else - tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT + tool_interaction_flags |= TOOL_INTERACTION_DECONSTRUCT /obj/structure/reagent_dispensers/initialize_reagents(populate = TRUE) if(!reagents) From de42c733d04baefeab70c7c7730aebd0ab7b9f9a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 18:00:31 +1100 Subject: [PATCH 210/554] Structure parts_type does not get applied to non-main materials. --- .../structures/_structure_materials.dm | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/code/game/objects/structures/_structure_materials.dm b/code/game/objects/structures/_structure_materials.dm index 3245a10faa2..f3c619b1f61 100644 --- a/code/game/objects/structures/_structure_materials.dm +++ b/code/game/objects/structures/_structure_materials.dm @@ -65,19 +65,25 @@ if(parts_type && !ispath(parts_type, /obj/item/stack)) for(var/i = 1 to max(parts_amount, 1)) LAZYADD(., create_dismantled_part(T)) - else - for(var/mat in matter) - var/decl/material/M = GET_DECL(mat) - var/placing - if(isnull(parts_amount)) - placing = (matter[mat] / SHEET_MATERIAL_AMOUNT) * 0.75 - if(parts_type) - placing *= atom_info_repository.get_matter_multiplier_for(parts_type, mat, placing) - placing = floor(placing) - else - placing = parts_amount - if(placing > 0) + return + + for(var/mat in matter) + + var/decl/material/M = GET_DECL(mat) + var/placing + if(isnull(parts_amount)) + placing = (matter[mat] / SHEET_MATERIAL_AMOUNT) * 0.75 + if(material == M && parts_type) + placing *= atom_info_repository.get_matter_multiplier_for(parts_type, mat, placing) + placing = floor(placing) + else + placing = parts_amount + + if(placing > 0) + if(material == M) LAZYADD(., M.place_dismantled_product(T, FALSE, placing, parts_type)) + else + LAZYADD(., M.place_dismantled_product(T, FALSE, placing)) /obj/structure/proc/clear_materials() matter = null From 2f862843bbfef3974d2a2c420d09fdae1eb30e06 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 18:11:18 +1100 Subject: [PATCH 211/554] Garlic oil can be used as a weaker antibiotic. --- code/modules/materials/_materials.dm | 10 ++++++++++ code/modules/organs/organ.dm | 6 +++--- code/modules/reagents/chems/chems_drinks.dm | 9 +++++---- code/modules/reagents/chems/chems_medicines.dm | 11 +---------- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 01aa188e0cc..0c2dbc287b5 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -261,6 +261,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/cocktail_ingredient var/defoliant var/fruit_descriptor // String added to fruit desc if this chemical is present. + /// Does this reagent have an antibiotic effect (helping with infections)? + var/antibiotic_strength = 0 var/dirtiness = DIRTINESS_NEUTRAL // How dirty turfs are after being exposed to this material. Negative values cause a cleaning/sterilizing effect. var/decontamination_dose = 0 // Amount required for a decontamination effect, if any. @@ -825,6 +827,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(M.status_flags & GODMODE) return + if(antibiotic_strength) + M.adjust_immunity(-0.1 * antibiotic_strength) + M.add_chemical_effect(CE_ANTIBIOTIC, antibiotic_strength) + if(REAGENT_VOLUME(holder, type) > 10) + M.adjust_immunity(-0.3 * antibiotic_strength) + if(LAZYACCESS(M.chem_doses, type) > 15) + M.adjust_immunity(-0.25 * antibiotic_strength) + if(nutriment_factor || hydration_factor) if(injectable_nutrition) adjust_mob_nutrition(M, removed, holder, CHEM_INJECT) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 4f6094ae0f9..64436859109 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -372,11 +372,11 @@ if (germ_level < INFECTION_LEVEL_ONE) germ_level = 0 //cure instantly else if (germ_level < INFECTION_LEVEL_TWO) - germ_level -= 5 //at germ_level == 500, this should cure the infection in 5 minutes + germ_level -= round(5 * antibiotics) //at germ_level == 500, this should cure the infection in 5 minutes else - germ_level -= 3 //at germ_level == 1000, this will cure the infection in 10 minutes + germ_level -= round(3 * antibiotics) //at germ_level == 1000, this will cure the infection in 10 minutes if(owner && owner.current_posture.prone) - germ_level -= 2 + germ_level -= round(2 * antibiotics) germ_level = max(0, germ_level) /obj/item/organ/proc/take_general_damage(var/amount, var/silent = FALSE) diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index ba069e72a23..e7ec3f1b241 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -178,15 +178,16 @@ allergen_flags = ALLERGEN_VEGETABLE /decl/material/liquid/drink/juice/garlic - name = "garlic juice" - lore_text = "Who would even drink this?" + name = "garlic oil" + lore_text = "A strong-smelling, pungent oil pressed from garlic cloves. It has some antibiotic properties, and can help with infections." taste_description = "bad breath" nutriment_factor = 1 color = "#eeddcc" uid = "chem_drink_garlic" + antibiotic_strength = 0.65 - glass_name = "garlic juice" - glass_desc = "Who would even drink juice from garlic?" + glass_name = "garlic oil" + glass_desc = "A potion of guaranteed bad breath." allergen_flags = ALLERGEN_ALLIUM /decl/material/liquid/drink/juice/onion diff --git a/code/modules/reagents/chems/chems_medicines.dm b/code/modules/reagents/chems/chems_medicines.dm index 5724175fbce..701d2f1d476 100644 --- a/code/modules/reagents/chems/chems_medicines.dm +++ b/code/modules/reagents/chems/chems_medicines.dm @@ -236,19 +236,10 @@ overdose = REAGENTS_OVERDOSE/2 scannable = 1 value = 1.5 + antibiotic_strength = 1 exoplanet_rarity_gas = MAT_RARITY_EXOTIC uid = "chem_antibiotics" -/decl/material/liquid/antibiotics/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) - var/volume = REAGENT_VOLUME(holder, type) - . = ..() - M.adjust_immunity(-0.1) - M.add_chemical_effect(CE_ANTIBIOTIC, 1) - if(volume > 10) - M.adjust_immunity(-0.3) - if(LAZYACCESS(M.chem_doses, type) > 15) - M.adjust_immunity(-0.25) - /decl/material/liquid/antibiotics/affect_overdose(mob/living/M, total_dose) ..() M.adjust_immunity(-0.5) From 34eda11872b7a15269231732043c48f4e93ebba7 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 18:26:31 +1100 Subject: [PATCH 212/554] Ethanol is now an abstract type. --- .../integrated_electronics/passive/power.dm | 12 ++--- code/modules/materials/_materials.dm | 2 - .../liquids/materials_liquid_toxins.dm | 6 +-- .../definitions/solids/materials_solid_ice.dm | 6 +-- code/modules/organs/internal/stomach.dm | 3 +- code/modules/reagents/Chemistry-Holder.dm | 4 +- code/modules/reagents/chems/chems_ethanol.dm | 44 ++++++++++--------- .../reagents/dispenser/cartridge_presets.dm | 2 +- .../reagents/reactions/reaction_alcohol.dm | 2 +- .../reagents/reactions/reaction_compounds.dm | 2 +- .../reagents/reactions/reaction_drugs.dm | 12 ++--- .../reagents/reactions/reaction_herbal.dm | 10 ++--- .../reagents/reactions/reaction_recipe.dm | 2 +- .../reagents/reagent_containers/food/lunch.dm | 10 ++--- code/modules/surgery/other.dm | 2 +- code/modules/vehicles/engine.dm | 2 +- .../finds/find_types/chem_containers.dm | 20 ++++----- 17 files changed, 72 insertions(+), 69 deletions(-) diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index 8a5e9a6ccbe..7741451973f 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -98,13 +98,13 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH var/volume = 60 var/list/fuel = list( - /decl/material/gas/hydrogen = 50000, + /decl/material/gas/hydrogen = 50000, /decl/material/gas/hydrogen/deuterium = 50000, - /decl/material/gas/hydrogen/tritium = 50000, - /decl/material/liquid/fuel = 15000, - /decl/material/solid/carbon = 10000, - /decl/material/liquid/ethanol = 10000, - /decl/material/liquid/nutriment = 8000 + /decl/material/gas/hydrogen/tritium = 50000, + /decl/material/liquid/fuel = 15000, + /decl/material/solid/carbon = 10000, + /decl/material/liquid/ethanol/spirits = 10000, + /decl/material/liquid/nutriment = 8000 ) var/multi = 1 diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 0c2dbc287b5..20195de9055 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -288,13 +288,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/chilling_message = "crackles and freezes!" var/chilling_sound = 'sound/effects/bubbles.ogg' var/list/chilling_products - var/bypass_chilling_products_for_root_type var/heating_point var/heating_message = "begins to boil!" var/heating_sound = 'sound/effects/bubbles.ogg' var/list/heating_products - var/bypass_heating_products_for_root_type var/accelerant_value = FUEL_VALUE_NONE var/burn_temperature = 100 CELSIUS var/burn_product diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 2b8f8eca63c..081d8dacd23 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -218,9 +218,9 @@ color = "#140b30" toxicity = 4 heating_products = list( - /decl/material/liquid/acetone = 0.4, - /decl/material/solid/carbon = 0.4, - /decl/material/liquid/ethanol = 0.2 + /decl/material/liquid/acetone = 0.4, + /decl/material/solid/carbon = 0.4, + /decl/material/liquid/ethanol/spirits = 0.2 ) heating_point = 145 CELSIUS heating_message = "separates." diff --git a/code/modules/materials/definitions/solids/materials_solid_ice.dm b/code/modules/materials/definitions/solids/materials_solid_ice.dm index dd69df88531..badd55eb76a 100644 --- a/code/modules/materials/definitions/solids/materials_solid_ice.dm +++ b/code/modules/materials/definitions/solids/materials_solid_ice.dm @@ -117,9 +117,9 @@ liquid_name = null gas_name = null heating_products = list( - /decl/material/gas/ammonia = 0.05, - /decl/material/liquid/water = 0.55, - /decl/material/liquid/ethanol = 0.4 + /decl/material/gas/ammonia = 0.05, + /decl/material/liquid/water = 0.55, + /decl/material/liquid/ethanol/spirits = 0.4 ) uid = "solid_ice_ediroite" value = 0.2 diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index cdc7df2fe4f..b1023677490 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -115,7 +115,8 @@ next_cramp = world.time + rand(200,800) owner.custom_pain("Your stomach cramps agonizingly!",1) - var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/ethanol) + // TODO: check if this even works - it won't be picking up alcohol subtypes. + var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/ethanol/spirits) var/alcohol_threshold_met = alcohol_volume > STOMACH_VOLUME / 2 if(alcohol_threshold_met && owner.has_genetic_condition(GENE_COND_EPILEPSY) && prob(20)) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index d35715d884a..f2b3f484ada 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -199,12 +199,12 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new var/replace_sound if(!(check_flags & ATOM_FLAG_NO_PHASE_CHANGE)) - if(!isnull(R.chilling_point) && R.type != R.bypass_chilling_products_for_root_type && LAZYLEN(R.chilling_products) && temperature <= R.chilling_point) + if(!isnull(R.chilling_point) && LAZYLEN(R.chilling_products) && temperature <= R.chilling_point) replace_self_with = R.chilling_products if(R.chilling_message) replace_message = "\The [R.get_reagent_name(src)] [R.chilling_message]" replace_sound = R.chilling_sound - else if(!isnull(R.heating_point) && R.type != R.bypass_heating_products_for_root_type && LAZYLEN(R.heating_products) && temperature >= R.heating_point) + else if(!isnull(R.heating_point) && LAZYLEN(R.heating_products) && temperature >= R.heating_point) replace_self_with = R.heating_products if(R.heating_message) replace_message = "\The [R.get_reagent_name(src)] [R.heating_message]" diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_ethanol.dm index f7deadf14c9..09950f337c7 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_ethanol.dm @@ -1,4 +1,5 @@ /decl/material/liquid/ethanol + abstract_type = /decl/material/liquid/ethanol name = "ethanol" //Parent class for all alcoholic reagents. lore_text = "A well-known alcohol with a variety of applications." taste_description = "pure alcohol" @@ -7,29 +8,28 @@ ignition_point = T0C+150 accelerant_value = FUEL_VALUE_ACCELERANT solvent_power = MAT_SOLVENT_MODERATE - uid = "chem_ethanol" - boiling_point = T0C + 78.37 + boiling_point = null // Pure ethanol boils, the rest has to separate first. heating_message = "boils away its ethanol content, leaving pure water." heating_point = T0C + 78.37 heating_products = list( - /decl/material/liquid/ethanol = 0.75, - /decl/material/liquid/water = 0.25 + /decl/material/liquid/ethanol/spirits = 0.75, + /decl/material/liquid/water = 0.25 ) - bypass_heating_products_for_root_type = /decl/material/liquid/ethanol chilling_message = "separates as its water content freezes, leaving pure ethanol." chilling_point = T0C chilling_products = list( - /decl/material/liquid/ethanol = 0.75, - /decl/material/solid/ice = 0.25 + /decl/material/liquid/ethanol/spirits = 0.75, + /decl/material/solid/ice = 0.25 ) - bypass_chilling_products_for_root_type = /decl/material/liquid/ethanol affect_blood_on_ingest = FALSE // prevents automatic toxins/inebriation as though injected affect_blood_on_inhale = FALSE - can_boil_to_gas = TRUE - temperature_burn_milestone_material = /decl/material/liquid/ethanol + + glass_name = "ethanol" + glass_desc = "A well-known alcohol with a variety of applications." + value = 1.2 var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity. var/alcohol_toxicity = 1 @@ -37,16 +37,6 @@ var/targ_temp = 310 var/halluci = 0 - glass_name = "ethanol" - glass_desc = "A well-known alcohol with a variety of applications." - value = 1.2 - -/decl/material/liquid/ethanol/Initialize() - . = ..() - // Impure ethanol doesn't boil, it has to separate first. - if(type != bypass_heating_products_for_root_type) - boiling_point = null - /decl/material/liquid/ethanol/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.take_damage(removed * 2 * alcohol_toxicity, TOX) @@ -99,6 +89,20 @@ if(halluci) M.adjust_hallucination(halluci, halluci) +// Somewhat a dummy type for 'pure ethanol' to avoid having to set dirtiness/heating products/etc on literally everything else. +/decl/material/liquid/ethanol/spirits + dirtiness = DIRTINESS_STERILE + boiling_point = T0C + 78.37 + uid = "chem_ethanol" + can_boil_to_gas = TRUE + temperature_burn_milestone_material = /decl/material/liquid/ethanol/spirits + + // Pure ethanol does not separate. + heating_point = null + heating_products = null + chilling_point = null + chilling_products = null + /decl/material/liquid/ethanol/absinthe name = "absinthe" lore_text = "Watch out that the Green Fairy doesn't come for you!" diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index fc67bea1606..d90e71023fa 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -32,7 +32,7 @@ DEFINE_CARTRIDGE_FOR_CHEM(iron, /decl/material/solid/metal/iron) DEFINE_CARTRIDGE_FOR_CHEM(copper, /decl/material/solid/metal/copper) DEFINE_CARTRIDGE_FOR_CHEM(mercury, /decl/material/liquid/mercury) DEFINE_CARTRIDGE_FOR_CHEM(radium, /decl/material/solid/metal/radium) -DEFINE_CARTRIDGE_FOR_CHEM(ethanol, /decl/material/liquid/ethanol) +DEFINE_CARTRIDGE_FOR_CHEM(ethanol, /decl/material/liquid/ethanol/spirits) DEFINE_CARTRIDGE_FOR_CHEM(sacid, /decl/material/liquid/acid) DEFINE_CARTRIDGE_FOR_CHEM(tungsten, /decl/material/solid/metal/tungsten) diff --git a/code/modules/reagents/reactions/reaction_alcohol.dm b/code/modules/reagents/reactions/reaction_alcohol.dm index 87ac55aacef..015448f51a7 100644 --- a/code/modules/reagents/reactions/reaction_alcohol.dm +++ b/code/modules/reagents/reactions/reaction_alcohol.dm @@ -108,7 +108,7 @@ /decl/chemical_reaction/recipe/hooch name = "Hooch" result = /decl/material/liquid/ethanol/hooch - required_reagents = list (/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/ethanol = 2, /decl/material/liquid/fuel = 1) + required_reagents = list (/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/ethanol/spirits = 2, /decl/material/liquid/fuel = 1) minimum_temperature = 30 CELSIUS maximum_temperature = (30 CELSIUS) + 100 result_amount = 3 diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index a2126b561d7..a2a21280d67 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -48,7 +48,7 @@ name = "Methyl Bromide" required_reagents = list( /decl/material/liquid/bromide = 1, - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/fuel/hydrazine = 1 ) result_amount = 3 diff --git a/code/modules/reagents/reactions/reaction_drugs.dm b/code/modules/reagents/reactions/reaction_drugs.dm index 97cfaafade6..e46935f7cc8 100644 --- a/code/modules/reagents/reactions/reaction_drugs.dm +++ b/code/modules/reagents/reactions/reaction_drugs.dm @@ -22,16 +22,16 @@ name = "Strong Painkillers" result = /decl/material/liquid/painkillers/strong required_reagents = list( - /decl/material/liquid/stabilizer = 1, - /decl/material/liquid/ethanol = 1, - /decl/material/liquid/acetone = 1 + /decl/material/liquid/stabilizer = 1, + /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/acetone = 1 ) result_amount = 3 /decl/chemical_reaction/drug/antiseptic name = "Antiseptic" result = /decl/material/liquid/antiseptic - required_reagents = list(/decl/material/liquid/ethanol = 1, /decl/material/liquid/antitoxins = 1, /decl/material/liquid/acid/hydrochloric = 1) + required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/antitoxins = 1, /decl/material/liquid/acid/hydrochloric = 1) result_amount = 3 /decl/chemical_reaction/drug/mutagenics @@ -136,7 +136,7 @@ /decl/chemical_reaction/drug/sedatives name = "Sedatives" result = /decl/material/liquid/sedatives - required_reagents = list(/decl/material/liquid/ethanol = 1, /decl/material/liquid/nutriment/sugar = 4 + required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/nutriment/sugar = 4 ) inhibitors = list( /decl/material/solid/phosphorus @@ -146,7 +146,7 @@ /decl/chemical_reaction/drug/paralytics name = "Paralytics" result = /decl/material/liquid/paralytics - required_reagents = list(/decl/material/liquid/ethanol = 1, /decl/material/liquid/mercury = 2, /decl/material/liquid/fuel/hydrazine = 2) + required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/mercury = 2, /decl/material/liquid/fuel/hydrazine = 2) result_amount = 1 /decl/chemical_reaction/drug/zombiepowder diff --git a/code/modules/reagents/reactions/reaction_herbal.dm b/code/modules/reagents/reactions/reaction_herbal.dm index f0f6bc441f4..7a580bcfba1 100644 --- a/code/modules/reagents/reactions/reaction_herbal.dm +++ b/code/modules/reagents/reactions/reaction_herbal.dm @@ -44,7 +44,7 @@ /decl/chemical_reaction/drug/herbal/yarrow_tincture name = "tincture of yarrow" required_reagents = list( - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/brute_meds/yarrow = 3 ) result = /decl/material/liquid/brute_meds/yarrow/tincture @@ -52,15 +52,15 @@ /decl/chemical_reaction/drug/herbal/aloe_tincture name = "tincture of aloe" required_reagents = list( - /decl/material/liquid/ethanol = 1, - /decl/material/liquid/burn_meds/aloe = 3 + /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/burn_meds/aloe = 3 ) result = /decl/material/liquid/burn_meds/aloe/tincture /decl/chemical_reaction/drug/herbal/ginseng_tincture name = "tincture of ginseng" required_reagents = list( - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/antitoxins/ginseng = 3 ) result = /decl/material/liquid/antitoxins/ginseng/tincture @@ -68,7 +68,7 @@ /decl/chemical_reaction/drug/herbal/valerian_tincture name = "tincture of valerian" required_reagents = list( - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/sedatives/valerian = 3 ) result = /decl/material/liquid/sedatives/valerian/tincture diff --git a/code/modules/reagents/reactions/reaction_recipe.dm b/code/modules/reagents/reactions/reaction_recipe.dm index f8a9797da15..369f3ea68b2 100644 --- a/code/modules/reagents/reactions/reaction_recipe.dm +++ b/code/modules/reagents/reactions/reaction_recipe.dm @@ -79,7 +79,7 @@ /decl/chemical_reaction/recipe/vinegar2 name = "Clear Vinegar" result = /decl/material/liquid/nutriment/vinegar - required_reagents = list(/decl/material/liquid/ethanol = 10) + required_reagents = list(/decl/material/liquid/ethanol/spirits = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 mix_message = "The solution roils as it rapidly ferments into a sharp-smelling liquid." diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index b027e451e05..34698bd2a87 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -107,11 +107,11 @@ var/global/list/lunchables_ethanol_reagents_ = list( .[initial(O.name)] = lunch return sortTim(., /proc/cmp_text_asc) -/proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_types) +/proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_type) . = list() - for(var/reagent_type in subtypesof(reagent_types)) - if(reagent_type in banned_reagents) + for(var/reagent_subtype in decls_repository.get_decls_of_subtype(reagent_type)) + if(reagent_subtype in banned_reagents) continue - var/decl/material/reagent = reagent_type - .[initial(reagent.name)] = reagent_type + var/decl/material/reagent = reagent_subtype + .[initial(reagent.name)] = reagent_subtype return sortTim(., /proc/cmp_text_asc) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 06fe754e5de..fc8c21ab697 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -181,7 +181,7 @@ /decl/surgery_step/sterilize/Initialize() . = ..() - for(var/decl/material/liquid/ethanol/booze in decls_repository.get_decls_of_type_unassociated(/decl/material/liquid/ethanol)) + for(var/decl/material/liquid/ethanol/booze in decls_repository.get_decls_of_subtype_unassociated(/decl/material/liquid/ethanol)) if(booze.strength <= 40) sterilizing_reagents |= booze.type diff --git a/code/modules/vehicles/engine.dm b/code/modules/vehicles/engine.dm index d431fc0f15f..e518456b058 100644 --- a/code/modules/vehicles/engine.dm +++ b/code/modules/vehicles/engine.dm @@ -110,7 +110,7 @@ for(var/rtype in temp_reagents_holder.reagents.reagent_volumes) var/new_multiplier = 1 var/decl/material/R = GET_DECL(rtype) - if(istype(R,/decl/material/liquid/ethanol)) + if(istype(R, /decl/material/liquid/ethanol)) var/decl/material/liquid/ethanol/E = R new_multiplier = (10/E.strength) actually_flameable = 1 diff --git a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm index 9cd5a4e78ae..8bd35650d54 100644 --- a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm +++ b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm @@ -29,16 +29,16 @@ /obj/item/chems/glass/replenishing/Initialize() . = ..() - spawning_id = pick( - /decl/material/liquid/blood, \ - /decl/material/liquid/lube, \ - /decl/material/liquid/sedatives, \ - /decl/material/liquid/ethanol, \ - /decl/material/liquid/water, \ - /decl/material/solid/ice, \ - /decl/material/liquid/fuel, \ - /decl/material/liquid/cleaner \ - ) + spawning_id = pick(list( + /decl/material/liquid/blood, + /decl/material/liquid/lube, + /decl/material/liquid/sedatives, + /decl/material/liquid/ethanol/spirits, + /decl/material/liquid/water, + /decl/material/solid/ice, + /decl/material/liquid/fuel, + /decl/material/liquid/cleaner + )) START_PROCESSING(SSobj, src) /obj/item/chems/glass/replenishing/Process() From 7051ae2ed6a2c4083143678dfe01c0be52e18e53 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 18:50:24 +1100 Subject: [PATCH 213/554] Dirt/clay/sand items cannot hold reagents. --- code/game/objects/{objs.dm => __objs.dm} | 13 +++++++++++++ .../objects/{obj_edibility.dm => _obj_edibility.dm} | 0 .../objects/{objs_damage.dm => _objs_damage.dm} | 0 .../{objs_interactions.dm => _objs_interactions.dm} | 0 code/game/objects/items/__item.dm | 9 +++++++++ code/game/objects/items/_item_materials.dm | 2 +- code/game/objects/structures/__structure.dm | 2 +- code/game/objects/structures/barrel.dm | 6 +++--- code/modules/reagents/Chemistry-Holder.dm | 2 ++ code/modules/reagents/reagent_dispenser.dm | 5 ----- nebula.dme | 8 ++++---- 11 files changed, 33 insertions(+), 14 deletions(-) rename code/game/objects/{objs.dm => __objs.dm} (95%) rename code/game/objects/{obj_edibility.dm => _obj_edibility.dm} (100%) rename code/game/objects/{objs_damage.dm => _objs_damage.dm} (100%) rename code/game/objects/{objs_interactions.dm => _objs_interactions.dm} (100%) diff --git a/code/game/objects/objs.dm b/code/game/objects/__objs.dm similarity index 95% rename from code/game/objects/objs.dm rename to code/game/objects/__objs.dm index b9966cf27e9..3fc47332062 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/__objs.dm @@ -404,3 +404,16 @@ // Stub, used by /item and /structure /obj/proc/refresh_color() return + +// Slightly convoluted reagent logic to avoid fluid_act() putting reagents straight back into the destroyed /obj. +/obj/physically_destroyed(skip_qdel) + var/dumped_reagents = FALSE + var/atom/last_loc = loc + if(last_loc && reagents?.total_volume) + reagents.trans_to(loc, reagents.total_volume, defer_update = TRUE) + dumped_reagents = TRUE + reagents.clear_reagents() // We are qdeling, don't bother with a more nuanced update. + . = ..() + if(dumped_reagents && last_loc && !QDELETED(last_loc) && last_loc.reagents?.total_volume) + last_loc.reagents.handle_update() + HANDLE_REACTIONS(last_loc.reagents) diff --git a/code/game/objects/obj_edibility.dm b/code/game/objects/_obj_edibility.dm similarity index 100% rename from code/game/objects/obj_edibility.dm rename to code/game/objects/_obj_edibility.dm diff --git a/code/game/objects/objs_damage.dm b/code/game/objects/_objs_damage.dm similarity index 100% rename from code/game/objects/objs_damage.dm rename to code/game/objects/_objs_damage.dm diff --git a/code/game/objects/objs_interactions.dm b/code/game/objects/_objs_interactions.dm similarity index 100% rename from code/game/objects/objs_interactions.dm rename to code/game/objects/_objs_interactions.dm diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index f55744e50eb..f5b5cc7eff2 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -1244,3 +1244,12 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. continue reagent_overlay.overlays += overlay_image(icon, modified_reagent_overlay, reagent.get_reagent_overlay_color(reagents), RESET_COLOR | RESET_ALPHA) return reagent_overlay + +/obj/item/on_reagent_change() + . = ..() + // You can't put liquids in clay/sand/dirt vessels, sorry. + if(reagents?.total_liquid_volume > 0 && material && material.hardness <= MAT_VALUE_MALLEABLE && !QDELETED(src)) + visible_message(SPAN_DANGER("\The [src] falls apart!")) + squash_item() + if(!QDELETED(src)) + physically_destroyed() diff --git a/code/game/objects/items/_item_materials.dm b/code/game/objects/items/_item_materials.dm index 95bc6402777..1a80c8c3bd5 100644 --- a/code/game/objects/items/_item_materials.dm +++ b/code/game/objects/items/_item_materials.dm @@ -104,7 +104,7 @@ queue_icon_update() /obj/item/proc/update_name() - if(material_alteration & MAT_FLAG_ALTERATION_NAME) + if(istype(material) && (material_alteration & MAT_FLAG_ALTERATION_NAME)) SetName("[material.adjective_name] [base_name || initial(name)]") else SetName(base_name || initial(name)) diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index b498045253d..724a01372c5 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -159,7 +159,7 @@ last_damage_message = 0.75 /obj/structure/physically_destroyed(var/skip_qdel) - if(..(TRUE)) + if((. = ..(TRUE))) return dismantle_structure() /obj/structure/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index 25597a77ae7..59f42c5e67b 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -39,7 +39,7 @@ storage.handle_item_insertion(null, thing) /obj/structure/reagent_dispensers/barrel/on_reagent_change() - if(!(. = ..())) + if(!(. = ..()) || QDELETED(src)) return var/primary_mat = reagents?.get_primary_reagent_name() if(primary_mat) @@ -55,9 +55,9 @@ var/overlay_amount = NONUNIT_CEILING(reagents.total_liquid_volume / reagents.maximum_volume * 100, 10) var/image/filling_overlay = overlay_image(icon, "[icon_state]-[overlay_amount]", reagents.get_color(), RESET_COLOR | RESET_ALPHA) add_overlay(filling_overlay) - add_overlay(overlay_image(icon, "[icon_state]-lidopen", material.color, RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-lidopen", material?.color, RESET_COLOR)) else - add_overlay(overlay_image(icon, "[icon_state]-lidclosed", material.color, RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-lidclosed", material?.color, RESET_COLOR)) /obj/structure/reagent_dispensers/barrel/ebony material = /decl/material/solid/organic/wood/ebony diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index f2b3f484ada..08d3c9323c9 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -579,6 +579,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new if(transferred_phases & MAT_PHASE_LIQUID) var/liquid_transferred = min(amount_to_transfer, CHEMS_QUANTIZE(LIQUID_VOLUME(src, rtype))) target.add_reagent(rtype, liquid_transferred * multiplier, REAGENT_DATA(src, rtype), TRUE, TRUE, MAT_PHASE_LIQUID) // We don't react until everything is in place + . += liquid_transferred amount_to_transfer -= liquid_transferred @@ -885,6 +886,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new if(!target.reagents) target.create_reagents(FLUID_MAX_DEPTH) + trans_to_holder(target.reagents, amount, multiplier, copy, defer_update = defer_update, transferred_phases = transferred_phases) // Deferred updates are presumably being done by SSfluids. // Do an immediate fluid_act call rather than waiting for SSfluids to proc. diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 196b1d55f7e..077d8abfa2e 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -118,11 +118,6 @@ if (N) amount_dispensed = N -/obj/structure/reagent_dispensers/physically_destroyed(var/skip_qdel) - if(reagents?.total_volume) - reagents.trans_to_turf(get_turf(src), reagents.total_volume) - . = ..() - /obj/structure/reagent_dispensers/explosion_act(severity) . = ..() if(. && (severity == 1) || (severity == 2 && prob(50)) || (severity == 3 && prob(5))) diff --git a/nebula.dme b/nebula.dme index f8b13ec706b..2f0f7c3a13b 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1003,15 +1003,15 @@ #include "code\game\machinery\vending\misc.dm" #include "code\game\machinery\vending\security.dm" #include "code\game\machinery\vending\toxins.dm" +#include "code\game\objects\__objs.dm" +#include "code\game\objects\_obj_edibility.dm" +#include "code\game\objects\_objs_damage.dm" +#include "code\game\objects\_objs_interactions.dm" #include "code\game\objects\alien_props.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\explosion.dm" #include "code\game\objects\item_mob_overlay.dm" #include "code\game\objects\munition.dm" -#include "code\game\objects\obj_edibility.dm" -#include "code\game\objects\objs.dm" -#include "code\game\objects\objs_damage.dm" -#include "code\game\objects\objs_interactions.dm" #include "code\game\objects\topic.dm" #include "code\game\objects\auras\aura.dm" #include "code\game\objects\auras\blueforge_aura.dm" From 32e096a4c6690c56072e79b5aaf4d3e1f1286228 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 19:29:31 +1100 Subject: [PATCH 214/554] Disables ethanol boiling. --- code/modules/reagents/chems/chems_ethanol.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_ethanol.dm index 09950f337c7..8dc07f2273a 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_ethanol.dm @@ -92,10 +92,12 @@ // Somewhat a dummy type for 'pure ethanol' to avoid having to set dirtiness/heating products/etc on literally everything else. /decl/material/liquid/ethanol/spirits dirtiness = DIRTINESS_STERILE - boiling_point = T0C + 78.37 uid = "chem_ethanol" - can_boil_to_gas = TRUE - temperature_burn_milestone_material = /decl/material/liquid/ethanol/spirits + + // Uncomment when refining spirits is less annoying + // boiling_point = T0C + 78.37 + // can_boil_to_gas = TRUE + // temperature_burn_milestone_material = /decl/material/liquid/ethanol/spirits // Pure ethanol does not separate. heating_point = null From 19f193b956b426cca60168e6bf220d0a9d808704 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 19:42:22 +1100 Subject: [PATCH 215/554] Moved spoon handling code to /glass. --- code/game/objects/items/weapons/paint.dm | 6 ++ code/modules/detectivework/tools/rag.dm | 10 +++- code/modules/paperwork/pen/quill_and_ink.dm | 6 ++ .../{glass.dm => _glass.dm} | 57 ++++++++++++++++++- ...glass_edibility.dm => _glass_edibility.dm} | 0 .../reagents/reagent_containers/bowl.dm | 51 ----------------- .../reagents/reagent_containers/bucket.dm | 6 ++ nebula.dme | 4 +- 8 files changed, 84 insertions(+), 56 deletions(-) rename code/modules/reagents/reagent_containers/{glass.dm => _glass.dm} (60%) rename code/modules/reagents/reagent_containers/{glass_edibility.dm => _glass_edibility.dm} (100%) diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 0b2da5f210a..37304ae49fc 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -22,6 +22,12 @@ add_to_reagents(pigment, amt) add_to_reagents(/decl/material/liquid/paint, amt) +/obj/item/chems/glass/paint/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/paint/get_utensil_food_type() + return null + /obj/item/chems/glass/paint/on_update_icon() . = ..() if(reagents?.total_volume) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 1097f54f9bc..ca9b832689f 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -7,7 +7,6 @@ amount_per_transfer_from_this = 5 possible_transfer_amounts = @"[5]" volume = 10 - can_be_placed_into = null item_flags = ITEM_FLAG_NO_BLUDGEON atom_flags = ATOM_FLAG_OPEN_CONTAINER material = /decl/material/solid/organic/cloth @@ -16,6 +15,15 @@ var/on_fire = 0 var/burn_time = 20 //if the rag burns for too long it turns to ashes +/obj/item/chems/glass/rag/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/rag/get_utensil_food_type() + return null + +/obj/item/chems/glass/rag/get_atoms_can_be_placed_into() + return null + /obj/item/chems/glass/rag/Initialize() . = ..() update_name() diff --git a/code/modules/paperwork/pen/quill_and_ink.dm b/code/modules/paperwork/pen/quill_and_ink.dm index c9cdf1af927..4944165f4e5 100644 --- a/code/modules/paperwork/pen/quill_and_ink.dm +++ b/code/modules/paperwork/pen/quill_and_ink.dm @@ -62,6 +62,12 @@ /// The maximum amount of ink in the inkwell when populating reagents. var/starting_volume_high = 30 +/obj/item/chems/glass/inkwell/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/inkwell/get_utensil_food_type() + return null + /obj/item/chems/glass/inkwell/can_lid() return FALSE diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/_glass.dm similarity index 60% rename from code/modules/reagents/reagent_containers/glass.dm rename to code/modules/reagents/reagent_containers/_glass.dm index 64473fa9530..a7fda97e015 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -19,7 +19,8 @@ pickup_sound = 'sound/foley/bottlepickup1.ogg' watertight = FALSE // /glass uses the open container flag for this - var/list/can_be_placed_into = list( +/obj/item/chems/glass/proc/get_atoms_can_be_placed_into() + var/static/list/_can_be_placed_into = list( /obj/machinery/chem_master/, /obj/machinery/chemical_dispenser, /obj/machinery/reagentgrinder, @@ -40,6 +41,7 @@ /obj/machinery/radiocarbon_spectrometer, /obj/machinery/material_processing/extractor ) + return _can_be_placed_into /obj/item/chems/glass/examine(mob/user, distance) . = ..() @@ -77,7 +79,7 @@ return FALSE //If not, do nothing. if(target?.storage) return TRUE - for(var/type in can_be_placed_into) //Is it something it can be placed into? + for(var/type in get_atoms_can_be_placed_into()) //Is it something it can be placed into? if(istype(target, type)) return TRUE if(standard_dispenser_refill(user, target)) //Are they clicking a water tank/some dispenser? @@ -98,3 +100,54 @@ reagents.splash(target, min(reagents.total_volume, 5)) return TRUE . = ..() + +// Drinking out of bowls. +/obj/item/chems/glass/attack_self(mob/user) + if(is_edible(user) && handle_eaten_by_mob(user, user) != EATEN_INVALID) + return TRUE + return ..() + +/obj/item/chems/glass/can_lid() + return FALSE + +/obj/item/chems/glass/get_food_default_transfer_amount(mob/eater) + return eater?.get_eaten_transfer_amount(amount_per_transfer_from_this) + +/obj/item/chems/glass/get_food_consumption_method(mob/eater) + return EATING_METHOD_DRINK + +/obj/item/chems/glass/get_edible_material_amount(mob/eater) + return reagents?.total_volume + +/obj/item/chems/glass/get_utensil_food_type() + return /obj/item/food/lump + +// Interaction code borrowed from /food. +// Should we consider moving this down to /chems for any open container? Medicine from a bottle using a spoon, etc. +/obj/item/chems/glass/attackby(obj/item/used_item, mob/living/user) + + if(ATOM_IS_OPEN_CONTAINER(src)) + if(istype(used_item, /obj/item/food)) + if(!reagents?.total_volume) + to_chat(user, SPAN_WARNING("\The [src] is empty.")) + return TRUE + var/transferring = min(get_food_default_transfer_amount(user), REAGENTS_FREE_SPACE(used_item.reagents)) + if(!transferring) + to_chat(user, SPAN_WARNING("You cannot dip \the [used_item] in \the [src].")) + return TRUE + reagents.trans_to_holder(used_item.reagents, transferring) + user.visible_message(SPAN_NOTICE("\The [user] dunks \the [used_item] in \the [src].")) + return TRUE + var/obj/item/utensil/utensil = used_item + if(istype(utensil) && (utensil.utensil_flags & UTENSIL_FLAG_SCOOP)) + if(utensil.loaded_food) + to_chat(user, SPAN_WARNING("You already have something on \the [utensil].")) + return TRUE + if(!reagents?.total_volume) + to_chat(user, SPAN_WARNING("\The [src] is empty.")) + return TRUE + seperate_food_chunk(utensil, user) + if(utensil.loaded_food?.reagents?.total_volume) + to_chat(user, SPAN_NOTICE("You scoop up some of \the [utensil.loaded_food.reagents.get_primary_reagent_name()] with \the [utensil].")) + return TRUE + return ..() diff --git a/code/modules/reagents/reagent_containers/glass_edibility.dm b/code/modules/reagents/reagent_containers/_glass_edibility.dm similarity index 100% rename from code/modules/reagents/reagent_containers/glass_edibility.dm rename to code/modules/reagents/reagent_containers/_glass_edibility.dm diff --git a/code/modules/reagents/reagent_containers/bowl.dm b/code/modules/reagents/reagent_containers/bowl.dm index 62e34795c23..7c69241f516 100644 --- a/code/modules/reagents/reagent_containers/bowl.dm +++ b/code/modules/reagents/reagent_containers/bowl.dm @@ -9,57 +9,6 @@ volume = 30 amount_per_transfer_from_this = 5 -// Drinking out of bowls. -/obj/item/chems/glass/bowl/attack_self(mob/user) - if(is_edible(user) && handle_eaten_by_mob(user, user) != EATEN_INVALID) - return TRUE - return ..() - -/obj/item/chems/glass/bowl/can_lid() - return FALSE - -/obj/item/chems/glass/bowl/get_food_default_transfer_amount(mob/eater) - return eater?.get_eaten_transfer_amount(amount_per_transfer_from_this) - -/obj/item/chems/glass/bowl/get_edible_material_amount(mob/eater) - return reagents?.total_volume - -/obj/item/chems/glass/bowl/get_food_consumption_method(mob/eater) - return EATING_METHOD_DRINK - -/obj/item/chems/glass/bowl/get_utensil_food_type() - return /obj/item/food/lump - -// Interaction code borrowed from /food. -/obj/item/chems/glass/bowl/attackby(obj/item/W, mob/living/user) - - if(istype(W, /obj/item/food)) - if(!reagents?.total_volume) - to_chat(user, SPAN_WARNING("\The [src] is empty.")) - return TRUE - var/transferring = min(get_food_default_transfer_amount(user), REAGENTS_FREE_SPACE(W.reagents)) - if(!transferring) - to_chat(user, SPAN_WARNING("You cannot dip \the [W] in \the [src].")) - return TRUE - reagents.trans_to_holder(W.reagents, transferring) - user.visible_message(SPAN_NOTICE("\The [user] dunks \the [W] in \the [src].")) - return TRUE - - var/obj/item/utensil/utensil = W - if(istype(utensil) && (utensil.utensil_flags & UTENSIL_FLAG_SCOOP)) - if(utensil.loaded_food) - to_chat(user, SPAN_WARNING("You already have something on \the [utensil].")) - return TRUE - if(!reagents?.total_volume) - to_chat(user, SPAN_WARNING("\The [src] is empty.")) - return TRUE - seperate_food_chunk(utensil, user) - if(utensil.loaded_food?.reagents?.total_volume) - to_chat(user, SPAN_NOTICE("You scoop up some of \the [utensil.loaded_food.reagents.get_primary_reagent_name()] with \the [utensil].")) - return TRUE - - return ..() - // Predefined soup types for mapping. /obj/item/chems/glass/bowl/mapped abstract_type = /obj/item/chems/glass/bowl/mapped diff --git a/code/modules/reagents/reagent_containers/bucket.dm b/code/modules/reagents/reagent_containers/bucket.dm index 1e072a63217..bf25af27044 100644 --- a/code/modules/reagents/reagent_containers/bucket.dm +++ b/code/modules/reagents/reagent_containers/bucket.dm @@ -15,6 +15,12 @@ drop_sound = 'sound/foley/donk1.ogg' pickup_sound = 'sound/foley/pickup2.ogg' +/obj/item/chems/glass/bucket/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/bucket/get_utensil_food_type() + return null + /obj/item/chems/glass/bucket/attackby(var/obj/D, mob/user) if(istype(D, /obj/item/mop)) if(reagents.total_volume < 1) diff --git a/nebula.dme b/nebula.dme index 2f0f7c3a13b..0aa34c70b86 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3601,6 +3601,8 @@ #include "code\modules\reagents\reactions\reaction_recipe.dm" #include "code\modules\reagents\reactions\reaction_recipe_food.dm" #include "code\modules\reagents\reactions\reaction_synthesis.dm" +#include "code\modules\reagents\reagent_containers\_glass.dm" +#include "code\modules\reagents\reagent_containers\_glass_edibility.dm" #include "code\modules\reagents\reagent_containers\beaker.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" @@ -3611,8 +3613,6 @@ #include "code\modules\reagents\reagent_containers\food.dm" #include "code\modules\reagents\reagent_containers\food_cooking.dm" #include "code\modules\reagents\reagent_containers\food_edibility.dm" -#include "code\modules\reagents\reagent_containers\glass.dm" -#include "code\modules\reagents\reagent_containers\glass_edibility.dm" #include "code\modules\reagents\reagent_containers\hypospray.dm" #include "code\modules\reagents\reagent_containers\inhaler.dm" #include "code\modules\reagents\reagent_containers\mortar.dm" From 794afebc971ddbf0924d12b95537806c4207b507 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 19:50:35 +1100 Subject: [PATCH 216/554] Should prevent 'You can taste .' --- code/modules/mob/living/living_taste.dm | 2 +- code/modules/reagents/Chemistry-Taste.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/living_taste.dm b/code/modules/mob/living/living_taste.dm index 03845380c3e..9beeb47e2fb 100644 --- a/code/modules/mob/living/living_taste.dm +++ b/code/modules/mob/living/living_taste.dm @@ -9,7 +9,7 @@ var/datum/reagents/temp = new(amount, global.temp_reagents_holder) //temporary holder used to analyse what gets transfered. from.trans_to_holder(temp, amount, multiplier, 1) var/text_output = temp.generate_taste_message(src, from) - if(text_output != last_taste_text || last_taste_time + 1 MINUTE < world.time) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. + if(text_output && (text_output != last_taste_text || last_taste_time + 1 MINUTE < world.time)) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. to_chat(src, SPAN_NOTICE("You can taste [text_output].")) //no taste means there are too many tastes and not enough flavor. last_taste_time = world.time last_taste_text = text_output diff --git a/code/modules/reagents/Chemistry-Taste.dm b/code/modules/reagents/Chemistry-Taste.dm index 46889757994..73b25e51cd5 100644 --- a/code/modules/reagents/Chemistry-Taste.dm +++ b/code/modules/reagents/Chemistry-Taste.dm @@ -72,4 +72,4 @@ calculate text size per text. for(var/taste_desc in cocktail.tastes) var/taste_power = cocktail.tastes[taste_desc] * cocktail_volume tastes[taste_desc] += taste_power - return tastes \ No newline at end of file + return tastes From 01e1be60f3e770ec46df94894dd660f98b197dfe Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 19:58:19 +1100 Subject: [PATCH 217/554] Cherrypicking reagent holder interactions from dev for quick-fixing barrel/well interactions. --- code/game/atoms.dm | 3 + code/game/objects/items/_item_interactions.dm | 91 ------------ code/game/objects/items/_item_reagents.dm | 4 +- .../items/weapons/tools/weldingtool.dm | 2 +- code/game/objects/structures/barrel.dm | 20 ++- code/game/objects/structures/well.dm | 17 +++ code/game/turfs/turf.dm | 4 + .../interactions/interactions_reagents.dm | 138 ++++++++++++++++++ .../reagents/reagent_containers/_glass.dm | 8 + .../reagents/reagent_containers/drinks.dm | 2 +- nebula.dme | 1 + 11 files changed, 190 insertions(+), 100 deletions(-) create mode 100644 code/modules/interactions/interactions_reagents.dm diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 01856eb7773..5dd985c6064 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -994,3 +994,6 @@ /atom/proc/is_watertight() return ATOM_IS_OPEN_CONTAINER(src) + +/atom/proc/can_drink_from(mob/user) + return ATOM_IS_OPEN_CONTAINER(src) && reagents?.total_volume && user.check_has_mouth() diff --git a/code/game/objects/items/_item_interactions.dm b/code/game/objects/items/_item_interactions.dm index e3e6a83045f..b9efb6e61dc 100644 --- a/code/game/objects/items/_item_interactions.dm +++ b/code/game/objects/items/_item_interactions.dm @@ -40,94 +40,3 @@ /decl/interaction_handler/storage_open/invoked(atom/target, mob/user, obj/item/prop) target?.storage?.open(user) - -/decl/interaction_handler/wash_hands - name = "Wash Hands" - expected_target_type = /atom - interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC - -/decl/interaction_handler/wash_hands/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) - if(.) - for(var/hand_slot in user.get_held_item_slots()) - var/obj/item/organ/external/organ = user.get_organ(hand_slot) - if(istype(organ) && organ.is_washable) - return TRUE - -/decl/interaction_handler/wash_hands/invoked(atom/target, mob/user, obj/item/prop) - - // Probably needs debounce and do_after() but showers and wading into water don't, so whatever. - if(!target?.reagents?.has_reagent(/decl/material/liquid/water, 150)) // To avoid washing your hands in beakers. - to_chat(user, SPAN_WARNING("\The [src] doesn't have enough water in it to wash your hands.")) - return - - var/found_hand = FALSE - for(var/hand_slot in user.get_held_item_slots()) - var/obj/item/organ/external/organ = user.get_organ(hand_slot) - if(istype(organ) && organ.is_washable) - found_hand = TRUE - break - - if(!found_hand) - return - - var/decl/pronouns/pronouns = user.get_pronouns() - if(isturf(target)) - var/turf/turf = target - var/fluid = turf.get_fluid_name() - user.visible_message( - SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [fluid]."), - SPAN_NOTICE("You wash your hands in \the [fluid].") - ) - else - user.visible_message( - SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [target]."), - SPAN_NOTICE("You wash your hands in \the [target].") - ) - - user.clean() - playsound(user.loc, 'sound/effects/slosh.ogg', 25, 1) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - -/decl/interaction_handler/drink - name = "Drink" - expected_target_type = /atom - interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC - -/decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) - return ..() && ATOM_IS_OPEN_CONTAINER(target) && target?.reagents?.total_volume && user.check_has_mouth() && !istype(target, /obj/item) - -/decl/interaction_handler/drink/invoked(atom/target, mob/user, obj/item/prop) - - // Items can be picked up and drunk from, this interaction is for turfs and structures. - if(istype(target, /obj/item)) - return - - if(!user.check_has_mouth()) - target.show_food_no_mouth_message(user, user) - return - - if(!target?.reagents?.total_volume) - target.show_food_empty_message(user, EATING_METHOD_DRINK) - return - - if(!user.can_eat_food_currently(null, user, EATING_METHOD_DRINK)) - return - - var/blocked = user.check_mouth_coverage() - if(blocked) - to_chat(user, SPAN_NOTICE("\The [blocked] is in the way!")) - return - - var/fluid_name = "\the [target]" - if(isturf(target)) - var/turf/target_turf = target - fluid_name = "\the [target_turf.get_fluid_name()]" - - user.visible_message( - SPAN_NOTICE("\The [user] drinks from [fluid_name]."), - SPAN_NOTICE("You drink from [fluid_name].") - ) - target.reagents.trans_to_mob(user, 5, CHEM_INGEST) - playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) diff --git a/code/game/objects/items/_item_reagents.dm b/code/game/objects/items/_item_reagents.dm index c4de45769dc..7f28940eb25 100644 --- a/code/game/objects/items/_item_reagents.dm +++ b/code/game/objects/items/_item_reagents.dm @@ -1,5 +1,5 @@ -/obj/item/proc/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target) // This goes into afterattack - if(!istype(target) || (target.atom_flags & ATOM_FLAG_OPEN_CONTAINER)) +/obj/item/proc/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target, skip_container_check = FALSE) // This goes into afterattack + if(!istype(target) || (!skip_container_check && (target.atom_flags & ATOM_FLAG_OPEN_CONTAINER))) return FALSE if(!target.reagents || !target.reagents.total_volume) diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 6cc583631c2..0ba2ab36135 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -432,7 +432,7 @@ return TRUE return ..() -/obj/item/chems/welder_tank/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target) +/obj/item/chems/welder_tank/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE) if(!can_refuel) to_chat(user, SPAN_DANGER("\The [src] does not have a refuelling port.")) return FALSE diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index 59f42c5e67b..7c525ba3fcb 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -22,12 +22,22 @@ ..() return INITIALIZE_HINT_LATELOAD -/obj/structure/reagent_dispensers/barrel/attackby(obj/item/W, mob/user) +// Overrides due to wonky reagent_dispeners opencontainer flag handling. +/obj/structure/reagent_dispensers/barrel/can_be_poured_from(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +/obj/structure/reagent_dispensers/barrel/can_be_poured_into(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +// Override to skip open container check. +/obj/structure/reagent_dispensers/barrel/can_drink_from(mob/user) + return reagents?.total_volume && user.check_has_mouth() + +/obj/structure/reagent_dispensers/barrel/get_alt_interactions(mob/user) . = ..() - if(!. && user.a_intent == I_HELP && reagents?.total_volume > FLUID_PUDDLE) - user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) - W.fluid_act(reagents) - return TRUE + if(reagents?.total_volume >= FLUID_PUDDLE) + LAZYADD(., /decl/interaction_handler/dip_item) + LAZYADD(., /decl/interaction_handler/fill_from) + if(user?.get_active_held_item()) + LAZYADD(., /decl/interaction_handler/empty_into) /obj/structure/reagent_dispensers/barrel/LateInitialize(mapload, ...) ..() diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index cb0c2006285..3da3c4eb2e7 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -18,6 +18,23 @@ can_toggle_open = FALSE var/auto_refill +/obj/structure/reagent_dispensers/well/get_alt_interactions(mob/user) + . = ..() + if(reagents?.total_volume >= FLUID_PUDDLE) + LAZYADD(., /decl/interaction_handler/dip_item) + LAZYADD(., /decl/interaction_handler/fill_from) + if(user?.get_active_held_item()) + LAZYADD(., /decl/interaction_handler/empty_into) + +// Overrides due to wonky reagent_dispeners opencontainer flag handling. +/obj/structure/reagent_dispensers/well/can_be_poured_from(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +/obj/structure/reagent_dispensers/well/can_be_poured_into(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +// Override to skip open container check. +/obj/structure/reagent_dispensers/well/can_drink_from(mob/user) + return reagents?.total_volume && user.check_has_mouth() + /obj/structure/reagent_dispensers/well/populate_reagents() . = ..() if(auto_refill) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a25d818697f..c7fef097926 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -807,6 +807,10 @@ if(user) var/obj/item/held = user.get_active_held_item() if(istype(held)) + if(reagents?.total_volume >= FLUID_PUDDLE) + LAZYADD(., /decl/interaction_handler/dip_item) + LAZYADD(., /decl/interaction_handler/fill_from) + LAZYADD(., /decl/interaction_handler/empty_into) if(IS_SHOVEL(held)) if(can_dig_pit(held.material?.hardness)) LAZYDISTINCTADD(., /decl/interaction_handler/dig/pit) diff --git a/code/modules/interactions/interactions_reagents.dm b/code/modules/interactions/interactions_reagents.dm new file mode 100644 index 00000000000..c99ffad81ab --- /dev/null +++ b/code/modules/interactions/interactions_reagents.dm @@ -0,0 +1,138 @@ +/decl/interaction_handler/dip_item + name = "Dip Into" + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + +/decl/interaction_handler/dip_item/is_possible(atom/target, mob/user, obj/item/prop) + return ..() && target.reagents?.total_volume >= FLUID_PUDDLE && istype(prop) && target.can_be_poured_from(user, prop) + +/decl/interaction_handler/dip_item/invoked(atom/target, mob/user, obj/item/prop) + user.visible_message(SPAN_NOTICE("\The [user] dips \the [prop] into \the [target.reagents.get_primary_reagent_name()].")) + prop.fluid_act(target.reagents) + return TRUE + +/decl/interaction_handler/fill_from + name = "Fill From" + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + +/decl/interaction_handler/fill_from/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + if(target.reagents?.total_volume < FLUID_PUDDLE) + return FALSE + if(!istype(prop) || (!isitem(target) && !istype(target, /obj/structure/reagent_dispensers))) + return FALSE + return target.can_be_poured_from(user, prop) && prop.can_be_poured_into(user, target) + +/decl/interaction_handler/fill_from/invoked(atom/target, mob/user, obj/item/prop) + if(isitem(target)) + var/obj/item/vessel = target + return vessel.standard_pour_into(user, prop) + if(istype(target, /obj/structure/reagent_dispensers)) + // Reagent dispensers have some wonky assumptions due to old UX around filling/emptying so we skip the atom flags check. + return prop.standard_dispenser_refill(user, target, skip_container_check = TRUE) + return FALSE + +/decl/interaction_handler/empty_into + name = "Pour Into" + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + +/decl/interaction_handler/empty_into/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + if(!istype(prop) || prop.reagents?.total_volume <= 0) + return FALSE + return target.can_be_poured_into(user, prop) && prop.can_be_poured_from(user, target) + +/decl/interaction_handler/empty_into/invoked(atom/target, mob/user, obj/item/prop) + prop.standard_pour_into(user, target) + return TRUE + +/decl/interaction_handler/wash_hands + name = "Wash Hands" + expected_target_type = /atom + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + +/decl/interaction_handler/wash_hands/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() && !istype(prop) && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) + if(.) + for(var/hand_slot in user.get_held_item_slots()) + var/obj/item/organ/external/organ = user.get_organ(hand_slot) + if(istype(organ) && organ.is_washable) + return TRUE + +/decl/interaction_handler/wash_hands/invoked(atom/target, mob/user, obj/item/prop) + + // Probably needs debounce and do_after() but showers and wading into water don't, so whatever. + if(!target?.reagents?.has_reagent(/decl/material/liquid/water, 150)) // To avoid washing your hands in beakers. + to_chat(user, SPAN_WARNING("\The [src] doesn't have enough water in it to wash your hands.")) + return + + var/found_hand = FALSE + for(var/hand_slot in user.get_held_item_slots()) + var/obj/item/organ/external/organ = user.get_organ(hand_slot) + if(istype(organ) && organ.is_washable) + found_hand = TRUE + break + + if(!found_hand) + return FALSE + + var/decl/pronouns/pronouns = user.get_pronouns() + if(isturf(target)) + var/turf/turf = target + var/fluid = turf.get_fluid_name() + user.visible_message( + SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [fluid]."), + SPAN_NOTICE("You wash your hands in \the [fluid].") + ) + else + user.visible_message( + SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [target]."), + SPAN_NOTICE("You wash your hands in \the [target].") + ) + + user.clean() + playsound(user.loc, 'sound/effects/slosh.ogg', 25, 1) + return TRUE + +/decl/interaction_handler/drink + name = "Drink" + expected_target_type = /atom + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + +/decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) + return ..() && !istype(prop) && target.can_drink_from(user) + +/decl/interaction_handler/drink/invoked(atom/target, mob/user, obj/item/prop) + + // Items can be picked up and drunk from, this interaction is for turfs and structures. + if(istype(target, /obj/item)) + return + + if(!user.check_has_mouth()) + target.show_food_no_mouth_message(user, user) + return + + if(!target?.reagents?.total_volume) + target.show_food_empty_message(user, EATING_METHOD_DRINK) + return + + if(!user.can_eat_food_currently(null, user, EATING_METHOD_DRINK)) + return + + var/blocked = user.check_mouth_coverage() + if(blocked) + to_chat(user, SPAN_NOTICE("\The [blocked] is in the way!")) + return + + var/fluid_name = "\the [target]" + if(isturf(target)) + var/turf/target_turf = target + fluid_name = "\the [target_turf.get_fluid_name()]" + + user.visible_message( + SPAN_NOTICE("\The [user] drinks from [fluid_name]."), + SPAN_NOTICE("You drink from [fluid_name].") + ) + target.reagents.trans_to_mob(user, 5, CHEM_INGEST) + playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index a7fda97e015..3df7ca1144f 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -151,3 +151,11 @@ to_chat(user, SPAN_NOTICE("You scoop up some of \the [utensil.loaded_food.reagents.get_primary_reagent_name()] with \the [utensil].")) return TRUE return ..() + +/obj/structure/glass/get_alt_interactions(mob/user) + . = ..() + if(reagents?.total_volume >= FLUID_PUDDLE) + LAZYADD(., /decl/interaction_handler/dip_item) + LAZYADD(., /decl/interaction_handler/fill_from) + if(user?.get_active_held_item()) + LAZYADD(., /decl/interaction_handler/empty_into) diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm index d1f01780b6e..46c56514eee 100644 --- a/code/modules/reagents/reagent_containers/drinks.dm +++ b/code/modules/reagents/reagent_containers/drinks.dm @@ -57,7 +57,7 @@ return return ..() -/obj/item/chems/drinks/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target) +/obj/item/chems/drinks/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target, skip_container_check = FALSE) return do_open_check(user) && ..() /obj/item/chems/drinks/standard_pour_into(var/mob/user, var/atom/target) diff --git a/nebula.dme b/nebula.dme index 0aa34c70b86..25979899314 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2611,6 +2611,7 @@ #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\interactions\_interactions.dm" #include "code\modules\interactions\interactions_atom.dm" +#include "code\modules\interactions\interactions_reagents.dm" #include "code\modules\interactions\interactions_shared.dm" #include "code\modules\item_effects\_item_effect.dm" #include "code\modules\item_effects\item_effect_aura.dm" From 3e4d4c134de0521b417fee59d402735effcbb0e1 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 20:32:53 +1100 Subject: [PATCH 218/554] Repathing waterskins to /glass. --- code/game/objects/items/waterskin.dm | 42 ++++++++++--------- code/modules/butchery/butchery_products.dm | 4 +- .../stack_recipes/recipes_textiles.dm | 2 +- maps/shaded_hills/outfits/visitors.dm | 2 +- .../fantasy/items/clothing/_loadout.dm | 6 +-- tools/map_migrations/4662_waterskin.txt | 2 + 6 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 tools/map_migrations/4662_waterskin.txt diff --git a/code/game/objects/items/waterskin.dm b/code/game/objects/items/waterskin.dm index 298388f36ec..3463c646e25 100644 --- a/code/game/objects/items/waterskin.dm +++ b/code/game/objects/items/waterskin.dm @@ -1,4 +1,4 @@ -/obj/item/chems/waterskin +/obj/item/chems/glass/waterskin name = "waterskin" desc = "A water-carrying vessel made from the dried stomach of some unfortunate animal." icon = 'icons/obj/items/waterskin.dmi' @@ -10,38 +10,40 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME var/decl/material/stopper_material = /decl/material/solid/organic/cloth/hemp -/obj/item/chems/waterskin/proc/get_stopper_message() +/obj/item/chems/glass/waterskin/can_lid() + return FALSE // We handle it in attack_self(). + +/obj/item/chems/glass/waterskin/proc/get_stopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You tie the neck of \the [src] closed with \a [stopper_material_instance.adjective_name] cord." -/obj/item/chems/waterskin/proc/get_unstopper_message() +/obj/item/chems/glass/waterskin/proc/get_unstopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You untie \the [stopper_material_instance.adjective_name] cord from around the neck of \the [src]." -/obj/item/chems/waterskin/proc/get_stopper_overlay() +/obj/item/chems/glass/waterskin/proc/get_stopper_overlay() if(ATOM_IS_OPEN_CONTAINER(src)) return null var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return overlay_image(icon, "[icon_state]-stopper", stopper_material_instance.color, RESET_COLOR | RESET_ALPHA) -/obj/item/chems/waterskin/attack_self() - . = ..() - if(!.) - if(ATOM_IS_OPEN_CONTAINER(src)) - to_chat(usr, SPAN_NOTICE(get_stopper_message())) - atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER - else - to_chat(usr, SPAN_NOTICE(get_unstopper_message())) - atom_flags |= ATOM_FLAG_OPEN_CONTAINER - update_icon() +/obj/item/chems/glass/waterskin/attack_self() + if(ATOM_IS_OPEN_CONTAINER(src)) + to_chat(usr, SPAN_NOTICE(get_stopper_message())) + atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER + else + to_chat(usr, SPAN_NOTICE(get_unstopper_message())) + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + update_icon() + return TRUE -/obj/item/chems/waterskin/on_update_icon() // TODO: filled/empty sprites +/obj/item/chems/glass/waterskin/on_update_icon() // TODO: filled/empty sprites . = ..() // cuts overlays var/image/stopper_overlay = get_stopper_overlay() if(stopper_overlay) add_overlay(stopper_overlay) -/obj/item/chems/waterskin/crafted +/obj/item/chems/glass/waterskin/crafted desc = "A long and rather unwieldly water-carrying vessel." icon = 'icons/obj/items/waterskin_crafted.dmi' material = /decl/material/solid/organic/leather @@ -49,17 +51,17 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC stopper_material = /decl/material/solid/organic/wood/maple -/obj/item/chems/waterskin/crafted/get_stopper_message() +/obj/item/chems/glass/waterskin/crafted/get_stopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You insert \a [stopper_material_instance.adjective_name] stopper in the neck of \the [src]." -/obj/item/chems/waterskin/crafted/get_unstopper_message() +/obj/item/chems/glass/waterskin/crafted/get_unstopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You remove \the [stopper_material_instance.adjective_name] stopper from the neck of \the [src]." -/obj/item/chems/waterskin/crafted/wine +/obj/item/chems/glass/waterskin/crafted/wine name = "wineskin" -/obj/item/chems/waterskin/crafted/wine/populate_reagents() +/obj/item/chems/glass/waterskin/crafted/wine/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/ethanol/wine, reagents?.maximum_volume) diff --git a/code/modules/butchery/butchery_products.dm b/code/modules/butchery/butchery_products.dm index 23f9dc4858c..184a9a87504 100644 --- a/code/modules/butchery/butchery_products.dm +++ b/code/modules/butchery/butchery_products.dm @@ -263,12 +263,12 @@ icon = 'icons/obj/food/butchery/ruminant_stomach.dmi' material = /decl/material/solid/organic/meat/gut nutriment_amt = 8 - dried_type = /obj/item/chems/waterskin + dried_type = /obj/item/chems/glass/waterskin w_class = ITEM_SIZE_SMALL var/stomach_reagent = /decl/material/liquid/acid/stomach /obj/item/food/butchery/stomach/get_dried_product() - var/obj/item/chems/waterskin/result = ..() + var/obj/item/chems/glass/waterskin/result = ..() if(istype(result) && reagents?.total_volume) reagents.trans_to_holder(result.reagents, reagents.total_volume) return result diff --git a/code/modules/crafting/stack_recipes/recipes_textiles.dm b/code/modules/crafting/stack_recipes/recipes_textiles.dm index ee608b17555..c68b69f4e49 100644 --- a/code/modules/crafting/stack_recipes/recipes_textiles.dm +++ b/code/modules/crafting/stack_recipes/recipes_textiles.dm @@ -61,7 +61,7 @@ difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. /decl/stack_recipe/textiles/leather/waterskin - result_type = /obj/item/chems/waterskin/crafted + result_type = /obj/item/chems/glass/waterskin/crafted required_material = /decl/material/solid/organic/leather category = null diff --git a/maps/shaded_hills/outfits/visitors.dm b/maps/shaded_hills/outfits/visitors.dm index 5d89949bbff..ca0204ce1a7 100644 --- a/maps/shaded_hills/outfits/visitors.dm +++ b/maps/shaded_hills/outfits/visitors.dm @@ -8,7 +8,7 @@ backpack_contents = list( /obj/item/stack/medical/bandage/crafted/five = 1, /obj/item/stack/medical/ointment/crafted/five = 1, - /obj/item/chems/waterskin/crafted/wine = 1 + /obj/item/chems/glass/waterskin/crafted/wine = 1 ) /decl/outfit/job/shaded_hills/traveller/scholar diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 28468c54941..1bb06b8926f 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -265,7 +265,7 @@ /decl/loadout_option/fantasy/utility/waterskin name = "waterskin selection" - path = /obj/item/chems/waterskin + path = /obj/item/chems/glass/waterskin available_materials = null apply_to_existing_if_possible = TRUE // overwrite beggar knight's wineskin uid = "gear_fantasy_waterskin" @@ -273,8 +273,8 @@ /decl/loadout_option/fantasy/utility/waterskin/get_gear_tweak_options() . = ..() LAZYDISTINCTADD(.[/datum/gear_tweak/path], list( - "crafted leather waterskin" = /obj/item/chems/waterskin/crafted, - "dried stomach waterskin" = /obj/item/chems/waterskin, + "crafted leather waterskin" = /obj/item/chems/glass/waterskin/crafted, + "dried stomach waterskin" = /obj/item/chems/glass/waterskin, )) LAZYDISTINCTADD(.[/datum/gear_tweak/reagents], list( "ale" = /decl/material/liquid/ethanol/ale, diff --git a/tools/map_migrations/4662_waterskin.txt b/tools/map_migrations/4662_waterskin.txt new file mode 100644 index 00000000000..8fa91607ee8 --- /dev/null +++ b/tools/map_migrations/4662_waterskin.txt @@ -0,0 +1,2 @@ +/obj/item/chems/waterskin/@SUBTYPES : /obj/item/chems/glass/waterskin/@SUBTYPES{@OLD} + From 8cb6b6d0705b2c5939973e609aa115420d6baaa8 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 20:38:30 +1100 Subject: [PATCH 219/554] Fixes slings requiring a sling that they cannot take. --- .../projectiles/guns/launcher/bows/sling.dm | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/code/modules/projectiles/guns/launcher/bows/sling.dm b/code/modules/projectiles/guns/launcher/bows/sling.dm index 25a4b6e6d9c..c3f3822d4d8 100644 --- a/code/modules/projectiles/guns/launcher/bows/sling.dm +++ b/code/modules/projectiles/guns/launcher/bows/sling.dm @@ -1,14 +1,15 @@ /obj/item/gun/launcher/bow/sling - name = "sling" - desc = "A simple strip of leather with a cup in the center, used to hurl stones with great speed." - slot_flags = 0 - draw_time = 0.5 SECONDS - icon = 'icons/obj/guns/launcher/sling.dmi' - material = /decl/material/solid/organic/leather - color = /decl/material/solid/organic/leather::color - string = null - max_tension = 1 - bow_ammo_type = null + name = "sling" + desc = "A simple strip of leather with a cup in the center, used to hurl stones with great speed." + slot_flags = 0 + draw_time = 0.5 SECONDS + icon = 'icons/obj/guns/launcher/sling.dmi' + material = /decl/material/solid/organic/leather + color = /decl/material/solid/organic/leather::color + string = null + requires_string = FALSE + max_tension = 1 + bow_ammo_type = null /obj/item/gun/launcher/bow/sling/try_string(mob/user, obj/item/bowstring/new_string) return FALSE From 3efa978cd3a304fcbc82f051fe1dffeba2b37d9f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 02:12:03 -0500 Subject: [PATCH 220/554] Fix items being affected by fluids when they shouldn't be --- .../inventory_slots/inventory_gripper.dm | 1 + code/game/atoms_fluids.dm | 5 ++- code/game/atoms_movable.dm | 2 +- code/game/objects/items/flame/_flame.dm | 9 +---- code/game/turfs/turf_fluids.dm | 5 +-- code/modules/mob/inventory.dm | 38 ++++++++++++++++++- code/modules/mob/living/living.dm | 5 +++ 7 files changed, 49 insertions(+), 16 deletions(-) diff --git a/code/datums/inventory_slots/inventory_gripper.dm b/code/datums/inventory_slots/inventory_gripper.dm index c11a09eed72..334be51e15c 100644 --- a/code/datums/inventory_slots/inventory_gripper.dm +++ b/code/datums/inventory_slots/inventory_gripper.dm @@ -5,6 +5,7 @@ /// If set, use this icon_state for the hand slot overlay; otherwise, use slot_id. var/hand_overlay quick_equip_priority = null // you quick-equip stuff by holding it in a gripper, so this ought to be skipped + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level, reasoning that you can just hold it up out of the water // For reference, grippers do not use ui_loc, they have it set dynamically during /datum/hud/proc/rebuild_hands() diff --git a/code/game/atoms_fluids.dm b/code/game/atoms_fluids.dm index d25bb595df6..2984d5393f2 100644 --- a/code/game/atoms_fluids.dm +++ b/code/game/atoms_fluids.dm @@ -24,11 +24,12 @@ return T?.is_flooded(lying_mob, absolute) /atom/proc/submerged(depth, above_turf) + var/turf/T = get_turf(src) if(isnull(depth)) - var/turf/T = get_turf(src) if(!istype(T)) return FALSE depth = T.get_fluid_depth() + if(istype(T)) var/turf_height = T.get_physical_height() // If we're not on the surface of the turf (floating, leaping, or other sources) // then we add the turf height to the depth, so you can jump over a water-filled pit @@ -50,7 +51,7 @@ return ..() /obj/item/submerged(depth, above_turf) - var/datum/inventory_slot/slot = get_any_equipped_slot() + var/datum/inventory_slot/slot = get_any_equipped_slot_datum() // we're in a mob and have a slot, so we bail early if(istype(slot)) var/mob/owner = loc // get_any_equipped_slot checks istype already diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 477e9d25c5d..4b0049e92f2 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -272,7 +272,7 @@ if(isturf(loc)) var/turf/T = loc - if(T.reagents) + if(T.reagents?.total_volume && submerged()) fluid_act(T.reagents) for(var/mob/viewer in storage?.storage_ui?.is_seeing) diff --git a/code/game/objects/items/flame/_flame.dm b/code/game/objects/items/flame/_flame.dm index bee61f2c54c..645e04d1c71 100644 --- a/code/game/objects/items/flame/_flame.dm +++ b/code/game/objects/items/flame/_flame.dm @@ -167,14 +167,7 @@ if(waterproof) return - var/check_depth = FLUID_PUDDLE - if(ismob(loc)) - var/mob/holder = loc - if(!holder.current_posture?.prone) - check_depth = FLUID_OVER_MOB_HEAD - else - check_depth = FLUID_SHALLOW - if(fluids.total_volume >= check_depth) + if(fluids.total_volume >= FLUID_PUDDLE) snuff_out(no_message = TRUE) /obj/item/flame/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index 42220adc739..0ea31b04c6f 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -117,11 +117,8 @@ ..() if(!QDELETED(src) && fluids?.total_volume) fluids.touch_turf(src) - // technically, fluids might not be our own reagent holder - // so we factor in height ourselves - var/fluid_height = fluids.total_volume + get_physical_height() for(var/atom/movable/AM as anything in get_contained_external_atoms()) - if(!AM.submerged(fluid_height)) + if(!AM.submerged()) continue AM.fluid_act(fluids) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 89f590dcecd..62329f27692 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -271,15 +271,49 @@ return 1 //already unequipped, so success return I.mob_can_unequip(src, slot) +/// Gets the inventory slot string ID for the mob whose contents we're in, if any. +/// Checks both equipped and held item slots. /obj/item/proc/get_any_equipped_slot() - return get_equipped_slot() || get_held_slot() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_any_equipped_slot_for_item(src) + +/// Gets the inventory slot string ID for an item that may be in our inventory. +/// Checks both equipped and held item slots. +/mob/proc/get_any_equipped_slot_for_item(obj/item/I) + var/list/slots = get_inventory_slots() + get_held_item_slots() + if(!length(slots)) + return + for(var/slot_str in slots) + if(get_equipped_item(slot_str) == I) // slots[slot]._holding == I + return slot_str +/// A counterpart to get_any_equipped_slot_for_item that returns the slot datum rather than the slot name. +/// Checks both equipped and held item slots. +/obj/item/proc/get_any_equipped_slot_datum() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_inventory_slot_datum(mob.get_any_equipped_slot_for_item(src)) + +/// Gets the equipment (worn) slot string ID for the mob whose contents we're in, if any. Does not include held slots. /obj/item/proc/get_equipped_slot() if(!ismob(loc)) return null var/mob/mob = loc return mob.get_equipped_slot_for_item(src) +/// A helper that returns the slot datum rather than the slot name. +/// Does not include held slots. +/// Saves unnecessary duplicate ismob checks and loc casts. +/obj/item/proc/get_equipped_slot_datum() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_inventory_slot_datum(mob.get_equipped_slot_for_item(src)) + +/// Gets the equipment (worn) slot string ID for an item we may be wearing. Does not include held slots. /mob/proc/get_equipped_slot_for_item(obj/item/I) var/list/slots = get_inventory_slots() if(!length(slots)) @@ -288,12 +322,14 @@ if(get_equipped_item(slot_str) == I) // slots[slot]._holding == I return slot_str +/// Gets the held item slot string ID for the mob whose contents we're in, if any. Does not include worn slots. /obj/item/proc/get_held_slot() if(!ismob(loc)) return null var/mob/mob = loc return mob.get_held_slot_for_item(src) +/// Gets the held item slot string ID for an item we may be holding. Does not include worn slots. /mob/proc/get_held_slot_for_item(obj/item/I) var/list/slots = get_held_item_slots() if(!length(slots)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index df4f9b1c97d..e76e323abea 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -853,9 +853,14 @@ default behaviour is: fluids.touch_mob(src) if(QDELETED(src) || !fluids.total_volume) return + var/on_turf = fluids.my_atom == get_turf(src) for(var/atom/movable/A as anything in get_equipped_items(TRUE)) if(!A.simulated) continue + // if we're being affected by reagent fluids, items check if they're submerged + // todo: i don't like how this works, it feels hacky. maybe separate coating and submersion somehow and make this only checked for submersion + if(on_turf && !A.submerged()) + continue A.fluid_act(fluids) if(QDELETED(src) || !fluids.total_volume) return From 234373b11f72fbe4804a9e0bebaea5c59bcc8015 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 17:53:09 -0500 Subject: [PATCH 221/554] Fix ticks2readable giving a blank output --- code/_helpers/time.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index eea2b9b3833..464860a2392 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -89,7 +89,7 @@ var/global/round_start_time = 0 out += "[seconds] second\s" if(length(out)) return english_list(out) - return null + return "less than a second" /proc/roundduration2text() if(!round_start_time) From 5d164620b2076b95cd918f1971116c2d253938f5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 18:18:46 -0500 Subject: [PATCH 222/554] Fix flame sources not updating held icon when extinguished --- code/game/objects/items/flame/_flame.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/items/flame/_flame.dm b/code/game/objects/items/flame/_flame.dm index 4527a2b6bc1..1ad11f3fa14 100644 --- a/code/game/objects/items/flame/_flame.dm +++ b/code/game/objects/items/flame/_flame.dm @@ -125,6 +125,9 @@ update_attack_force() update_icon() + if(ismob(loc)) // not very robust for things like accessories... + update_held_icon() + update_clothing_icon() if(istype(loc, /obj/structure/wall_sconce)) loc.update_icon() From 5036372023d4c59408717fd544f0e6aaee969678 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 18:18:57 -0500 Subject: [PATCH 223/554] Fix torch color breaking in water/tall grass --- code/game/objects/items/flame/flame_torch.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/flame/flame_torch.dm b/code/game/objects/items/flame/flame_torch.dm index 66aac1847d6..edfc5568856 100644 --- a/code/game/objects/items/flame/flame_torch.dm +++ b/code/game/objects/items/flame/flame_torch.dm @@ -76,11 +76,11 @@ if(head_material) var/decl/material/head_mat = GET_DECL(head_material) if(burnt) - add_overlay(overlay_image(icon, "[icon_state]-burnt", head_mat.color, flags = RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-burnt", head_mat.color, flags = RESET_COLOR|KEEP_APART)) else - add_overlay(overlay_image(icon, "[icon_state]-head", head_mat.color, flags = RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-head", head_mat.color, flags = RESET_COLOR|KEEP_APART)) if(lit) - add_overlay(overlay_image(icon, "[icon_state]-lit", flags = RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-lit", flags = RESET_COLOR|KEEP_APART)) /obj/item/flame/torch/get_sconce_overlay() . = list(overlay_image(icon, "[icon_state]-sconce", color = color, flags = RESET_COLOR)) From c229bb582259e04dc8ad476f7413d83e1409ce72 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 18:19:11 -0500 Subject: [PATCH 224/554] Fix filter removal using the wrong return value --- code/_helpers/visual_filters.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/_helpers/visual_filters.dm b/code/_helpers/visual_filters.dm index deb7162f196..13bdaa2d6be 100644 --- a/code/_helpers/visual_filters.dm +++ b/code/_helpers/visual_filters.dm @@ -55,8 +55,8 @@ LAZYREMOVE(filter_data, filter_name) filters -= thing update_filters() - return FALSE - return TRUE + return TRUE + return FALSE /// Animate a given filter on this atom. All params after the first are passed to animate(). /atom/movable/proc/animate_filter(filter_name, list/params) From b45e854adf435287e63116e1d373651b5b37aee7 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Dec 2024 18:21:47 -0500 Subject: [PATCH 225/554] Fix standing in fluid causing layer flickering --- code/modules/fluids/_fluid.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/fluids/_fluid.dm b/code/modules/fluids/_fluid.dm index ef00dac2cea..ef3d0259a0d 100644 --- a/code/modules/fluids/_fluid.dm +++ b/code/modules/fluids/_fluid.dm @@ -22,8 +22,7 @@ // Update layer. var/new_layer var/turf/T = get_turf(src) - var/effective_depth = T?.get_physical_height() + reagent_volume - if(effective_depth < 0) + if(T.pixel_z < 0) new_layer = T.layer + 0.2 else if(reagent_volume > FLUID_DEEP) new_layer = DEEP_FLUID_LAYER From 5756ca6e7c290c982760b9db2e360b54e9b886fc Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 10:31:58 +1100 Subject: [PATCH 226/554] Repaths ethanol to alcohol. --- code/game/machinery/kitchen/icecream.dm | 2 +- code/game/objects/items/waterskin.dm | 2 +- code/game/objects/structures/barrel.dm | 4 +- .../codex/categories/category_recipes.dm | 2 +- code/modules/crafting/handmade_items.dm | 6 +- .../food/cooking/recipes/recipe_assembled.dm | 2 +- .../hydroponics/plant_types/seeds_misc.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 6 +- .../integrated_electronics/passive/power.dm | 2 +- .../liquids/materials_liquid_toxins.dm | 2 +- .../definitions/solids/materials_solid_ice.dm | 2 +- .../silicon/robot/modules/module_clerical.dm | 4 +- code/modules/organs/internal/stomach.dm | 2 +- code/modules/power/port_gen.dm | 6 +- .../{chems_ethanol.dm => chems_alcohol.dm} | 106 +++++------ .../reagents/chems/chems_painkillers.dm | 2 +- .../reagents/chems/random/chems_random.dm | 2 +- code/modules/reagents/cocktails.dm | 172 +++++++++--------- .../reagents/dispenser/cartridge_presets.dm | 26 +-- .../reagents/reactions/reaction_alcohol.dm | 40 ++-- .../reagents/reactions/reaction_compounds.dm | 2 +- .../reagents/reactions/reaction_drugs.dm | 8 +- .../reagents/reactions/reaction_herbal.dm | 8 +- .../reagents/reactions/reaction_recipe.dm | 2 +- .../reactions/reaction_recipe_food.dm | 4 +- .../reagents/reagent_containers/borghydro.dm | 28 +-- .../reagent_containers/drinks/bottle.dm | 48 ++--- .../reagent_containers/drinks/cans.dm | 6 +- .../reagents/reagent_containers/food/lunch.dm | 12 +- code/modules/reagents/reagent_dispenser.dm | 2 +- code/modules/surgery/other.dm | 2 +- code/modules/vehicles/engine.dm | 4 +- .../finds/find_types/chem_containers.dm | 2 +- .../fantasy/items/clothing/_loadout.dm | 16 +- .../fantasy/items/material_overrides.dm | 2 +- nebula.dme | 2 +- 36 files changed, 270 insertions(+), 270 deletions(-) rename code/modules/reagents/chems/{chems_ethanol.dm => chems_alcohol.dm} (87%) diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm index 2a893f6e61b..cd751f4d64a 100644 --- a/code/game/machinery/kitchen/icecream.dm +++ b/code/game/machinery/kitchen/icecream.dm @@ -33,7 +33,7 @@ if(ICECREAM_STRAWBERRY) return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/drink/juice/berry) if(ICECREAM_BLUE) - return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/ethanol/bluecuracao) + return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/alcohol/bluecuracao) if(ICECREAM_CHERRY) return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/nutriment/cherryjelly) if(ICECREAM_BANANA) diff --git a/code/game/objects/items/waterskin.dm b/code/game/objects/items/waterskin.dm index 3463c646e25..73852feaef0 100644 --- a/code/game/objects/items/waterskin.dm +++ b/code/game/objects/items/waterskin.dm @@ -64,4 +64,4 @@ /obj/item/chems/glass/waterskin/crafted/wine/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents?.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents?.maximum_volume) diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index 7c525ba3fcb..a8f9c376102 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -79,11 +79,11 @@ /obj/structure/reagent_dispensers/barrel/ebony/beer/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/structure/reagent_dispensers/barrel/ebony/wine/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents.maximum_volume) /obj/structure/reagent_dispensers/barrel/ebony/oil/populate_reagents() . = ..() diff --git a/code/modules/codex/categories/category_recipes.dm b/code/modules/codex/categories/category_recipes.dm index 292eca01761..caf8064f577 100644 --- a/code/modules/codex/categories/category_recipes.dm +++ b/code/modules/codex/categories/category_recipes.dm @@ -40,7 +40,7 @@ if(!product) continue lore_text = initial(product.lore_text) - if(ispath(food.result, /decl/material/liquid/drink) || ispath(food.result, /decl/material/liquid/ethanol)) + if(ispath(food.result, /decl/material/liquid/drink) || ispath(food.result, /decl/material/liquid/alcohol)) category_name = "drink recipe" mechanics_text = "This recipe produces [food.result_amount]u [product.name].
    It should be performed in a glass or shaker, and requires the following ingredients:" else diff --git a/code/modules/crafting/handmade_items.dm b/code/modules/crafting/handmade_items.dm index 6a03aba8f7d..1135a26cc8b 100644 --- a/code/modules/crafting/handmade_items.dm +++ b/code/modules/crafting/handmade_items.dm @@ -83,12 +83,12 @@ /obj/item/chems/glass/handmade/bottle/beer/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/item/chems/glass/handmade/bottle/tall/wine/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents.maximum_volume) /obj/item/chems/glass/handmade/bottle/wide/whiskey/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/whiskey, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/whiskey, reagents.maximum_volume) diff --git a/code/modules/food/cooking/recipes/recipe_assembled.dm b/code/modules/food/cooking/recipes/recipe_assembled.dm index db38ad62101..863129f6f12 100644 --- a/code/modules/food/cooking/recipes/recipe_assembled.dm +++ b/code/modules/food/cooking/recipes/recipe_assembled.dm @@ -30,7 +30,7 @@ result = /obj/item/food/superbiteburger /decl/recipe/twobread - reagents = list(/decl/material/liquid/ethanol/wine = 5) + reagents = list(/decl/material/liquid/alcohol/wine = 5) items = list( /obj/item/food/slice/bread = 2, ) diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index 34650444cd0..3f57470752f 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -288,7 +288,7 @@ mutants = null chems = list( /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/ethanol/bluecuracao = list(10,5) + /decl/material/liquid/alcohol/bluecuracao = list(10,5) ) /datum/seed/tomato/blue/teleport/New() diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 3092b5c73e5..0456bff2302 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -59,7 +59,7 @@ ) var/static/list/nutrient_reagents = list( /decl/material/liquid/drink/milk = 0.1, - /decl/material/liquid/ethanol/beer = 0.25, + /decl/material/liquid/alcohol/beer = 0.25, /decl/material/solid/phosphorus = 0.1, /decl/material/liquid/nutriment/sugar = 0.1, /decl/material/liquid/drink/sodawater = 0.1, @@ -89,7 +89,7 @@ /decl/material/liquid/water = 1, /decl/material/liquid/adminordrazine = 1, /decl/material/liquid/drink/milk = 0.9, - /decl/material/liquid/ethanol/beer = 0.7, + /decl/material/liquid/alcohol/beer = 0.7, /decl/material/liquid/fuel/hydrazine = -2, /decl/material/solid/phosphorus = -0.5, /decl/material/liquid/water = 1, @@ -98,7 +98,7 @@ // Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order). var/static/list/beneficial_reagents = list( - /decl/material/liquid/ethanol/beer = list( -0.05, 0, 0 ), + /decl/material/liquid/alcohol/beer = list( -0.05, 0, 0 ), /decl/material/liquid/fuel/hydrazine = list( -2, 0, 0 ), /decl/material/solid/phosphorus = list( -0.75, 0, 0 ), /decl/material/liquid/drink/sodawater = list( 0.1, 0, 0 ), diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index 7741451973f..69ae5bae034 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -103,7 +103,7 @@ /decl/material/gas/hydrogen/tritium = 50000, /decl/material/liquid/fuel = 15000, /decl/material/solid/carbon = 10000, - /decl/material/liquid/ethanol/spirits = 10000, + /decl/material/liquid/alcohol/ethanol = 10000, /decl/material/liquid/nutriment = 8000 ) var/multi = 1 diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 081d8dacd23..6b76cad038a 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -220,7 +220,7 @@ heating_products = list( /decl/material/liquid/acetone = 0.4, /decl/material/solid/carbon = 0.4, - /decl/material/liquid/ethanol/spirits = 0.2 + /decl/material/liquid/alcohol/ethanol = 0.2 ) heating_point = 145 CELSIUS heating_message = "separates." diff --git a/code/modules/materials/definitions/solids/materials_solid_ice.dm b/code/modules/materials/definitions/solids/materials_solid_ice.dm index badd55eb76a..c90937ccd3b 100644 --- a/code/modules/materials/definitions/solids/materials_solid_ice.dm +++ b/code/modules/materials/definitions/solids/materials_solid_ice.dm @@ -119,7 +119,7 @@ heating_products = list( /decl/material/gas/ammonia = 0.05, /decl/material/liquid/water = 0.55, - /decl/material/liquid/ethanol/spirits = 0.4 + /decl/material/liquid/alcohol/ethanol = 0.4 ) uid = "solid_ice_ediroite" value = 0.2 diff --git a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm index d052194f847..94f73f0d637 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm @@ -65,7 +65,7 @@ var/datum/reagents/R = emag.create_reagents(50) R.add_reagent(/decl/material/liquid/paralytics, 10) R.add_reagent(/decl/material/liquid/sedatives, 15) - R.add_reagent(/decl/material/liquid/ethanol/beer, 20) + R.add_reagent(/decl/material/liquid/alcohol/beer, 20) R.add_reagent(/decl/material/solid/ice, 5) emag.SetName("Mickey Finn's Special Brew") @@ -75,7 +75,7 @@ E.add_to_reagents(/decl/material/liquid/enzyme, 2 * amount) if(emag) var/obj/item/chems/drinks/bottle/small/beer/B = emag - B.add_to_reagents(/decl/material/liquid/ethanol/beer, amount * 0.4) + B.add_to_reagents(/decl/material/liquid/alcohol/beer, amount * 0.4) B.add_to_reagents(/decl/material/solid/ice, amount * 0.1) B.add_to_reagents(/decl/material/liquid/paralytics, amount * 0.2) B.add_to_reagents(/decl/material/liquid/sedatives, amount * 0.3) diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index b1023677490..cf870f3b64b 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -116,7 +116,7 @@ owner.custom_pain("Your stomach cramps agonizingly!",1) // TODO: check if this even works - it won't be picking up alcohol subtypes. - var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/ethanol/spirits) + var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/alcohol/ethanol) var/alcohol_threshold_met = alcohol_volume > STOMACH_VOLUME / 2 if(alcohol_threshold_met && owner.has_genetic_condition(GENE_COND_EPILEPSY) && prob(20)) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index ae7a1bc6e42..4bba7b7f563 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -466,7 +466,7 @@ to_chat(user, "Auxilary tank shows [reagents.total_volume]u of liquid in it.") /obj/machinery/port_gen/pacman/super/potato/UseFuel() - if(reagents.has_reagent(/decl/material/liquid/ethanol/vodka)) + if(reagents.has_reagent(/decl/material/liquid/alcohol/vodka)) rad_power = 4 temperature_gain = 60 remove_any_reagents(1) @@ -486,9 +486,9 @@ /obj/machinery/port_gen/pacman/super/potato/attackby(var/obj/item/hit_with, var/mob/user) if(istype(hit_with, /obj/item/chems)) var/obj/item/chems/chem_container = hit_with - var/old_vodka_amount = REAGENT_VOLUME(reagents, /decl/material/liquid/ethanol/vodka) + var/old_vodka_amount = REAGENT_VOLUME(reagents, /decl/material/liquid/alcohol/vodka) if(chem_container.standard_pour_into(src,user)) - if(REAGENT_VOLUME(reagents, /decl/material/liquid/ethanol/vodka) > old_vodka_amount) // yay, booze! + if(REAGENT_VOLUME(reagents, /decl/material/liquid/alcohol/vodka) > old_vodka_amount) // yay, booze! audible_message(SPAN_NOTICE("[src] blips happily!")) playsound(get_turf(src),'sound/machines/synth_yes.ogg', 50, FALSE) else // you didn't add any more than we already had diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_alcohol.dm similarity index 87% rename from code/modules/reagents/chems/chems_ethanol.dm rename to code/modules/reagents/chems/chems_alcohol.dm index 8dc07f2273a..aa7ca92f847 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_alcohol.dm @@ -1,8 +1,5 @@ -/decl/material/liquid/ethanol - abstract_type = /decl/material/liquid/ethanol - name = "ethanol" //Parent class for all alcoholic reagents. - lore_text = "A well-known alcohol with a variety of applications." - taste_description = "pure alcohol" +/decl/material/liquid/alcohol + abstract_type = /decl/material/liquid/alcohol color = "#404030" touch_met = 5 ignition_point = T0C+150 @@ -11,24 +8,22 @@ boiling_point = null // Pure ethanol boils, the rest has to separate first. - heating_message = "boils away its ethanol content, leaving pure water." + heating_message = "boils away its water content, leaving pure alcohol." heating_point = T0C + 78.37 heating_products = list( - /decl/material/liquid/ethanol/spirits = 0.75, + /decl/material/liquid/alcohol/ethanol = 0.75, /decl/material/liquid/water = 0.25 ) - chilling_message = "separates as its water content freezes, leaving pure ethanol." + chilling_message = "separates as its water content freezes, leaving pure alcohol." chilling_point = T0C chilling_products = list( - /decl/material/liquid/ethanol/spirits = 0.75, + /decl/material/liquid/alcohol/ethanol = 0.75, /decl/material/solid/ice = 0.25 ) affect_blood_on_ingest = FALSE // prevents automatic toxins/inebriation as though injected affect_blood_on_inhale = FALSE - glass_name = "ethanol" - glass_desc = "A well-known alcohol with a variety of applications." value = 1.2 var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity. @@ -37,18 +32,18 @@ var/targ_temp = 310 var/halluci = 0 -/decl/material/liquid/ethanol/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.take_damage(removed * 2 * alcohol_toxicity, TOX) M.add_chemical_effect(CE_ALCOHOL_TOXIC, alcohol_toxicity) -/decl/material/liquid/ethanol/affect_inhale(mob/living/M, removed, datum/reagents/holder) +/decl/material/liquid/alcohol/affect_inhale(mob/living/M, removed, datum/reagents/holder) if(M.has_trait(/decl/trait/metabolically_inert)) return ..() affect_ingest(M, removed, holder) // a bit of a hack, but it avoids code duplication -/decl/material/liquid/ethanol/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) if(M.has_trait(/decl/trait/metabolically_inert)) return @@ -90,14 +85,19 @@ M.adjust_hallucination(halluci, halluci) // Somewhat a dummy type for 'pure ethanol' to avoid having to set dirtiness/heating products/etc on literally everything else. -/decl/material/liquid/ethanol/spirits +/decl/material/liquid/alcohol/ethanol + name = "ethanol" + lore_text = "A well-known alcohol with a variety of applications." + taste_description = "pure alcohol" + glass_name = "ethanol" + glass_desc = "A well-known alcohol with a variety of applications." dirtiness = DIRTINESS_STERILE uid = "chem_ethanol" - // Uncomment when refining spirits is less annoying + // Uncomment when refining spirits is less annoying, specifically when we have more precise temperature control. // boiling_point = T0C + 78.37 // can_boil_to_gas = TRUE - // temperature_burn_milestone_material = /decl/material/liquid/ethanol/spirits + // temperature_burn_milestone_material = /decl/material/liquid/alcohol/ethanol // Pure ethanol does not separate. heating_point = null @@ -105,7 +105,7 @@ chilling_point = null chilling_products = null -/decl/material/liquid/ethanol/absinthe +/decl/material/liquid/alcohol/absinthe name = "absinthe" lore_text = "Watch out that the Green Fairy doesn't come for you!" taste_description = "death and licorice" @@ -119,7 +119,7 @@ glass_desc = "Wormwood, anise, oh my." uid = "chem_ethanol_absinthe" -/decl/material/liquid/ethanol/ale +/decl/material/liquid/alcohol/ale name = "ale" lore_text = "A dark alchoholic beverage made by malted barley and yeast." taste_description = "hearty barley ale" @@ -132,7 +132,7 @@ glass_desc = "A freezing container of delicious ale" uid = "chem_ethanol_ale" -/decl/material/liquid/ethanol/beer +/decl/material/liquid/alcohol/beer name = "beer" codex_name = "plain beer" lore_text = "An alcoholic beverage made from malted grains, hops, yeast, and water." @@ -147,18 +147,18 @@ glass_desc = "A freezing container of beer" uid = "chem_ethanol_beer" -/decl/material/liquid/ethanol/beer/good +/decl/material/liquid/alcohol/beer/good uid = "chem_ethanol_beer_good" codex_name = "premium beer" taste_description = "beer" -/decl/material/liquid/ethanol/beer/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/beer/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_JITTER, -3) -/decl/material/liquid/ethanol/bluecuracao +/decl/material/liquid/alcohol/bluecuracao name = "blue curacao" lore_text = "Exotically blue, fruity drink, distilled from oranges." taste_description = "oranges" @@ -172,7 +172,7 @@ glass_name = "blue curacao" glass_desc = "Exotically blue, fruity drink, distilled from oranges." -/decl/material/liquid/ethanol/cognac +/decl/material/liquid/alcohol/cognac name = "cognac" lore_text = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." taste_description = "rich and smooth alcohol" @@ -186,7 +186,7 @@ glass_name = "cognac" glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." -/decl/material/liquid/ethanol/gin +/decl/material/liquid/alcohol/gin name = "gin" lore_text = "It's gin. In space. I say, good sir." taste_description = "an alcoholic christmas tree" @@ -200,7 +200,7 @@ glass_desc = "A crystal clear glass of Griffeater gin." //Base type for alchoholic drinks containing coffee -/decl/material/liquid/ethanol/coffee +/decl/material/liquid/alcohol/coffee name = "coffee liqueur" lore_text = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" taste_description = "spiked coffee" @@ -214,7 +214,7 @@ glass_desc = "Guaranteed to perk you up." overdose = 45 -/decl/material/liquid/ethanol/coffee/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/coffee/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) @@ -226,10 +226,10 @@ if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) -/decl/material/liquid/ethanol/coffee/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/alcohol/coffee/affect_overdose(mob/living/M, total_dose) ADJ_STATUS(M, STAT_JITTER, 5) -/decl/material/liquid/ethanol/melonliquor +/decl/material/liquid/alcohol/melonliquor name = "melon liqueur" lore_text = "A relatively sweet and fruity 46 proof liqueur." taste_description = "fruity alcohol" @@ -242,7 +242,7 @@ glass_name = "melon liqueur" glass_desc = "A relatively sweet and fruity 46 proof liquor." -/decl/material/liquid/ethanol/rum +/decl/material/liquid/alcohol/rum name = "dark rum" lore_text = "Yohoho and all that." taste_description = "spiked butterscotch" @@ -256,7 +256,7 @@ glass_name = "rum" glass_desc = "Now you want to Pray for a pirate suit, don't you?" -/decl/material/liquid/ethanol/sake +/decl/material/liquid/alcohol/sake name = "sake" lore_text = "Anime's favorite drink." taste_description = "dry alcohol" @@ -269,7 +269,7 @@ glass_name = "sake" glass_desc = "A glass of sake." -/decl/material/liquid/ethanol/tequila +/decl/material/liquid/alcohol/tequila name = "tequila" lore_text = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" taste_description = "paint stripper" @@ -282,7 +282,7 @@ glass_name = "tequila" glass_desc = "Now all that's missing is the weird colored shades!" -/decl/material/liquid/ethanol/thirteenloko +/decl/material/liquid/alcohol/thirteenloko name = "Thirteen Loko" lore_text = "A potent mixture of caffeine and alcohol." taste_description = "jitters and death" @@ -296,7 +296,7 @@ glass_name = "Thirteen Loko" glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." -/decl/material/liquid/ethanol/thirteenloko/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/thirteenloko/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) @@ -308,7 +308,7 @@ ADJ_STATUS(M, STAT_JITTER, 5) M.add_chemical_effect(CE_PULSE, 2) -/decl/material/liquid/ethanol/vermouth +/decl/material/liquid/alcohol/vermouth name = "vermouth" lore_text = "You suddenly feel a craving for a martini..." taste_description = "dry alcohol" @@ -322,7 +322,7 @@ glass_name = "vermouth" glass_desc = "You wonder why you're even drinking this straight." -/decl/material/liquid/ethanol/vodka +/decl/material/liquid/alcohol/vodka name = "vodka" codex_name = "plain vodka" lore_text = "Number one drink AND fueling choice for Independents around the galaxy." @@ -336,7 +336,7 @@ glass_name = "vodka" glass_desc = "The glass contain wodka. Xynta." -/decl/material/liquid/ethanol/vodka/premium +/decl/material/liquid/alcohol/vodka/premium name = "premium vodka" codex_name = null lore_text = "Premium distilled vodka imported directly from the Gilgamesh Colonial Confederation." @@ -347,7 +347,7 @@ exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_ethanol_premiumvodka" -/decl/material/liquid/ethanol/whiskey +/decl/material/liquid/alcohol/whiskey name = "malt whiskey" lore_text = "A superb and well-aged single-malt whiskey. Damn." taste_description = "molasses" @@ -360,7 +360,7 @@ glass_name = "whiskey" glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." -/decl/material/liquid/ethanol/wine +/decl/material/liquid/alcohol/wine name = "red wine" lore_text = "An premium alchoholic beverage made from distilled grape juice." taste_description = "bitter sweetness" @@ -373,7 +373,7 @@ glass_name = "red wine" glass_desc = "A very classy looking drink." -/decl/material/liquid/ethanol/wine/premium +/decl/material/liquid/alcohol/wine/premium name = "white wine" lore_text = "An exceptionally expensive alchoholic beverage made from distilled white grapes." taste_description = "white velvet" @@ -383,7 +383,7 @@ exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_ethanol_whitewine" -/decl/material/liquid/ethanol/herbal +/decl/material/liquid/alcohol/herbal name = "herbal liquor" lore_text = "A complex blend of herbs, spices and roots mingle in this old Earth classic." taste_description = "a sweet summer garden" @@ -396,7 +396,7 @@ glass_name = "herbal liquor" glass_desc = "It's definitely green. Or is it yellow?" -/decl/material/liquid/ethanol/hooch +/decl/material/liquid/alcohol/hooch name = "hooch" lore_text = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?" taste_description = "pure resignation" @@ -410,7 +410,7 @@ glass_name = "Hooch" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." -/decl/material/liquid/ethanol/irish_cream +/decl/material/liquid/alcohol/irish_cream name = "Irish cream" lore_text = "Whiskey-imbued cream." taste_description = "creamy alcohol" @@ -423,7 +423,7 @@ glass_name = "Irish cream" glass_desc = "It's cream, mixed with whiskey." -/decl/material/liquid/ethanol/mead +/decl/material/liquid/alcohol/mead name = "mead" lore_text = "A Viking's drink, though a cheap one." taste_description = "sweet, sweet alcohol" @@ -437,7 +437,7 @@ glass_name = "mead" glass_desc = "A Viking's beverage, though a cheap one." -/decl/material/liquid/ethanol/moonshine +/decl/material/liquid/alcohol/moonshine name = "moonshine" lore_text = "You've really hit rock bottom now... your liver packed its bags and left last night." taste_description = "bitterness" @@ -451,7 +451,7 @@ glass_name = "moonshine" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." -/decl/material/liquid/ethanol/pwine +/decl/material/liquid/alcohol/pwine name = "poison wine" lore_text = "Is this even wine? Toxic! Hallucinogenic! Probably consumed in boatloads by your superiors!" taste_description = "purified alcoholic death" @@ -465,7 +465,7 @@ exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_ethanol_poisonwine" -/decl/material/liquid/ethanol/pwine/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/pwine/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) @@ -483,7 +483,7 @@ else heart.take_internal_damage(100, 0) -/decl/material/liquid/ethanol/aged_whiskey // I have no idea what this is and where it comes from. //It comes from Dinnlan now +/decl/material/liquid/alcohol/aged_whiskey // I have no idea what this is and where it comes from. //It comes from Dinnlan now name = "aged whiskey" lore_text = "A well-aged whiskey of high quality. Probably imported. Just a sip'll do it, but that burn will leave you wanting more." color = "#523600" @@ -495,7 +495,7 @@ glass_name = "aged whiskey" glass_desc = "A well-aged whiskey of high quality. Probably imported." -/decl/material/liquid/ethanol/cider_apple +/decl/material/liquid/alcohol/cider_apple name = "apple cider" lore_text = "A refreshing glass of apple cider." taste_description = "cool apple cider" @@ -508,7 +508,7 @@ glass_name = "apple cider" glass_desc = "A refreshing glass of apple cider." -/decl/material/liquid/ethanol/cider_pear +/decl/material/liquid/alcohol/cider_pear name = "pear cider" lore_text = "A refreshing glass of pear cider." taste_description = "cool pear cider" @@ -521,7 +521,7 @@ glass_name = "pear cider" glass_desc = "A refreshing glass of pear cider." -/decl/material/liquid/ethanol/champagne +/decl/material/liquid/alcohol/champagne name = "champagne" lore_text = "Smooth sparkling wine, produced in the same region of France as it has been for centuries." taste_description = "bitterness and fizz" @@ -535,7 +535,7 @@ glass_desc = "Sparkling white wine, produced in the same region of France as it has been for centuries." glass_special = list(DRINK_FIZZ) -/decl/material/liquid/ethanol/jagermeister +/decl/material/liquid/alcohol/jagermeister name = "Jagermeister" lore_text = "A special blend of alcohol, herbs, and spices. It has remained a popular Earther drink." taste_description = "herbs, spices, and alcohol" @@ -548,7 +548,7 @@ glass_name = "jagermeister" glass_desc = "A special blend of alcohol, herbs, and spices. It has remained a popular Earther drink." -/decl/material/liquid/ethanol/kvass +/decl/material/liquid/alcohol/kvass name = "kvass" lore_text = "An alcoholic drink commonly made from bread." taste_description = "vkusnyy kvas, ypa!" diff --git a/code/modules/reagents/chems/chems_painkillers.dm b/code/modules/reagents/chems/chems_painkillers.dm index dc75c84c4ad..6647c2afed2 100644 --- a/code/modules/reagents/chems/chems_painkillers.dm +++ b/code/modules/reagents/chems/chems_painkillers.dm @@ -132,7 +132,7 @@ if(ingested) var/list/pool = M.reagents.reagent_volumes | ingested.reagent_volumes for(var/rtype in pool) - var/decl/material/liquid/ethanol/booze = GET_DECL(rtype) + var/decl/material/liquid/alcohol/booze = GET_DECL(rtype) if(!istype(booze) ||LAZYACCESS(M.chem_doses, rtype) < 2) //let them experience false security at first continue . = 1 diff --git a/code/modules/reagents/chems/random/chems_random.dm b/code/modules/reagents/chems/random/chems_random.dm index 5327c213c04..2f67984c009 100644 --- a/code/modules/reagents/chems/random/chems_random.dm +++ b/code/modules/reagents/chems/random/chems_random.dm @@ -6,7 +6,7 @@ var/global/list/random_chem_interaction_blacklist = list( /decl/material/solid/tobacco, /decl/material/liquid/drink, /decl/material/liquid/random, - /decl/material/liquid/ethanol // Includes alcoholic beverages + /decl/material/liquid/alcohol // Includes alcoholic beverages ) #define FOR_ALL_EFFECTS \ diff --git a/code/modules/reagents/cocktails.dm b/code/modules/reagents/cocktails.dm index 8bfe4705a95..166d689541b 100644 --- a/code/modules/reagents/cocktails.dm +++ b/code/modules/reagents/cocktails.dm @@ -104,7 +104,7 @@ description = "Watered-down rum. Pirate approved!" ratios = list( /decl/material/liquid/water = 1, - /decl/material/liquid/ethanol/rum = 1 + /decl/material/liquid/alcohol/rum = 1 ) /decl/cocktail/screwdriver @@ -112,7 +112,7 @@ description = "A classic mixture of vodka and orange juice. Just the thing for the tired engineer." ratios = list( /decl/material/liquid/drink/juice/orange = 4, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/tequila_sunrise @@ -120,39 +120,39 @@ description = "A simple cocktail of tequila and orange juice. Much like a screwdriver." ratios = list( /decl/material/liquid/drink/juice/orange = 4, - /decl/material/liquid/ethanol/tequila = 1 + /decl/material/liquid/alcohol/tequila = 1 ) /decl/cocktail/classic_martini name = "gin martini" description = "Vermouth with gin. The classiest of all cocktails." ratios = list( - /decl/material/liquid/ethanol/gin = 4, - /decl/material/liquid/ethanol/vermouth = 1 + /decl/material/liquid/alcohol/gin = 4, + /decl/material/liquid/alcohol/vermouth = 1 ) /decl/cocktail/vodka_martini name = "vodka martini" description = "A bastardisation of the classic martini. Still great." ratios = list( - /decl/material/liquid/ethanol/vodka = 4, - /decl/material/liquid/ethanol/vermouth = 1 + /decl/material/liquid/alcohol/vodka = 4, + /decl/material/liquid/alcohol/vermouth = 1 ) /decl/cocktail/allies_cocktail name = "Allies Cocktail" description = "A drink made from your allies, not as sweet as when made from your enemies." ratios = list( - /decl/material/liquid/ethanol/vermouth = 2, - /decl/material/liquid/ethanol/vodka = 2, - /decl/material/liquid/ethanol/gin = 2 + /decl/material/liquid/alcohol/vermouth = 2, + /decl/material/liquid/alcohol/vodka = 2, + /decl/material/liquid/alcohol/gin = 2 ) /decl/cocktail/bilk name = "bilk" description = "A foul brew of milk and beer. For alcoholics who fear osteoporosis." ratios = list( - /decl/material/liquid/ethanol/beer = 1, + /decl/material/liquid/alcohol/beer = 1, /decl/material/liquid/drink/milk = 1 ) @@ -161,7 +161,7 @@ description = "A mild cocktail, widely considered an all-time classic." ratios = list( /decl/material/liquid/drink/tonic = 4, - /decl/material/liquid/ethanol/gin = 1 + /decl/material/liquid/alcohol/gin = 1 ) /decl/cocktail/cuba_libre @@ -169,24 +169,24 @@ description = "A classic mix of rum and cola." ratios = list( /decl/material/liquid/drink/cola = 4, - /decl/material/liquid/ethanol/rum = 1 + /decl/material/liquid/alcohol/rum = 1 ) /decl/cocktail/black_russian name = "black Russian" description = "Similar to a white Russian, but fit for the lactose-intolerant." ratios = list( - /decl/material/liquid/ethanol/vodka = 2, - /decl/material/liquid/ethanol/coffee = 1 + /decl/material/liquid/alcohol/vodka = 2, + /decl/material/liquid/alcohol/coffee = 1 ) /decl/cocktail/white_russian name = "white Russian" description = "A straightforward cocktail of coffee liqueur and vodka. Popular in a lot of places, but that's just, like, an opinion, man." ratios = list( - /decl/material/liquid/ethanol/coffee = 2, + /decl/material/liquid/alcohol/coffee = 2, /decl/material/liquid/drink/milk/cream, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/whiskey_cola @@ -194,7 +194,7 @@ description = "Whiskey mixed with cola. Quite refreshing." ratios = list( /decl/material/liquid/drink/cola = 4, - /decl/material/liquid/ethanol/whiskey = 1 + /decl/material/liquid/alcohol/whiskey = 1 ) /decl/cocktail/bloody_mary @@ -202,7 +202,7 @@ description = "A cocktail of vodka, tomato and lime juice. Celery stalk optional." ratios = list( /decl/material/liquid/drink/juice/tomato = 3, - /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/alcohol/vodka = 1, /decl/material/liquid/drink/juice/lime = 1 ) @@ -210,10 +210,10 @@ name = "The Livergeist" description = "A cocktail pioneered by a small cabal with a vendetta against the liver. Drink very carefully." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/aged_whiskey = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/aged_whiskey = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/liquid/drink/juice/lime = 1 ) @@ -221,16 +221,16 @@ name = "Brave Bull" description = "A strong cocktail of tequila and coffee liquor." ratios = list( - /decl/material/liquid/ethanol/tequila = 2, - /decl/material/liquid/ethanol/coffee = 1 + /decl/material/liquid/alcohol/tequila = 2, + /decl/material/liquid/alcohol/coffee = 1 ) /decl/cocktail/toxins_special name = "H2 Special" description = "Raise a glass to the bomb technicians of yesteryear, wherever their ashes now reside." ratios = list( - /decl/material/liquid/ethanol/rum = 1, - /decl/material/liquid/ethanol/vermouth = 1, + /decl/material/liquid/alcohol/rum = 1, + /decl/material/liquid/alcohol/vermouth = 1, /decl/material/solid/metallic_hydrogen ) @@ -238,7 +238,7 @@ name = "Beepsky Smash" description = "A cocktail originating with stationside security forces. Rumoured to take the edge off being stunned with your own baton." ratios = list( - /decl/material/liquid/ethanol/whiskey = 2, + /decl/material/liquid/alcohol/whiskey = 2, /decl/material/liquid/drink/juice/lime = 1, /decl/material/solid/metal/iron ) @@ -258,8 +258,8 @@ name = "The Manly Dorf" description = "A cocktail of old that claims to be for manly men, but is mostly for people who can't tell beer and ale apart." ratios = list( - /decl/material/liquid/ethanol/ale = 1, - /decl/material/liquid/ethanol/beer = 1 + /decl/material/liquid/alcohol/ale = 1, + /decl/material/liquid/alcohol/beer = 1 ) /decl/cocktail/irish_coffee @@ -267,16 +267,16 @@ description = "A cocktail of coffee, whiskey and cream, just the thing to kick you awake while also dulling the pain of existence." ratios = list( /decl/material/liquid/drink/coffee = 4, - /decl/material/liquid/ethanol/irish_cream = 1 + /decl/material/liquid/alcohol/irish_cream = 1 ) /decl/cocktail/b52 name = "B-52" description = "A semi-modern spin on an Irish coffee, featuring a dash of cognac. It will get you bombed." ratios = list( - /decl/material/liquid/ethanol/coffee = 1, - /decl/material/liquid/ethanol/irish_cream = 1, - /decl/material/liquid/ethanol/cognac = 1 + /decl/material/liquid/alcohol/coffee = 1, + /decl/material/liquid/alcohol/irish_cream = 1, + /decl/material/liquid/alcohol/cognac = 1 ) order_specific = TRUE // layered cocktail @@ -284,9 +284,9 @@ name = "Atomic Bomb" description = "A radioactive take on a B-52, popularized by asteroid miners with prosthetic organs and something to prove." ratios = list( - /decl/material/liquid/ethanol/coffee = 1, - /decl/material/liquid/ethanol/irish_cream = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/coffee = 1, + /decl/material/liquid/alcohol/irish_cream = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/solid/metal/uranium ) order_specific = TRUE // layered cocktail @@ -296,7 +296,7 @@ name = "margarita" description = "A classic cocktail of antiquity." ratios = list( - /decl/material/liquid/ethanol/tequila = 3, + /decl/material/liquid/alcohol/tequila = 3, /decl/material/liquid/drink/juice/lime = 1 ) @@ -305,10 +305,10 @@ description = "Most of the liquor cabinet, brought together in a delicious mix. Designed for middle-aged alcoholics." ratios = list( /decl/material/liquid/drink/cola = 2, - /decl/material/liquid/ethanol/rum = 1, - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/tequila = 1 + /decl/material/liquid/alcohol/rum = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/tequila = 1 ) /decl/cocktail/threemileisland @@ -316,10 +316,10 @@ description = "Much like the Atomic Bomb, this cocktail was adapted by asteroid miners who couldn't enjoy a drink without a dose of radiation poisoning." ratios = list( /decl/material/liquid/drink/cola = 2, - /decl/material/liquid/ethanol/rum = 1, - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/tequila = 1, + /decl/material/liquid/alcohol/rum = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/tequila = 1, /decl/material/solid/metal/uranium ) @@ -328,23 +328,23 @@ description = "A simple cocktail, considered to be cultured and refined." ratios = list( /decl/material/liquid/drink/sodawater = 4, - /decl/material/liquid/ethanol/whiskey = 1 + /decl/material/liquid/alcohol/whiskey = 1 ) /decl/cocktail/manhattan name = "Manhattan" description = "Another classic cocktail of antiquity. Popular with private investigators." ratios = list( - /decl/material/liquid/ethanol/whiskey = 2, - /decl/material/liquid/ethanol/vermouth = 1 + /decl/material/liquid/alcohol/whiskey = 2, + /decl/material/liquid/alcohol/vermouth = 1 ) /decl/cocktail/manhattan_proj name = "Manhattan Project" description = "A classic cocktail with a spicy twist, pioneered by a robot detective." ratios = list( - /decl/material/liquid/ethanol/whiskey = 2, - /decl/material/liquid/ethanol/vermouth = 1, + /decl/material/liquid/alcohol/whiskey = 2, + /decl/material/liquid/alcohol/vermouth = 1, /decl/material/solid/metal/uranium ) @@ -353,14 +353,14 @@ description = "A simple, refreshing cocktail with a kick to it." ratios = list( /decl/material/liquid/drink/tonic = 4, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/gin_fizz name = "gin fizz" description = "A dry, refreshing cocktail with a tang of lime." ratios = list( - /decl/material/liquid/ethanol/gin = 2, + /decl/material/liquid/alcohol/gin = 2, /decl/material/liquid/drink/sodawater = 2, /decl/material/liquid/drink/juice/lime = 1 ) @@ -369,7 +369,7 @@ name = "Bahama Mama" description = "A sweet tropical cocktail that is deceptively strong." ratios = list( - /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/alcohol/rum = 2, /decl/material/liquid/drink/juice/orange = 2, /decl/material/liquid/drink/juice/lime = 2, /decl/material/liquid/drink/grenadine = 1 @@ -379,8 +379,8 @@ name = "Singulo" description = "Traditionally thrown together from maintenance stills and used to treat singularity exposure in engineers who forgot their meson goggles." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/wine = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/wine = 1, /decl/material/solid/metal/radium ) @@ -388,7 +388,7 @@ name = "Demon's Blood" description = "A ghoulish cocktail that originated as a practical joke in a fringe habitat." ratios = list( - /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/alcohol/rum = 2, /decl/material/liquid/drink/citrussoda = 2, /decl/material/liquid/drink/cherrycola = 2, /decl/material/liquid/blood = 1 @@ -399,7 +399,7 @@ description = "A thick and creamy cocktail." ratios = list( /decl/material/liquid/drink/milk/cream = 2, - /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/alcohol/rum = 2, /decl/material/liquid/drink/juice/banana = 1, /decl/material/liquid/drink/juice/watermelon = 1 ) @@ -408,7 +408,7 @@ name = "Anti-freeze" description = "A chilled cocktail invented and popularized by corona miners." ratios = list( - /decl/material/liquid/ethanol/vodka = 3, + /decl/material/liquid/alcohol/vodka = 3, /decl/material/liquid/drink/milk/cream = 2, /decl/material/solid/ice = 2 ) @@ -417,7 +417,7 @@ name = "Barefoot" description = "A smooth cocktail that will take your mind off the broken glass you stepped on." ratios = list( - /decl/material/liquid/ethanol/vermouth = 4, + /decl/material/liquid/alcohol/vermouth = 4, /decl/material/liquid/drink/juice/berry = 2, /decl/material/liquid/drink/milk/cream = 1 ) @@ -426,7 +426,7 @@ name = "sbiten" description = "A form of spiced mead that will bring tears to the eyes of the most hardened drinker." ratios = list( - /decl/material/liquid/ethanol/mead = 9, + /decl/material/liquid/alcohol/mead = 9, /decl/material/liquid/capsaicin = 1 ) @@ -434,7 +434,7 @@ name = "red mead" description = "Supposedly a traditional drink amongst mercenary groups prior to dangerous missions." ratios = list( - /decl/material/liquid/ethanol/mead = 1, + /decl/material/liquid/alcohol/mead = 1, /decl/material/liquid/blood = 1 ) @@ -442,7 +442,7 @@ name = "Acid Spit" description = "A cocktail inspired by monsters of legend, popular with college students daring their friends to drink one." ratios = list( - /decl/material/liquid/ethanol/wine = 1, + /decl/material/liquid/alcohol/wine = 1, /decl/material/liquid/acid ) @@ -454,17 +454,17 @@ /decl/material/liquid/drink/juice/orange = 2, /decl/material/liquid/drink/juice/lime = 1, /decl/material/liquid/drink/juice/lemon = 1, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/neurotoxin name = "Neurotoxin" description = "A cocktail primarily intended for people with a grudge against their own brain." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/aged_whiskey = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/aged_whiskey = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/liquid/drink/juice/lime = 1, /decl/material/liquid/sedatives ) @@ -474,16 +474,16 @@ description = "A tangy, fizzy twist on beer." ratios = list( /decl/material/liquid/drink/lemon_lime = 3, - /decl/material/liquid/ethanol/beer = 1 + /decl/material/liquid/alcohol/beer = 1 ) /decl/cocktail/irishslammer name = "Irish Slammer" description = "A rich cocktail of whiskey, stout and cream that was performed using a shot glass before glass-interleaving technology was lost." ratios = list( - /decl/material/liquid/ethanol/ale = 5, - /decl/material/liquid/ethanol/whiskey = 1, - /decl/material/liquid/ethanol/irish_cream = 1 + /decl/material/liquid/alcohol/ale = 5, + /decl/material/liquid/alcohol/whiskey = 1, + /decl/material/liquid/alcohol/irish_cream = 1 ) // A whiskey cola with added beer. @@ -491,8 +491,8 @@ name = "Syndicate Bomb" description = "A murky cocktail reputed to have originated in criminal circles. It will definitely get you bombed." ratios = list( - /decl/material/liquid/ethanol/whiskey = 1, - /decl/material/liquid/ethanol/beer = 1, + /decl/material/liquid/alcohol/whiskey = 1, + /decl/material/liquid/alcohol/beer = 1, /decl/material/liquid/drink/cola = 4 ) @@ -500,19 +500,19 @@ name = "Devil's Kiss" description = "A ghoulish cocktail popular in some of the weirder dive bars on the system fringe." ratios = list( - /decl/material/liquid/ethanol/rum = 4, + /decl/material/liquid/alcohol/rum = 4, /decl/material/liquid/blood = 1, - /decl/material/liquid/ethanol/coffee = 2 + /decl/material/liquid/alcohol/coffee = 2 ) /decl/cocktail/hippiesdelight name = "Hippy's Delight" description = "A complex cocktail that just might open your third eye." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/aged_whiskey = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/aged_whiskey = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/liquid/drink/juice/lime = 1, /decl/material/liquid/psychotropics = 2 ) @@ -531,7 +531,7 @@ description = "A smooth, steady cocktail supposedly ordered by sawbones and surgeons of legend." ratios = list( /decl/material/liquid/drink/cherrycola = 4, - /decl/material/liquid/ethanol/rum = 2 + /decl/material/liquid/alcohol/rum = 2 ) /decl/cocktail/vodkacola @@ -539,14 +539,14 @@ description = "A simple mix of cola and vodka, combining sweetness, fizz and a kick in the teeth." ratios = list( /decl/material/liquid/drink/cola = 2, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/sawbonesdismay name = "Sawbones' Dismay" description = "Legally, we are required to inform you that drinking this cocktail may invalidate your health insurance." ratios = list( - /decl/material/liquid/ethanol/jagermeister = 1, + /decl/material/liquid/alcohol/jagermeister = 1, /decl/material/liquid/drink/beastenergy = 1 ) @@ -554,7 +554,7 @@ name = "Patron" description = "Tequila mixed with flaked silver, for those with moderate expensive tastes." ratios = list( - /decl/material/liquid/ethanol/tequila = 1, + /decl/material/liquid/alcohol/tequila = 1, /decl/material/solid/metal/silver ) @@ -571,7 +571,7 @@ name = "Goldschlager" description = "Schnapps mixed with flaked gold, for those with very expensive tastes." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/alcohol/vodka = 1, /decl/material/solid/metal/gold ) @@ -597,5 +597,5 @@ description = "Watered-down whiskey. Essentially grog, but without the pirates." ratios = list( /decl/material/liquid/water = 1, - /decl/material/liquid/ethanol/whiskey = 1 + /decl/material/liquid/alcohol/whiskey = 1 ) diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index d90e71023fa..fadf1e19187 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -32,24 +32,24 @@ DEFINE_CARTRIDGE_FOR_CHEM(iron, /decl/material/solid/metal/iron) DEFINE_CARTRIDGE_FOR_CHEM(copper, /decl/material/solid/metal/copper) DEFINE_CARTRIDGE_FOR_CHEM(mercury, /decl/material/liquid/mercury) DEFINE_CARTRIDGE_FOR_CHEM(radium, /decl/material/solid/metal/radium) -DEFINE_CARTRIDGE_FOR_CHEM(ethanol, /decl/material/liquid/ethanol/spirits) +DEFINE_CARTRIDGE_FOR_CHEM(ethanol, /decl/material/liquid/alcohol/ethanol) DEFINE_CARTRIDGE_FOR_CHEM(sacid, /decl/material/liquid/acid) DEFINE_CARTRIDGE_FOR_CHEM(tungsten, /decl/material/solid/metal/tungsten) // Bar, alcoholic -DEFINE_CARTRIDGE_FOR_CHEM(beer, /decl/material/liquid/ethanol/beer) -DEFINE_CARTRIDGE_FOR_CHEM(kahlua, /decl/material/liquid/ethanol/coffee) -DEFINE_CARTRIDGE_FOR_CHEM(whiskey, /decl/material/liquid/ethanol/whiskey) -DEFINE_CARTRIDGE_FOR_CHEM(wine, /decl/material/liquid/ethanol/wine) -DEFINE_CARTRIDGE_FOR_CHEM(vodka, /decl/material/liquid/ethanol/vodka) -DEFINE_CARTRIDGE_FOR_CHEM(gin, /decl/material/liquid/ethanol/gin) -DEFINE_CARTRIDGE_FOR_CHEM(rum, /decl/material/liquid/ethanol/rum) -DEFINE_CARTRIDGE_FOR_CHEM(tequila, /decl/material/liquid/ethanol/tequila) -DEFINE_CARTRIDGE_FOR_CHEM(vermouth, /decl/material/liquid/ethanol/vermouth) -DEFINE_CARTRIDGE_FOR_CHEM(cognac, /decl/material/liquid/ethanol/cognac) -DEFINE_CARTRIDGE_FOR_CHEM(ale, /decl/material/liquid/ethanol/ale) -DEFINE_CARTRIDGE_FOR_CHEM(mead, /decl/material/liquid/ethanol/mead) +DEFINE_CARTRIDGE_FOR_CHEM(beer, /decl/material/liquid/alcohol/beer) +DEFINE_CARTRIDGE_FOR_CHEM(kahlua, /decl/material/liquid/alcohol/coffee) +DEFINE_CARTRIDGE_FOR_CHEM(whiskey, /decl/material/liquid/alcohol/whiskey) +DEFINE_CARTRIDGE_FOR_CHEM(wine, /decl/material/liquid/alcohol/wine) +DEFINE_CARTRIDGE_FOR_CHEM(vodka, /decl/material/liquid/alcohol/vodka) +DEFINE_CARTRIDGE_FOR_CHEM(gin, /decl/material/liquid/alcohol/gin) +DEFINE_CARTRIDGE_FOR_CHEM(rum, /decl/material/liquid/alcohol/rum) +DEFINE_CARTRIDGE_FOR_CHEM(tequila, /decl/material/liquid/alcohol/tequila) +DEFINE_CARTRIDGE_FOR_CHEM(vermouth, /decl/material/liquid/alcohol/vermouth) +DEFINE_CARTRIDGE_FOR_CHEM(cognac, /decl/material/liquid/alcohol/cognac) +DEFINE_CARTRIDGE_FOR_CHEM(ale, /decl/material/liquid/alcohol/ale) +DEFINE_CARTRIDGE_FOR_CHEM(mead, /decl/material/liquid/alcohol/mead) // Bar, soft DEFINE_CARTRIDGE_FOR_CHEM(ice, /decl/material/solid/ice) diff --git a/code/modules/reagents/reactions/reaction_alcohol.dm b/code/modules/reagents/reactions/reaction_alcohol.dm index 015448f51a7..121c4a9bf2f 100644 --- a/code/modules/reagents/reactions/reaction_alcohol.dm +++ b/code/modules/reagents/reactions/reaction_alcohol.dm @@ -14,7 +14,7 @@ /decl/chemical_reaction/recipe/moonshine name = "Moonshine" - result = /decl/material/liquid/ethanol/moonshine + result = /decl/material/liquid/alcohol/moonshine required_reagents = list(/decl/material/liquid/nutriment = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -29,7 +29,7 @@ /decl/chemical_reaction/recipe/wine name = "Red Wine" - result = /decl/material/liquid/ethanol/wine + result = /decl/material/liquid/alcohol/wine required_reagents = list(/decl/material/liquid/drink/juice/grape = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -37,7 +37,7 @@ /decl/chemical_reaction/recipe/pwine name = "Poison Wine" - result = /decl/material/liquid/ethanol/pwine + result = /decl/material/liquid/alcohol/pwine required_reagents = list(/decl/material/liquid/poisonberryjuice = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -45,7 +45,7 @@ /decl/chemical_reaction/recipe/melonliquor name = "Melon Liquor" - result = /decl/material/liquid/ethanol/melonliquor + result = /decl/material/liquid/alcohol/melonliquor required_reagents = list(/decl/material/liquid/drink/juice/watermelon = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -53,7 +53,7 @@ /decl/chemical_reaction/recipe/bluecuracao name = "Blue Curacao" - result = /decl/material/liquid/ethanol/bluecuracao + result = /decl/material/liquid/alcohol/bluecuracao required_reagents = list(/decl/material/liquid/drink/juice/orange = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -61,7 +61,7 @@ /decl/chemical_reaction/recipe/beer name = "Plain Beer" - result = /decl/material/liquid/ethanol/beer + result = /decl/material/liquid/alcohol/beer required_reagents = list(/decl/material/liquid/nutriment/cornoil = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -69,7 +69,7 @@ /decl/chemical_reaction/recipe/vodka name = "Potato Vodka" - result = /decl/material/liquid/ethanol/vodka + result = /decl/material/liquid/alcohol/vodka required_reagents = list(/decl/material/liquid/drink/juice/potato = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -77,7 +77,7 @@ /decl/chemical_reaction/recipe/vodka2 name = "Turnip Vodka" - result = /decl/material/liquid/ethanol/vodka + result = /decl/material/liquid/alcohol/vodka required_reagents = list(/decl/material/liquid/drink/juice/turnip = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -85,7 +85,7 @@ /decl/chemical_reaction/recipe/sake name = "Sake" - result = /decl/material/liquid/ethanol/sake + result = /decl/material/liquid/alcohol/sake required_reagents = list(/decl/material/liquid/nutriment/rice = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -93,7 +93,7 @@ /decl/chemical_reaction/recipe/kahlua name = "Kahlua" - result = /decl/material/liquid/ethanol/coffee + result = /decl/material/liquid/alcohol/coffee required_reagents = list(/decl/material/liquid/drink/coffee = 5, /decl/material/liquid/nutriment/sugar = 5) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 5 @@ -101,28 +101,28 @@ /decl/chemical_reaction/recipe/irish_cream name = "Irish Cream" - result = /decl/material/liquid/ethanol/irish_cream - required_reagents = list(/decl/material/liquid/ethanol/whiskey = 2, /decl/material/liquid/drink/milk/cream = 1) + result = /decl/material/liquid/alcohol/irish_cream + required_reagents = list(/decl/material/liquid/alcohol/whiskey = 2, /decl/material/liquid/drink/milk/cream = 1) result_amount = 3 /decl/chemical_reaction/recipe/hooch name = "Hooch" - result = /decl/material/liquid/ethanol/hooch - required_reagents = list (/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/ethanol/spirits = 2, /decl/material/liquid/fuel = 1) + result = /decl/material/liquid/alcohol/hooch + required_reagents = list (/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/alcohol/ethanol = 2, /decl/material/liquid/fuel = 1) minimum_temperature = 30 CELSIUS maximum_temperature = (30 CELSIUS) + 100 result_amount = 3 /decl/chemical_reaction/recipe/mead name = "Mead" - result = /decl/material/liquid/ethanol/mead + result = /decl/material/liquid/alcohol/mead required_reagents = list(/decl/material/liquid/nutriment/honey = 1, /decl/material/liquid/water = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 2 /decl/chemical_reaction/recipe/rum name = "Dark Rum" - result = /decl/material/liquid/ethanol/rum + result = /decl/material/liquid/alcohol/rum required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/water = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 2 @@ -130,21 +130,21 @@ /decl/chemical_reaction/recipe/cider_apple name = "Apple Cider" - result = /decl/material/liquid/ethanol/cider_apple + result = /decl/material/liquid/alcohol/cider_apple required_reagents = list(/decl/material/liquid/drink/juice/apple = 2, /decl/material/liquid/nutriment/sugar = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 3 /decl/chemical_reaction/recipe/cider_pear name = "Pear Cider" - result = /decl/material/liquid/ethanol/cider_pear + result = /decl/material/liquid/alcohol/cider_pear required_reagents = list(/decl/material/liquid/drink/juice/pear = 2, /decl/material/liquid/nutriment/sugar = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 3 /decl/chemical_reaction/recipe/kvass name = "Kvass" - result = /decl/material/liquid/ethanol/kvass - required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/ethanol/beer = 1) + result = /decl/material/liquid/alcohol/kvass + required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/alcohol/beer = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 3 diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index a2a21280d67..bbd64250900 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -48,7 +48,7 @@ name = "Methyl Bromide" required_reagents = list( /decl/material/liquid/bromide = 1, - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/fuel/hydrazine = 1 ) result_amount = 3 diff --git a/code/modules/reagents/reactions/reaction_drugs.dm b/code/modules/reagents/reactions/reaction_drugs.dm index e46935f7cc8..8f10b625a3c 100644 --- a/code/modules/reagents/reactions/reaction_drugs.dm +++ b/code/modules/reagents/reactions/reaction_drugs.dm @@ -23,7 +23,7 @@ result = /decl/material/liquid/painkillers/strong required_reagents = list( /decl/material/liquid/stabilizer = 1, - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/acetone = 1 ) result_amount = 3 @@ -31,7 +31,7 @@ /decl/chemical_reaction/drug/antiseptic name = "Antiseptic" result = /decl/material/liquid/antiseptic - required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/antitoxins = 1, /decl/material/liquid/acid/hydrochloric = 1) + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/antitoxins = 1, /decl/material/liquid/acid/hydrochloric = 1) result_amount = 3 /decl/chemical_reaction/drug/mutagenics @@ -136,7 +136,7 @@ /decl/chemical_reaction/drug/sedatives name = "Sedatives" result = /decl/material/liquid/sedatives - required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/nutriment/sugar = 4 + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/nutriment/sugar = 4 ) inhibitors = list( /decl/material/solid/phosphorus @@ -146,7 +146,7 @@ /decl/chemical_reaction/drug/paralytics name = "Paralytics" result = /decl/material/liquid/paralytics - required_reagents = list(/decl/material/liquid/ethanol/spirits = 1, /decl/material/liquid/mercury = 2, /decl/material/liquid/fuel/hydrazine = 2) + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/mercury = 2, /decl/material/liquid/fuel/hydrazine = 2) result_amount = 1 /decl/chemical_reaction/drug/zombiepowder diff --git a/code/modules/reagents/reactions/reaction_herbal.dm b/code/modules/reagents/reactions/reaction_herbal.dm index 7a580bcfba1..b8a02ca07fe 100644 --- a/code/modules/reagents/reactions/reaction_herbal.dm +++ b/code/modules/reagents/reactions/reaction_herbal.dm @@ -44,7 +44,7 @@ /decl/chemical_reaction/drug/herbal/yarrow_tincture name = "tincture of yarrow" required_reagents = list( - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/brute_meds/yarrow = 3 ) result = /decl/material/liquid/brute_meds/yarrow/tincture @@ -52,7 +52,7 @@ /decl/chemical_reaction/drug/herbal/aloe_tincture name = "tincture of aloe" required_reagents = list( - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/burn_meds/aloe = 3 ) result = /decl/material/liquid/burn_meds/aloe/tincture @@ -60,7 +60,7 @@ /decl/chemical_reaction/drug/herbal/ginseng_tincture name = "tincture of ginseng" required_reagents = list( - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/antitoxins/ginseng = 3 ) result = /decl/material/liquid/antitoxins/ginseng/tincture @@ -68,7 +68,7 @@ /decl/chemical_reaction/drug/herbal/valerian_tincture name = "tincture of valerian" required_reagents = list( - /decl/material/liquid/ethanol/spirits = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/sedatives/valerian = 3 ) result = /decl/material/liquid/sedatives/valerian/tincture diff --git a/code/modules/reagents/reactions/reaction_recipe.dm b/code/modules/reagents/reactions/reaction_recipe.dm index 369f3ea68b2..bcd93c0e8af 100644 --- a/code/modules/reagents/reactions/reaction_recipe.dm +++ b/code/modules/reagents/reactions/reaction_recipe.dm @@ -79,7 +79,7 @@ /decl/chemical_reaction/recipe/vinegar2 name = "Clear Vinegar" result = /decl/material/liquid/nutriment/vinegar - required_reagents = list(/decl/material/liquid/ethanol/spirits = 10) + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 mix_message = "The solution roils as it rapidly ferments into a sharp-smelling liquid." diff --git a/code/modules/reagents/reactions/reaction_recipe_food.dm b/code/modules/reagents/reactions/reaction_recipe_food.dm index 29ba82a01db..0900c6d5c2e 100644 --- a/code/modules/reagents/reactions/reaction_recipe_food.dm +++ b/code/modules/reagents/reactions/reaction_recipe_food.dm @@ -210,7 +210,7 @@ name = "Space Liberty Duff" required_reagents = list( /decl/material/liquid/water = 10, - /decl/material/liquid/ethanol/vodka = 5, + /decl/material/liquid/alcohol/vodka = 5, /decl/material/liquid/psychotropics = 5 ) obj_result = /obj/item/food/spacylibertyduff @@ -219,7 +219,7 @@ name = "Amanita Jelly" required_reagents = list( /decl/material/liquid/water = 10, - /decl/material/liquid/ethanol/vodka = 5, + /decl/material/liquid/alcohol/vodka = 5, /decl/material/liquid/amatoxin = 5 ) obj_result = /obj/item/food/amanitajelly diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 6e69142d458..feee64d330b 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -128,18 +128,18 @@ volume = 60 possible_transfer_amounts = @"[5,10,20,30]" reagent_ids = list( - /decl/material/liquid/ethanol/beer, - /decl/material/liquid/ethanol/coffee, - /decl/material/liquid/ethanol/whiskey, - /decl/material/liquid/ethanol/wine, - /decl/material/liquid/ethanol/vodka, - /decl/material/liquid/ethanol/gin, - /decl/material/liquid/ethanol/rum, - /decl/material/liquid/ethanol/tequila, - /decl/material/liquid/ethanol/vermouth, - /decl/material/liquid/ethanol/cognac, - /decl/material/liquid/ethanol/ale, - /decl/material/liquid/ethanol/mead, + /decl/material/liquid/alcohol/beer, + /decl/material/liquid/alcohol/coffee, + /decl/material/liquid/alcohol/whiskey, + /decl/material/liquid/alcohol/wine, + /decl/material/liquid/alcohol/vodka, + /decl/material/liquid/alcohol/gin, + /decl/material/liquid/alcohol/rum, + /decl/material/liquid/alcohol/tequila, + /decl/material/liquid/alcohol/vermouth, + /decl/material/liquid/alcohol/cognac, + /decl/material/liquid/alcohol/ale, + /decl/material/liquid/alcohol/mead, /decl/material/liquid/water, /decl/material/liquid/nutriment/sugar, /decl/material/solid/ice, @@ -158,8 +158,8 @@ /decl/material/liquid/drink/hot_coco, /decl/material/liquid/drink/tea/green, /decl/material/liquid/drink/citrussoda, - /decl/material/liquid/ethanol/beer, - /decl/material/liquid/ethanol/coffee + /decl/material/liquid/alcohol/beer, + /decl/material/liquid/alcohol/coffee ) /obj/item/chems/borghypo/service/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index 6d5bebfe3ef..bd6c5d8bfc2 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -251,7 +251,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/gin/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/gin, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/gin, reagents.maximum_volume) /obj/item/chems/drinks/bottle/whiskey name = "Uncle Git's Special Reserve" @@ -260,7 +260,7 @@ center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/whiskey/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/whiskey, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/whiskey, reagents.maximum_volume) /obj/item/chems/drinks/bottle/agedwhiskey name = "aged whiskey" @@ -269,7 +269,7 @@ center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/agedwhiskey/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/aged_whiskey, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/aged_whiskey, reagents.maximum_volume) /obj/item/chems/drinks/bottle/vodka name = "Tunguska Triple Distilled" @@ -278,7 +278,7 @@ center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/vodka/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/vodka, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/vodka, reagents.maximum_volume) /obj/item/chems/drinks/bottle/tequila name = "Caccavo Guaranteed Quality tequila" @@ -287,7 +287,7 @@ center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/tequila/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/tequila, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/tequila, reagents.maximum_volume) /obj/item/chems/drinks/bottle/patron name = "Wrapp Artiste Patron" @@ -296,7 +296,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/patron/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/tequila, reagents.maximum_volume - 5) + add_to_reagents(/decl/material/liquid/alcohol/tequila, reagents.maximum_volume - 5) add_to_reagents(/decl/material/solid/metal/silver, 5) /obj/item/chems/drinks/bottle/rum @@ -306,7 +306,7 @@ center_of_mass = @'{"x":16,"y":8}' /obj/item/chems/drinks/bottle/rum/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/rum, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/rum, reagents.maximum_volume) /obj/item/chems/drinks/bottle/holywater name = "Flask of Holy Water" @@ -324,7 +324,7 @@ center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/vermouth/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/vermouth, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/vermouth, reagents.maximum_volume) /obj/item/chems/drinks/bottle/kahlua name = "Robert Robust's Coffee Liqueur" @@ -333,7 +333,7 @@ center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/kahlua/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/coffee, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/coffee, reagents.maximum_volume) /obj/item/chems/drinks/bottle/goldschlager name = "College Girl Goldschlager" @@ -342,7 +342,7 @@ center_of_mass = @'{"x":15,"y":3}' /obj/item/chems/drinks/bottle/goldschlager/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/vodka, reagents.maximum_volume - 5) + add_to_reagents(/decl/material/liquid/alcohol/vodka, reagents.maximum_volume - 5) add_to_reagents(/decl/material/solid/metal/gold, 5) /obj/item/chems/drinks/bottle/cognac @@ -352,7 +352,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/cognac/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/cognac, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/cognac, reagents.maximum_volume) /obj/item/chems/drinks/bottle/wine name = "Doublebeard Bearded Special Wine" @@ -361,7 +361,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/wine/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents.maximum_volume) /obj/item/chems/drinks/bottle/absinthe name = "Jailbreaker Verte" @@ -370,7 +370,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/absinthe/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/absinthe, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/absinthe, reagents.maximum_volume) /obj/item/chems/drinks/bottle/melonliquor name = "Emeraldine Melon Liquor" @@ -379,7 +379,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/melonliquor/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/melonliquor, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/melonliquor, reagents.maximum_volume) /obj/item/chems/drinks/bottle/bluecuracao name = "Miss Blue Curacao" @@ -388,7 +388,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/bluecuracao/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/bluecuracao, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/bluecuracao, reagents.maximum_volume) /obj/item/chems/drinks/bottle/herbal name = "Liqueur d'Herbe" @@ -397,7 +397,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/herbal/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/herbal, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/herbal, reagents.maximum_volume) /obj/item/chems/drinks/bottle/grenadine name = "Briar Rose Grenadine Syrup" @@ -442,7 +442,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/pwine/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/pwine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/pwine, reagents.maximum_volume) /obj/item/chems/drinks/bottle/sake name = "Takeo Sadow's Combined Sake" @@ -451,7 +451,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/sake/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/sake, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/sake, reagents.maximum_volume) /obj/item/chems/drinks/bottle/champagne @@ -463,7 +463,7 @@ var/opening /obj/item/chems/drinks/bottle/champagne/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/champagne, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/champagne, reagents.maximum_volume) /obj/item/chems/drinks/bottle/champagne/open(mob/user) if(ATOM_IS_OPEN_CONTAINER(src)) @@ -498,7 +498,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/jagermeister/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/jagermeister, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/jagermeister, reagents.maximum_volume) //////////////////////////PREMIUM ALCOHOL /////////////////////// /obj/item/chems/drinks/bottle/premiumvodka @@ -511,7 +511,7 @@ var/namepick = pick("Four Stripes","Gilgamesh","Novaya Zemlya","Indie","STS-35") var/typepick = pick("Absolut","Gold","Quadruple Distilled","Platinum","Standard") name = "[namepick] [typepick]" - add_to_reagents(/decl/material/liquid/ethanol/vodka/premium, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/vodka/premium, reagents.maximum_volume) /obj/item/chems/drinks/bottle/premiumwine name = "Uve De Blanc" @@ -529,7 +529,7 @@ var/agedyear = rand(global.using_map.game_year - aged_max, global.using_map.game_year - aged_min) set_custom_name(make_random_name()) desc += " This bottle is marked as [agedyear] Vintage." - add_to_reagents(/decl/material/liquid/ethanol/wine/premium, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine/premium, reagents.maximum_volume) //////////////////////////JUICES AND STUFF /////////////////////// @@ -612,7 +612,7 @@ center_of_mass = @'{"x":16,"y":12}' /obj/item/chems/drinks/bottle/small/beer/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/item/chems/drinks/bottle/small/ale name = "\improper Magm-Ale" @@ -622,7 +622,7 @@ center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/bottle/small/ale/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/ale, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/ale, reagents.maximum_volume) /obj/item/chems/drinks/bottle/small/gingerbeer name = "Ginger Beer" diff --git a/code/modules/reagents/reagent_containers/drinks/cans.dm b/code/modules/reagents/reagent_containers/drinks/cans.dm index 4caf4c5fa41..7c2dbb14dd6 100644 --- a/code/modules/reagents/reagent_containers/drinks/cans.dm +++ b/code/modules/reagents/reagent_containers/drinks/cans.dm @@ -50,7 +50,7 @@ center_of_mass = @'{"x":16,"y":8}' /obj/item/chems/drinks/cans/thirteenloko/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/thirteenloko, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/thirteenloko, reagents.maximum_volume) /obj/item/chems/drinks/cans/dr_gibb name = "\improper Dr. Gibb" @@ -202,7 +202,7 @@ center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/speer/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/beer/good, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer/good, reagents.maximum_volume) /obj/item/chems/drinks/cans/ale name = "\improper Magm-Ale" @@ -211,4 +211,4 @@ center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/ale/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/ale, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/ale, reagents.maximum_volume) diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index 34698bd2a87..fc4f92672c1 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -69,10 +69,10 @@ var/global/list/lunchables_drink_reagents_ = list( // This default list is a bit different, it contains items we don't want var/global/list/lunchables_ethanol_reagents_ = list( - /decl/material/liquid/ethanol/coffee, - /decl/material/liquid/ethanol/hooch, - /decl/material/liquid/ethanol/thirteenloko, - /decl/material/liquid/ethanol/pwine + /decl/material/liquid/alcohol/coffee, + /decl/material/liquid/alcohol/hooch, + /decl/material/liquid/alcohol/thirteenloko, + /decl/material/liquid/alcohol/pwine ) /proc/lunchables_lunches() @@ -97,7 +97,7 @@ var/global/list/lunchables_ethanol_reagents_ = list( /proc/lunchables_ethanol_reagents() if(!(lunchables_ethanol_reagents_[lunchables_ethanol_reagents_[1]])) - lunchables_ethanol_reagents_ = init_lunchable_reagent_list(lunchables_ethanol_reagents_, /decl/material/liquid/ethanol) + lunchables_ethanol_reagents_ = init_lunchable_reagent_list(lunchables_ethanol_reagents_, /decl/material/liquid/alcohol) return lunchables_ethanol_reagents_ /proc/init_lunchable_list(var/list/lunches) @@ -109,7 +109,7 @@ var/global/list/lunchables_ethanol_reagents_ = list( /proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_type) . = list() - for(var/reagent_subtype in decls_repository.get_decls_of_subtype(reagent_type)) + for(var/reagent_subtype in decls_repository.get_decls_of_type(reagent_type)) if(reagent_subtype in banned_reagents) continue var/decl/material/reagent = reagent_subtype diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 077d8abfa2e..235e6b2b658 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -314,7 +314,7 @@ matter = list(/decl/material/solid/metal/stainlesssteel = MATTER_AMOUNT_TRACE) /obj/structure/reagent_dispensers/beerkeg/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/structure/reagent_dispensers/acid name = "sulphuric acid dispenser" diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index fc8c21ab697..ca8806692a1 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -181,7 +181,7 @@ /decl/surgery_step/sterilize/Initialize() . = ..() - for(var/decl/material/liquid/ethanol/booze in decls_repository.get_decls_of_subtype_unassociated(/decl/material/liquid/ethanol)) + for(var/decl/material/liquid/alcohol/booze in decls_repository.get_decls_of_subtype_unassociated(/decl/material/liquid/alcohol)) if(booze.strength <= 40) sterilizing_reagents |= booze.type diff --git a/code/modules/vehicles/engine.dm b/code/modules/vehicles/engine.dm index e518456b058..b9dbc2f8f5a 100644 --- a/code/modules/vehicles/engine.dm +++ b/code/modules/vehicles/engine.dm @@ -110,8 +110,8 @@ for(var/rtype in temp_reagents_holder.reagents.reagent_volumes) var/new_multiplier = 1 var/decl/material/R = GET_DECL(rtype) - if(istype(R, /decl/material/liquid/ethanol)) - var/decl/material/liquid/ethanol/E = R + if(istype(R, /decl/material/liquid/alcohol)) + var/decl/material/liquid/alcohol/E = R new_multiplier = (10/E.strength) actually_flameable = 1 else if(istype(R,/decl/material/liquid/fuel/hydrazine)) diff --git a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm index 8bd35650d54..957c9204a4d 100644 --- a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm +++ b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm @@ -33,7 +33,7 @@ /decl/material/liquid/blood, /decl/material/liquid/lube, /decl/material/liquid/sedatives, - /decl/material/liquid/ethanol/spirits, + /decl/material/liquid/alcohol/ethanol, /decl/material/liquid/water, /decl/material/solid/ice, /decl/material/liquid/fuel, diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 1bb06b8926f..12f0c4fd9d1 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -277,15 +277,15 @@ "dried stomach waterskin" = /obj/item/chems/glass/waterskin, )) LAZYDISTINCTADD(.[/datum/gear_tweak/reagents], list( - "ale" = /decl/material/liquid/ethanol/ale, - "apple cider" = /decl/material/liquid/ethanol/cider_apple, - "beer" = /decl/material/liquid/ethanol/beer, - "kvass" = /decl/material/liquid/ethanol/kvass, - "pear cider" = /decl/material/liquid/ethanol/cider_pear, - "red wine" = /decl/material/liquid/ethanol/wine, - "sake" = /decl/material/liquid/ethanol/sake, + "ale" = /decl/material/liquid/alcohol/ale, + "apple cider" = /decl/material/liquid/alcohol/cider_apple, + "beer" = /decl/material/liquid/alcohol/beer, + "kvass" = /decl/material/liquid/alcohol/kvass, + "pear cider" = /decl/material/liquid/alcohol/cider_pear, + "red wine" = /decl/material/liquid/alcohol/wine, + "sake" = /decl/material/liquid/alcohol/sake, "water" = /decl/material/liquid/water, - "white wine" = /decl/material/liquid/ethanol/wine/premium, + "white wine" = /decl/material/liquid/alcohol/wine/premium, )) /decl/loadout_option/fantasy/eyes diff --git a/mods/content/fantasy/items/material_overrides.dm b/mods/content/fantasy/items/material_overrides.dm index 7b9b3a8b851..cd5699e37b4 100644 --- a/mods/content/fantasy/items/material_overrides.dm +++ b/mods/content/fantasy/items/material_overrides.dm @@ -10,7 +10,7 @@ /obj/item/chems/drinks/bottle/champagne name = "sparkling wine bottle" -/decl/material/liquid/ethanol/champagne +/decl/material/liquid/alcohol/champagne name = "sparkling wine" glass_name = "sparkling wine" glass_desc = "Sparkling white wine, a favourite at noble and merchant parties." diff --git a/nebula.dme b/nebula.dme index 25979899314..3547855884a 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3565,12 +3565,12 @@ #include "code\modules\reagents\reagent_container_edibility.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" +#include "code\modules\reagents\chems\chems_alcohol.dm" #include "code\modules\reagents\chems\chems_blood.dm" #include "code\modules\reagents\chems\chems_cleaner.dm" #include "code\modules\reagents\chems\chems_compounds.dm" #include "code\modules\reagents\chems\chems_drinks.dm" #include "code\modules\reagents\chems\chems_drugs.dm" -#include "code\modules\reagents\chems\chems_ethanol.dm" #include "code\modules\reagents\chems\chems_explosives.dm" #include "code\modules\reagents\chems\chems_fuel.dm" #include "code\modules\reagents\chems\chems_herbal.dm" From 11bd76fbcf21af2f79c2595d6d4d0bbe10038355 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 13:49:38 +1100 Subject: [PATCH 227/554] Various drake fixes. --- mods/species/drakes/drake_attacks.dm | 10 ++++++++-- mods/species/drakes/icons/damage.dmi | Bin 0 -> 14343 bytes mods/species/drakes/species_bodytypes.dm | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 mods/species/drakes/icons/damage.dmi diff --git a/mods/species/drakes/drake_attacks.dm b/mods/species/drakes/drake_attacks.dm index df214d9fc54..53d3fe7addc 100644 --- a/mods/species/drakes/drake_attacks.dm +++ b/mods/species/drakes/drake_attacks.dm @@ -16,25 +16,31 @@ wound.disinfected = FALSE // 50% damage bonus on prone, stunned or confused enemies. +/decl/natural_attack/bite/sharp/drake + damage = 12 // chomp + /decl/natural_attack/bite/sharp/drake/get_unarmed_damage(mob/living/user, mob/living/victim) . = ..() if(victim.current_posture?.prone || HAS_STATUS(victim, STAT_CONFUSE) || HAS_STATUS(victim, STAT_STUN)) . = max(1, round(. * 1.5)) +/decl/natural_attack/claws/strong/drake + damage = 8 // chonky for digging + /decl/natural_attack/claws/strong/drake/get_unarmed_damage(mob/living/user, mob/living/victim) . = ..() if(victim.current_posture?.prone || HAS_STATUS(victim, STAT_CONFUSE) || HAS_STATUS(victim, STAT_STUN)) . = max(1, round(. * 1.5)) // Raises germ level of wounds on attack. -/decl/natural_attack/bite/sharp/drake/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/bite/sharp/drake/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) . = ..() if(. && drake_spend_sap(user, 5)) var/obj/item/organ/external/bit = target.get_organ(zone) if(bit) drake_infect_wounds(bit) -/decl/natural_attack/claws/strong/drake/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/claws/strong/drake/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) . = ..() if(. && drake_spend_sap(user, 5)) var/obj/item/organ/external/bit = target.get_organ(zone) diff --git a/mods/species/drakes/icons/damage.dmi b/mods/species/drakes/icons/damage.dmi new file mode 100644 index 0000000000000000000000000000000000000000..189ce8a346cd48bd7abcd39cbd2e854f8197dcf9 GIT binary patch literal 14343 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 aIDSvCxFos|V*Y!Fr6{NNzFNlo+y4in4J-`+ literal 0 HcmV?d00001 diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index daec4b0ea06..0330ca9c456 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -28,6 +28,7 @@ eye_icon = 'mods/species/drakes/icons/eyes.dmi' icon_template = 'mods/species/drakes/icons/template.dmi' skeletal_icon = 'mods/species/drakes/icons/skeleton.dmi' + damage_overlays = 'mods/species/drakes/icons/damage.dmi' bodytype_category = BODYTYPE_GRAFADREKA eye_blend = ICON_MULTIPLY limb_blend = ICON_MULTIPLY From 5cb77d0a48b6e4bcdc9365bf1eb86329358952f9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 13:50:34 +1100 Subject: [PATCH 228/554] Adding cooldowns to unarmed attacks. --- .../mob/living/human/human_attackhand.dm | 5 ++++- .../mob/living/human/unarmed_attack.dm | 21 ++++++++++--------- code/modules/mob/living/living.dm | 4 ++-- code/modules/mob/living/living_attackhand.dm | 1 + .../modules/mob/living/silicon/robot/robot.dm | 1 + .../living/simple_animal/_simple_animal.dm | 1 + code/modules/species/species_attack.dm | 2 +- 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/code/modules/mob/living/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm index cc45f1c3fc3..3ad1462e59a 100644 --- a/code/modules/mob/living/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -230,9 +230,12 @@ rand_damage *= damage_multiplier real_damage = max(1, real_damage) // Apply additional unarmed effects. - attack.apply_effects(H, src, rand_damage, hit_zone) + attack.apply_attack_effects(H, src, rand_damage, hit_zone) // Finally, apply damage to target apply_damage(real_damage, attack.get_damage_type(), hit_zone, damage_flags=attack.damage_flags()) + if(attack.apply_cooldown) + H.setClickCooldown(attack.apply_cooldown) + if(istype(ai)) ai.retaliate(user) return TRUE diff --git a/code/modules/mob/living/human/unarmed_attack.dm b/code/modules/mob/living/human/unarmed_attack.dm index 39fc3fee25f..f1740242c4f 100644 --- a/code/modules/mob/living/human/unarmed_attack.dm +++ b/code/modules/mob/living/human/unarmed_attack.dm @@ -18,6 +18,7 @@ var/eye_attack_text_victim var/list/usable_with_limbs = list(BP_L_HAND, BP_R_HAND) var/is_starting_default = FALSE + var/apply_cooldown = DEFAULT_ATTACK_COOLDOWN /decl/natural_attack/proc/summarize() var/list/usable_limbs = list() @@ -74,7 +75,7 @@ return damage // Returns TRUE if further affects should be applied. -/decl/natural_attack/proc/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/proc/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) if(target.stat == DEAD) return FALSE @@ -161,16 +162,16 @@ return (src.sharp? DAM_SHARP : 0)|(src.edge? DAM_EDGE : 0) /decl/natural_attack/bite - name = "bite" + name = "bite" selector_icon_state = "attack_bite" - attack_verb = list("bit") - attack_noun = list("mouth") - attack_sound = 'sound/weapons/bite.ogg' - shredding = 0 - damage = 0 - sharp = 0 - edge = 0 - usable_with_limbs = list(BP_HEAD) + attack_verb = list("bit") + attack_noun = list("mouth") + attack_sound = 'sound/weapons/bite.ogg' + shredding = 0 + damage = 5 + sharp = 0 + edge = 0 + usable_with_limbs = list(BP_HEAD) /decl/natural_attack/bite/sharp attack_verb = list("bit", "chomped") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6889922700e..699518c3d30 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -406,7 +406,7 @@ default behaviour is: /mob/living/proc/update_damage_overlays(update_icons = TRUE) // first check whether something actually changed about damage appearance - var/damage_appearance = "" + var/damage_appearance = get_overlay_state_modifier() || "" for(var/obj/item/organ/external/O in get_external_organs()) damage_appearance += O.damage_state || "00" @@ -426,7 +426,7 @@ default behaviour is: continue var/icon/DI var/use_colour = (BP_IS_PROSTHETIC(O) ? SYNTH_BLOOD_COLOR : O.species.get_species_blood_color(src)) - var/cache_index = "[O.damage_state]/[O.bodytype.type]/[O.icon_state]/[use_colour]/[O.species.name]" + var/cache_index = "[O.damage_state]/[O.bodytype.uid]/[O.icon_state]/[use_colour]/[O.species.name]" if(!(cache_index in damage_icon_parts)) var/damage_overlay_icon = O.bodytype.get_damage_overlays(src) if(check_state_in_icon(O.damage_state, damage_overlay_icon)) diff --git a/code/modules/mob/living/living_attackhand.dm b/code/modules/mob/living/living_attackhand.dm index af16a0e793b..1e2840284c9 100644 --- a/code/modules/mob/living/living_attackhand.dm +++ b/code/modules/mob/living/living_attackhand.dm @@ -29,6 +29,7 @@ attackby(attacking_with, predator) else attack_animal(predator) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE return FALSE diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e588fc13400..3b206f6f5ec 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -653,6 +653,7 @@ var/decl/species/user_species = user.get_species() if(user_species?.can_shred(user)) attack_generic(user, rand(30,50), "slashed") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE . = ..() diff --git a/code/modules/mob/living/simple_animal/_simple_animal.dm b/code/modules/mob/living/simple_animal/_simple_animal.dm index 95b6c06bb8b..699bc575285 100644 --- a/code/modules/mob/living/simple_animal/_simple_animal.dm +++ b/code/modules/mob/living/simple_animal/_simple_animal.dm @@ -333,6 +333,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() take_damage(dealt_damage, damage_type, damage_flags = damage_flags, inflicter = user) user.visible_message(SPAN_DANGER("\The [user] [harm_verb] \the [src]!")) user.do_attack_animation(src) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE /mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user) diff --git a/code/modules/species/species_attack.dm b/code/modules/species/species_attack.dm index 0c1fe901f76..d2daf2daa06 100644 --- a/code/modules/species/species_attack.dm +++ b/code/modules/species/species_attack.dm @@ -90,7 +90,7 @@ damage = 2 usable_with_limbs = list(BP_CHEST, BP_GROIN) -/decl/natural_attack/slime_glomp/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/slime_glomp/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) . = ..() if(.) user.apply_stored_shock_to(target) From 3f657ed73c5b223fb565fe2fcf850f2cc99efa18 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 15:05:05 +1100 Subject: [PATCH 229/554] Drakes now have natural armor. --- code/modules/mob/living/human/human.dm | 3 --- code/modules/species/species.dm | 1 - code/modules/species/species_bodytype.dm | 16 +++++++++++----- mods/species/drakes/species_bodytypes.dm | 10 ++++++++++ mods/species/serpentid/datum/species.dm | 7 ------- .../species/serpentid/datum/species_bodytypes.dm | 8 ++++++++ 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 7902a3391e6..5f1ec5dc359 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -511,9 +511,6 @@ if(species.holder_type) holder_type = species.holder_type set_max_health(species.total_health, skip_health_update = TRUE) // Health update is handled later. - remove_extension(src, /datum/extension/armor) - if(species.natural_armour_values) - set_extension(src, /datum/extension/armor, species.natural_armour_values) apply_species_appearance() var/decl/pronouns/new_pronouns = get_pronouns_by_gender(get_gender()) diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 2318bf539af..85df8623e43 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -87,7 +87,6 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 /decl/natural_attack/bite ) - var/list/natural_armour_values // Armour values used if naked. var/brute_mod = 1 // Physical damage multiplier. var/burn_mod = 1 // Burn damage multiplier. var/toxins_mod = 1 // Toxloss modifier diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index 95394d64551..af7756ddebb 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -326,6 +326,8 @@ var/global/list/bodytypes_by_category = list() ) /// Set to FALSE if the mob will update prone icon based on state rather than transform. var/rotate_on_prone = TRUE + /// Armour values used if naked. + var/list/natural_armour_values /decl/bodytype/Initialize() . = ..() @@ -570,11 +572,15 @@ var/global/list/bodytypes_by_category = list() return 220 /decl/bodytype/proc/apply_bodytype_organ_modifications(obj/item/organ/org) - if(istype(org, /obj/item/organ/external)) - var/obj/item/organ/external/E = org - E.arterial_bleed_severity *= arterial_bleed_multiplier - if(islist(apply_encased)) - E.encased = apply_encased[E.organ_tag] + if(!istype(org, /obj/item/organ/external)) + return + var/obj/item/organ/external/limb = org + limb.arterial_bleed_severity *= arterial_bleed_multiplier + if(islist(apply_encased)) + limb.encased = apply_encased[limb.organ_tag] + if(LAZYLEN(natural_armour_values)) + remove_extension(limb, /datum/extension/armor) + set_extension(limb, /datum/extension/armor, natural_armour_values) //fully_replace: If true, all existing organs will be discarded. Useful when doing mob transformations, and not caring about the existing organs /decl/bodytype/proc/create_missing_organs(mob/living/human/H, fully_replace = FALSE) diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index 0330ca9c456..4d97ff61bb9 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -119,6 +119,16 @@ eye_low_light_vision_adjustment_speed = 0.3 eye_darksight_range = 7 + // Copied from riot armor, as drakes cannot wear equipment + // or hold shields. May need to be toned down at some point. + natural_armour_values = list( + ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, + ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, + ARMOR_LASER = ARMOR_LASER_SMALL, + ARMOR_ENERGY = ARMOR_ENERGY_MINOR, + ARMOR_BOMB = ARMOR_BOMB_PADDED + ) + var/list/sitting_equip_adjust var/list/lying_equip_adjust diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm index e58789252fc..aec8b4d0485 100644 --- a/mods/species/serpentid/datum/species.dm +++ b/mods/species/serpentid/datum/species.dm @@ -49,13 +49,6 @@ brute_mod = 0.9 burn_mod = 1.35 - natural_armour_values = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = 0.5*ARMOR_RAD_MINOR - ) gluttonous = GLUT_SMALLER strength = STR_HIGH breath_pressure = 25 diff --git a/mods/species/serpentid/datum/species_bodytypes.dm b/mods/species/serpentid/datum/species_bodytypes.dm index 8e9bd1be3b4..de0c77e659f 100644 --- a/mods/species/serpentid/datum/species_bodytypes.dm +++ b/mods/species/serpentid/datum/species_bodytypes.dm @@ -56,6 +56,14 @@ heat_level_2 = 440 //Default 400 heat_level_3 = 800 //Default 1000 + natural_armour_values = list( + ARMOR_MELEE = ARMOR_MELEE_KNIVES, + ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, + ARMOR_BOMB = ARMOR_BOMB_PADDED, + ARMOR_BIO = ARMOR_BIO_SHIELDED, + ARMOR_RAD = 0.5*ARMOR_RAD_MINOR + ) + /decl/bodytype/serpentid/Initialize() equip_adjust = list( BP_L_HAND_UPPER = list("[NORTH]" = list( 0, 8), "[EAST]" = list(0, 8), "[SOUTH]" = list(-0, 8), "[WEST]" = list( 0, 8)), From af964e47137865e9c62ae43bce45ce9233fcafae Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 22 Dec 2024 15:33:40 +1100 Subject: [PATCH 230/554] Automatic changelog generation for PR #4653 [ci skip] --- html/changelogs/AutoChangeLog-pr-4653.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4653.yml diff --git a/html/changelogs/AutoChangeLog-pr-4653.yml b/html/changelogs/AutoChangeLog-pr-4653.yml new file mode 100644 index 00000000000..2fd019eea5a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4653.yml @@ -0,0 +1,6 @@ +author: ophelia v0.8 +changes: + - {imageadd: added new dirt and mud tile sprites} + - {imageadd: 'added new wooden chest sprites, by Doe'} + - {tweak: mud and soil plots are now properly greyscaled to soil material color} +delete-after: true From e23cf8a6d0df84324c7561ced2e452207739b220 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 16:25:23 +1100 Subject: [PATCH 231/554] Drakes can dig. :D --- .../abilities/abilities_predator.dm | 16 +++++++- code/game/turfs/turf.dm | 5 ++- code/modules/mob/mob.dm | 8 ++++ mods/species/drakes/drake_abilities.dm | 4 +- mods/species/drakes/species_bodytypes.dm | 39 ++++++++++++++++++- 5 files changed, 67 insertions(+), 5 deletions(-) diff --git a/code/datums/extensions/abilities/abilities_predator.dm b/code/datums/extensions/abilities/abilities_predator.dm index c6cfa9542c6..739909b81c2 100644 --- a/code/datums/extensions/abilities/abilities_predator.dm +++ b/code/datums/extensions/abilities/abilities_predator.dm @@ -5,12 +5,26 @@ return istype(user) && !user.incapacitated() && isatom(target) && target.Adjacent(user) /datum/ability_handler/predator/do_melee_invocation(mob/user, atom/target) - // Nibbles + + // Nibbles! if(user.a_intent == I_HURT) if(isliving(target)) return handle_dismemberment(user, target) if(istype(target, /obj/item/organ)) return handle_organ_destruction(user, target) + + // Digging! + var/static/list/diggable_types = list( + /turf/floor, + /turf/wall, + /obj/structure/pit, + /obj/machinery/portable_atmospherics/hydroponics/soil + ) + if(is_type_in_list(target, diggable_types)) + var/obj/item/organ/external/paw = user.get_usable_hand_slot_organ() + if(paw) + return target.attackby(paw, user) + return FALSE /datum/ability_handler/predator/proc/handle_organ_destruction(mob/user, obj/item/organ/chewtoy) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a25d818697f..aaae07cfb0c 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -805,7 +805,7 @@ . = ..() LAZYADD(., /decl/interaction_handler/show_turf_contents) if(user) - var/obj/item/held = user.get_active_held_item() + var/obj/item/held = user.get_active_held_item() || user.get_usable_hand_slot_organ() if(istype(held)) if(IS_SHOVEL(held)) if(can_dig_pit(held.material?.hardness)) @@ -835,6 +835,7 @@ name = "Dig Trench" /decl/interaction_handler/dig/trench/invoked(atom/target, mob/user, obj/item/prop) + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. var/turf/T = get_turf(target) if(IS_SHOVEL(prop)) if(T.can_dig_trench(prop?.material?.hardness)) @@ -848,6 +849,7 @@ name = "Dig Pit" /decl/interaction_handler/dig/pit/invoked(atom/target, mob/user, obj/item/prop) + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. var/turf/T = get_turf(target) if(T.can_dig_pit(prop?.material?.hardness)) T.try_dig_pit(user, prop) @@ -856,6 +858,7 @@ name = "Dig Farm Plot" /decl/interaction_handler/dig/farm/invoked(atom/target, mob/user, obj/item/prop) + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. var/turf/T = get_turf(target) if(T.can_dig_farm(prop?.material?.hardness)) T.try_dig_farm(user, prop) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7554d0e91f5..0a301a3ea54 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1398,3 +1398,11 @@ /mob/proc/can_twohand_item(obj/item/item) return FALSE + +/// THIS DOES NOT RELATE TO HELD ITEM SLOTS. It is very specifically a functional BP_L_HAND or BP_R_HAND organ, not necessarily a gripper. +/mob/proc/get_usable_hand_slot_organ() + var/obj/item/organ/external/paw = GET_EXTERNAL_ORGAN(src, BP_L_HAND) + if(!istype(paw) && !paw.is_usable()) + paw = GET_EXTERNAL_ORGAN(src, BP_R_HAND) + if(istype(paw) && paw.is_usable()) + return paw diff --git a/mods/species/drakes/drake_abilities.dm b/mods/species/drakes/drake_abilities.dm index dcd67a13ef7..4ba5da0ccae 100644 --- a/mods/species/drakes/drake_abilities.dm +++ b/mods/species/drakes/drake_abilities.dm @@ -24,8 +24,8 @@ return TRUE /datum/ability_handler/predator/grafadreka/do_melee_invocation(mob/user, atom/target) - if(user.a_intent == I_HURT) - return ..() // Handled by predator ability handler. + if((. = ..())) + return // Healing if(user.a_intent == I_HELP && isliving(target)) return handle_wound_cleaning(user, target) diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index daec4b0ea06..b2c021f950e 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -33,7 +33,11 @@ limb_blend = ICON_MULTIPLY appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR mob_size = MOB_SIZE_LARGE - override_limb_types = list(BP_TAIL = /obj/item/organ/external/tail/grafadreka) + override_limb_types = list( + BP_TAIL = /obj/item/organ/external/tail/grafadreka, + BP_L_HAND = /obj/item/organ/external/hand/quadruped/grafadreka, + BP_R_HAND = /obj/item/organ/external/hand/right/quadruped/grafadreka + ) base_color = "#608894" base_eye_color = COLOR_SILVER pixel_offset_x = -16 @@ -274,3 +278,36 @@ /obj/item/organ/external/tail/grafadreka/hatchling tail_icon = 'mods/species/drakes/icons/hatchling_body.dmi' + +// Technically means that severed drake paws can be used as shovels, but whatever. +/obj/item/organ/external/hand/quadruped/grafadreka + _base_attack_force = 8 + needs_attack_dexterity = DEXTERITY_NONE + +/obj/item/organ/external/hand/quadruped/grafadreka/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) + . = ..() + item_flags |= ITEM_FLAG_NO_BLUDGEON + set_extension(src, /datum/extension/tool, list( + TOOL_SHOVEL = TOOL_QUALITY_GOOD, + TOOL_HOE = TOOL_QUALITY_GOOD + )) + +/obj/item/organ/external/hand/quadruped/grafadreka/set_bodytype(decl/bodytype/new_bodytype, override_material, apply_to_internal_organs) + override_material = /decl/material/solid/organic/bone + . = ..() + +/obj/item/organ/external/hand/right/quadruped/grafadreka + _base_attack_force = 8 + needs_attack_dexterity = DEXTERITY_NONE + +/obj/item/organ/external/hand/right/quadruped/grafadreka/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) + . = ..() + item_flags |= ITEM_FLAG_NO_BLUDGEON + set_extension(src, /datum/extension/tool, list( + TOOL_SHOVEL = TOOL_QUALITY_GOOD, + TOOL_HOE = TOOL_QUALITY_GOOD + )) + +/obj/item/organ/external/hand/right/quadruped/grafadreka/set_bodytype(decl/bodytype/new_bodytype, override_material, apply_to_internal_organs) + override_material = /decl/material/solid/organic/bone + . = ..() From e52ea37843817936063812bfa7298754a50fa459 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 17:28:31 +1100 Subject: [PATCH 232/554] Adjusting how fire sources work with atoms. --- .../objects/effects/decals/Cleanable/misc.dm | 157 +++++++++--------- code/game/objects/effects/decals/cleanable.dm | 6 + code/game/objects/items/saddle.dm | 2 +- code/game/objects/structures/fires.dm | 1 - code/modules/materials/_materials.dm | 4 +- .../solids/materials_solid_organic.dm | 1 + code/modules/mob/living/living_defense.dm | 6 +- code/modules/organs/external/_external.dm | 5 +- 8 files changed, 94 insertions(+), 88 deletions(-) diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 4abf329fd59..2a22a171886 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -1,19 +1,20 @@ /obj/effect/decal/cleanable/generic - name = "clutter" - desc = "Someone should clean that up." - gender = PLURAL - icon = 'icons/obj/objects.dmi' - icon_state = "shards" - sweepable = TRUE + name = "clutter" + desc = "Someone should clean that up." + gender = PLURAL + icon = 'icons/obj/objects.dmi' + icon_state = "shards" + sweepable = TRUE /obj/effect/decal/cleanable/ash - name = "ashes" - desc = "Ashes to ashes, dust to dust, and into space." - gender = PLURAL - icon = 'icons/obj/objects.dmi' - icon_state = "ash" - weather_sensitive = FALSE - sweepable = TRUE + name = "ashes" + desc = "Ashes to ashes, dust to dust, and into space." + gender = PLURAL + icon = 'icons/obj/objects.dmi' + icon_state = "ash" + weather_sensitive = FALSE + sweepable = TRUE + burnable = FALSE /obj/effect/decal/cleanable/ash/attackby(obj/item/I, mob/user) if(ATOM_IS_OPEN_CONTAINER(I)) @@ -36,50 +37,50 @@ return TRUE /obj/effect/decal/cleanable/flour - name = "flour" - desc = "It's still good. Four second rule!" - gender = PLURAL - icon = 'icons/effects/effects.dmi' - icon_state = "flour" - persistent = TRUE - sweepable = TRUE + name = "flour" + desc = "It's still good. Four second rule!" + gender = PLURAL + icon = 'icons/effects/effects.dmi' + icon_state = "flour" + persistent = TRUE + sweepable = TRUE /obj/effect/decal/cleanable/cobweb - name = "cobweb" - desc = "Somebody should remove that." - layer = ABOVE_HUMAN_LAYER - icon = 'icons/effects/effects.dmi' - icon_state = "cobweb1" - weather_sensitive = FALSE - sweepable = TRUE + name = "cobweb" + desc = "Somebody should remove that." + layer = ABOVE_HUMAN_LAYER + icon = 'icons/effects/effects.dmi' + icon_state = "cobweb1" + weather_sensitive = FALSE + sweepable = TRUE /obj/effect/decal/cleanable/molten_item - name = "gooey grey mass" - desc = "It looks like a melted... something." - icon = 'icons/effects/molten_item.dmi' - icon_state = "molten" - persistent = TRUE - generic_filth = TRUE - weather_sensitive = FALSE + name = "gooey grey mass" + desc = "It looks like a melted... something." + icon = 'icons/effects/molten_item.dmi' + icon_state = "molten" + persistent = TRUE + generic_filth = TRUE + weather_sensitive = FALSE /obj/effect/decal/cleanable/cobweb2 - name = "cobweb" - desc = "Somebody should remove that." - layer = ABOVE_HUMAN_LAYER - icon = 'icons/effects/effects.dmi' - icon_state = "cobweb2" - weather_sensitive = FALSE - sweepable = TRUE + name = "cobweb" + desc = "Somebody should remove that." + layer = ABOVE_HUMAN_LAYER + icon = 'icons/effects/effects.dmi' + icon_state = "cobweb2" + weather_sensitive = FALSE + sweepable = TRUE //Vomit (sorry) /obj/effect/decal/cleanable/vomit - name = "vomit" - desc = "Gosh, how unpleasant." - gender = PLURAL - icon = 'icons/effects/vomit.dmi' - icon_state = "vomit_1" - persistent = TRUE - generic_filth = TRUE + name = "vomit" + desc = "Gosh, how unpleasant." + gender = PLURAL + icon = 'icons/effects/vomit.dmi' + icon_state = "vomit_1" + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/vomit/Initialize(ml, _age) random_icon_states = icon_states(icon) @@ -94,46 +95,46 @@ color = reagents.get_color() /obj/effect/decal/cleanable/tomato_smudge - name = "tomato smudge" - desc = "It's red." - icon = 'icons/effects/tomatodecal.dmi' - icon_state = "tomato_floor1" + name = "tomato smudge" + desc = "It's red." + icon = 'icons/effects/tomatodecal.dmi' + icon_state = "tomato_floor1" random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") - persistent = TRUE - generic_filth = TRUE + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/egg_smudge - name = "smashed egg" - desc = "Seems like this one won't hatch." - icon = 'icons/effects/tomatodecal.dmi' - icon_state = "smashed_egg1" + name = "smashed egg" + desc = "Seems like this one won't hatch." + icon = 'icons/effects/tomatodecal.dmi' + icon_state = "smashed_egg1" random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") - persistent = TRUE - generic_filth = TRUE + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/pie_smudge //honk - name = "smashed pie" - desc = "It's pie cream from a cream pie." - icon = 'icons/effects/tomatodecal.dmi' - icon_state = "smashed_pie" + name = "smashed pie" + desc = "It's pie cream from a cream pie." + icon = 'icons/effects/tomatodecal.dmi' + icon_state = "smashed_pie" random_icon_states = list("smashed_pie") - persistent = TRUE - generic_filth = TRUE + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/fruit_smudge - name = "smudge" - desc = "Some kind of fruit smear." - icon = 'icons/effects/blood.dmi' - icon_state = "mfloor1" + name = "smudge" + desc = "Some kind of fruit smear." + icon = 'icons/effects/blood.dmi' + icon_state = "mfloor1" random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") - persistent = TRUE - generic_filth = TRUE + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/champagne - name = "champagne" - desc = "Someone got a bit too excited." - gender = PLURAL - icon = 'icons/effects/effects.dmi' - icon_state = "fchampagne1" - color = COLOR_BRASS + name = "champagne" + desc = "Someone got a bit too excited." + gender = PLURAL + icon = 'icons/effects/effects.dmi' + icon_state = "fchampagne1" + color = COLOR_BRASS random_icon_states = list("fchampagne1", "fchampagne2", "fchampagne3", "fchampagne4") diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 6c7d9ec89e0..66319d3ee89 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -3,6 +3,7 @@ anchored = TRUE abstract_type = /obj/effect/decal/cleanable + var/burnable = TRUE var/sweepable = FALSE var/weather_sensitive = TRUE var/persistent = FALSE @@ -46,6 +47,11 @@ SSpersistence.forget_value(src, /decl/persistence_handler/filth) . = ..() +/obj/effect/decal/cleanable/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + . = ..() + if(burnable && !QDELETED(src)) + qdel(src) + /obj/effect/decal/cleanable/process_weather(obj/abstract/weather_system/weather, decl/state/weather/weather_state) if(!weather_sensitive) return PROCESS_KILL diff --git a/code/game/objects/items/saddle.dm b/code/game/objects/items/saddle.dm index cf7d51f0a3c..2fb35ce01a4 100644 --- a/code/game/objects/items/saddle.dm +++ b/code/game/objects/items/saddle.dm @@ -9,7 +9,7 @@ material_alteration = MAT_FLAG_ALTERATION_ALL /obj/item/saddle/mob_can_equip(mob/user, slot, disable_warning, force, ignore_equipped) - if(!istype(user, /mob/living/simple_animal/passive/horse)) + if(!istype(user) || !istype(user.get_bodytype(), /decl/bodytype/quadruped)) return FALSE return ..() diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index 428c0b8bf9e..f035bdf9be0 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -441,7 +441,6 @@ removed.add_thermal_energy(heat_transfer) environment.merge(removed) - queue_icon_update() /obj/structure/fire_source/proc/has_fuel() diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 01aa188e0cc..c32e48cd381 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -439,7 +439,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) else if(isnull(temperature_damage_threshold)) var/new_temperature_damage_threshold = max(melting_point, boiling_point, heating_point) // Don't let the threshold be lower than the ignition point. - if(!isnull(new_temperature_damage_threshold) && (isnull(ignition_point) || (new_temperature_damage_threshold > ignition_point))) + if(isnull(new_temperature_damage_threshold) && !isnull(ignition_point)) + temperature_damage_threshold = ignition_point + else if(isnull(ignition_point) || (new_temperature_damage_threshold > ignition_point)) temperature_damage_threshold = new_temperature_damage_threshold if(!shard_icon) diff --git a/code/modules/materials/definitions/solids/materials_solid_organic.dm b/code/modules/materials/definitions/solids/materials_solid_organic.dm index b410f85be58..26d720a8814 100644 --- a/code/modules/materials/definitions/solids/materials_solid_organic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_organic.dm @@ -3,6 +3,7 @@ ignition_point = T0C+500 // Based on loose ignition temperature of plastic accelerant_value = 0.1 burn_product = /decl/material/gas/carbon_monoxide + boiling_point = null melting_point = null compost_value = 1 diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 97fe9281e2c..d162c1c0543 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -330,13 +330,13 @@ fire_stacks = max(0, fire_stacks - 0.2) //I guess the fire runs out of fuel eventually - var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(G.get_by_flag(XGM_GAS_OXIDIZER) < 1) + var/datum/gas_mixture/G = loc?.return_air() // Check if we're standing in an oxygenless environment + if(G?.get_by_flag(XGM_GAS_OXIDIZER) < 1) ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire return TRUE var/turf/location = get_turf(src) - location.hotspot_expose(fire_burn_temperature(), 50, 1) + location?.hotspot_expose(fire_burn_temperature(), 50, 1) var/burn_temperature = fire_burn_temperature() var/thermal_protection = get_heat_protection(burn_temperature) diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 57bf6892044..4518ef32887 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -1588,14 +1588,11 @@ Note that amputating the affected organ does in fact remove the infection from t butchery_decl.place_products(owner, butchery_decl.bone_material, 1, butchery_decl.bone_type) return ..() -// This likely seems excessive, but refer to organ explosion_act() to see how it should be handled before reaching this point. /obj/item/organ/external/physically_destroyed(skip_qdel) if(!owner) return ..() if(limb_flags & ORGAN_FLAG_CAN_AMPUTATE) - dismember(FALSE, DISMEMBER_METHOD_BLUNT) - else - owner.gib() + dismember(FALSE, DISMEMBER_METHOD_BLUNT) // This will also destroy the mob if it removes the last non-core limb. /obj/item/organ/external/is_vital_to_owner() if(isnull(vital_to_owner)) From 96c6cb7a9a403290e75e26120634099fa654f05e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 18:46:09 +1100 Subject: [PATCH 233/554] Allowed prone or clientless mobs to be pushed into fires. --- code/game/objects/structures/fires.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index f035bdf9be0..d214c690a43 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -494,7 +494,7 @@ . = ..() if(. && lit && ismob(mover)) var/mob/M = mover - if(!MOVING_QUICKLY(M)) + if(M.client && !M.current_posture?.prone && !MOVING_QUICKLY(M)) to_chat(M, SPAN_WARNING("You refrain from stepping into \the [src].")) return FALSE return ..() From 5c96abc8bfa38fc541dd301e0efba23bad8feb74 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 19:12:51 +1100 Subject: [PATCH 234/554] Fixes some grass issues. --- code/game/turfs/flooring/flooring_grass.dm | 5 +++-- code/modules/crafting/stack_recipes/_recipe.dm | 3 ++- code/modules/crafting/stack_recipes/recipes_grass.dm | 7 ++++--- code/modules/crafting/stack_recipes/recipes_soft.dm | 6 +++++- code/modules/materials/material_stack_misc.dm | 4 ++++ 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/code/game/turfs/flooring/flooring_grass.dm b/code/game/turfs/flooring/flooring_grass.dm index 802c509f573..4ed237772fe 100644 --- a/code/game/turfs/flooring/flooring_grass.dm +++ b/code/game/turfs/flooring/flooring_grass.dm @@ -34,9 +34,10 @@ . = ..() || "mask_grass" /decl/flooring/grass/wild/handle_item_interaction(turf/floor/floor, mob/user, obj/item/item) - if(IS_KNIFE(item) && harvestable) + var/decl/material/floor_material = floor.get_material() + if(IS_KNIFE(item) && harvestable && istype(floor_material) && floor_material.dug_drop_type) if(item.do_tool_interaction(TOOL_KNIFE, user, floor, 3 SECONDS, start_message = "harvesting", success_message = "harvesting") && !QDELETED(floor) && floor.get_topmost_flooring() == src) - new /obj/item/stack/material/bundle/grass(floor, rand(2,5)) + new floor_material.dug_drop_type(floor, rand(2,5)) floor.set_flooring(/decl/flooring/grass) return TRUE return ..() diff --git a/code/modules/crafting/stack_recipes/_recipe.dm b/code/modules/crafting/stack_recipes/_recipe.dm index a73dbc0298f..a5a28c6e6a5 100644 --- a/code/modules/crafting/stack_recipes/_recipe.dm +++ b/code/modules/crafting/stack_recipes/_recipe.dm @@ -61,7 +61,8 @@ /obj/item/stack/material/ore, /obj/item/stack/material/log, /obj/item/stack/material/lump, - /obj/item/stack/material/slab + /obj/item/stack/material/slab, + /obj/item/stack/material/bundle ) /// If set, will group recipes under a stack recipe list. var/category diff --git a/code/modules/crafting/stack_recipes/recipes_grass.dm b/code/modules/crafting/stack_recipes/recipes_grass.dm index d6f262e90bc..a2a88b86d5c 100644 --- a/code/modules/crafting/stack_recipes/recipes_grass.dm +++ b/code/modules/crafting/stack_recipes/recipes_grass.dm @@ -1,7 +1,8 @@ /decl/stack_recipe/woven - abstract_type = /decl/stack_recipe/woven - craft_stack_types = /obj/item/stack/material/bundle - category = "woven items" + abstract_type = /decl/stack_recipe/woven + craft_stack_types = /obj/item/stack/material/bundle + category = "woven items" + forbidden_craft_stack_types = null /decl/stack_recipe/woven/can_be_made_from(stack_type, tool_type, decl/material/mat, decl/material/reinf_mat) if((istype(mat) ? mat.type : mat) == /decl/material/solid/organic/plantmatter/grass) diff --git a/code/modules/crafting/stack_recipes/recipes_soft.dm b/code/modules/crafting/stack_recipes/recipes_soft.dm index 00a0e650a45..9672f23017e 100644 --- a/code/modules/crafting/stack_recipes/recipes_soft.dm +++ b/code/modules/crafting/stack_recipes/recipes_soft.dm @@ -2,7 +2,11 @@ time = 1 SECOND abstract_type = /decl/stack_recipe/soft craft_stack_types = null - forbidden_craft_stack_types = null + forbidden_craft_stack_types = list( + /obj/item/stack/material/bundle, + /obj/item/stack/material/thread, + /obj/item/stack/material/bolt + ) required_min_hardness = 0 required_max_hardness = MAT_VALUE_SOFT crafting_extra_cost_factor = 1 // No wastage for just resculpting materials. diff --git a/code/modules/materials/material_stack_misc.dm b/code/modules/materials/material_stack_misc.dm index cf8ddd36474..9ed1861aab8 100644 --- a/code/modules/materials/material_stack_misc.dm +++ b/code/modules/materials/material_stack_misc.dm @@ -147,9 +147,13 @@ /obj/item/stack/material/bundle/grass material = /decl/material/solid/organic/plantmatter/grass + drying_wetness = 50 + dried_type = /obj/item/stack/material/bundle/grass/dry /obj/item/stack/material/bundle/grass/dry material = /decl/material/solid/organic/plantmatter/grass/dry + drying_wetness = null + dried_type = null /obj/item/stack/material/strut name = "struts" From dba692cd3ddabb0ed0a82b3f90d7540ac62c7226 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 19:59:07 +1100 Subject: [PATCH 235/554] Sit and Rest verb only prompts when appropriate. --- code/modules/mob/living/living.dm | 13 +++++++++++-- code/modules/mob/living/silicon/ai/ai.dm | 2 +- code/modules/mob/living/silicon/pai/pai.dm | 2 +- .../mob/living/simple_animal/friendly/possum.dm | 2 +- mods/species/drakes/species.dm | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 699518c3d30..11dbe82ed4a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -639,9 +639,9 @@ default behaviour is: /mob/living/verb/rest_verb() set name = "Rest" set category = "IC" - lay_down() + lay_down(block_posture = /decl/posture/sitting) -/mob/living/verb/lay_down() +/mob/living/verb/lay_down(block_posture as null) set name = "Change Posture" set category = "IC" @@ -650,6 +650,15 @@ default behaviour is: return var/list/selectable_postures = get_selectable_postures() + + if(block_posture) + for(var/decl/posture/selectable_posture in selectable_postures) + if(islist(block_posture)) + if(is_type_in_list(selectable_posture, block_posture)) + selectable_postures -= selectable_posture + else if(istype(selectable_posture, block_posture)) + selectable_postures -= selectable_posture + if(!length(selectable_postures)) return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index feec39924e9..e9920873353 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -659,7 +659,7 @@ var/global/list/custom_ai_icons_by_ckey_and_name = list() set_light(1, 1, selected_sprite.alive_light) // Pass lying down or getting up to our pet human, if we're in a rig. -/mob/living/silicon/ai/lay_down() +/mob/living/silicon/ai/lay_down(block_posture as null) var/obj/item/rig/rig = src.get_rig() if(rig) rig.force_rest(src) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 742c03a9c49..e1ec033940b 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -251,7 +251,7 @@ var/global/list/possible_say_verbs = list( if(istype(T)) T.visible_message("[src] neatly folds inwards, compacting down to a rectangular card.") -/mob/living/silicon/pai/lay_down() +/mob/living/silicon/pai/lay_down(block_posture as null) // Pass lying down or getting up to our pet human, if we're in a rig. if(istype(loc, /obj/item/paicard)) set_posture(/decl/posture/standing) diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 1aefcb1e0fd..69f4f997321 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -72,7 +72,7 @@ if(damage >= 3) respond_to_damage() -/mob/living/simple_animal/opossum/lay_down() +/mob/living/simple_animal/opossum/lay_down(block_posture as null) . = ..() update_icon() diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index 12b6b2109d0..a1a0c4bf6c7 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -77,7 +77,7 @@ set name = "Sit" set category = "IC" set src = usr - lay_down() + lay_down(block_posture = /decl/posture/lying) /datum/hud_data/grafadreka inventory_slots = list( From 35ea53ac0dfaa249515f71aab2e73b0d6ad99ca6 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 20:52:48 +1100 Subject: [PATCH 236/554] Ginseng will now restore blood. --- code/modules/reagents/chems/chems_herbal.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/chems/chems_herbal.dm b/code/modules/reagents/chems/chems_herbal.dm index f9f7d7bb480..676142113fb 100644 --- a/code/modules/reagents/chems/chems_herbal.dm +++ b/code/modules/reagents/chems/chems_herbal.dm @@ -15,10 +15,16 @@ /decl/material/liquid/antitoxins/ginseng name = "powdered ginseng" uid = "chem_antitoxins_herbal" - lore_text = "Ginseng root has curative properties and encourages organ recovery after poisoning." + lore_text = "Ginseng root has curative properties and encourages organ recovery and restoration of blood volume after poisoning or blood loss." taste_description = "bitter herbs" antitoxin_strength = 0.35 +/decl/material/liquid/antitoxins/ginseng/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) + . = ..() + if(M.has_trait(/decl/trait/metabolically_inert)) + return + M.add_chemical_effect(CE_BLOODRESTORE, 8 * removed) + /decl/material/liquid/sedatives/valerian name = "powdered valerian flower" uid = "chem_sedatives_herbal" From 2c4a22e592d30e07508673a4a351fd1568378551 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 23 Dec 2024 00:51:49 +0000 Subject: [PATCH 237/554] Automatic changelog generation [ci skip] --- html/changelog.html | 8 ++++++++ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-4653.yml | 6 ------ 3 files changed, 13 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4653.yml diff --git a/html/changelog.html b/html/changelog.html index d152fc17840..7ec0db885cb 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,14 @@ -->
    +

    23 December 2024

    +

    ophelia v0.8 updated:

    +
      +
    • added new dirt and mud tile sprites
    • +
    • added new wooden chest sprites, by Doe
    • +
    • mud and soil plots are now properly greyscaled to soil material color
    • +
    +

    21 December 2024

    Penelope Haze updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 09a36ad2264..9e2102536fb 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14936,3 +14936,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2024-12-21: Penelope Haze: - tweak: Makes weather effects slightly more transparent. +2024-12-23: + ophelia v0.8: + - imageadd: added new dirt and mud tile sprites + - imageadd: added new wooden chest sprites, by Doe + - tweak: mud and soil plots are now properly greyscaled to soil material color diff --git a/html/changelogs/AutoChangeLog-pr-4653.yml b/html/changelogs/AutoChangeLog-pr-4653.yml deleted file mode 100644 index 2fd019eea5a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4653.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: ophelia v0.8 -changes: - - {imageadd: added new dirt and mud tile sprites} - - {imageadd: 'added new wooden chest sprites, by Doe'} - - {tweak: mud and soil plots are now properly greyscaled to soil material color} -delete-after: true From 591ffc760fd1449f1ee25c01d92994456f8b05d4 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 24 Dec 2024 09:42:48 +1100 Subject: [PATCH 238/554] Tweaks to burning PR. --- code/modules/materials/_material_stack.dm | 5 +++++ code/modules/organs/external/_external.dm | 2 ++ 2 files changed, 7 insertions(+) diff --git a/code/modules/materials/_material_stack.dm b/code/modules/materials/_material_stack.dm index 0d6f7161dea..05b8d2392d9 100644 --- a/code/modules/materials/_material_stack.dm +++ b/code/modules/materials/_material_stack.dm @@ -219,3 +219,8 @@ . += " [singular_name]" return indefinite_article ? "[indefinite_article] [.]" : ADD_ARTICLE(.) return "[amount] [.] [plural_name]" + +// Horrible solution to heat damage for atoms causing logs and +// fuel to vanish. Replace this when the atom fire system exists. +/obj/item/stack/material/should_take_heat_damage(datum/gas_mixture/air, exposed_temperature) + return istype(loc, /obj/structure/fire_source) ? FALSE : ..() diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 4518ef32887..1c6f8997cc3 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -1593,6 +1593,8 @@ Note that amputating the affected organ does in fact remove the infection from t return ..() if(limb_flags & ORGAN_FLAG_CAN_AMPUTATE) dismember(FALSE, DISMEMBER_METHOD_BLUNT) // This will also destroy the mob if it removes the last non-core limb. + else + owner.physically_destroyed() // Previously gib(), but that caused blood and guts to fly everywhere. /obj/item/organ/external/is_vital_to_owner() if(isnull(vital_to_owner)) From 4c1de0d3e19ec8cf8a3b42dc05970b13778b87c0 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 25 Dec 2024 00:49:05 +0000 Subject: [PATCH 239/554] Automatic changelog generation [ci skip] --- html/changelog.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 7ec0db885cb..b64a9c790da 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -106,13 +106,6 @@

      MistakeNot4892 updated:

      • Curries, soups and stews have been rewritten, please refer to the codex for recipes.
      - -

      23 October 2024

      -

      MistakeNot4892 updated:

      -
        -
      • Dough now requires a 60C temperature and does not use egg.
      • -
      • Flatbread now uses unleavened dough, made without yeast, while pies use pie crust. Check the codex for updated recipes.
      • -
    From 85b234d9517377e45c7edf2bcbfa89254907538d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 26 Dec 2024 18:23:56 +1100 Subject: [PATCH 240/554] Milking cows/goats will also give cream, which can be skimmed off the top of the milk with an empty container. --- code/datums/extensions/milkable/milkable.dm | 19 +++++++++++--- .../crafting/metalwork/metalwork_items.dm | 26 +++++++++---------- code/modules/materials/_materials.dm | 2 ++ code/modules/reagents/Chemistry-Holder.dm | 8 +++++- code/modules/reagents/chems/chems_drinks.dm | 1 + code/modules/reagents/reagent_containers.dm | 15 +++++++++++ 6 files changed, 53 insertions(+), 18 deletions(-) diff --git a/code/datums/extensions/milkable/milkable.dm b/code/datums/extensions/milkable/milkable.dm index debc42f4853..523a37e3e53 100644 --- a/code/datums/extensions/milkable/milkable.dm +++ b/code/datums/extensions/milkable/milkable.dm @@ -8,6 +8,10 @@ var/milk_min = 5 var/milk_max = 10 + var/cream_type = /decl/material/liquid/drink/milk/cream + var/cream_min = 2 + var/cream_max = 5 + var/impatience = 0 var/decl/skill/milking_skill = SKILL_BOTANY var/milking_skill_req = SKILL_BASIC @@ -42,9 +46,16 @@ create_milk() /datum/extension/milkable/proc/create_milk() - var/create_milk = min(rand(milk_min, milk_max), REAGENTS_FREE_SPACE(udder)) - if(create_milk > 0) - udder.add_reagent(milk_type, create_milk, get_milk_data()) + + var/create_milk = min(rand(milk_min, milk_max), REAGENTS_FREE_SPACE(udder)) + var/create_cream = min(rand(cream_min, cream_max), REAGENTS_FREE_SPACE(udder) - create_milk) + + if(create_milk <= 0 && create_cream <= 0) + return + + var/list/milk_data = get_milk_data() + udder.add_reagent(milk_type, create_milk, milk_data) + udder.add_reagent(cream_type, create_cream, milk_data) /datum/extension/milkable/proc/get_milk_data() var/static/list/milk_data = list( @@ -113,7 +124,7 @@ SPAN_NOTICE("\The [user] milks \the [critter] into \the [container]."), SPAN_NOTICE("You milk \the [critter] into \the [container].") ) - udder.trans_type_to(container, milk_type, min(REAGENTS_FREE_SPACE(container.reagents), rand(15, 20))) + udder.trans_to(container, min(REAGENTS_FREE_SPACE(container.reagents), rand(15, 20))) return TRUE /datum/extension/milkable/proc/handle_milking_failure(mob/user, mob/living/critter) diff --git a/code/modules/crafting/metalwork/metalwork_items.dm b/code/modules/crafting/metalwork/metalwork_items.dm index 5815340c135..5278aaf343e 100644 --- a/code/modules/crafting/metalwork/metalwork_items.dm +++ b/code/modules/crafting/metalwork/metalwork_items.dm @@ -19,37 +19,37 @@ obj_flags = OBJ_FLAG_NO_STORAGE var/max_held = 10 -/obj/item/chems/crucible/attackby(obj/item/W, mob/user) +/obj/item/chems/crucible/attackby(obj/item/used_item, mob/user) // Fill a mould. - if(istype(W, /obj/item/chems/mould)) - if(W.material?.hardness <= MAT_VALUE_MALLEABLE) - to_chat(user, SPAN_WARNING("\The [W] is currently too soft to be used as a mould.")) + if(istype(used_item, /obj/item/chems/mould)) + if(used_item.material?.hardness <= MAT_VALUE_MALLEABLE) + to_chat(user, SPAN_WARNING("\The [used_item] is currently too soft to be used as a mould.")) return TRUE - if(standard_pour_into(user, W)) + if(standard_pour_into(user, used_item)) return TRUE // Skim off any slag. - if(istype(W, /obj/item/chems) && ATOM_IS_OPEN_CONTAINER(W) && W.reagents) + if(istype(used_item, /obj/item/chems) && ATOM_IS_OPEN_CONTAINER(used_item) && used_item.reagents) // Pour contents into the crucible. - if(W.reagents.total_volume) - var/obj/item/chems/pouring = W + if(used_item.reagents.total_volume) + var/obj/item/chems/pouring = used_item if(pouring.standard_pour_into(user, src)) return TRUE // Attempting to skim off slag. // TODO: check for appropriate vessel material? Check melting point against temperature of crucible? if(reagents?.total_volume && length(reagents.reagent_volumes) > 1) - var/removing = min(amount_per_transfer_from_this, REAGENTS_FREE_SPACE(W.reagents)) + var/removing = min(amount_per_transfer_from_this, REAGENTS_FREE_SPACE(used_item.reagents)) if(removing < length(reagents.reagent_volumes)-1) - to_chat(user, SPAN_WARNING("\The [W] is full.")) + to_chat(user, SPAN_WARNING("\The [used_item] is full.")) return TRUE // Remove a portion, excepting the primary reagent. - var/old_amt = W.reagents.total_volume + var/old_amt = used_item.reagents.total_volume var/decl/material/primary_mat = reagents.get_primary_reagent_decl() - reagents.trans_to_holder(W.reagents, removing, skip_reagents = list(primary_mat.type)) - to_chat(user, SPAN_NOTICE("You skim [W.reagents.total_volume-old_amt] unit\s of slag from the top of \the [primary_mat].")) + reagents.trans_to_holder(used_item.reagents, removing, skip_reagents = list(primary_mat.type)) + to_chat(user, SPAN_NOTICE("You skim [used_item.reagents.total_volume-old_amt] unit\s of slag from the top of \the [primary_mat].")) return TRUE return ..() diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index f4a057dd411..5a88f901d29 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -141,6 +141,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/list/stack_origin_tech = @'{"materials":1}' // Research level for stacks. // Attributes + /// Does this material float to the top of liquids, allowing it to be skimmed off? Specific to cream at time of writing. + var/skimmable = FALSE /// How rare is this material in exoplanet xenoflora? var/exoplanet_rarity_plant = MAT_RARITY_MUNDANE /// How rare is this material in exoplanet atmospheres? diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index d35715d884a..e67584ef67c 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -907,6 +907,12 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new /* Atom reagent creation - use it all the time */ +/datum/reagents/proc/get_skimmable_reagents() + for(var/mat in reagent_volumes) + var/decl/material/reagent = GET_DECL(mat) + if(reagent.skimmable) + LAZYADD(., mat) + /atom/proc/create_reagents(var/max_vol) if(reagents) log_debug("Attempted to create a new reagents holder when already referencing one: [log_info_line(src)]") @@ -926,4 +932,4 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new var/decl/material/newreagent = GET_DECL(reagent_type) if(!istype(newreagent)) return FALSE - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index ba069e72a23..c8f1650d7f5 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -308,6 +308,7 @@ taste_description = "creamy milk" color = "#dfd7af" uid = "chem_drink_cream" + skimmable = TRUE glass_name = "cream" glass_desc = "Ewwww..." diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index a39da55a863..1d82ec12a02 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -100,6 +100,21 @@ return /obj/item/chems/attackby(obj/item/used_item, mob/user) + + // Skimming off cream, repurposed from crucibles. + // TODO: potentially make this an alt interaction and unify with slag skimming. + if(istype(used_item, /obj/item/chems) && ATOM_IS_OPEN_CONTAINER(used_item) && used_item.reagents?.maximum_volume && reagents?.total_volume && length(reagents.reagent_volumes) > 1) + var/list/skimmable_reagents = reagents.get_skimmable_reagents() + if(length(skimmable_reagents)) + var/removing = min(amount_per_transfer_from_this, REAGENTS_FREE_SPACE(used_item.reagents)) + if(removing <= 0) + to_chat(user, SPAN_WARNING("\The [used_item] is full.")) + else + var/old_amt = used_item.reagents.total_volume + reagents.trans_to_holder(used_item.reagents, removing, skip_reagents = (reagents.reagent_volumes - skimmable_reagents)) + to_chat(user, SPAN_NOTICE("You skim [used_item.reagents.total_volume-old_amt] unit\s of [used_item.reagents.get_primary_reagent_name()] from the top of \the [reagents.get_primary_reagent_name()].")) + return TRUE + if(used_item.user_can_attack_with(user, silent = TRUE)) if(IS_PEN(used_item)) var/tmp_label = sanitize_safe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN) From 14cd7d0f3d229f9c4fcc5f961fed3ef8f0690926 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 22 Dec 2024 19:44:07 -0500 Subject: [PATCH 241/554] Add covered wells --- code/game/objects/structures/well.dm | 7 +++++++ icons/obj/structures/well.dmi | Bin 1279 -> 2021 bytes 2 files changed, 7 insertions(+) diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index 10c34059fea..1b2039aa77e 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -32,6 +32,10 @@ . = ..() if(reagents?.total_volume) add_overlay(overlay_image(icon, "[icon_state]-fluid", reagents.get_color(), (RESET_COLOR | RESET_ALPHA))) + if(istype(reinf_material)) // reinf_material -> roof and posts, at this point in time + var/image/roof_image = overlay_image(icon, "[icon_state]-roof", reinf_material.color, RESET_COLOR | RESET_ALPHA | KEEP_APART) + roof_image.pixel_y = 16 // we have to use 32x32 sprites but want this to be, effectively, 48x32 + add_overlay(roof_image) /obj/structure/reagent_dispensers/well/on_reagent_change() if(!(. = ..())) @@ -64,6 +68,9 @@ /obj/structure/reagent_dispensers/well/mapped auto_refill = /decl/material/liquid/water +/obj/structure/reagent_dispensers/well/mapped/covered + reinf_material = /decl/material/solid/organic/wood/walnut + /obj/structure/reagent_dispensers/well/wall_fountain name = "wall fountain" desc = "An intricately-constructed fountain set into a wall." diff --git a/icons/obj/structures/well.dmi b/icons/obj/structures/well.dmi index 33a27086c184cfaa2fdc1555d80edb09aada4c59..9a6402de82652553c919d3ce3359b4ca0239161c 100644 GIT binary patch delta 2020 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 iDny;IjIjiG8}T Date: Thu, 26 Dec 2024 12:21:14 -0500 Subject: [PATCH 242/554] Replace Shaded Hills well with covered well --- maps/shaded_hills/shaded_hills-inn.dmm | 39 ++++++++++---------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 62e2a71efb3..7dc097ab79b 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -771,10 +771,6 @@ /obj/structure/closet/crate/chest/ebony, /turf/floor/path/basalt, /area/shaded_hills/general_store) -"wA" = ( -/obj/abstract/exterior_marker/inside, -/turf/floor/dirt, -/area/shaded_hills/outside/downlands) "xh" = ( /obj/structure/table/wood/ebony, /obj/item/chems/condiment/large/salt, @@ -1212,10 +1208,6 @@ }, /turf/floor/wood/walnut, /area/shaded_hills/inn) -"Iz" = ( -/obj/abstract/exterior_marker/inside, -/turf/wall/brick/basalt, -/area/shaded_hills/outside/downlands) "IB" = ( /obj/structure/door/walnut, /obj/abstract/landmark/lock_preset/shaded_hills/shrine, @@ -1324,8 +1316,7 @@ /turf/floor/path/basalt, /area/shaded_hills/outside/downlands) "Lj" = ( -/obj/structure/reagent_dispensers/well/mapped, -/obj/abstract/exterior_marker/inside, +/obj/structure/reagent_dispensers/well/mapped/covered, /turf/floor/dirt, /area/shaded_hills/outside/downlands) "Ly" = ( @@ -7835,9 +7826,9 @@ HI HI HI TR -Iz -Iz -Iz +TR +TR +TR TR TR EV @@ -7987,9 +7978,9 @@ HI HI TR TR -wA -wA -wA +TR +TR +TR TR TR EV @@ -8139,9 +8130,9 @@ HI HI TR TR -wA +TR Lj -wA +TR TR TR EV @@ -8291,9 +8282,9 @@ HI HI TR TR -wA -wA -wA +TR +TR +TR TR TR TR @@ -8443,9 +8434,9 @@ HI HI HI TR -Iz -Iz -Iz +TR +TR +TR TR TR EV From ee71c8b2bf319dbecb6f5bbec6802c6898b240b0 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 27 Dec 2024 10:46:24 +1100 Subject: [PATCH 243/554] Enforcing UID on skill decls. --- code/modules/mob/skills/skill.dm | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/skills/skill.dm b/code/modules/mob/skills/skill.dm index 8a464067a3a..cd0d2ec8927 100644 --- a/code/modules/mob/skills/skill.dm +++ b/code/modules/mob/skills/skill.dm @@ -1,14 +1,24 @@ /decl/skill - - abstract_type = /decl/skill // Don't mess with this without changing how Initialize works. - var/name = "None" // Name of the skill. This is what the player sees. - var/decl/skill_category/category // Category this skill belongs to. - var/desc = "Placeholder skill" // Generic description of this skill. - var/difficulty = SKILL_AVERAGE //Used to compute how expensive the skill is - var/default_max = SKILL_ADEPT //Makes the skill capped at this value in selection unless overriden at job level. - var/default_value // The specific default value used for this skill. If null, uses the skillset's default. - var/prerequisites // A list of skill prerequisites, if needed. - var/fallback_key // If the skill UID is not found in the savefile, this is the fallback key to use for migrating old savefiles. + // UID is required for saving in prefs. + decl_flags = DECL_FLAG_MANDATORY_UID + /// Don't mess with this without changing how Initialize works. + abstract_type = /decl/skill + /// Name of the skill. This is what the player sees. + var/name = "None" + /// Generic description of this skill. + var/desc = "Placeholder skill" + /// Used to compute how expensive the skill is + var/difficulty = SKILL_AVERAGE + /// Makes the skill capped at this value in selection unless overriden at job level. + var/default_max = SKILL_ADEPT + /// The specific default value used for this skill. If null, uses the skillset's default. + var/default_value + /// A list of skill prerequisites, if needed. + var/prerequisites + /// If the skill UID is not found in the savefile, this is the fallback key to use for migrating old savefiles. + var/fallback_key + /// Category this skill belongs to. + var/decl/skill_category/category // Names for different skill values, in order from 1 up. var/list/levels = list( From a81848708d06027d9b20643ccd4cf637acf781de Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 27 Dec 2024 10:48:44 +1100 Subject: [PATCH 244/554] Adding UID to skills missing it. --- mods/content/fantasy/datum/skills.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/content/fantasy/datum/skills.dm b/mods/content/fantasy/datum/skills.dm index 2fb92c6f9e1..badad3428e7 100644 --- a/mods/content/fantasy/datum/skills.dm +++ b/mods/content/fantasy/datum/skills.dm @@ -220,6 +220,7 @@ /decl/skill/service/husbandry name = "Animal Husbandry" + uid = "skill_husbandry" desc = "Your ability to raise and care for animals." levels = list( "Unskilled" = "You know next to nothing about animals. You can feed and clean up after them, but you know nothing about their biology, their behavior, or raising their young.", From 27e82d507e634634fd103059a81267287aa7afea Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 27 Dec 2024 11:15:33 +1100 Subject: [PATCH 245/554] Fish and chips use the right icon. --- code/modules/reagents/reagent_containers/food/meat/fish.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/food/meat/fish.dm b/code/modules/reagents/reagent_containers/food/meat/fish.dm index 80b15eae9fb..4036cb4efe7 100644 --- a/code/modules/reagents/reagent_containers/food/meat/fish.dm +++ b/code/modules/reagents/reagent_containers/food/meat/fish.dm @@ -29,7 +29,7 @@ /obj/item/food/fishandchips name = "fish and chips" desc = "Best enjoyed wrapped in a newspaper on a cold wet day." - icon = 'icons/obj/food/fried/fishfingers.dmi' + icon = 'icons/obj/food/fried/fishandchips.dmi' filling_color = "#e3d796" center_of_mass = @'{"x":16,"y":16}' nutriment_desc = list("salt" = 1, "chips" = 2, "fish" = 2) From b485b3ec68ebc62deefd48e8c95a8d4481d5c128 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:17:59 -0500 Subject: [PATCH 246/554] Combine unnecessary duplicate proc overrides in core code --- code/_helpers/unsorted.dm | 5 +-- code/datums/datum.dm | 7 ---- .../machinery/_machines_base/machinery.dm | 7 +--- code/game/machinery/doors/airlock.dm | 3 -- code/game/machinery/hologram.dm | 10 ++--- code/game/machinery/vending/_vending.dm | 5 --- code/game/objects/items/__item.dm | 5 +-- code/game/objects/items/devices/tvcamera.dm | 1 + code/game/objects/items/flame/flame_torch.dm | 5 +-- code/game/objects/items/trash.dm | 7 +--- code/game/objects/items/weapons/RCD.dm | 5 +-- .../objects/items/weapons/material/shards.dm | 7 +--- .../items/weapons/melee/energy_sword.dm | 3 -- .../objects/items/weapons/storage/backpack.dm | 7 +--- code/game/objects/random/subtypes/clothing.dm | 16 -------- code/game/objects/random/subtypes/misc.dm | 10 ----- .../game/objects/random/subtypes/paperwork.dm | 3 +- code/game/objects/structures/fires.dm | 5 +-- code/game/objects/structures/girders.dm | 11 ++---- code/game/objects/structures/target_stake.dm | 7 +--- code/game/objects/structures/watercloset.dm | 38 +++++++++---------- code/modules/butchery/butchery_products.dm | 6 --- .../clothing/spacesuits/rig/modules/combat.dm | 4 -- code/modules/events/meteors.dm | 7 +--- .../designs/general/designs_general.dm | 11 +----- code/modules/games/cards.dm | 5 +-- code/modules/mechs/components/body.dm | 33 ++++++++-------- code/modules/mechs/premade/heavy.dm | 4 -- code/modules/mechs/premade/misc.dm | 4 -- code/modules/mob/living/brain/brain.dm | 11 ++---- .../modules/mob/living/human/human_species.dm | 3 -- code/modules/mob/living/living.dm | 17 ++++----- .../robot/modules/module_maintenance_drone.dm | 7 +--- code/modules/mob/living/silicon/silicon.dm | 3 -- code/modules/mob/mob.dm | 5 --- code/modules/organs/internal/_internal.dm | 14 +++---- .../overmap/contacts/contact_sensors.dm | 9 ++--- code/modules/persistence/persistence_datum.dm | 6 +-- code/modules/projectiles/gun.dm | 7 +--- code/modules/projectiles/projectile.dm | 5 +-- code/modules/reagents/reagent_containers.dm | 7 +--- .../reagents/reagent_containers/borghydro.dm | 3 -- .../drinkingglass/drinkingglass.dm | 25 ++++-------- .../reagents/reagent_containers/hypospray.dm | 5 +-- .../tools/ano_device_battery.dm | 5 +-- 45 files changed, 99 insertions(+), 274 deletions(-) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 45dc05bd2c8..32eac707ce7 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -719,11 +719,8 @@ Turf and target are seperate in case you want to teleport some distance from a t /obj/item/weldingtool/can_puncture() return 1 -/obj/item/screwdriver/can_puncture() - return 1 - /obj/item/clothing/mask/smokable/cigarette/can_puncture() - return src.lit + return ..() || lit // in case someone has a sharp cigarette for some reason /* Checks if that loc and dir has a item on the wall diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 0fbfeaf0232..a0aeed07808 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -111,10 +111,3 @@ */ /datum/proc/PopulateClone(var/datum/clone) return clone - -///////////////////////////////////////////////////////////// -//Common implementations -///////////////////////////////////////////////////////////// - -/image/GetCloneArgs() - return list(icon, loc, icon_state, layer, dir) \ No newline at end of file diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index 6736ad221bb..d6fafc99f1e 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -234,6 +234,8 @@ Class Procs: /obj/machinery/CouldUseTopic(var/mob/user) ..() user.set_machine(src) + if(clicksound && isliving(user)) + playsound(src, clicksound, clickvol) /obj/machinery/CouldNotUseTopic(var/mob/user) user.unset_machine() @@ -391,11 +393,6 @@ Class Procs: /datum/proc/remove_visual(mob/M) return -/obj/machinery/CouldUseTopic(var/mob/user) - ..() - if(clicksound && isliving(user)) - playsound(src, clicksound, clickvol) - /obj/machinery/proc/display_parts(mob/user) to_chat(user, "Following parts detected in the machine:") for(var/obj/item/C in component_parts) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c9149697a66..aa341461f1c 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -141,9 +141,6 @@ About the new airlock wires panel: return ..(user) -/obj/machinery/door/airlock/bumpopen(mob/living/simple_animal/user) - ..(user) - /obj/machinery/door/airlock/proc/isElectrified() if(src.electrified_until != 0) return 1 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 9d871d3e2b5..ce3c79b45d8 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -80,6 +80,9 @@ var/global/list/holopads = list() /obj/machinery/hologram/holopad/Destroy() global.listening_objects -= src + global.holopads -= src + for (var/mob/living/master in masters) + clear_holo(master) return ..() /obj/machinery/hologram/holopad/interface_interact(var/mob/living/human/user) //Carn: Hologram requests. @@ -387,13 +390,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ idle_power_usage = 5 active_power_usage = 100 -//Destruction procs. -/obj/machinery/hologram/holopad/Destroy() - global.holopads -= src - for (var/mob/living/master in masters) - clear_holo(master) - return ..() - /* * Other Stuff: Is this even used? */ diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm index 2bc56a9c105..866062f2a54 100644 --- a/code/game/machinery/vending/_vending.dm +++ b/code/game/machinery/vending/_vending.dm @@ -195,11 +195,6 @@ . = ..() SSnano.update_uis(src) -/obj/machinery/vending/receive_mouse_drop(atom/dropping, mob/user, params) - . = ..() - if(!. && dropping.loc == user && attempt_to_stock(dropping, user)) - return TRUE - /obj/machinery/vending/proc/attempt_to_stock(var/obj/item/I, var/mob/user) for(var/datum/stored_items/vending_products/R in product_records) if(I.type == R.item_path) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 5081ba6b45d..e2e71c3653e 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -378,7 +378,7 @@ return ..(user, distance, "", jointext(desc_comp, "
    ")) /obj/item/check_mousedrop_adjacency(var/atom/over, var/mob/user) - . = (loc == user && istype(over, /obj/screen/inventory)) || ..() + . = (loc == user && istype(over, /obj/screen)) || ..() /obj/item/handle_mouse_drop(atom/over, mob/user, params) @@ -1115,9 +1115,6 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. step_towards(src,S) else ..() -/obj/item/check_mousedrop_adjacency(var/atom/over, var/mob/user) - . = (loc == user && istype(over, /obj/screen)) || ..() - // Supplied during loadout gear tweaking. /obj/item/proc/set_custom_name(var/new_name) base_name = new_name diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index bbcbc43e488..272de843372 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -96,6 +96,7 @@ update_held_icon() /* Assembly by a roboticist */ +// TODO: Make this slapcrafting or remove tvcamera/tvassembly entirely /obj/item/robot_parts/head/attackby(var/obj/item/assembly/S, mob/user) if (!istype(S, /obj/item/assembly/infra)) return ..() diff --git a/code/game/objects/items/flame/flame_torch.dm b/code/game/objects/items/flame/flame_torch.dm index 26f616a4a47..7f0edbe8dd3 100644 --- a/code/game/objects/items/flame/flame_torch.dm +++ b/code/game/objects/items/flame/flame_torch.dm @@ -13,10 +13,6 @@ var/head_material = /decl/material/solid/organic/cloth var/burnt = FALSE -/obj/item/flame/torch/Initialize() - . = ..() - set_color(null) // clear our scent color - /obj/item/flame/torch/get_available_scents() var/static/list/available_scents = list( /decl/scent_type/woodsmoke @@ -34,6 +30,7 @@ /obj/item/flame/torch/Initialize(var/ml, var/material_key, var/_head_material) . = ..() + set_color(null) // clear our scent color. TODO: allow flame items to disable scent color setting in the first place if(_head_material) head_material = _head_material diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index bf4bfab6f1b..8c88b8edc0d 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -10,15 +10,12 @@ var/age = 0 /obj/item/trash/Initialize(mapload, var/_age) + if(!mapload) + SSpersistence.track_value(src, /decl/persistence_handler/filth/trash) . = ..(mapload) if(!isnull(_age)) age = _age -/obj/item/trash/Initialize(var/ml) - if(!ml) - SSpersistence.track_value(src, /decl/persistence_handler/filth/trash) - . = ..() - /obj/item/trash/Destroy() SSpersistence.forget_value(src, /decl/persistence_handler/filth/trash) . = ..() diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 8e40d1f38f8..f48b28762d0 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -32,6 +32,7 @@ var/decl/hierarchy/h = GET_DECL(/decl/hierarchy/rcd_mode) work_modes = h.children work_mode = work_modes[1] + update_icon() //Initializes the ammo counter /obj/item/rcd/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) return FALSE @@ -45,10 +46,6 @@ to_chat(user, "The current mode is '[work_mode]'.") to_chat(user, "It currently holds [stored_matter]/[max_stored_matter] matter-units.") -/obj/item/rcd/Initialize() - . = ..() - update_icon() //Initializes the ammo counter - /obj/item/rcd/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/rcd_ammo)) var/obj/item/rcd_ammo/cartridge = W diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index dd248df7bb7..7ff92bf32ad 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -53,6 +53,8 @@ . = ..() // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity alpha = 255 * (material ? (1 - (1 - material.opacity)**2) : 1) + if(has_handle) + add_overlay(overlay_image(icon, "handle", has_handle, RESET_COLOR)) /obj/item/shard/attackby(obj/item/W, mob/user) if(IS_WELDER(W) && material.shard_can_repair) @@ -80,11 +82,6 @@ return TRUE return ..() -/obj/item/shard/on_update_icon() - . = ..() - if(has_handle) - add_overlay(overlay_image(icon, "handle", has_handle, RESET_COLOR)) - /obj/item/shard/Crossed(atom/movable/AM) ..() if(!isliving(AM)) diff --git a/code/game/objects/items/weapons/melee/energy_sword.dm b/code/game/objects/items/weapons/melee/energy_sword.dm index 3d20dd638d3..045040acb76 100644 --- a/code/game/objects/items/weapons/melee/energy_sword.dm +++ b/code/game/objects/items/weapons/melee/energy_sword.dm @@ -20,9 +20,6 @@ if(!lighting_color) lighting_color = blade_color . = ..() - -/obj/item/energy_blade/sword/Initialize() - . = ..() set_extension(src, /datum/extension/demolisher/energy) /obj/item/energy_blade/sword/is_special_cutting_tool(var/high_power) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 14a20b4125c..fb4d2bb6756 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -17,17 +17,14 @@ /obj/item/backpack/can_contaminate() return FALSE -/obj/item/backpack/equipped() - if(!has_extension(src, /datum/extension/appearance)) - set_extension(src, /datum/extension/appearance/cardborg) - ..() - /obj/item/backpack/attackby(obj/item/W, mob/user) if (storage?.use_sound) playsound(src.loc, storage.use_sound, 50, 1, -5) return ..() /obj/item/backpack/equipped(var/mob/user, var/slot) + if(!has_extension(src, /datum/extension/appearance)) + set_extension(src, /datum/extension/appearance/cardborg) if (slot == slot_back_str && storage?.use_sound) playsound(loc, storage.use_sound, 50, 1, -5) return ..(user, slot) diff --git a/code/game/objects/random/subtypes/clothing.dm b/code/game/objects/random/subtypes/clothing.dm index f9bac2fd1c4..8524aff474c 100644 --- a/code/game/objects/random/subtypes/clothing.dm +++ b/code/game/objects/random/subtypes/clothing.dm @@ -238,19 +238,3 @@ /obj/item/clothing/suit/space/void/medical/alt ) return spawnable_choices - -/obj/random/hardsuit - name = "Random Hardsuit" - desc = "This is a random hardsuit control module." - icon = 'icons/obj/rig_modules.dmi' - icon_state = "generic" - -/obj/random/hardsuit/spawn_choices() - var/static/list/spawnable_choices = list( - /obj/item/rig/industrial, - /obj/item/rig/eva, - /obj/item/rig/light/hacker, - /obj/item/rig/light/stealth, - /obj/item/rig/light - ) - return spawnable_choices diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index b5206b950d3..4ccde91270d 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -465,16 +465,6 @@ ) return spawnable_choices -/obj/random/crayon - name = "random crayon" - desc = "This is a random crayon." - icon = 'icons/obj/items/crayons.dmi' - icon_state = "crayonred" - -/obj/random/crayon/spawn_choices() - var/static/list/spawnable_choices = subtypesof(/obj/item/pen/crayon) - return spawnable_choices - /obj/random/umbrella name = "Random Umbrella" desc = "This is a random umbrella." diff --git a/code/game/objects/random/subtypes/paperwork.dm b/code/game/objects/random/subtypes/paperwork.dm index 061b4944609..a073a9d9506 100644 --- a/code/game/objects/random/subtypes/paperwork.dm +++ b/code/game/objects/random/subtypes/paperwork.dm @@ -12,7 +12,8 @@ icon_state = "crayonred" /obj/random/crayon/spawn_choices() - return subtypesof(/obj/item/pen/crayon) + var/static/list/spawnable_choices = subtypesof(/obj/item/pen/crayon) + return spawnable_choices /obj/random/clipboard name = "random clipboard" diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index cdb416489e3..56dca65f9b5 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -244,9 +244,6 @@ /obj/structure/fire_source/isflamesource() return (lit == FIRE_LIT) -/obj/structure/fire_source/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - return ..() || (istype(mover) && mover.checkpass(PASS_FLAG_TABLE)) - /obj/structure/fire_source/proc/burn_material(var/decl/material/mat, var/amount) var/effective_burn_temperature = get_effective_burn_temperature() . = mat.get_burn_products(amount, effective_burn_temperature) @@ -492,7 +489,7 @@ try_light(1000) /obj/structure/fire_source/CanPass(atom/movable/mover, turf/target, height, air_group) - . = ..() + . = ..() || mover?.checkpass(PASS_FLAG_TABLE) if(. && lit && ismob(mover)) var/mob/M = mover if(!MOVING_QUICKLY(M)) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index c508eb305f9..a82c4c7733d 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -19,13 +19,6 @@ set_extension(src, /datum/extension/penetration/simple, 100) . = ..() -/obj/structure/girder/can_unanchor(var/mob/user) - . = ..() - var/turf/T = loc - if(!anchored && . && (!istype(T) || T.is_open())) - to_chat(user, SPAN_WARNING("You can only secure \the [src] to solid ground.")) - return FALSE - /obj/structure/girder/handle_default_screwdriver_attackby(var/mob/user, var/obj/item/screwdriver) if(reinf_material) @@ -88,6 +81,10 @@ to_chat(user, SPAN_WARNING("You must remove the support rods before you can dislodge \the [src].")) return FALSE . = ..() + var/turf/T = loc + if(!anchored && . && (!istype(T) || T.is_open())) + to_chat(user, SPAN_WARNING("You can only secure \the [src] to solid ground.")) + return FALSE /obj/structure/girder/can_dismantle(var/mob/user) if(reinf_material) diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 0dc8afefce6..38feb74fd25 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -15,11 +15,6 @@ dummy = null . = ..() -/obj/structure/target_stake/attackby(obj/item/used_item, mob/user) - if(dummy?.repair_target_dummy(used_item, user)) - return TRUE - return ..() - /obj/structure/target_stake/take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) if(dummy) . = dummy.take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) @@ -42,6 +37,8 @@ return ..() /obj/structure/target_stake/attackby(obj/item/used_item, mob/user) + if(dummy?.repair_target_dummy(used_item, user)) + return TRUE if(istype(used_item, /obj/item/training_dummy) && can_hold_dummy(user, used_item)) if(dummy) to_chat(user, SPAN_WARNING("\The [src] is already holding \the [dummy].")) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 454e6e9b6b5..549d7d913ab 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -49,6 +49,23 @@ var/global/list/hygiene_props = list() if(clogged <= 0) unclog() return TRUE + //toilet paper interaction for clogging toilets and other facilities + if (istype(thing, /obj/item/stack/tape_roll/barricade_tape/toilet)) + if (clogged == -1) + to_chat(user, SPAN_WARNING("Try as you might, you can not clog \the [src] with \the [thing].")) + return TRUE + if (clogged) + to_chat(user, SPAN_WARNING("\The [src] is already clogged.")) + return TRUE + if (!do_after(user, 3 SECONDS, src)) + to_chat(user, SPAN_WARNING("You must stay still to clog \the [src].")) + return TRUE + if (clogged || QDELETED(thing) || !user.try_unequip(thing)) + return TRUE + to_chat(user, SPAN_NOTICE("You unceremoniously jam \the [src] with \the [thing]. What a rebel.")) + clog(1) + qdel(thing) + return TRUE . = ..() /obj/structure/hygiene/examine(mob/user) @@ -474,27 +491,6 @@ var/global/list/hygiene_props = list() . = ..() icon_state = "puddle" -//toilet paper interaction for clogging toilets and other facilities - -/obj/structure/hygiene/attackby(obj/item/I, mob/user) - if (!istype(I, /obj/item/stack/tape_roll/barricade_tape/toilet)) - return ..() - if (clogged == -1) - to_chat(user, SPAN_WARNING("Try as you might, you can not clog \the [src] with \the [I].")) - return TRUE - if (clogged) - to_chat(user, SPAN_WARNING("\The [src] is already clogged.")) - return TRUE - if (!do_after(user, 3 SECONDS, src)) - to_chat(user, SPAN_WARNING("You must stay still to clog \the [src].")) - return TRUE - if (clogged || QDELETED(I) || !user.try_unequip(I)) - return TRUE - to_chat(user, SPAN_NOTICE("You unceremoniously jam \the [src] with \the [I]. What a rebel.")) - clog(1) - qdel(I) - return TRUE - //////////////////////////////////////////////////// // Toilet Paper Roll //////////////////////////////////////////////////// diff --git a/code/modules/butchery/butchery_products.dm b/code/modules/butchery/butchery_products.dm index 23f9dc4858c..075345d3e33 100644 --- a/code/modules/butchery/butchery_products.dm +++ b/code/modules/butchery/butchery_products.dm @@ -63,12 +63,6 @@ else return ..() -/obj/item/food/butchery/get_dried_product() - . = ..() - if(meat_name && istype(., /obj/item/food/jerky)) - var/obj/item/food/jerky/jerk = . - jerk.set_meat_name(meat_name) - /obj/item/food/butchery/get_drying_state(var/obj/rack) return "meat" diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index 5f16eca8900..0386948c602 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -215,10 +215,6 @@ var/obj/item/gun/gun -/obj/item/rig_module/mounted/Destroy() - QDEL_NULL(gun) - . = ..() - /obj/item/rig_module/mounted/Initialize() . = ..() if(ispath(gun)) diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index f291cda35f5..b39f3c9da04 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -243,6 +243,8 @@ var/global/list/meteors_major = list( . = ..() z_original = z global.meteor_list += src + if(!ismissile) + SpinAnimation() /obj/effect/meteor/Move() . = ..() //process movement... @@ -259,11 +261,6 @@ var/global/list/meteors_major = list( global.meteor_list -= src . = ..() -/obj/effect/meteor/Initialize() - . = ..() - if(!ismissile) - SpinAnimation() - /obj/effect/meteor/Bump(atom/A) ..() if(A && !QDELETED(src)) // Prevents explosions and other effects when we were deleted by whatever we Bumped() - currently used by shields. diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 69b99bda0b9..fda6ce15bad 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -188,7 +188,7 @@ /datum/fabricator_recipe/fishing_line_high_quality path = /obj/item/fishing_line/high_quality -/datum/fabricator_recipe/chipboard +/datum/fabricator_recipe/chipboard // base type is for oak path = /obj/item/stack/material/sheet/mapped/chipboard_oak category = "Textiles" fabricator_types = list( @@ -202,15 +202,6 @@ /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) ) -/datum/fabricator_recipe/chipboard - path = /obj/item/stack/material/sheet/mapped/chipboard_oak - -/datum/fabricator_recipe/chipboard/get_resources() - resources = list( - /decl/material/solid/organic/wood/oak = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), - /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) - ) - /datum/fabricator_recipe/chipboard/maple path = /obj/item/stack/material/sheet/mapped/chipboard_maple diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index c4351b213e2..8084a66d09d 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -27,6 +27,7 @@ var/global/list/card_decks = list() /obj/item/deck/Initialize() . = ..() global.card_decks += src + generate_cards() /obj/item/deck/Destroy() . = ..() @@ -70,10 +71,6 @@ var/global/list/card_decks = list() desc = "A simple deck of playing cards." icon_state = "deck" -/obj/item/deck/Initialize() - . = ..() - generate_cards() - /obj/item/deck/proc/generate_cards() return diff --git a/code/modules/mechs/components/body.dm b/code/modules/mechs/components/body.dm index 4d8016e7138..e60ba072403 100644 --- a/code/modules/mechs/components/body.dm +++ b/code/modules/mechs/components/body.dm @@ -50,6 +50,21 @@ "[WEST]" = list("x" = 8, "y" = 0) ) ) + if(pilot_coverage >= 100) //Open cockpits dont get to have air + cockpit = new + cockpit.volume = 200 + if(loc) + var/datum/gas_mixture/air = loc.return_air() + if(air) + //Essentially at this point its like we created a vacuum, but realistically making a bottle doesnt actually increase volume of a room and neither should a mech + for(var/g in air.gas) + cockpit.gas[g] = (air.gas[g] / air.volume) * cockpit.volume + + cockpit.temperature = air.temperature + cockpit.update_values() + + air_supply = new /obj/machinery/portable_atmospherics/canister/air(src) + storage_compartment = new(src) /obj/item/mech_component/chassis/Destroy() QDEL_NULL(cell) @@ -74,24 +89,6 @@ if(!m_armour) to_chat(user, SPAN_WARNING("It is missing exosuit armour plating.")) -/obj/item/mech_component/chassis/Initialize() - . = ..() - if(pilot_coverage >= 100) //Open cockpits dont get to have air - cockpit = new - cockpit.volume = 200 - if(loc) - var/datum/gas_mixture/air = loc.return_air() - if(air) - //Essentially at this point its like we created a vacuum, but realistically making a bottle doesnt actually increase volume of a room and neither should a mech - for(var/g in air.gas) - cockpit.gas[g] = (air.gas[g] / air.volume) * cockpit.volume - - cockpit.temperature = air.temperature - cockpit.update_values() - - air_supply = new /obj/machinery/portable_atmospherics/canister/air(src) - storage_compartment = new(src) - /obj/item/mech_component/chassis/proc/update_air(var/take_from_supply) var/changed diff --git a/code/modules/mechs/premade/heavy.dm b/code/modules/mechs/premade/heavy.dm index a81ce89533f..e1dfd62d77f 100644 --- a/code/modules/mechs/premade/heavy.dm +++ b/code/modules/mechs/premade/heavy.dm @@ -90,10 +90,6 @@ "[WEST]" = list("x" = 12, "y" = 8) ) ) - - . = ..() - -/obj/item/mech_component/chassis/heavy/prebuild() . = ..() m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/combat(src) diff --git a/code/modules/mechs/premade/misc.dm b/code/modules/mechs/premade/misc.dm index 4d150377c32..dafb3bc44d5 100644 --- a/code/modules/mechs/premade/misc.dm +++ b/code/modules/mechs/premade/misc.dm @@ -53,7 +53,3 @@ ) ) . = ..() - -/obj/item/mech_component/chassis/pod/prebuild() - . = ..() - m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/radproof(src) \ No newline at end of file diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 35b97e4880b..b80dfb8f85d 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -26,11 +26,6 @@ ) return default_emotes -/mob/living/brain/handle_regular_status_updates() - . = ..() - if(emp_damage || stat == DEAD || !is_in_interface()) - SET_STATUS_MAX(src, STAT_SILENCE, 2) - /mob/living/brain/is_deaf() return emp_damage || stat == DEAD || !is_in_interface() @@ -99,8 +94,10 @@ emp_damage += rand(0,10) emp_damage = clamp(emp_damage, 0, max_emp_damage) -/mob/living/brain/handle_regular_status_updates() // Status & health update, are we dead or alive etc. +/mob/living/brain/handle_regular_status_updates() // Status & health update, are we dead or alive, can we communicate, etc. . = ..() + if(emp_damage || stat == DEAD || !is_in_interface()) + SET_STATUS_MAX(src, STAT_SILENCE, 2) if(stat == DEAD || !isSynthetic()) emp_damage = 0 return @@ -114,4 +111,4 @@ if(emp_damage <= 0) last_emp_message = 0 emp_damage = 0 - to_chat(src, SPAN_NOTICE("All systems restored.")) + to_chat(src, SPAN_NOTICE("All systems restored.")) \ No newline at end of file diff --git a/code/modules/mob/living/human/human_species.dm b/code/modules/mob/living/human/human_species.dm index 6988a940bed..c499bbb2da2 100644 --- a/code/modules/mob/living/human/human_species.dm +++ b/code/modules/mob/living/human/human_species.dm @@ -37,9 +37,6 @@ corpse.equip_corpse_outfit(src) return INITIALIZE_HINT_LATELOAD -/mob/living/human/corpse/get_death_message(gibbed) - return SKIP_DEATH_MESSAGE - /mob/living/human/corpse/LateInitialize() ..() var/current_max_health = get_max_health() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e76e323abea..1ac5dbe15c4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1524,6 +1524,13 @@ default behaviour is: qdel(grab) if(istype(ai)) ai.on_buckled(M) + reset_layer() + update_icon() + +/mob/living/unbuckle_mob() + . = ..() + reset_layer() + update_icon() /mob/living/try_make_grab(mob/living/user, defer_hand = FALSE) . = ..() @@ -1891,16 +1898,6 @@ default behaviour is: return TRUE return FALSE -/mob/living/buckle_mob(mob/living/M) - . = ..() - reset_layer() - update_icon() - -/mob/living/unbuckle_mob() - . = ..() - reset_layer() - update_icon() - /mob/living/proc/flee(atom/target, upset = FALSE) var/static/datum/automove_metadata/_flee_automove_metadata = new( _move_delay = null, diff --git a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm index fe58498a36e..b9456bc2050 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm @@ -115,6 +115,8 @@ ..() var/obj/item/chems/spray/cleaner/drone/SC = locate() in equipment SC.add_to_reagents(/decl/material/liquid/cleaner, 8 * amount) + var/obj/item/lightreplacer/LR = locate() in equipment + LR.Charge(R, amount) /obj/item/robot_module/drone/construction name = "construction drone module" @@ -126,8 +128,3 @@ /obj/item/robot_module/drone/construction/Initialize() equipment += /obj/item/rcd/borg . = ..() - -/obj/item/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/lightreplacer/LR = locate() in equipment - LR.Charge(R, amount) - ..() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 768dc1c0d51..52457ceb078 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -68,9 +68,6 @@ QDEL_NULL_LIST(stock_parts) return ..() -/mob/living/silicon/get_dexterity(silent) - return dexterity - /mob/living/silicon/fully_replace_character_name(new_name) ..() create_or_update_account(new_name) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 5ed9d75db53..dfb7852c528 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1297,11 +1297,6 @@ /mob/proc/get_blood_type() return -// Gets the ID card of a mob, but will not check types in the exceptions list -/mob/GetIdCard(exceptions = null) - RETURN_TYPE(/obj/item/card/id) - return LAZYACCESS(GetIdCards(exceptions), 1) - /mob/get_overhead_text_x_offset() return offset_overhead_text_x diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index ac00fcf30e5..d891023e600 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -56,6 +56,12 @@ affected.cavity_max_w_class = max(affected.cavity_max_w_class, w_class) affected.update_internal_organs_cost() + // This might need revisiting to stop people successfully implanting brains in groins and transferring minds. + if(transfer_brainmob_with_organ && istype(owner)) + var/mob/living/brainmob = get_brainmob(create_if_missing = FALSE) + if(brainmob?.key) + transfer_key_from_mob_to_mob(brainmob, owner) + /obj/item/organ/internal/do_uninstall(in_place, detach, ignore_children, update_icon) var/mob/living/victim = owner // cleared in parent proc @@ -289,11 +295,3 @@ /obj/item/organ/internal/preserve_in_cryopod(var/obj/machinery/cryopod/pod) var/mob/living/brainmob = get_brainmob() return brainmob?.key - -// This might need revisiting to stop people successfully implanting brains in groins and transferring minds. -/obj/item/organ/internal/do_install(mob/living/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) - . = ..() - if(transfer_brainmob_with_organ && istype(owner)) - var/mob/living/brainmob = get_brainmob(create_if_missing = FALSE) - if(brainmob?.key) - transfer_key_from_mob_to_mob(brainmob, owner) diff --git a/code/modules/overmap/contacts/contact_sensors.dm b/code/modules/overmap/contacts/contact_sensors.dm index f6dee900ce4..fcdd349fb07 100644 --- a/code/modules/overmap/contacts/contact_sensors.dm +++ b/code/modules/overmap/contacts/contact_sensors.dm @@ -16,6 +16,9 @@ var/obj/effect/overmap/overmap_location = loc if(overmap_location.requires_contact) new /datum/overmap_contact(src, overmap_location) + if(!contact_datums[linked]) + var/datum/overmap_contact/record = new(src, linked) + record.marker.alpha = 255 /obj/machinery/computer/ship/sensors/Destroy() objects_in_view.Cut() @@ -23,12 +26,6 @@ trackers.Cut() . = ..() -/obj/machinery/computer/ship/sensors/attempt_hook_up(obj/effect/overmap/visitable/ship/sector) - . = ..() - if(. && linked && !contact_datums[linked]) - var/datum/overmap_contact/record = new(src, linked) - record.marker.alpha = 255 - /obj/machinery/computer/ship/sensors/proc/reveal_contacts(var/mob/user) if(user && user.client) for(var/key in contact_datums) diff --git a/code/modules/persistence/persistence_datum.dm b/code/modules/persistence/persistence_datum.dm index 0c9e0aedca6..557ae252b88 100644 --- a/code/modules/persistence/persistence_datum.dm +++ b/code/modules/persistence/persistence_datum.dm @@ -12,10 +12,6 @@ var/ignore_area_flags = FALSE // Set to TRUE to skip area flag checks such as nonpersistent areas. var/ignore_invalid_loc = FALSE // Set to TRUE to skip checking for a non-null station turf for the entry. -/decl/persistence_handler/Initialize() - SetFilename() - . = ..() - /decl/persistence_handler/proc/SetFilename() if(name) filename = "data/persistent/[ckey(global.using_map.name)]-[ckey(name)].json" @@ -95,6 +91,8 @@ /decl/persistence_handler/Initialize() + SetFilename() + . = ..() if(!fexists(filename)) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 83ee026551b..4de22aa0616 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -259,7 +259,8 @@ /obj/item/gun/dropped(var/mob/living/user) check_accidents(user) update_icon() - return ..() + . = ..() + clear_autofire() /obj/item/gun/proc/Fire(atom/target, atom/movable/firer, clickparams, pointblank = FALSE, reflex = FALSE, set_click_cooldown = TRUE, target_zone = BP_CHEST) if(!firer || !target) @@ -708,10 +709,6 @@ afterattack(shoot_to,target) return 1 -/obj/item/gun/dropped(mob/living/user) - . = ..() - clear_autofire() - /obj/item/gun/proc/can_autofire() return (autofire_enabled && world.time >= next_fire_time) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index fbf7adf743f..07ad3c6c686 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -97,7 +97,7 @@ else animate_movement = NO_STEPS . = ..() -/obj/item/projectile/CanPass() +/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return TRUE /obj/item/projectile/damage_flags() @@ -315,9 +315,6 @@ SHOULD_CALL_PARENT(FALSE) return -/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - return 1 - /obj/item/projectile/proc/before_move() return diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index a39da55a863..615e68c3be9 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -30,6 +30,8 @@ var/image/contents_overlay = get_reagents_overlay(use_single_icon ? icon_state : null) if(contents_overlay) add_overlay(contents_overlay) + if(detail_state) + add_overlay(overlay_image(icon, "[initial(icon_state)][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) /obj/item/chems/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) var/image/reagents_overlay = get_reagents_overlay(overlay.icon_state) @@ -50,11 +52,6 @@ return TRUE return FALSE -/obj/item/chems/on_update_icon() - . = ..() - if(detail_state) - add_overlay(overlay_image(icon, "[initial(icon_state)][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) - /obj/item/chems/update_name() . = ..() // handles material, etc var/newname = name diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 06147c369b4..0098dd2a9b8 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -37,9 +37,6 @@ reagent_volumes[T] = volume var/decl/material/R = T reagent_names += initial(R.name) - -/obj/item/chems/borghypo/Initialize() - . = ..() START_PROCESSING(SSobj, src) /obj/item/chems/borghypo/Destroy() diff --git a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm index 1dc986fb81b..386ad49b09a 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm @@ -39,23 +39,6 @@ var/global/const/DRINK_ICON_NOISY = "noise" if(obj_flags & OBJ_FLAG_HOLLOW) . /= HOLLOW_OBJECT_MATTER_MULTIPLIER -/obj/item/chems/drinks/glass2/examine(mob/M) - . = ..() - - for(var/I in extras) - if(istype(I, /obj/item/glass_extra)) - to_chat(M, "There is \a [I] in \the [src].") - else if(istype(I, /obj/item/food/processed_grown/slice)) - to_chat(M, "There is \a [I] on the rim.") - else - to_chat(M, "There is \a [I] somewhere on the glass. Somehow.") - - if(has_ice()) - to_chat(M, "There is some ice floating in the drink.") - - if(has_fizz()) - to_chat(M, "It is fizzing slightly.") - /obj/item/chems/drinks/glass2/proc/has_ice() if(LAZYLEN(reagents.reagent_volumes)) var/decl/material/R = reagents.get_primary_reagent_decl() @@ -113,7 +96,7 @@ var/global/const/DRINK_ICON_NOISY = "noise" /obj/item/chems/drinks/glass2/examine(mob/user, distance) . = ..() - if(!istype(user) || distance > 1) + if(!istype(user)) return var/list/extra_text for(var/extra in extras) @@ -122,8 +105,14 @@ var/global/const/DRINK_ICON_NOISY = "noise" LAZYADD(extra_text, GE.glass_desc) else if(istype(extra, /obj/item/food/processed_grown/slice)) LAZYADD(extra_text, "There is \a [extra] on the rim.") + else + to_chat(user, "There is \a [extra] somewhere on the glass. Somehow.") if(length(extra_text)) to_chat(user, SPAN_NOTICE(jointext(extra_text," "))) + if(has_ice()) + to_chat(user, "There is some ice floating in the drink.") + if(has_fizz()) + to_chat(user, "It is fizzing slightly.") /obj/item/chems/drinks/glass2/proc/get_filling_overlay(amount, overlay) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index af8367645f7..be5659ebba4 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -185,6 +185,7 @@ . = ..() if(label_text) update_name() + update_icon() /obj/item/chems/hypospray/autoinjector/populate_reagents() SHOULD_CALL_PARENT(TRUE) @@ -192,10 +193,6 @@ if(reagents?.total_volume > 0 && autolabel && !label_text) // don't override preset labels label_text = "[reagents.get_primary_reagent_name()], [reagents.total_volume]u" -/obj/item/chems/hypospray/autoinjector/Initialize() - . = ..() - update_icon() - /obj/item/chems/hypospray/autoinjector/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) . = ..() if(.) diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index 0ac71ec2278..86f037fd0f8 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -57,6 +57,7 @@ /obj/item/anodevice/Destroy() inserted_battery = null + STOP_PROCESSING(SSobj, src) . = ..() /obj/item/anodevice/attackby(var/obj/I, var/mob/user) @@ -188,10 +189,6 @@ else icon_state = "anodev_empty" -/obj/item/anodevice/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - /obj/item/anodevice/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if (!istype(target)) return ..() From 762711c04c4404b7364c19ecab15be8ec91c5428 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:41:53 -0500 Subject: [PATCH 247/554] Condense assembly and timer side-overrides into definitions --- code/modules/assembly/assembly.dm | 70 ++++++++++-------------------- code/modules/assembly/holder.dm | 52 ++++++++++------------ code/modules/assembly/proximity.dm | 35 +++++++-------- code/modules/assembly/timer.dm | 5 +-- 4 files changed, 61 insertions(+), 101 deletions(-) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index e583f5664ce..a4cf742c410 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -35,53 +35,49 @@ /// What the device does when turned on /obj/item/assembly/proc/activate() - return - -/// Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs -/obj/item/assembly/proc/pulsed(var/radio = 0) - return - -/// Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct -/obj/item/assembly/proc/pulse_device(var/radio = 0) - return + if(!secured || (cooldown > 0)) return 0 + cooldown = 2 + spawn(10) + process_cooldown() + return 1 /// Code that has to happen when the assembly is un\secured goes here /obj/item/assembly/proc/toggle_secure() - return + secured = !secured + update_icon() + return secured /// Called when an assembly is attacked by another -/obj/item/assembly/proc/attach_assembly(var/obj/A, var/mob/user) - return - -/// Called via spawn(10) to have it count down the cooldown var -/obj/item/assembly/proc/process_cooldown() - return +/obj/item/assembly/proc/attach_assembly(var/obj/item/A, var/mob/user) + holder = new/obj/item/assembly_holder(get_turf(src)) + if(holder.attach(A,src,user)) + to_chat(user, "You attach \the [A] to \the [src]!") + return 1 + return 0 /// Called when the holder is moved /obj/item/assembly/proc/holder_movement() return -/// Called when attack_self is called -/obj/item/assembly/interact(mob/user) - return - -/obj/item/assembly/process_cooldown() +/// Called via spawn(10) to have it count down the cooldown var +/// This is really bad. Please just make it process... +/obj/item/assembly/proc/process_cooldown() cooldown-- if(cooldown <= 0) return 0 spawn(10) process_cooldown() return 1 - -/obj/item/assembly/pulsed(var/radio = 0) +/// Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs +/obj/item/assembly/proc/pulsed(var/radio = 0) if(holder && (wires & WIRE_RECEIVE)) activate() if(radio && (wires & WIRE_RADIO_RECEIVE)) activate() return 1 - -/obj/item/assembly/pulse_device(var/radio = 0) +/// Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct +/obj/item/assembly/proc/pulse_device(var/radio = 0) if(holder && (wires & WIRE_PULSE)) holder.process_activation(src, 1, 0) if(holder && (wires & WIRE_PULSE_SPECIAL)) @@ -90,29 +86,6 @@ //Not sure what goes here quite yet send signal? return 1 - -/obj/item/assembly/activate() - if(!secured || (cooldown > 0)) return 0 - cooldown = 2 - spawn(10) - process_cooldown() - return 1 - - -/obj/item/assembly/toggle_secure() - secured = !secured - update_icon() - return secured - - -/obj/item/assembly/attach_assembly(var/obj/item/assembly/A, var/mob/user) - holder = new/obj/item/assembly_holder(get_turf(src)) - if(holder.attach(A,src,user)) - to_chat(user, "You attach \the [A] to \the [src]!") - return 1 - return 0 - - /obj/item/assembly/attackby(obj/item/component, mob/user) if(!user_can_attack_with(user) || !component.user_can_attack_with(user)) return TRUE @@ -152,6 +125,7 @@ interact(user) return TRUE +/// Called when attack_self is called /obj/item/assembly/interact(mob/user) return //HTML MENU FOR WIRES GOES HERE diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index c4ef0fcdbfa..dba32a26eb2 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -36,20 +36,11 @@ special_assembly = null return ..() -/obj/item/assembly_holder/proc/attach(var/obj/item/left, var/obj/item/right, var/mob/user) - return - -/obj/item/assembly_holder/proc/process_activation(var/atom/activator) - return - -/obj/item/assembly_holder/proc/detached() - return - -/obj/item/assembly_holder/attach(var/obj/item/assembly/left, var/obj/item/assembly/right, var/mob/user) - if((!left)||(!right)) - return 0 - if((!istype(left))||(!istype(right))) +/obj/item/assembly_holder/proc/attach(var/obj/item/left_item, var/obj/item/right_item, var/mob/user) + if(!istype(left_item) || !istype(right_item)) return 0 + var/obj/item/assembly/left = left_item + var/obj/item/assembly/right = right_item if((left.secured)||(right.secured)) return 0 if(user) @@ -67,6 +58,24 @@ return 1 +/obj/item/assembly_holder/proc/process_activation(var/atom/activator, var/normal = 1, var/special = 1) + if(!activator) return 0 + if(!secured) + visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") + if((normal) && (a_right) && (a_left)) + if(a_right != activator) + a_right.pulsed(0) + if(a_left != activator) + a_left.pulsed(0) + if(master) + master.receive_signal() +// if(special && special_assembly) +// if(!special_assembly == activator) +// special_assembly.dothings() + return 1 + +/obj/item/assembly_holder/proc/detached() + return /obj/item/assembly_holder/HasProximity(atom/movable/AM) . = ..() @@ -154,23 +163,6 @@ qdel(src) return - -/obj/item/assembly_holder/process_activation(var/atom/activator, var/normal = 1, var/special = 1) - if(!activator) return 0 - if(!secured) - visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") - if((normal) && (a_right) && (a_left)) - if(a_right != activator) - a_right.pulsed(0) - if(a_left != activator) - a_left.pulsed(0) - if(master) - master.receive_signal() -// if(special && special_assembly) -// if(!special_assembly == activator) -// special_assembly.dothings() - return 1 - /obj/item/assembly_holder/hear_talk(mob/living/M, msg, verb, decl/language/speaking) if(a_right) a_right.hear_talk(M,msg,verb,speaking) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index aee7624c0f7..a451bcffec1 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -20,7 +20,23 @@ var/range = 2 /obj/item/assembly/prox_sensor/proc/toggle_scan() + if(!secured) return 0 + scanning = !scanning + update_icon() + return + /obj/item/assembly/prox_sensor/proc/sense() + var/turf/mainloc = get_turf(src) +// if(scanning && cooldown <= 0) +// mainloc.visible_message("[html_icon(src)] *boop* *boop*", "*boop* *boop*") + if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0 + pulse_device(0) + if(!holder) + mainloc.visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") + cooldown = 2 + spawn(10) + process_cooldown() + return /obj/item/assembly/prox_sensor/activate() @@ -46,19 +62,6 @@ if(. && !istype(AM, /obj/effect/ir_beam) && AM.move_speed < 12) sense() -/obj/item/assembly/prox_sensor/sense() - var/turf/mainloc = get_turf(src) -// if(scanning && cooldown <= 0) -// mainloc.visible_message("[html_icon(src)] *boop* *boop*", "*boop* *boop*") - if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0 - pulse_device(0) - if(!holder) - mainloc.visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") - cooldown = 2 - spawn(10) - process_cooldown() - return - /obj/item/assembly/prox_sensor/Process() if(scanning) @@ -80,12 +83,6 @@ . = ..() addtimer(CALLBACK(src, PROC_REF(sense)), 0) -/obj/item/assembly/prox_sensor/toggle_scan() - if(!secured) return 0 - scanning = !scanning - update_icon() - return - /obj/item/assembly/prox_sensor/on_update_icon() . = ..() diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index aeb57facd84..bac9d7ec079 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -16,9 +16,6 @@ var/timing = 0 var/time = 10 -/obj/item/assembly/timer/proc/timer_end() - - /obj/item/assembly/timer/activate() if(!..()) return 0//Cooldown check @@ -39,7 +36,7 @@ return secured -/obj/item/assembly/timer/timer_end() +/obj/item/assembly/timer/proc/timer_end() if(!secured) return 0 pulse_device(0) if(!holder) From 4f98b9ced282a8ecff11227e5538b8321d9f2bfa Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:42:23 -0500 Subject: [PATCH 248/554] Make smokable extinguishing code more consistent --- code/modules/clothing/masks/smokable.dm | 45 +++++++++---------------- 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index 9d5c9cf1a9f..3612df6f718 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -158,6 +158,19 @@ STOP_PROCESSING(SSobj, src) set_light(0) update_icon() + remove_extension(src, /datum/extension/scent) + if (type_butt) + var/obj/item/trash/cigbutt/butt = new type_butt(get_turf(src)) + transfer_fingerprints_to(butt) + if(istype(butt) && butt.use_color) + butt.color = color + if(brand) + butt.desc += " This one is a [brand]." + if(ismob(loc)) + var/mob/living/M = loc + if (!no_message) + to_chat(M, SPAN_NOTICE("Your [name] goes out.")) + qdel(src) /obj/item/clothing/mask/smokable/attackby(var/obj/item/W, var/mob/user) if(W.isflamesource() || W.get_heat() >= T100C) @@ -221,22 +234,6 @@ if(is_processing) set_scent_by_reagents(src) -/obj/item/clothing/mask/smokable/extinguish_fire(mob/user, no_message = FALSE) - ..() - remove_extension(src, /datum/extension/scent) - if (type_butt) - var/obj/item/trash/cigbutt/butt = new type_butt(get_turf(src)) - transfer_fingerprints_to(butt) - if(istype(butt) && butt.use_color) - butt.color = color - if(brand) - butt.desc += " This one is a [brand]." - if(ismob(loc)) - var/mob/living/M = loc - if (!no_message) - to_chat(M, SPAN_NOTICE("Your [name] goes out.")) - qdel(src) - /obj/item/clothing/mask/smokable/cigarette/menthol name = "menthol cigarette" desc = "A cigarette with a little minty kick. Well, minty in theory." @@ -530,22 +527,10 @@ set_scent_by_reagents(src) update_icon() -/obj/item/clothing/mask/smokable/pipe/extinguish_fire(mob/user, no_message) - ..() - new /obj/effect/decal/cleanable/ash(get_turf(src)) - if(ismob(loc)) - var/mob/living/M = loc - if (!no_message) - to_chat(M, SPAN_NOTICE("Your [name] goes out, and you empty the ash.")) - remove_extension(src, /datum/extension/scent) - /obj/item/clothing/mask/smokable/pipe/attack_self(var/mob/user) - if(lit == 1) + if(lit) user.visible_message(SPAN_NOTICE("[user] puts out [src]."), SPAN_NOTICE("You put out [src].")) - lit = FALSE - update_icon() - STOP_PROCESSING(SSobj, src) - remove_extension(src, /datum/extension/scent) + extinguish_fire(user, no_message = TRUE) else if (smoketime) var/turf/location = get_turf(user) user.visible_message(SPAN_NOTICE("[user] empties out [src]."), SPAN_NOTICE("You empty out [src].")) From 3a5aaf766f43cf7128d9499799a5245f9cc881d8 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:43:51 -0500 Subject: [PATCH 249/554] Condense clothing OnDisguise overrides --- code/modules/clothing/_clothing_accessories.dm | 4 +++- code/modules/clothing/chameleon.dm | 11 ----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/code/modules/clothing/_clothing_accessories.dm b/code/modules/clothing/_clothing_accessories.dm index 81e9d41a80a..0469f605d01 100644 --- a/code/modules/clothing/_clothing_accessories.dm +++ b/code/modules/clothing/_clothing_accessories.dm @@ -216,7 +216,8 @@ accessory_visibility = clothes.accessory_visibility accessory_slowdown = clothes.accessory_slowdown mimicking_state_modifiers = TRUE - clothing_state_modifiers = clothes.clothing_state_modifiers?.Copy() + clothing_state_modifiers = clothes.clothing_state_modifiers?.Copy() + bodytype_equip_flags = clothes.bodytype_equip_flags else accessory_hide_on_states = get_initial_accessory_hide_on_states() accessory_slot = initial(accessory_slot) @@ -225,5 +226,6 @@ accessory_slowdown = initial(accessory_slowdown) mimicking_state_modifiers = FALSE clothing_state_modifiers = null + bodytype_equip_flags = initial(bodytype_equip_flags) update_clothing_state_toggles() diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 5132c8e2bc9..4a85cb47cef 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -22,17 +22,6 @@ flags_inv = copy.flags_inv set_gender(copy.gender) -/obj/item/clothing/OnDisguise(obj/item/copy, mob/user) - . = ..() - if(. && istype(copy, /obj/item/clothing)) - var/obj/item/clothing/clothing_copy = copy - bodytype_equip_flags = clothing_copy.bodytype_equip_flags - accessory_slot = clothing_copy.accessory_slot - accessory_removable = clothing_copy.accessory_removable - accessory_visibility = clothing_copy.accessory_visibility - accessory_slowdown = clothing_copy.accessory_slowdown - accessory_hide_on_states = clothing_copy.accessory_hide_on_states?.Copy() - /proc/generate_chameleon_choices(var/basetype) . = list() From 6e9683efb6dd3cfe74fdd4a0f86ce63fde1225eb Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:44:18 -0500 Subject: [PATCH 250/554] Fix non-chest lung organ subtypes not showing ruptures on scan --- code/modules/organs/external/diagnostics.dm | 3 +++ code/modules/organs/external/standard.dm | 6 ------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/code/modules/organs/external/diagnostics.dm b/code/modules/organs/external/diagnostics.dm index 2bc96bfa3fc..973c506b9fc 100644 --- a/code/modules/organs/external/diagnostics.dm +++ b/code/modules/organs/external/diagnostics.dm @@ -110,6 +110,9 @@ for(var/obj/item/organ/internal/augment/aug in internal_organs) if(istype(aug) && aug.known) . += "[capitalize(aug.name)] implanted" + var/obj/item/organ/internal/lungs/L = locate() in src + if( L && L.is_bruised()) + . += "Lung ruptured" /obj/item/organ/external/proc/inspect(mob/user) diff --git a/code/modules/organs/external/standard.dm b/code/modules/organs/external/standard.dm index d3ec8d68e7f..2beef64083b 100644 --- a/code/modules/organs/external/standard.dm +++ b/code/modules/organs/external/standard.dm @@ -23,12 +23,6 @@ /obj/item/organ/external/chest/proc/get_current_skin() return -/obj/item/organ/external/get_scan_results() - . = ..() - var/obj/item/organ/internal/lungs/L = locate() in src - if( L && L.is_bruised()) - . += "Lung ruptured" - /obj/item/organ/external/chest/die() //Special handling for synthetics if(BP_IS_PROSTHETIC(src) || BP_IS_CRYSTAL(src)) From 4bdf373dfd479c00a828933ff5e510bb1d14ff2e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 27 Dec 2024 11:39:14 +1100 Subject: [PATCH 251/554] Adding lantern fish and cave fish. --- .../game/objects/structures/barrels/barrel.dm | 2 +- code/game/objects/structures/barrels/cask.dm | 2 +- code/modules/butchery/butchery_data_fish.dm | 3 ++ .../butchery/butchery_products_meat_fish.dm | 11 ++++++++ .../hydroponics/plant_types/seeds_misc.dm | 12 ++++---- code/modules/hydroponics/seed_packets.dm | 2 +- .../simple_animal/aquatic/aquatic_fish.dm | 14 ++++++++++ code/modules/organs/internal/_internal.dm | 2 +- code/modules/organs/internal/brain.dm | 4 +-- .../modules/reagents/chems/chems_nutriment.dm | 13 --------- code/modules/reagents/chems/chems_oil.dm | 28 +++++++++++++++++++ .../reactions/reaction_recipe_food.dm | 2 +- .../reagents/reactions/reaction_synthesis.dm | 2 +- maps/shaded_hills/areas/grassland.dm | 10 +++++++ maps/shaded_hills/shaded_hills_map.dm | 2 +- nebula.dme | 1 + 16 files changed, 82 insertions(+), 28 deletions(-) create mode 100644 code/modules/reagents/chems/chems_oil.dm diff --git a/code/game/objects/structures/barrels/barrel.dm b/code/game/objects/structures/barrels/barrel.dm index 2f92b82e163..4b7f0d2e87c 100644 --- a/code/game/objects/structures/barrels/barrel.dm +++ b/code/game/objects/structures/barrels/barrel.dm @@ -110,4 +110,4 @@ /obj/structure/reagent_dispensers/barrel/ebony/oil/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/plant_oil, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/nutriment/oil/plant, reagents.maximum_volume) diff --git a/code/game/objects/structures/barrels/cask.dm b/code/game/objects/structures/barrels/cask.dm index 20acd049023..8a704ad55cf 100644 --- a/code/game/objects/structures/barrels/cask.dm +++ b/code/game/objects/structures/barrels/cask.dm @@ -39,4 +39,4 @@ /obj/structure/reagent_dispensers/barrel/cask/ebony/oil/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/plant_oil, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/nutriment/oil/plant, reagents.maximum_volume) diff --git a/code/modules/butchery/butchery_data_fish.dm b/code/modules/butchery/butchery_data_fish.dm index 1facebe1a93..f7f37c31878 100644 --- a/code/modules/butchery/butchery_data_fish.dm +++ b/code/modules/butchery/butchery_data_fish.dm @@ -11,6 +11,9 @@ gut_type = /obj/item/food/butchery/offal/small meat_flags = ALLERGEN_FISH +/decl/butchery_data/animal/fish/oily + meat_type = /obj/item/food/butchery/meat/fish/oily + /decl/butchery_data/animal/fish/small bone_amount = 1 skin_amount = 2 diff --git a/code/modules/butchery/butchery_products_meat_fish.dm b/code/modules/butchery/butchery_products_meat_fish.dm index f1e06223d09..8361c4af74c 100644 --- a/code/modules/butchery/butchery_products_meat_fish.dm +++ b/code/modules/butchery/butchery_products_meat_fish.dm @@ -16,6 +16,17 @@ slice_num = 3 butchery_data = /decl/butchery_data/animal/fish allergen_flags = ALLERGEN_FISH + var/oil_type = /decl/material/liquid/nutriment/oil/fish + var/oil_amount = 2 + +/obj/item/food/butchery/meat/fish/oily + nutriment_amt = 4 + oil_amount = 4 + +/obj/item/food/butchery/meat/fish/populate_reagents() + . = ..() + if(oil_type && oil_amount > 0) + add_to_reagents(oil_type, oil_amount) /obj/item/food/butchery/meat/fish/get_meat_icons() var/static/list/meat_icons = list( diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index b44099d3412..db5d4739d6d 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -4,7 +4,7 @@ display_name = "cotton patch" product_material = /decl/material/solid/organic/plantmatter/pith/husk chems = list( - /decl/material/liquid/nutriment/plant_oil = list(3,10), + /decl/material/liquid/nutriment/oil/plant = list(3,10), /decl/material/solid/organic/cloth = list(10,1) ) slice_product = null @@ -28,7 +28,7 @@ display_name = "flax patch" // Do we want linseed oil at some point? chems = list( - /decl/material/liquid/nutriment/plant_oil = list(5,12), + /decl/material/liquid/nutriment/oil/plant = list(5,12), /decl/material/solid/organic/cloth/linen = list(8,1) ) @@ -400,7 +400,7 @@ display_name = "hemp patch" mutants = null chems = list( - /decl/material/liquid/nutriment/plant_oil = list(3,10), + /decl/material/liquid/nutriment/oil/plant = list(3,10), /decl/material/solid/organic/cloth/hemp = list(8,1), /decl/material/liquid/nutriment = list(1) ) @@ -725,7 +725,7 @@ product_name = "sunflower" display_name = "sunflower patch" chems = list( - /decl/material/liquid/nutriment/plant_oil = list(10,10) + /decl/material/liquid/nutriment/oil/plant = list(10,10) ) /datum/seed/flower/sunflower/New() @@ -800,7 +800,7 @@ display_name = "peanut vine" chems = list( /decl/material/liquid/nutriment = list(1,10), - /decl/material/liquid/nutriment/plant_oil = list(1,10) + /decl/material/liquid/nutriment/oil/plant = list(1,10) ) slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -987,7 +987,7 @@ display_name = "soybean patch" chems = list( /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/nutriment/plant_oil = list(3,20), + /decl/material/liquid/nutriment/oil/plant = list(3,20), /decl/material/liquid/drink/milk/soymilk = list(7,20) ) grown_tag = "soybeans" diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index aca1014088d..d9033c86f84 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -26,7 +26,7 @@ /obj/item/seeds/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/plant_oil, 3) + add_to_reagents(/decl/material/liquid/nutriment/oil/plant, 3) /obj/item/seeds/get_single_monetary_worth() . = seed ? seed.get_monetary_value() : ..() diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm index 7b8f5b5f178..7de69b83944 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm @@ -16,6 +16,20 @@ name = "small fish" icon = 'icons/mob/simple_animal/fish_grump.dmi' +/mob/living/simple_animal/aquatic/fish/lantern + name = "lantern-fish" + desc = "An oily, glowing fish sometimes caught in cave rivers, rumoured to have cousins in the deep ocean." + // TODO: icon = 'icons/mob/simple_animal/fish_lantern.dmi' + butchery_data = /decl/butchery_data/animal/fish/oily + +/mob/living/simple_animal/aquatic/fish/cave + name = "blind cave fish" + desc = "A pale, blobby fish that lives its entire life in the cold darkness of cave rivers, and hence has no need for eyes." + // TODO: icon = 'icons/mob/simple_animal/fish_cave.dmi' + +/mob/living/simple_animal/aquatic/fish/cave/is_blind() + return TRUE + /mob/living/simple_animal/aquatic/fish/large name = "smallmouth bass" icon = 'icons/mob/simple_animal/fish_judge.dmi' diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index ac00fcf30e5..e8e076a057c 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -171,7 +171,7 @@ // We clamp/round here so that we don't accidentally heal past the threshold and // cheat our way into a full second threshold of healing. - damage = clamp(damage-get_organ_heal_amount(), min_heal_val, absolute_max_damage) + damage = clamp(damage - max(0, get_organ_heal_amount() * GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN)), min_heal_val, absolute_max_damage) // If we're within 1 damage of the nearest threshold (such as 0), round us down. // This should be removed when float-aware modulo comes in in 515, but for now is needed diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 32a4b6e1c2d..a26e424aba8 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -99,10 +99,10 @@ alert(owner, "You have taken massive brain damage! You will not be able to remember the events leading up to your injury.", "Brain Damaged") /obj/item/organ/internal/brain/organ_can_heal() - return (damage && owner && GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN)) || ..() + return (damage && owner && GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) > 0) || ..() /obj/item/organ/internal/brain/has_limited_healing() - return (!owner || !GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN)) && ..() + return (!owner || GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) <= 0) && ..() /obj/item/organ/internal/brain/get_organ_heal_amount() return 1 diff --git a/code/modules/reagents/chems/chems_nutriment.dm b/code/modules/reagents/chems/chems_nutriment.dm index 3ac879172e7..3b5567d3f36 100644 --- a/code/modules/reagents/chems/chems_nutriment.dm +++ b/code/modules/reagents/chems/chems_nutriment.dm @@ -62,19 +62,6 @@ uid = "chem_nutriment_plant" allergen_flags = ALLERGEN_VEGETABLE -/decl/material/liquid/nutriment/plant_oil - name = "plant oil" - lore_text = "A thin yellow oil pressed from vegetables or nuts. Useful as fuel, or in cooking." - uid = "chem_nutriment_plant_oil" - melting_point = 273 - boiling_point = 373 - taste_description = "oily blandness" - burn_product = /decl/material/gas/carbon_monoxide - ignition_point = T0C+150 - accelerant_value = FUEL_VALUE_ACCELERANT - gas_flags = XGM_GAS_FUEL - allergen_flags = ALLERGEN_VEGETABLE - /decl/material/liquid/nutriment/honey name = "honey" lore_text = "A golden yellow syrup, loaded with sugary sweetness." diff --git a/code/modules/reagents/chems/chems_oil.dm b/code/modules/reagents/chems/chems_oil.dm new file mode 100644 index 00000000000..5395daacc11 --- /dev/null +++ b/code/modules/reagents/chems/chems_oil.dm @@ -0,0 +1,28 @@ +/decl/material/liquid/nutriment/oil + abstract_type = /decl/material/liquid/nutriment/oil + burn_product = /decl/material/gas/carbon_monoxide + ignition_point = T0C+150 + accelerant_value = FUEL_VALUE_ACCELERANT + gas_flags = XGM_GAS_FUEL + melting_point = 273 + boiling_point = 373 + +/decl/material/liquid/nutriment/oil/plant + name = "plant oil" + lore_text = "A thin yellow oil pressed from vegetables or nuts. Useful as fuel, or in cooking." + uid = "chem_nutriment_plant_oil" + taste_description = "oily blandness" + allergen_flags = ALLERGEN_VEGETABLE + +/decl/material/liquid/nutriment/oil/fish + name = "fish oil" + lore_text = "A pungent yellow oil pressed from fish meat and fish skin. Useful as fuel, or in cooking, or for encouraging recovery after brain injuries." + uid = "chem_nutriment_fish_oil" + taste_description = "pungent, oily fish" + allergen_flags = ALLERGEN_FISH + +// Copied from neuroannealer; yes, it's silly, but we need a way to treat brain damage on the medieval map. +// Should possibly be an ingredient rather than the be-all end-all medication. +/decl/material/liquid/nutriment/oil/fish/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) + . = ..() + M.add_chemical_effect(CE_BRAIN_REGEN, 0.5) // Half as effective as neuroannealer, without the side-effects. diff --git a/code/modules/reagents/reactions/reaction_recipe_food.dm b/code/modules/reagents/reactions/reaction_recipe_food.dm index 0900c6d5c2e..ef99755711d 100644 --- a/code/modules/reagents/reactions/reaction_recipe_food.dm +++ b/code/modules/reagents/reactions/reaction_recipe_food.dm @@ -58,7 +58,7 @@ name = "Enzyme Margarine" required_reagents = list( /decl/material/solid/sodiumchloride = 1, - /decl/material/liquid/nutriment/plant_oil = 20 + /decl/material/liquid/nutriment/oil/plant = 20 ) catalysts = list(/decl/material/liquid/enzyme = 5) mix_message = "The solution thickens and curdles into a pale yellow solid." diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index c70444faff8..d12783c8f7a 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -130,7 +130,7 @@ required_reagents = list( /decl/material/solid/carbon/ashes = 5, /decl/material/liquid/water = 5, - /decl/material/liquid/nutriment/plant_oil = 10 + /decl/material/liquid/nutriment/oil/plant = 10 ) result_amount = 1 mix_message = "The solution thickens and solidifies." diff --git a/maps/shaded_hills/areas/grassland.dm b/maps/shaded_hills/areas/grassland.dm index 46c25332644..3fa264b4392 100644 --- a/maps/shaded_hills/areas/grassland.dm +++ b/maps/shaded_hills/areas/grassland.dm @@ -53,6 +53,16 @@ area_blurb_category = /area/shaded_hills/caves sound_env = CAVE area_flags = AREA_FLAG_IS_BACKGROUND + fishing_results = list( + /mob/living/simple_animal/aquatic/fish/cave = 13 + /mob/living/simple_animal/aquatic/fish/lantern = 7 + /obj/item/mollusc = 5, + /obj/item/mollusc/barnacle/fished = 5, + /obj/item/mollusc/clam/fished/pearl = 3, + /obj/item/trash/mollusc_shell/clam = 1, + /obj/item/trash/mollusc_shell/barnacle = 1, + /obj/item/trash/mollusc_shell = 1 + ) /area/shaded_hills/caves/deep name = "\improper Deep Caverns" diff --git a/maps/shaded_hills/shaded_hills_map.dm b/maps/shaded_hills/shaded_hills_map.dm index 5e3cda3b8bc..0b545c07a61 100644 --- a/maps/shaded_hills/shaded_hills_map.dm +++ b/maps/shaded_hills/shaded_hills_map.dm @@ -1,5 +1,5 @@ /datum/map/shaded_hills - default_liquid_fuel_type = /decl/material/liquid/nutriment/plant_oil + default_liquid_fuel_type = /decl/material/liquid/nutriment/oil/plant default_species = SPECIES_KOBALOI loadout_categories = list( /decl/loadout_category/fantasy/clothing, diff --git a/nebula.dme b/nebula.dme index c08cae0b5a9..dcafae477c0 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3605,6 +3605,7 @@ #include "code\modules\reagents\chems\chems_herbal.dm" #include "code\modules\reagents\chems\chems_medicines.dm" #include "code\modules\reagents\chems\chems_nutriment.dm" +#include "code\modules\reagents\chems\chems_oil.dm" #include "code\modules\reagents\chems\chems_painkillers.dm" #include "code\modules\reagents\chems\chems_pigments.dm" #include "code\modules\reagents\chems\chems_poisons.dm" From 3863d0886a65a602734e1cbadf56684b0634edb3 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:10:50 -0500 Subject: [PATCH 252/554] Move oldpod ruin into corporate modpack --- mods/content/corporate/_corporate.dme | 1 + .../corporate}/random_ruins/exoplanet_ruins/oldpod/oldpod.dm | 3 +-- .../corporate}/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm | 0 nebula.dme | 1 - 4 files changed, 2 insertions(+), 3 deletions(-) rename {maps => mods/content/corporate}/random_ruins/exoplanet_ruins/oldpod/oldpod.dm (87%) rename {maps => mods/content/corporate}/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm (100%) diff --git a/mods/content/corporate/_corporate.dme b/mods/content/corporate/_corporate.dme index 3a62ba3a912..5a30646d264 100644 --- a/mods/content/corporate/_corporate.dme +++ b/mods/content/corporate/_corporate.dme @@ -43,6 +43,7 @@ #include "items\stamps.dm" #include "items\wristcomp.dm" #include "machines\machines.dm" +#include "random_ruins\exoplanet_ruins\oldpod\oldpod.dm" #include "structures\lockers.dm" // END_INCLUDE #endif diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dm b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dm similarity index 87% rename from maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dm rename to mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dm index 0ea139fdbc7..4175cd8f17c 100644 --- a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dm +++ b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dm @@ -1,8 +1,7 @@ -#include "../../../../mods/content/corporate/_corporate.dme" - /datum/map_template/ruin/exoplanet/oldpod name = "old pod" description = "A now unused, crashed escape pod." + prefix = "mods/content/corporate/random_ruins/exoplanet_ruins/" suffixes = list("oldpod/oldpod.dmm") cost = 0.5 template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm similarity index 100% rename from maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm rename to mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm diff --git a/nebula.dme b/nebula.dme index 3547855884a..85539f1a37f 100644 --- a/nebula.dme +++ b/nebula.dme @@ -4129,7 +4129,6 @@ #include "maps\random_ruins\exoplanet_ruins\marooned\marooned.dm" #include "maps\random_ruins\exoplanet_ruins\monoliths\monoliths.dm" #include "maps\random_ruins\exoplanet_ruins\oasis\oasis.dm" -#include "maps\random_ruins\exoplanet_ruins\oldpod\oldpod.dm" #include "maps\random_ruins\exoplanet_ruins\radshrine\radshrine.dm" #include "maps\random_ruins\exoplanet_ruins\spider_nest\spider_nest.dm" #include "maps\random_ruins\exoplanet_ruins\tar_anomaly\tar_anomaly.dm" From d5bee9b4dea38890490664fbf6b020bca9b3cf42 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:33:03 -0500 Subject: [PATCH 253/554] Make the game compile without the corporate modpack included --- .../objects/items/devices/radio/headsets_shared.dm | 12 ++++++++++++ code/game/objects/random/subtypes/maintenance.dm | 5 ----- .../crates_lockers/closets/secure/scientist.dm | 4 +++- maps/example/example_unit_testing.dm | 8 ++++++++ maps/ministation/ministation_define.dm | 2 -- maps/ministation/ministation_overrides.dm | 4 ++++ mods/content/corporate/_corporate.dme | 1 + mods/content/corporate/datum/antagonists/commando.dm | 12 ------------ mods/content/corporate/items/random.dm | 10 ++++++++++ mods/content/corporate/structures/lockers.dm | 3 +++ 10 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 mods/content/corporate/items/random.dm diff --git a/code/game/objects/items/devices/radio/headsets_shared.dm b/code/game/objects/items/devices/radio/headsets_shared.dm index c591cb4a83a..6c5551ea983 100644 --- a/code/game/objects/items/devices/radio/headsets_shared.dm +++ b/code/game/objects/items/devices/radio/headsets_shared.dm @@ -221,6 +221,18 @@ encryption_keys = list(/obj/item/encryptionkey/raider) analog_secured = list((access_raider) = TRUE) +/obj/item/encryptionkey/hacked + can_decrypt = list(access_hacked) + origin_tech = @'{"esoteric":3}' + +/obj/item/encryptionkey/hacked/Initialize(ml, material_key) + . = ..() + can_decrypt |= get_all_station_access() + +/obj/item/radio/headset/hacked + origin_tech = @'{"esoteric":3}' + encryption_keys = list(/obj/item/encryptionkey/hacked) + // Bowman alts /obj/item/radio/headset/headset_mining/bowman name = "mining bowman radio headset" diff --git a/code/game/objects/random/subtypes/maintenance.dm b/code/game/objects/random/subtypes/maintenance.dm index 0df746fd50a..b141867e7e1 100644 --- a/code/game/objects/random/subtypes/maintenance.dm +++ b/code/game/objects/random/subtypes/maintenance.dm @@ -209,14 +209,10 @@ something, make sure it's not in one of the other lists.*/ var/static/list/spawnable_choices = list( /obj/random/maintenance/clean = 320, /obj/item/clothing/head/soft/sec = 4, - /obj/item/clothing/head/soft/sec/corp = 4, /obj/item/backpack/security = 3, /obj/item/backpack/satchel/sec = 3, /obj/item/clothing/shoes/jackboots = 3, /obj/item/clothing/suit/armor/vest = 3, - /obj/item/clothing/head/beret/corp/sec = 3, - /obj/item/clothing/head/beret/corp/sec/corporate/hos = 3, - /obj/item/clothing/head/beret/corp/sec/navy/officer = 3, /obj/item/flashlight/maglight = 2, /obj/item/flash = 2, /obj/item/clothing/mask/balaclava = 2, @@ -226,7 +222,6 @@ something, make sure it's not in one of the other lists.*/ /obj/item/belt/security = 2, /obj/item/clothing/glasses/hud/security = 2, /obj/item/clothing/head/helmet = 2, - /obj/item/clothing/suit/armor/vest/security = 2, /obj/item/clothing/webbing/drop_pouches/black = 2, /obj/item/clothing/head/earmuffs = 2, /obj/item/handcuffs = 2, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 710f7d92d05..806048ba7a1 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -64,12 +64,14 @@ /obj/structure/closet/secure_closet/pilot name = "pilot locker" req_access = list(access_xenobiology) + /// The jumpsuit type spawned for this locker. Exists to be overridden by the corporate modpack, which adds pilot jumpsuits. + var/jumpsuit_type = /obj/item/clothing/jumpsuit/white /obj/structure/closet/secure_closet/pilot/WillContain() return list( /obj/item/backpack/parachute, /obj/item/knife/utility, - /obj/item/clothing/jumpsuit/pilot, + jumpsuit_type, /obj/item/clothing/suit/jacket/bomber, /obj/item/clothing/mask/gas/half, /obj/item/clothing/shoes/color/black, diff --git a/maps/example/example_unit_testing.dm b/maps/example/example_unit_testing.dm index 6c4c9380ab3..df857c78a41 100644 --- a/maps/example/example_unit_testing.dm +++ b/maps/example/example_unit_testing.dm @@ -9,3 +9,11 @@ /obj/abstract/map_data/example height = 3 + +// Enforce that this map must not have any modpacks, to ensure core code compiles on its own. +// I'd do this in setup_map on the example map datum but that happens before modpack init. +// This catches any modpacks accidentally included by core code, default away sites, space/planet ruin maps, etc. +/datum/controller/subsystem/modpacks/Initialize() + . = ..() + if(length(loaded_modpacks)) + CRASH("Example map had the following modpacks loaded: [json_encode(loaded_modpacks)]") \ No newline at end of file diff --git a/maps/ministation/ministation_define.dm b/maps/ministation/ministation_define.dm index d415969ed0b..b47a6b47024 100644 --- a/maps/ministation/ministation_define.dm +++ b/maps/ministation/ministation_define.dm @@ -13,8 +13,6 @@ company_name = "Tradehouse Administration" company_short = "Admin" - default_law_type = /datum/ai_laws/nanotrasen - lobby_screens = list('maps/ministation/ministation_lobby.png') overmap_ids = list(OVERMAP_ID_SPACE) diff --git a/maps/ministation/ministation_overrides.dm b/maps/ministation/ministation_overrides.dm index 508fbdaab31..709065f74aa 100644 --- a/maps/ministation/ministation_overrides.dm +++ b/maps/ministation/ministation_overrides.dm @@ -8,3 +8,7 @@ /datum/computer_file/program/wordprocessor, /datum/computer_file/program/supply ) + +// This has to be here rather than ministation_define.dm because it's from a modpack. +/datum/map/ministation + default_law_type = /datum/ai_laws/nanotrasen \ No newline at end of file diff --git a/mods/content/corporate/_corporate.dme b/mods/content/corporate/_corporate.dme index 5a30646d264..75a782ae63c 100644 --- a/mods/content/corporate/_corporate.dme +++ b/mods/content/corporate/_corporate.dme @@ -40,6 +40,7 @@ #include "items\cups.dm" #include "items\documents.dm" #include "items\medals.dm" +#include "items\random.dm" #include "items\stamps.dm" #include "items\wristcomp.dm" #include "machines\machines.dm" diff --git a/mods/content/corporate/datum/antagonists/commando.dm b/mods/content/corporate/datum/antagonists/commando.dm index f36ce069786..3aac5874e4b 100644 --- a/mods/content/corporate/datum/antagonists/commando.dm +++ b/mods/content/corporate/datum/antagonists/commando.dm @@ -26,15 +26,3 @@ /obj/item/gun/energy/laser, /obj/item/energy_blade/sword ) - -/obj/item/encryptionkey/hacked - can_decrypt = list(access_hacked) - origin_tech = @'{"esoteric":3}' - -/obj/item/encryptionkey/hacked/Initialize(ml, material_key) - . = ..() - can_decrypt |= get_all_station_access() - -/obj/item/radio/headset/hacked - origin_tech = @'{"esoteric":3}' - encryption_keys = list(/obj/item/encryptionkey/hacked) diff --git a/mods/content/corporate/items/random.dm b/mods/content/corporate/items/random.dm new file mode 100644 index 00000000000..54dde92f9ce --- /dev/null +++ b/mods/content/corporate/items/random.dm @@ -0,0 +1,10 @@ +/obj/random/maintenance/security/spawn_choices() + var/static/injected = FALSE + . = ..() + if(!injected) + .[/obj/item/clothing/head/soft/sec/corp] = 4 + .[/obj/item/clothing/head/beret/corp/sec] = 3 + .[/obj/item/clothing/head/beret/corp/sec/corporate/hos] = 3 + .[/obj/item/clothing/head/beret/corp/sec/navy/officer] = 3 + .[/obj/item/clothing/suit/armor/vest/security] = 2 + injected = TRUE \ No newline at end of file diff --git a/mods/content/corporate/structures/lockers.dm b/mods/content/corporate/structures/lockers.dm index 33c3cbf1eab..5116f72e02c 100644 --- a/mods/content/corporate/structures/lockers.dm +++ b/mods/content/corporate/structures/lockers.dm @@ -51,3 +51,6 @@ /obj/structure/closet/secure_closet/hop/WillContain() . = ..() + /obj/item/clothing/suit/armor/vest/nt + +/obj/structure/closet/secure_closet/pilot + jumpsuit_type = /obj/item/clothing/jumpsuit/pilot \ No newline at end of file From c97f7bcd82bd82fc4e5d94bf115bba5681ed13c3 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:39:54 -0500 Subject: [PATCH 254/554] Fix mispathed proc overrides --- .../admin/secrets/fun_secrets/waddle.dm | 2 +- code/modules/augment/passive/boost/shooting.dm | 6 +++--- .../butchery/butchery_products_meat_fish.dm | 2 +- code/modules/clothing/suits/jackets/hoodies.dm | 7 ------- code/modules/detectivework/tools/storage.dm | 6 +++--- .../planet_themes/ruined_city.dm | 2 +- .../solids/materials_solid_mineral.dm | 2 +- .../mob/living/simple_animal/hostile/leech.dm | 2 +- code/modules/overmap/ships/landable.dm | 2 +- code/modules/paperwork/filingcabinet.dm | 4 ++-- code/modules/random_map/drop/drop_types.dm | 18 +++--------------- .../reagents/chems/random/random_effects.dm | 4 ++-- .../reagents/reagent_containers/spray.dm | 2 +- code/modules/vehicles/engine.dm | 2 +- code/modules/weather/weather_fsm_states.dm | 2 +- .../finds/find_types/weapons.dm | 4 ++-- 16 files changed, 24 insertions(+), 43 deletions(-) diff --git a/code/modules/admin/secrets/fun_secrets/waddle.dm b/code/modules/admin/secrets/fun_secrets/waddle.dm index ea7bbd58889..90c663b5a82 100644 --- a/code/modules/admin/secrets/fun_secrets/waddle.dm +++ b/code/modules/admin/secrets/fun_secrets/waddle.dm @@ -35,7 +35,7 @@ events_repository.register(/decl/observ/moved, holder, src, PROC_REF(waddle)) events_repository.register(/decl/observ/destroyed, holder, src, PROC_REF(qdel_self)) -/datum/extension/event_registration/Destroy() +/datum/extension/waddle/Destroy() events_repository.unregister(/decl/observ/destroyed, holder, src) events_repository.unregister(/decl/observ/moved, holder, src) return ..() diff --git a/code/modules/augment/passive/boost/shooting.dm b/code/modules/augment/passive/boost/shooting.dm index 59ca29796cb..33306ef9f56 100644 --- a/code/modules/augment/passive/boost/shooting.dm +++ b/code/modules/augment/passive/boost/shooting.dm @@ -6,16 +6,16 @@ material = /decl/material/solid/metal/steel origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' -/obj/item/organ/internal/augment/boost/reflex/reset_matter() +/obj/item/organ/internal/augment/boost/shooting/reset_matter() matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) -/obj/item/organ/internal/augment/boost/reflex/buff() +/obj/item/organ/internal/augment/boost/shooting/buff() if((. = ..())) to_chat(owner, SPAN_NOTICE("Notice: AIM-4 finished reboot.")) -/obj/item/organ/internal/augment/boost/reflex/debuff() +/obj/item/organ/internal/augment/boost/shooting/debuff() if((. = ..())) to_chat(owner, SPAN_WARNING("Catastrophic damage detected: AIM-4 shutting down.")) \ No newline at end of file diff --git a/code/modules/butchery/butchery_products_meat_fish.dm b/code/modules/butchery/butchery_products_meat_fish.dm index f1e06223d09..a802907bdc6 100644 --- a/code/modules/butchery/butchery_products_meat_fish.dm +++ b/code/modules/butchery/butchery_products_meat_fish.dm @@ -52,7 +52,7 @@ . = ..() SetName("grilled [name]") -/obj/item/food/butchery/meat/fish/get_meat_icons() +/obj/item/food/butchery/meat/fish/grilled/get_meat_icons() var/static/list/meat_icons = list( 'icons/obj/food/butchery/fish_grilled.dmi' ) diff --git a/code/modules/clothing/suits/jackets/hoodies.dm b/code/modules/clothing/suits/jackets/hoodies.dm index fcbd38712c8..adfd915c60a 100644 --- a/code/modules/clothing/suits/jackets/hoodies.dm +++ b/code/modules/clothing/suits/jackets/hoodies.dm @@ -18,13 +18,6 @@ desc = "A warm, black sweatshirt." color = COLOR_DARK_GRAY -/obj/item/clothing/suit/jacket/hoodie/get_assumed_clothing_state_modifiers() - var/static/list/expected_state_modifiers = list( - GET_DECL(/decl/clothing_state_modifier/buttons), - GET_DECL(/decl/clothing_state_modifier/hood) - ) - return expected_state_modifiers - /obj/item/clothing/head/hoodiehood name = "hoodie hood" desc = "A hood attached to a warm sweatshirt." diff --git a/code/modules/detectivework/tools/storage.dm b/code/modules/detectivework/tools/storage.dm index de56ab7d3de..30e553fef61 100644 --- a/code/modules/detectivework/tools/storage.dm +++ b/code/modules/detectivework/tools/storage.dm @@ -3,7 +3,7 @@ desc = "Sterilized equipment within. Do not contaminate." icon = 'icons/obj/forensics.dmi' icon_state = "dnakit" - + /obj/item/box/swabs/WillContain() return list(/obj/item/forensics/sample/swab = DEFAULT_BOX_STORAGE) @@ -11,7 +11,7 @@ name = "evidence bag box" desc = "A box claiming to contain evidence bags." -/obj/item/box/swabs/WillContain() +/obj/item/box/evidence/WillContain() return list(/obj/item/evidencebag = 7) /obj/item/box/fingerprints @@ -20,5 +20,5 @@ icon = 'icons/obj/forensics.dmi' icon_state = "dnakit" -/obj/item/box/swabs/WillContain() +/obj/item/box/fingerprints/WillContain() return list(/obj/item/forensics/sample/print = DEFAULT_BOX_STORAGE) diff --git a/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm b/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm index b8e70d839d6..221ee935055 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_themes/ruined_city.dm @@ -15,7 +15,7 @@ 'sound/ambience/ominous3.ogg' ) -/datum/exoplanet_theme/robotic_guardians/modify_template_whitelist(whitelist_flags) +/datum/exoplanet_theme/ruined_city/modify_template_whitelist(whitelist_flags) return whitelist_flags | TEMPLATE_TAG_ALIEN /datum/exoplanet_theme/ruined_city/get_map_generators(/datum/planetoid_data/E) diff --git a/code/modules/materials/definitions/solids/materials_solid_mineral.dm b/code/modules/materials/definitions/solids/materials_solid_mineral.dm index 2be84c6c5df..8302ac13a99 100644 --- a/code/modules/materials/definitions/solids/materials_solid_mineral.dm +++ b/code/modules/materials/definitions/solids/materials_solid_mineral.dm @@ -181,7 +181,7 @@ /decl/material/solid/potassium = 1 ) -/decl/material/solid/potassium/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/solid/potash/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() var/volume = REAGENT_VOLUME(holder, type) if(volume > 3) diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index ea81aa10124..c8f7259babc 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -17,7 +17,7 @@ /datum/mob_controller/aggressive/leech break_stuff_probability = 5 -/mob/living/simple_animal/hostile/can_pry_door() +/mob/living/simple_animal/hostile/leech/can_pry_door() return FALSE /mob/living/simple_animal/hostile/leech/exoplanet/Initialize() diff --git a/code/modules/overmap/ships/landable.dm b/code/modules/overmap/ships/landable.dm index e2d698ecdb7..375e4253ec2 100644 --- a/code/modules/overmap/ships/landable.dm +++ b/code/modules/overmap/ships/landable.dm @@ -324,7 +324,7 @@ port_tag = new_port_tag . = ..() -/obj/abstract/local_dock/automatic/modify_mapped_vars(map_hash) +/obj/abstract/local_dock/modify_mapped_vars(map_hash) . = ..() ADJUST_TAG_VAR(port_tag, map_hash) ADJUST_TAG_VAR(dock_target, map_hash) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index e6014e8f4f7..07771782936 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -120,11 +120,11 @@ . += "Details: [record.get_medical_record()]" return jointext(., "
    ") -/obj/structure/filing_cabinet/records/medical +/obj/structure/filing_cabinet/records/employment name = "employment record archive" archive_name = "employment record" -/obj/structure/filing_cabinet/records/medical/collate_data(var/datum/computer_file/report/crew_record/record) +/obj/structure/filing_cabinet/records/employment/collate_data(var/datum/computer_file/report/crew_record/record) . = list() . += "Name: [record.get_name()]" . += "Gender: [record.get_gender()]" diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index d517a217017..a9f290a0aa6 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -51,18 +51,6 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/gun/projectile/automatic/smg, /obj/item/gun/projectile/automatic/assault_rifle) -/datum/supply_drop_loot/ballistics - name = "Ballistics" - container = /obj/structure/largecrate -/datum/supply_drop_loot/ballistics/New() - ..() - contents = list( - /obj/item/gun/projectile/pistol, - /obj/item/gun/projectile/shotgun/doublebarrel, - /obj/item/gun/projectile/shotgun/pump, - /obj/item/gun/projectile/automatic/smg, - /obj/item/gun/projectile/automatic/assault_rifle) - /datum/supply_drop_loot/seeds name = "Seeds" container = /obj/structure/closet/crate @@ -158,10 +146,10 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/box/syringes, /obj/item/box/autoinjectors) -/datum/supply_drop_loot/power - name = "Power" +/datum/supply_drop_loot/materials + name = "Materials" container = /obj/structure/largecrate -/datum/supply_drop_loot/power/New() +/datum/supply_drop_loot/materials/New() ..() contents = list( /obj/item/stack/material/sheet/mapped/steel, diff --git a/code/modules/reagents/chems/random/random_effects.dm b/code/modules/reagents/chems/random/random_effects.dm index af118872c97..0ef001eb16a 100644 --- a/code/modules/reagents/chems/random/random_effects.dm +++ b/code/modules/reagents/chems/random/random_effects.dm @@ -227,7 +227,7 @@ mode = RANDOM_CHEM_EFFECT_INT desc = "acute toxicity" -/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/removed, var/value) +/decl/random_chem_effect/random_properties/tox_damage/affect_blood(var/mob/living/M, var/removed, var/value) M.take_damage(value * removed, TOX) /decl/random_chem_effect/random_properties/heal_brute @@ -243,7 +243,7 @@ maximum = 10 desc = "burn repair" -/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/removed, var/value) +/decl/random_chem_effect/random_properties/heal_burns/affect_blood(var/mob/living/M, var/removed, var/value) M.heal_organ_damage(0, removed * value) #undef RANDOM_CHEM_EFFECT_TRUE diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 2df686595f8..f2079ac4214 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -109,7 +109,7 @@ if(has_safety() && distance <= 1) to_chat(user, "The safety is [safety ? "on" : "off"].") -/obj/item/chems/get_alt_interactions(mob/user) +/obj/item/chems/spray/get_alt_interactions(mob/user) . = ..() LAZYADD(., /decl/interaction_handler/empty/chems) LAZYADD(., /decl/interaction_handler/next_spray_amount) diff --git a/code/modules/vehicles/engine.dm b/code/modules/vehicles/engine.dm index b9dbc2f8f5a..56477903019 100644 --- a/code/modules/vehicles/engine.dm +++ b/code/modules/vehicles/engine.dm @@ -137,5 +137,5 @@ /obj/item/engine/thermal/rev_engine(var/atom/movable/M) M.audible_message("\The [M] rumbles to life.") -/obj/item/engine/electric/putter(var/atom/movable/M) +/obj/item/engine/thermal/putter(var/atom/movable/M) M.audible_message("\The [M] putters before turning off.") \ No newline at end of file diff --git a/code/modules/weather/weather_fsm_states.dm b/code/modules/weather/weather_fsm_states.dm index 6c80309d357..ca38c75279a 100644 --- a/code/modules/weather/weather_fsm_states.dm +++ b/code/modules/weather/weather_fsm_states.dm @@ -129,7 +129,7 @@ /decl/state_transition/weather/snow_heavy ) -/decl/state/weather/snow/heavy/adjust_temperature(initial_temperature) +/decl/state/weather/snow/medium/adjust_temperature(initial_temperature) return min(initial_temperature - 25, T0C) /decl/state/weather/snow/heavy diff --git a/code/modules/xenoarcheaology/finds/find_types/weapons.dm b/code/modules/xenoarcheaology/finds/find_types/weapons.dm index 73db85aeca5..b593cece25d 100644 --- a/code/modules/xenoarcheaology/finds/find_types/weapons.dm +++ b/code/modules/xenoarcheaology/finds/find_types/weapons.dm @@ -18,7 +18,7 @@ "It doesn't look safe.", "It looks wickedly jagged.", "There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along the edges.") - + /decl/archaeological_find/knife/new_icon() return pick(knife_icons) @@ -46,7 +46,7 @@ modification_flags = XENOFIND_APPLY_DECOR possible_types = list(/obj/item/beartrap) -/decl/archaeological_find/knife/generate_name() +/decl/archaeological_find/trap/generate_name() return "[pick("wicked","evil","byzantine","dangerous")] looking [pick("device","contraption","thing","trap")]" /decl/archaeological_find/trap/get_additional_description() From dea3f36ba359f47e4edabb7acc3caa5229a4c699 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 26 Dec 2024 22:41:18 -0500 Subject: [PATCH 255/554] Remove accidental duplicate proc overrides --- .../reagents/reactions/reaction_synthesis.dm | 3 --- code/modules/recycling/disposalpipe.dm | 23 ------------------- .../real_instruments/Violin/violin.dm | 3 --- 3 files changed, 29 deletions(-) diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index 90f7a0e1957..1c8182d7a49 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -28,9 +28,6 @@ var/decl/material/mat = GET_DECL(/decl/material/solid/fiberglass) mat.create_object(location, created_volume) -/decl/chemical_reaction/synthesis/crystalization/can_happen(datum/reagents/holder) - . = ..() && length(holder.reagent_volumes) > 1 - /decl/chemical_reaction/synthesis/crystalization name = "Crystalization" required_reagents = list(/decl/material/liquid/crystal_agent = 1) diff --git a/code/modules/recycling/disposalpipe.dm b/code/modules/recycling/disposalpipe.dm index 60401186373..e035da8b825 100644 --- a/code/modules/recycling/disposalpipe.dm +++ b/code/modules/recycling/disposalpipe.dm @@ -232,29 +232,6 @@ qdel(src) -// pipe is deleted -// ensure if holder is present, it is expelled -/obj/structure/disposalpipe/Destroy() - var/obj/structure/disposalholder/H = locate() in src - if(H) - // holder was present - H.active = 0 - var/turf/T = src.loc - if(T.density) - // deleting pipe is inside a dense turf (wall) - // this is unlikely, but just dump out everything into the turf in case - - for(var/atom/movable/AM in H) - AM.forceMove(T) - AM.pipe_eject(0) - qdel(H) - return ..() - - // otherwise, do normal expel from turf - if(H) - expel(H, T, 0) - . = ..() - /obj/structure/disposalpipe/hides_under_flooring() return 1 diff --git a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm index d73ee46400a..fe47cd2d560 100644 --- a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm +++ b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm @@ -10,6 +10,3 @@ path = /datum/instrument/obsolete/violin material = /decl/material/solid/organic/wood matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) - -/obj/structure/synthesized_instrument/synthesizer/shouldStopPlaying(mob/user) - return !(src && in_range(src, user)) \ No newline at end of file From dc8f1400ef6830eaa63395d337b9041058f0062c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 27 Dec 2024 02:17:43 -0500 Subject: [PATCH 256/554] Move ERT RIGs out of corporate modpack --- .../rigs/ert}/asset_protection/boots.dmi | Bin .../rigs/ert}/asset_protection/chest.dmi | Bin .../rigs/ert}/asset_protection/gloves.dmi | Bin .../rigs/ert}/asset_protection/helmet.dmi | Bin .../rigs/ert}/asset_protection/rig.dmi | Bin .../clothing/rigs/ert}/commander/boots.dmi | Bin .../clothing/rigs/ert}/commander/chest.dmi | Bin .../clothing/rigs/ert}/commander/gloves.dmi | Bin .../clothing/rigs/ert}/commander/helmet.dmi | Bin .../clothing/rigs/ert}/commander/rig.dmi | Bin .../clothing/rigs/ert}/engineer/boots.dmi | Bin .../clothing/rigs/ert}/engineer/chest.dmi | Bin .../clothing/rigs/ert}/engineer/gloves.dmi | Bin .../clothing/rigs/ert}/engineer/helmet.dmi | Bin .../clothing/rigs/ert}/engineer/rig.dmi | Bin .../clothing/rigs/ert}/janitor/boots.dmi | Bin .../clothing/rigs/ert}/janitor/chest.dmi | Bin .../clothing/rigs/ert}/janitor/gloves.dmi | Bin .../clothing/rigs/ert}/janitor/helmet.dmi | Bin .../clothing/rigs/ert}/janitor/rig.dmi | Bin .../clothing/rigs/ert}/medic/boots.dmi | Bin .../clothing/rigs/ert}/medic/chest.dmi | Bin .../clothing/rigs/ert}/medic/gloves.dmi | Bin .../clothing/rigs/ert}/medic/helmet.dmi | Bin .../clothing/rigs/ert}/medic/rig.dmi | Bin .../clothing/rigs/ert}/security/boots.dmi | Bin .../clothing/rigs/ert}/security/chest.dmi | Bin .../clothing/rigs/ert}/security/gloves.dmi | Bin .../clothing/rigs/ert}/security/helmet.dmi | Bin .../clothing/rigs/ert}/security/rig.dmi | Bin maps/antag_spawn/ert/ert.dm | 5 +- maps/antag_spawn/ert/ert_base.dmm | 54 ++++++---------- .../ert.dm => maps/antag_spawn/ert/rig.dm | 60 +++++++++--------- mods/content/corporate/_corporate.dme | 1 - 34 files changed, 53 insertions(+), 67 deletions(-) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/asset_protection/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/asset_protection/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/asset_protection/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/asset_protection/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/asset_protection/rig.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/commander/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/commander/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/commander/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/commander/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/commander/rig.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/engineer/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/engineer/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/engineer/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/engineer/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/engineer/rig.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/janitor/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/janitor/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/janitor/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/janitor/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/janitor/rig.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/medic/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/medic/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/medic/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/medic/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/medic/rig.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/security/boots.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/security/chest.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/security/gloves.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/security/helmet.dmi (100%) rename {mods/content/corporate/icons/rigs => icons/clothing/rigs/ert}/security/rig.dmi (100%) rename mods/content/corporate/clothing/rigs/ert.dm => maps/antag_spawn/ert/rig.dm (78%) diff --git a/mods/content/corporate/icons/rigs/asset_protection/boots.dmi b/icons/clothing/rigs/ert/asset_protection/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/boots.dmi rename to icons/clothing/rigs/ert/asset_protection/boots.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/chest.dmi b/icons/clothing/rigs/ert/asset_protection/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/chest.dmi rename to icons/clothing/rigs/ert/asset_protection/chest.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/gloves.dmi b/icons/clothing/rigs/ert/asset_protection/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/gloves.dmi rename to icons/clothing/rigs/ert/asset_protection/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/helmet.dmi b/icons/clothing/rigs/ert/asset_protection/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/helmet.dmi rename to icons/clothing/rigs/ert/asset_protection/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/rig.dmi b/icons/clothing/rigs/ert/asset_protection/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/rig.dmi rename to icons/clothing/rigs/ert/asset_protection/rig.dmi diff --git a/mods/content/corporate/icons/rigs/commander/boots.dmi b/icons/clothing/rigs/ert/commander/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/boots.dmi rename to icons/clothing/rigs/ert/commander/boots.dmi diff --git a/mods/content/corporate/icons/rigs/commander/chest.dmi b/icons/clothing/rigs/ert/commander/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/chest.dmi rename to icons/clothing/rigs/ert/commander/chest.dmi diff --git a/mods/content/corporate/icons/rigs/commander/gloves.dmi b/icons/clothing/rigs/ert/commander/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/gloves.dmi rename to icons/clothing/rigs/ert/commander/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/commander/helmet.dmi b/icons/clothing/rigs/ert/commander/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/helmet.dmi rename to icons/clothing/rigs/ert/commander/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/commander/rig.dmi b/icons/clothing/rigs/ert/commander/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/rig.dmi rename to icons/clothing/rigs/ert/commander/rig.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/boots.dmi b/icons/clothing/rigs/ert/engineer/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/boots.dmi rename to icons/clothing/rigs/ert/engineer/boots.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/chest.dmi b/icons/clothing/rigs/ert/engineer/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/chest.dmi rename to icons/clothing/rigs/ert/engineer/chest.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/gloves.dmi b/icons/clothing/rigs/ert/engineer/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/gloves.dmi rename to icons/clothing/rigs/ert/engineer/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/helmet.dmi b/icons/clothing/rigs/ert/engineer/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/helmet.dmi rename to icons/clothing/rigs/ert/engineer/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/rig.dmi b/icons/clothing/rigs/ert/engineer/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/rig.dmi rename to icons/clothing/rigs/ert/engineer/rig.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/boots.dmi b/icons/clothing/rigs/ert/janitor/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/boots.dmi rename to icons/clothing/rigs/ert/janitor/boots.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/chest.dmi b/icons/clothing/rigs/ert/janitor/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/chest.dmi rename to icons/clothing/rigs/ert/janitor/chest.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/gloves.dmi b/icons/clothing/rigs/ert/janitor/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/gloves.dmi rename to icons/clothing/rigs/ert/janitor/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/helmet.dmi b/icons/clothing/rigs/ert/janitor/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/helmet.dmi rename to icons/clothing/rigs/ert/janitor/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/rig.dmi b/icons/clothing/rigs/ert/janitor/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/rig.dmi rename to icons/clothing/rigs/ert/janitor/rig.dmi diff --git a/mods/content/corporate/icons/rigs/medic/boots.dmi b/icons/clothing/rigs/ert/medic/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/boots.dmi rename to icons/clothing/rigs/ert/medic/boots.dmi diff --git a/mods/content/corporate/icons/rigs/medic/chest.dmi b/icons/clothing/rigs/ert/medic/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/chest.dmi rename to icons/clothing/rigs/ert/medic/chest.dmi diff --git a/mods/content/corporate/icons/rigs/medic/gloves.dmi b/icons/clothing/rigs/ert/medic/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/gloves.dmi rename to icons/clothing/rigs/ert/medic/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/medic/helmet.dmi b/icons/clothing/rigs/ert/medic/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/helmet.dmi rename to icons/clothing/rigs/ert/medic/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/medic/rig.dmi b/icons/clothing/rigs/ert/medic/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/rig.dmi rename to icons/clothing/rigs/ert/medic/rig.dmi diff --git a/mods/content/corporate/icons/rigs/security/boots.dmi b/icons/clothing/rigs/ert/security/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/boots.dmi rename to icons/clothing/rigs/ert/security/boots.dmi diff --git a/mods/content/corporate/icons/rigs/security/chest.dmi b/icons/clothing/rigs/ert/security/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/chest.dmi rename to icons/clothing/rigs/ert/security/chest.dmi diff --git a/mods/content/corporate/icons/rigs/security/gloves.dmi b/icons/clothing/rigs/ert/security/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/gloves.dmi rename to icons/clothing/rigs/ert/security/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/security/helmet.dmi b/icons/clothing/rigs/ert/security/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/helmet.dmi rename to icons/clothing/rigs/ert/security/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/security/rig.dmi b/icons/clothing/rigs/ert/security/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/rig.dmi rename to icons/clothing/rigs/ert/security/rig.dmi diff --git a/maps/antag_spawn/ert/ert.dm b/maps/antag_spawn/ert/ert.dm index 0d16a0f2a8d..0422dfdada6 100644 --- a/maps/antag_spawn/ert/ert.dm +++ b/maps/antag_spawn/ert/ert.dm @@ -59,4 +59,7 @@ /area/map_template/rescue_base/start name = "\improper Response Team Base" icon_state = "shuttlered" - base_turf = /turf/unsimulated/floor/rescue_base \ No newline at end of file + base_turf = /turf/unsimulated/floor/rescue_base + +// Separated in preparation for making ERTs into a modpack. +#include "rig.dm" \ No newline at end of file diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm index 30c9701f6a8..6cc0037f9d8 100644 --- a/maps/antag_spawn/ert/ert_base.dmm +++ b/maps/antag_spawn/ert/ert_base.dmm @@ -415,9 +415,6 @@ /obj/item/flash, /turf/unsimulated/floor/dark, /area/map_template/rescue_base/base) -"bs" = ( -/turf/unsimulated/floor/vault, -/area/map_template/rescue_base/base) "bt" = ( /obj/machinery/door/airlock/centcom{ name = "Cell 2" @@ -1396,9 +1393,6 @@ /obj/structure/bed/chair/office/dark, /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) -"dP" = ( -/turf/unsimulated/floor/vault, -/area/map_template/rescue_base/base) "dQ" = ( /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/door/airlock/external/shuttle{ @@ -1466,10 +1460,6 @@ }, /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) -"ec" = ( -/obj/structure/table/reinforced, -/turf/unsimulated/floor/vault, -/area/map_template/rescue_base/base) "ed" = ( /obj/structure/table/reinforced, /obj/item/radio/intercom{ @@ -1547,7 +1537,7 @@ "et" = ( /obj/structure/rack, /obj/item/secure_storage/briefcase, -/obj/item/clothing/head/beret/corp/centcom/captain, +/obj/item/clothing/head/beret, /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) "eu" = ( @@ -1833,8 +1823,7 @@ "eV" = ( /obj/machinery/door/blast/regular/open{ id_tag = "rescuebridge"; - name = "Cockpit Blast Shutters"; - + name = "Cockpit Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -1843,8 +1832,7 @@ "eW" = ( /obj/machinery/door/blast/regular/open{ id_tag = "rescuedock"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2075,8 +2063,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescuebridge"; - name = "Cockpit Blast Shutters"; - + name = "Cockpit Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2135,8 +2122,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescueeva"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2539,8 +2525,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescuebridge"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/paint/blue, /turf/floor/plating, @@ -2590,8 +2575,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescueinfirm"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/paint/blue, /turf/floor/plating, @@ -3513,7 +3497,7 @@ ao ao dU ao -dP +ao ad ac ac @@ -4680,7 +4664,7 @@ ao ao ad cR -dP +ao dY dY eu @@ -4988,11 +4972,11 @@ ar ar ad ar -bs +ao ar ar ar -bs +ao ar ad cq @@ -5011,7 +4995,7 @@ ao ao ao ao -ec +de ad bB eN @@ -5076,7 +5060,7 @@ ao ao ao ao -ec +de ad bC eN @@ -5136,12 +5120,12 @@ ao ad ad ad -ec +de ao ao ao ao -ec +de ad bA eO @@ -5206,7 +5190,7 @@ ao ao ao ao -ec +de ad bA bB @@ -5271,7 +5255,7 @@ eq eq eq ao -ec +de ad bB bC @@ -5464,9 +5448,9 @@ ac ac ac ad -ec +de eq -ec +de ad ac ac diff --git a/mods/content/corporate/clothing/rigs/ert.dm b/maps/antag_spawn/ert/rig.dm similarity index 78% rename from mods/content/corporate/clothing/rigs/ert.dm rename to maps/antag_spawn/ert/rig.dm index 650d93c4881..353590e005f 100644 --- a/mods/content/corporate/clothing/rigs/ert.dm +++ b/maps/antag_spawn/ert/rig.dm @@ -2,7 +2,7 @@ name = "emergency response command hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has blue highlights. Armoured and space ready." suit_type = "emergency response command" - icon = 'mods/content/corporate/icons/rigs/commander/rig.dmi' + icon = 'icons/clothing/rigs/ert/commander/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert helmet = /obj/item/clothing/head/helmet/space/rig/ert @@ -53,20 +53,20 @@ /obj/item/clothing/head/helmet/space/rig/ert camera = /obj/machinery/camera/network/ert - icon = 'mods/content/corporate/icons/rigs/commander/helmet.dmi' + icon = 'icons/clothing/rigs/ert/commander/helmet.dmi' /obj/item/clothing/suit/space/rig/ert - icon = 'mods/content/corporate/icons/rigs/commander/chest.dmi' + icon = 'icons/clothing/rigs/ert/commander/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert - icon = 'mods/content/corporate/icons/rigs/commander/boots.dmi' + icon = 'icons/clothing/rigs/ert/commander/boots.dmi' /obj/item/clothing/gloves/rig/ert item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_NOCUFFS - icon = 'mods/content/corporate/icons/rigs/commander/gloves.dmi' + icon = 'icons/clothing/rigs/ert/commander/gloves.dmi' /obj/item/rig/ert/engineer name = "emergency response engineering hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has orange highlights. Armoured and space ready." suit_type = "emergency response engineer" - icon = 'mods/content/corporate/icons/rigs/engineer/rig.dmi' + icon = 'icons/clothing/rigs/ert/engineer/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert/engineer helmet = /obj/item/clothing/head/helmet/space/rig/ert/engineer @@ -82,20 +82,20 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/helmet.dmi' + icon = 'icons/clothing/rigs/ert/engineer/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/chest.dmi' + icon = 'icons/clothing/rigs/ert/engineer/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/boots.dmi' + icon = 'icons/clothing/rigs/ert/engineer/boots.dmi' /obj/item/clothing/gloves/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/gloves.dmi' + icon = 'icons/clothing/rigs/ert/engineer/gloves.dmi' siemens_coefficient = 0 /obj/item/rig/ert/janitor name = "emergency response sanitation hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has purple highlights. Armoured and space ready." suit_type = "emergency response sanitation" - icon = 'mods/content/corporate/icons/rigs/janitor/rig.dmi' + icon = 'icons/clothing/rigs/ert/janitor/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert/janitor helmet = /obj/item/clothing/head/helmet/space/rig/ert/janitor @@ -112,19 +112,19 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/helmet.dmi' + icon = 'icons/clothing/rigs/ert/janitor/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/chest.dmi' + icon = 'icons/clothing/rigs/ert/janitor/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/boots.dmi' + icon = 'icons/clothing/rigs/ert/janitor/boots.dmi' /obj/item/clothing/gloves/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/gloves.dmi' + icon = 'icons/clothing/rigs/ert/janitor/gloves.dmi' /obj/item/rig/ert/medical name = "emergency response medical hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has white highlights. Armoured and space ready." suit_type = "emergency response medic" - icon = 'mods/content/corporate/icons/rigs/medic/rig.dmi' + icon = 'icons/clothing/rigs/ert/medic/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert/medical helmet = /obj/item/clothing/head/helmet/space/rig/ert/medical @@ -140,19 +140,19 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/helmet.dmi' + icon = 'icons/clothing/rigs/ert/medic/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/chest.dmi' + icon = 'icons/clothing/rigs/ert/medic/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/boots.dmi' + icon = 'icons/clothing/rigs/ert/medic/boots.dmi' /obj/item/clothing/gloves/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/gloves.dmi' + icon = 'icons/clothing/rigs/ert/medic/gloves.dmi' /obj/item/rig/ert/security name = "emergency response security hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has red highlights. Armoured and space ready." suit_type = "emergency response security" - icon = 'mods/content/corporate/icons/rigs/security/rig.dmi' + icon = 'icons/clothing/rigs/ert/security/rig.dmi' initial_modules = list( /obj/item/rig_module/ai_container, /obj/item/rig_module/maneuvering_jets, @@ -167,19 +167,19 @@ gloves = /obj/item/clothing/gloves/rig/ert/security /obj/item/clothing/head/helmet/space/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/helmet.dmi' + icon = 'icons/clothing/rigs/ert/security/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/chest.dmi' + icon = 'icons/clothing/rigs/ert/security/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/boots.dmi' + icon = 'icons/clothing/rigs/ert/security/boots.dmi' /obj/item/clothing/gloves/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/gloves.dmi' + icon = 'icons/clothing/rigs/ert/security/gloves.dmi' /obj/item/rig/ert/assetprotection name = "heavy emergency response suit control module" desc = "A heavy, modified version of a common emergency response hardsuit. Has blood red highlights. Armoured and space ready." suit_type = "heavy emergency response" - icon = 'mods/content/corporate/icons/rigs/asset_protection/rig.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/rig.dmi' armor = list( ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, ARMOR_BULLET = ARMOR_BALLISTIC_RESISTANT, @@ -209,11 +209,11 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/helmet.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/chest.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/boots.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/boots.dmi' /obj/item/clothing/gloves/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/gloves.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/gloves.dmi' siemens_coefficient = 0 diff --git a/mods/content/corporate/_corporate.dme b/mods/content/corporate/_corporate.dme index 75a782ae63c..390348d3603 100644 --- a/mods/content/corporate/_corporate.dme +++ b/mods/content/corporate/_corporate.dme @@ -15,7 +15,6 @@ #include "clothing\head\ert.dm" #include "clothing\head\helmets.dm" #include "clothing\masks\rubber.dm" -#include "clothing\rigs\ert.dm" #include "clothing\suit\armour.dm" #include "clothing\suit\captain.dm" #include "clothing\suit\hoodies.dm" From f0923877b5f2cd99277e5d0b6c2237a555693e2c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 27 Dec 2024 18:17:30 -0500 Subject: [PATCH 257/554] Remove mind.original --- code/datums/communication/dsay.dm | 6 +----- code/datums/mind/mind.dm | 8 -------- code/game/antagonist/antagonist_update.dm | 1 - code/game/gamemodes/game_mode.dm | 2 +- code/game/machinery/computer/message.dm | 4 ++-- code/game/machinery/computer/robot.dm | 8 ++++---- code/game/objects/items/robot/robot_frame.dm | 1 + code/modules/mob/living/silicon/robot/laws.dm | 7 +++++-- code/modules/mob/mob_helpers.dm | 2 -- code/modules/mob/new_player/new_player.dm | 1 - code/modules/mob/transform_procs.dm | 2 -- mods/gamemodes/traitor/overrides.dm | 10 ++-------- mods/species/vox/datum/heist_compatibility.dm | 2 +- 13 files changed, 17 insertions(+), 37 deletions(-) diff --git a/code/datums/communication/dsay.dm b/code/datums/communication/dsay.dm index c21705a672e..273f17a36b7 100644 --- a/code/datums/communication/dsay.dm +++ b/code/datums/communication/dsay.dm @@ -61,12 +61,8 @@ keyname = C.key if(C.mob) //Most of the time this is the dead/observer mob; we can totally use him if there is no better name - var/mindname + var/mindname = C.mob.mind?.name // the mind's "original name" var/realname = C.mob.real_name - if(C.mob.mind) - mindname = C.mob.mind.name - if(C.mob.mind.original && C.mob.mind.original.real_name) - realname = C.mob.mind.original.real_name if(mindname && mindname != realname) name = "[realname] died as [mindname]" else diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index 34bad84cb65..cb9ad6c9539 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -33,7 +33,6 @@ var/key var/name //replaces mob/var/original_name var/mob/living/current - var/mob/living/original //TODO: remove.not used in any meaningful way ~Carn. First I'll need to tweak the way silicon-mobs handle minds. var/active = 0 var/gen_relations_info @@ -71,18 +70,12 @@ if(current?.mind == src) current.mind = null current = null - if(original?.mind == src) - original.mind = null - original = null . = ..() /datum/mind/proc/handle_mob_deletion(mob/living/deleted_mob) if (current == deleted_mob) current = null - if (original == deleted_mob) - original = null - /datum/mind/proc/transfer_to(mob/living/new_character) if(!istype(new_character)) to_world_log("## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn") @@ -505,7 +498,6 @@ mind.key = key else mind = new /datum/mind(key) - mind.original = src SSticker.minds += mind if(!mind.name) mind.name = real_name mind.current = src diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index be03efcadfd..64214125565 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -13,7 +13,6 @@ player.current = new mob_path(get_turf(player.current)) player.transfer_to(player.current) if(holder) qdel(holder) - player.original = player.current if(!preserve_appearance && (flags & ANTAG_SET_APPEARANCE)) spawn(3) var/mob/living/human/H = player.current diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 9bfdd979142..be38f8871ef 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -550,7 +550,7 @@ var/global/list/additional_antag_types = list() continue //Happy connected client for(var/mob/observer/ghost/D in SSmobs.mob_list) - if(D.mind && (D.mind.original == L || D.mind.current == L)) + if(D.mind && D.mind.current == L) if(L.stat == DEAD) msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n" continue //Dead mob, ghost abandoned diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 16503b09fe9..0c145faa9de 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -120,7 +120,7 @@ dat += "
    [++i]. Set Custom Key
    " else dat += "

    Please authenticate with the server in order to show additional options." - if((isAI(user) || isrobot(user)) && (user.mind.assigned_special_role && user.mind.original == user)) + if((isAI(user) || isrobot(user)) && player_is_antag(user.mind)) //Malf/Traitor AIs can bruteforce into the system to gain the Key. dat += "
    *&@#. Bruteforce Key
    " @@ -283,7 +283,7 @@ //Hack the Console to get the password if (href_list["hack"]) - if((isAI(usr) || isrobot(usr)) && usr.mind.assigned_special_role && usr.mind.original == usr) + if((isAI(usr) || isrobot(usr)) && player_is_antag(usr.mind)) src.hacking = 1 src.screen = 2 update_icon() diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 524f6a35889..4b1d38034e5 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -68,7 +68,7 @@ return TOPIC_HANDLED // Antag AI checks - if(!isAI(user) || !(user.mind.assigned_special_role && user.mind.original == user)) + if(!isAI(user) || !player_is_antag(user.mind)) to_chat(user, "Access Denied") return TOPIC_HANDLED @@ -103,9 +103,9 @@ . = TOPIC_REFRESH // Proc: get_cyborgs() -// Parameters: 1 (operator - mob which is operating the console.) +// Parameters: 1 (user - mob which is operating the console.) // Description: Returns NanoUI-friendly list of accessible cyborgs. -/obj/machinery/computer/robotics/proc/get_cyborgs(var/mob/operator) +/obj/machinery/computer/robotics/proc/get_cyborgs(var/mob/user) var/list/robots = list() for(var/mob/living/silicon/robot/R in global.silicon_mob_list) @@ -145,7 +145,7 @@ robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None" robot["hackable"] = 0 // Antag AIs know whether linked cyborgs are hacked or not. - if(operator && isAI(operator) && (R.connected_ai == operator) && (operator.mind.assigned_special_role && operator.mind.original == operator)) + if(user && isAI(user) && (R.connected_ai == user) && player_is_antag(user.mind)) robot["hacked"] = R.emagged ? 1 : 0 robot["hackable"] = R.emagged? 0 : 1 robots.Add(list(robot)) diff --git a/code/game/objects/items/robot/robot_frame.dm b/code/game/objects/items/robot/robot_frame.dm index bd8f71787b8..24f7474aa6e 100644 --- a/code/game/objects/items/robot/robot_frame.dm +++ b/code/game/objects/items/robot/robot_frame.dm @@ -111,6 +111,7 @@ O.custom_name = created_name O.updatename("Default") + clear_antag_roles(brainmob.mind, implanted = TRUE) // some antag roles persist brainmob.mind.transfer_to(O) if(O.mind && O.mind.assigned_role) O.job = O.mind.assigned_role diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 22ecbf50f91..991631baa85 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -42,8 +42,11 @@ var/datum/ai_laws/master = connected_ai && lawupdate ? connected_ai.laws : null if (master) master.sync(src) - ..() - return + . = ..() + // if we aren't malfunctioning and we have a law 0, it's presumably shared + // if we are malfunctioning and we don't have a law 0, we don't need to worry about this + if(connected_ai && is_malfunctioning() && has_zeroth_law()) + to_chat(src, SPAN_BOLD("Remember, your AI does NOT share or know about your law 0.")) /mob/living/silicon/robot/proc/robot_checklaws() set category = "Silicon Commands" diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 6751c0ad7f2..67e363adcb0 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -294,8 +294,6 @@ var/global/list/global/organ_rel_size = list( var/datum/mind/M = O if(M.current && M.current.client) C = M.current.client - else if(M.original && M.original.client) - C = M.original.client if(C) if(C.get_preference_value(/datum/client_preference/anon_say) == PREF_YES) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index caa16d854fb..d81eaccd530 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -392,7 +392,6 @@ INITIALIZE_IMMEDIATE(/mob/new_player) if(mind) mind.active = 0 //we wish to transfer the key manually - mind.original = new_character var/memory = client.prefs.records[PREF_MEM_RECORD] if(memory) mind.StoreMemory(memory) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e0c1d446876..866c96a62c6 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -70,7 +70,6 @@ O.aiRestorePowerRoutine = 0 if(mind) mind.transfer_to(O) - O.mind.original = O else O.key = key @@ -128,7 +127,6 @@ mind.active = TRUE mind.transfer_to(O) if(O.mind && O.mind.assigned_role == ASSIGNMENT_ROBOT) - O.mind.original = O var/mmi_type = SSrobots.get_brain_type_by_title(O.mind.role_alt_title ? O.mind.role_alt_title : O.mind.assigned_role) if(mmi_type) O.central_processor = new mmi_type(O) diff --git a/mods/gamemodes/traitor/overrides.dm b/mods/gamemodes/traitor/overrides.dm index 122c6cf5daa..0f8142a1635 100644 --- a/mods/gamemodes/traitor/overrides.dm +++ b/mods/gamemodes/traitor/overrides.dm @@ -3,18 +3,12 @@ return mind && traitors.is_antagonist(mind) /mob/living/silicon/robot/show_master(mob/who) - // TODO: Update to new antagonist system. - if (mind?.assigned_special_role == /decl/special_role/traitor && mind.original == src && connected_ai) + var/decl/special_role/traitor/traitor_role = IMPLIED_DECL + if(traitor_role.is_antagonist(mind) && connected_ai) to_chat(who, "Remember, [connected_ai.name] is technically your master, but your objective comes first.") return return ..() -/mob/living/silicon/robot/lawsync() - . = ..() - // TODO: Update to new antagonist system. - if(mind?.assigned_special_role == /decl/special_role/traitor && mind.original == src) - to_chat(src, SPAN_BOLD("Remember, your AI does NOT share or know about your law 0.")) - /mob/living/silicon/robot/handle_regular_hud_updates() . = ..() if(!.) diff --git a/mods/species/vox/datum/heist_compatibility.dm b/mods/species/vox/datum/heist_compatibility.dm index a34c7d79244..776057948c0 100644 --- a/mods/species/vox/datum/heist_compatibility.dm +++ b/mods/species/vox/datum/heist_compatibility.dm @@ -16,7 +16,7 @@ var/decl/species/my_species = user?.get_species() var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) - if(!istype(user) || !user.mind || !user.mind.assigned_special_role != raiders || !my_species || my_species.name == SPECIES_VOX || !is_alien_whitelisted(user, SPECIES_VOX)) + if(!istype(user) || !user.mind || !raiders.is_antagonist(user.mind) || !my_species || my_species.name == SPECIES_VOX || !is_alien_whitelisted(user, SPECIES_VOX)) return ..() var/choice = input("Do you wish to become a vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes") From 7c0d3eaadc3fe1408f3a254eb6fec2de3c12daa9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 16 Feb 2023 09:39:22 +1100 Subject: [PATCH 258/554] Compiled tweaks from old codex dump branch. --- code/game/objects/items/weapons/policetape.dm | 11 ++++++----- code/modules/mob/new_player/new_player.dm | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 7800b0131cd..81ae83daba0 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -250,7 +250,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar /obj/structure/tape_barricade/proc/update_neighbors(var/location = loc) for (var/look_dir in global.cardinal) var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, get_step(location, look_dir)) - if(B && !QDELETED(B)) + if(!QDELETED(B)) B.update_icon() if(!QDELETED(src)) @@ -261,10 +261,11 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar neighbors = 0 for (var/look_dir in global.cardinal) var/turf/target_turf = get_step(src, look_dir) - var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, target_turf) - //We connect to walls and other tape_barricades - if((B && !QDELETED(B)) || (!B && target_turf?.is_wall())) - neighbors |= look_dir + if(target_turf) + var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade) in target_turf + //We connect to walls and other tape_barricades + if((B && !QDELETED(B)) || (!B && target_turf.is_wall())) + neighbors |= look_dir /**Allow sutypes to override with their own forced icon state name.*/ /obj/structure/tape_barricade/proc/icon_name_override() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index caa16d854fb..c0e255949e2 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -2,6 +2,7 @@ universal_speak = TRUE mob_sort_value = 10 invisibility = INVISIBILITY_ABSTRACT + is_spawnable_type = FALSE simulated = FALSE density = FALSE stat = DEAD From 253a241f9bf5e7046b177c94cf1a414680d477dd Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 28 Dec 2024 13:13:09 +1100 Subject: [PATCH 259/554] Fixed copypaste error with liddables. --- code/modules/reagents/reagent_containers/_glass.dm | 3 --- code/modules/reagents/reagent_containers/beaker.dm | 3 +++ code/modules/reagents/reagent_containers/bowl.dm | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index 3df7ca1144f..ddaa812b4df 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -107,9 +107,6 @@ return TRUE return ..() -/obj/item/chems/glass/can_lid() - return FALSE - /obj/item/chems/glass/get_food_default_transfer_amount(mob/eater) return eater?.get_eaten_transfer_amount(amount_per_transfer_from_this) diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index 258146c77c4..d89ac9acff1 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -89,6 +89,9 @@ atom_flags = ATOM_FLAG_OPEN_CONTAINER material = /decl/material/solid/metal/steel +/obj/item/chems/glass/beaker/bowl/can_lid() + return FALSE + /obj/item/chems/glass/beaker/bowl/pottery material = /decl/material/solid/stone/pottery diff --git a/code/modules/reagents/reagent_containers/bowl.dm b/code/modules/reagents/reagent_containers/bowl.dm index 7c69241f516..bc54aadbaa4 100644 --- a/code/modules/reagents/reagent_containers/bowl.dm +++ b/code/modules/reagents/reagent_containers/bowl.dm @@ -9,6 +9,9 @@ volume = 30 amount_per_transfer_from_this = 5 +/obj/item/chems/glass/bowl/can_lid() + return FALSE + // Predefined soup types for mapping. /obj/item/chems/glass/bowl/mapped abstract_type = /obj/item/chems/glass/bowl/mapped From d6aef39e573ebf74b9dcec9ce4075ec37b999137 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 12 Dec 2024 18:36:07 +1100 Subject: [PATCH 260/554] Cleaning up equip_adjust list access/definition. --- code/game/objects/item_mob_overlay.dm | 2 +- code/modules/bodytype/bodytype_offsets.dm | 14 +-- code/modules/mob/living/human/update_icons.dm | 38 ++++---- .../mob/living/silicon/robot/drone/drone.dm | 12 +-- .../mob/living/simple_animal/friendly/cat.dm | 16 ++-- .../living/simple_animal/friendly/corgi.dm | 16 ++-- .../mob/living/simple_animal/friendly/crab.dm | 8 +- .../mob/living/simple_animal/passive/deer.dm | 8 +- .../mob/living/simple_animal/passive/fox.dm | 8 +- .../species/station/monkey_bodytypes.dm | 12 +-- mods/content/fantasy/datum/hnoll/bodytypes.dm | 10 +-- .../fantasy/datum/kobaloi/bodytypes.dm | 32 +++---- mods/mobs/dionaea/mob/_nymph.dm | 8 +- .../species/ascent/datum/species_bodytypes.dm | 4 +- .../adherent/datum/species_bodytypes.dm | 26 +++--- .../tajaran/datum/species_bodytypes.dm | 23 ++++- mods/species/drakes/species_bodytypes.dm | 70 +++++++-------- .../neoavians/datum/species_bodytypes.dm | 86 ++++++++++++++++--- .../serpentid/datum/species_bodytypes.dm | 58 +++++++++++-- .../utility_frames/species_bodytypes.dm | 8 +- mods/species/vox/datum/species_bodytypes.dm | 22 ++--- 21 files changed, 293 insertions(+), 188 deletions(-) diff --git a/code/game/objects/item_mob_overlay.dm b/code/game/objects/item_mob_overlay.dm index 5827dbba478..be29ad618ca 100644 --- a/code/game/objects/item_mob_overlay.dm +++ b/code/game/objects/item_mob_overlay.dm @@ -70,7 +70,7 @@ var/global/list/icon_state_cache = list() var/mob_icon = global.default_onmob_icons[slot] var/decl/bodytype/root_bodytype = user_mob?.get_bodytype() if(istype(root_bodytype)) - var/use_slot = (bodypart in root_bodytype.equip_adjust) ? bodypart : slot + var/use_slot = (bodypart in root_bodytype.get_equip_adjustments(user_mob)) ? bodypart : slot return root_bodytype.get_offset_overlay_image(user_mob, mob_icon, mob_state, color, use_slot) return overlay_image(mob_icon, mob_state, color, RESET_COLOR) diff --git a/code/modules/bodytype/bodytype_offsets.dm b/code/modules/bodytype/bodytype_offsets.dm index e0090189112..279b43e9918 100644 --- a/code/modules/bodytype/bodytype_offsets.dm +++ b/code/modules/bodytype/bodytype_offsets.dm @@ -4,8 +4,8 @@ each one can be in the NORTH, SOUTH, EAST, and WEST direction. Specify the x and y amounts to shift the thing for a given direction. example: - equip_adjust = list( - slot_back_str = list("[NORTH]" = list(-12, 7), "[EAST]" = list(-2, -12)) + _equip_adjust = list( + (slot_back_str) = list("[NORTH]" = list(-12, 7), "[EAST]" = list(-2, -12)) ) This would shift back items (backpacks, axes, etc.) when the mob @@ -18,15 +18,15 @@ The slots that you can use are found in items_clothing.dm and are the inventory */ /decl/bodytype - var/list/equip_adjust - var/list/equip_overlays = list() + VAR_PRIVATE/list/_equip_adjust + VAR_PRIVATE/list/equip_overlays = list() -/decl/bodytype/proc/get_equip_adjust(mob/mob) - return equip_adjust +/decl/bodytype/proc/get_equip_adjustments(mob/mob) + return _equip_adjust /decl/bodytype/proc/get_offset_overlay_image(mob/mob, mob_icon, mob_state, color, slot) // If we don't actually need to offset this, don't bother with any of the generation/caching. - var/list/use_equip_adjust = get_equip_adjust(mob) + var/list/use_equip_adjust = get_equip_adjustments(mob) if(length(use_equip_adjust) && use_equip_adjust[slot] && length(use_equip_adjust[slot])) // Check the cache for previously made icons. diff --git a/code/modules/mob/living/human/update_icons.dm b/code/modules/mob/living/human/update_icons.dm index 34fcb8ccc31..eafc3556942 100644 --- a/code/modules/mob/living/human/update_icons.dm +++ b/code/modules/mob/living/human/update_icons.dm @@ -320,27 +320,23 @@ Please contact me on #coderbus IRC. ~Carn x //UNDERWEAR OVERLAY /mob/living/human/proc/update_underwear(var/update_icons=1) - var/list/undies = list() - for(var/entry in worn_underwear) - - var/obj/item/underwear/UW = entry - if (!UW?.icon) // Avoid runtimes for nude underwear types - continue - - var/decl/bodytype/root_bodytype = get_bodytype() - if(!root_bodytype) - continue // Avoid runtimes for dummy mobs with no bodytype set - - var/image/I - if(UW.slot_offset_str && LAZYACCESS(root_bodytype.equip_adjust, UW.slot_offset_str)) - I = root_bodytype.get_offset_overlay_image(src, UW.icon, UW.icon_state, UW.color, UW.slot_offset_str) - else - I = image(icon = UW.icon, icon_state = UW.icon_state) - I.color = UW.color - if(I) // get_offset_overlay_image() may potentially return null - I.appearance_flags |= RESET_COLOR - undies += I - set_current_mob_overlay(HO_UNDERWEAR_LAYER, undies, update_icons) + var/list/undies_overlays = list() + var/decl/bodytype/root_bodytype = get_bodytype() + if(root_bodytype) + var/list/adjustments = root_bodytype.get_equip_adjustments(src) + for(var/obj/item/underwear/undies as anything in worn_underwear) + if (!undies?.icon) // Avoid runtimes for nude underwear types + continue + var/image/undies_overlay + if(undies.slot_offset_str && (undies.slot_offset_str in adjustments)) + undies_overlay = root_bodytype.get_offset_overlay_image(src, undies.icon, undies.icon_state, undies.color, undies.slot_offset_str) + else + undies_overlay = image(icon = undies.icon, icon_state = undies.icon_state) + undies_overlay.color = undies.color + if(undies_overlay) // get_offset_overlay_image() may potentially return null + undies_overlay.appearance_flags |= RESET_COLOR + undies_overlays += undies_overlay + set_current_mob_overlay(HO_UNDERWEAR_LAYER, undies_overlays, update_icons) /mob/living/human/update_hair(var/update_icons=1) var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD, /obj/item/organ/external/head) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 0563fce5521..90516b06381 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -117,7 +117,7 @@ uid = "bodytype_drone_construction" /decl/bodytype/drone/construction/Initialize() - equip_adjust = list( + _equip_adjust = list( slot_head_str = list( "[NORTH]" = list(1, -12), "[SOUTH]" = list(1, -12), @@ -355,13 +355,13 @@ uid = "bodytype_drone" /decl/bodytype/drone/Initialize() - if(!length(equip_adjust)) - equip_adjust = list( - slot_head_str = list( + if(!length(_equip_adjust)) + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list(0, -13), "[SOUTH]" = list(0, -13), - "[EAST]" = list(0, -13), - "[WEST]" = list(0, -13) + "[EAST]" = list(0, -13), + "[WEST]" = list(0, -13) ) ) . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index f4b20f9b75b..a9b8e6891b8 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -70,12 +70,12 @@ uid = "bodytype_animal_cat" /decl/bodytype/quadruped/animal/cat/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 1, -9), "[SOUTH]" = list( 1, -12), - "[EAST]" = list( 7, -10), - "[WEST]" = list(-7, -10) + "[EAST]" = list( 7, -10), + "[WEST]" = list(-7, -10) ) ) . = ..() @@ -210,12 +210,12 @@ uid = "bodytype_animal_kitten" /decl/bodytype/quadruped/animal/kitten/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 1, -14), "[SOUTH]" = list( 1, -14), - "[EAST]" = list( 5, -14), - "[WEST]" = list(-5, -14) + "[EAST]" = list( 5, -14), + "[WEST]" = list(-5, -14) ) ) . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index c8ee4417ebf..64ea0d6d25f 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -42,12 +42,12 @@ uid = "bodytype_animal_corgi" /decl/bodytype/quadruped/animal/corgi/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 1, -8), "[SOUTH]" = list( 1, -8), - "[EAST]" = list( 7, -8), - "[WEST]" = list(-7, -8) + "[EAST]" = list( 7, -8), + "[WEST]" = list(-7, -8) ) ) . = ..() @@ -151,12 +151,12 @@ uid = "bodytype_animal_puppy" /decl/bodytype/quadruped/animal/puppy/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 0, -12), "[SOUTH]" = list( 0, -12), - "[EAST]" = list( 5, -14), - "[WEST]" = list(-5, -14) + "[EAST]" = list( 5, -14), + "[WEST]" = list(-5, -14) ) ) . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 992ee0b67a9..bcd84ddc3df 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -42,12 +42,12 @@ uid = "bodytype_animal_crab" /decl/bodytype/hexapod/animal/crab/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list(-1, -10), "[SOUTH]" = list(-1, -10), - "[EAST]" = list(-1, -10), - "[WEST]" = list(-1, -10) + "[EAST]" = list(-1, -10), + "[WEST]" = list(-1, -10) ) ) . = ..() diff --git a/code/modules/mob/living/simple_animal/passive/deer.dm b/code/modules/mob/living/simple_animal/passive/deer.dm index 03acf0a006d..da09424bce8 100644 --- a/code/modules/mob/living/simple_animal/passive/deer.dm +++ b/code/modules/mob/living/simple_animal/passive/deer.dm @@ -36,12 +36,12 @@ uid = "bodytype_animal_deer" /decl/bodytype/quadruped/animal/deer/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 1, -4), "[SOUTH]" = list( 1, -4), - "[EAST]" = list( 9, -4), - "[WEST]" = list(-9, -4) + "[EAST]" = list( 9, -4), + "[WEST]" = list(-9, -4) ) ) return ..() diff --git a/code/modules/mob/living/simple_animal/passive/fox.dm b/code/modules/mob/living/simple_animal/passive/fox.dm index cfa2421fcd3..c2db673e6e8 100644 --- a/code/modules/mob/living/simple_animal/passive/fox.dm +++ b/code/modules/mob/living/simple_animal/passive/fox.dm @@ -32,12 +32,12 @@ uid = "bodytype_animal_fox" /decl/bodytype/quadruped/animal/fox/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 1, -9), "[SOUTH]" = list( 1, -8), - "[EAST]" = list( 11, -9), - "[WEST]" = list(-11, -9) + "[EAST]" = list( 11, -9), + "[WEST]" = list(-11, -9) ) ) return ..() diff --git a/code/modules/species/station/monkey_bodytypes.dm b/code/modules/species/station/monkey_bodytypes.dm index 804d6d0add1..b1b22de545c 100644 --- a/code/modules/species/station/monkey_bodytypes.dm +++ b/code/modules/species/station/monkey_bodytypes.dm @@ -19,12 +19,12 @@ uid = "bodytype_monkey" /decl/bodytype/monkey/Initialize() - equip_adjust = list( - BP_L_HAND = list("[NORTH]" = list( 1, 3), "[EAST]" = list(-3, 2), "[SOUTH]" = list(-1, 3), "[WEST]" = list( 3, 2)), - BP_R_HAND = list("[NORTH]" = list(-1, 3), "[EAST]" = list( 3, 2), "[SOUTH]" = list( 1, 3), "[WEST]" = list(-3, 2)), - slot_shoes_str = list("[NORTH]" = list( 0, 7), "[EAST]" = list(-1, 7), "[SOUTH]" = list( 0, 7), "[WEST]" = list( 1, 7)), - slot_head_str = list("[NORTH]" = list( 0, 0), "[EAST]" = list(-2, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list( 2, 0)), - slot_wear_mask_str = list("[NORTH]" = list( 0, 0), "[EAST]" = list(-1, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list( 1, 0)) + _equip_adjust = list( + (BP_L_HAND) = list("[NORTH]" = list( 1, 3), "[EAST]" = list(-3, 2), "[SOUTH]" = list(-1, 3), "[WEST]" = list( 3, 2)), + (BP_R_HAND) = list("[NORTH]" = list(-1, 3), "[EAST]" = list( 3, 2), "[SOUTH]" = list( 1, 3), "[WEST]" = list(-3, 2)), + (slot_shoes_str) = list("[NORTH]" = list( 0, 7), "[EAST]" = list(-1, 7), "[SOUTH]" = list( 0, 7), "[WEST]" = list( 1, 7)), + (slot_head_str) = list("[NORTH]" = list( 0, 0), "[EAST]" = list(-2, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list( 2, 0)), + (slot_wear_mask_str) = list("[NORTH]" = list( 0, 0), "[EAST]" = list(-1, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list( 1, 0)) ) . = ..() diff --git a/mods/content/fantasy/datum/hnoll/bodytypes.dm b/mods/content/fantasy/datum/hnoll/bodytypes.dm index b5da3ed52b5..218068362ce 100644 --- a/mods/content/fantasy/datum/hnoll/bodytypes.dm +++ b/mods/content/fantasy/datum/hnoll/bodytypes.dm @@ -55,21 +55,21 @@ ) /decl/bodytype/hnoll/Initialize() - if(!equip_adjust) - equip_adjust = list( - slot_glasses_str = list( + if(!_equip_adjust) + _equip_adjust = list( + (slot_glasses_str) = list( "[NORTH]" = list( 0, 2), "[EAST]" = list( 0, 2), "[SOUTH]" = list( 0, 2), "[WEST]" = list( 0, 2) ), - slot_wear_mask_str = list( + (slot_wear_mask_str) = list( "[NORTH]" = list( 0, 2), "[EAST]" = list( 2, 2), "[SOUTH]" = list( 0, 2), "[WEST]" = list(-2, 2) ), - slot_head_str = list( + (slot_head_str) = list( "[NORTH]" = list( 0, 2), "[EAST]" = list( 0, 2), "[SOUTH]" = list( 0, 2), diff --git a/mods/content/fantasy/datum/kobaloi/bodytypes.dm b/mods/content/fantasy/datum/kobaloi/bodytypes.dm index 3e87eafcf54..72740539a49 100644 --- a/mods/content/fantasy/datum/kobaloi/bodytypes.dm +++ b/mods/content/fantasy/datum/kobaloi/bodytypes.dm @@ -32,87 +32,87 @@ uid = "bodytype_kobaloi" /decl/bodytype/kobaloi/Initialize() - if(!equip_adjust) - equip_adjust = list( - BP_R_HAND = list( + if(!_equip_adjust) + _equip_adjust = list( + (BP_R_HAND) = list( "[NORTH]" = list( 1, -4), "[EAST]" = list( 0, -4), "[SOUTH]" = list(-1, -4), "[WEST]" = list(-1, -4) ), - BP_L_HAND = list( + (BP_L_HAND) = list( "[NORTH]" = list(-1, -4), "[EAST]" = list( 1, -4), "[SOUTH]" = list( 1, -4), "[WEST]" = list( 0, -4) ), - slot_w_uniform_str = list( + (slot_w_uniform_str) = list( "[NORTH]" = list( 0, -6), "[EAST]" = list( 1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-1, -6) ), - slot_belt_str = list( + (slot_belt_str) = list( "[NORTH]" = list( 0, -6), "[EAST]" = list( 1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-1, -6) ), - slot_handcuffed_str = list( + (slot_handcuffed_str) = list( "[NORTH]" = list(-1, -4), "[EAST]" = list( 1, -4), "[SOUTH]" = list( 1, -4), "[WEST]" = list( 0, -4) ), - slot_wear_id_str = list( + (slot_wear_id_str) = list( "[NORTH]" = list( 0, -6), "[EAST]" = list( 1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-1, -6) ), - slot_gloves_str = list( + (slot_gloves_str) = list( "[NORTH]" = list(-1, -4), "[EAST]" = list( 1, -4), "[SOUTH]" = list( 1, -4), "[WEST]" = list( 0, -4) ), - slot_wear_suit_str = list( + (slot_wear_suit_str) = list( "[NORTH]" = list( 0, -6), "[EAST]" = list( 1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-1, -6) ), - slot_back_str = list( + (slot_back_str) = list( "[NORTH]" = list( 0, -5), "[EAST]" = list( 1, -5), "[SOUTH]" = list( 0, -5), "[WEST]" = list(-1, -5) ), - slot_glasses_str = list( + (slot_glasses_str) = list( "[NORTH]" = list( 0, -6), "[EAST]" = list( 3, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-3, -6) ), - slot_wear_mask_str = list( + (slot_wear_mask_str) = list( "[NORTH]" = list( 0, -7), "[EAST]" = list( 5, -7), "[SOUTH]" = list( 0, -7), "[WEST]" = list(-5, -7) ), - slot_head_str = list( + (slot_head_str) = list( "[NORTH]" = list( 0, -5), "[EAST]" = list( 3, -5), "[SOUTH]" = list( 0, -5), "[WEST]" = list(-3, -5) ), - slot_l_ear_str = list( + (slot_l_ear_str) = list( "[NORTH]" = list( 0, -5), "[EAST]" = list( 3, -5), "[SOUTH]" = list( 0, -5), "[WEST]" = list(-3, -5) ), - slot_r_ear_str = list( + (slot_r_ear_str) = list( "[NORTH]" = list( 0, -5), "[EAST]" = list( 3, -5), "[SOUTH]" = list( 0, -5), diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 6ec480cda3b..a1c8efe4486 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -95,12 +95,12 @@ uid = "bodytype_diona" /decl/bodytype/diona/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list(0, -8), "[SOUTH]" = list(0, -8), - "[EAST]" = list(0, -8), - "[WEST]" = list(0, -8) + "[EAST]" = list(0, -8), + "[WEST]" = list(0, -8) ) ) . = ..() diff --git a/mods/species/ascent/datum/species_bodytypes.dm b/mods/species/ascent/datum/species_bodytypes.dm index 05ca4ed987f..9136d47e269 100644 --- a/mods/species/ascent/datum/species_bodytypes.dm +++ b/mods/species/ascent/datum/species_bodytypes.dm @@ -85,8 +85,8 @@ uid = "bodytype_crystalline_gyne" /decl/bodytype/crystalline/mantid/gyne/Initialize() - equip_adjust = list( - BP_L_HAND = list( + _equip_adjust = list( + (BP_L_HAND) = list( "[NORTH]" = list(-4, 12), "[EAST]" = list(-4, 12), "[SOUTH]" = list(-4, 12), diff --git a/mods/species/bayliens/adherent/datum/species_bodytypes.dm b/mods/species/bayliens/adherent/datum/species_bodytypes.dm index 8e6c7ab2ee9..bbf275eb855 100644 --- a/mods/species/bayliens/adherent/datum/species_bodytypes.dm +++ b/mods/species/bayliens/adherent/datum/species_bodytypes.dm @@ -53,54 +53,48 @@ uid = "bodytype_crystalline_adherent_turquoise" /decl/bodytype/crystalline/adherent/Initialize() - equip_adjust = list( - "[BP_L_HAND]" = list( + _equip_adjust = list( + (BP_L_HAND) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), "[WEST]" = list(0, 14) ), - - "[BP_R_HAND]" = list( + (BP_R_HAND) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), "[WEST]" = list(0, 14) ), - - "[slot_back_str]" = list( + (slot_back_str) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), "[WEST]" = list(0, 14) ), - - "[slot_belt_str]" = list( + (slot_belt_str) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), "[WEST]" = list(0, 14) ), - - "[slot_head_str]" = list( + (slot_head_str) = list( "[NORTH]" = list( 0, 14), "[EAST]" = list( 3, 14), "[SOUTH]" = list( 0, 14), "[WEST]" = list(-3, 14) ), - - "[slot_l_ear_str]" = list( + (slot_l_ear_str) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), - "[WEST]" = list(0, 14) + "[WEST]" = list(0, 14) ), - - "[slot_r_ear_str]" = list( + (slot_r_ear_str) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), - "[WEST]" = list(0, 14) + "[WEST]" = list(0, 14) ) ) . = ..() diff --git a/mods/species/bayliens/tajaran/datum/species_bodytypes.dm b/mods/species/bayliens/tajaran/datum/species_bodytypes.dm index 9dbd49a90fe..225bf5bc86e 100644 --- a/mods/species/bayliens/tajaran/datum/species_bodytypes.dm +++ b/mods/species/bayliens/tajaran/datum/species_bodytypes.dm @@ -52,10 +52,25 @@ ) /decl/bodytype/feline/Initialize() - equip_adjust = list( - slot_glasses_str = list("[NORTH]" = list(0, 2), "[EAST]" = list(0, 2), "[SOUTH]" = list( 0, 2), "[WEST]" = list(0, 2)), - slot_wear_mask_str = list("[NORTH]" = list(0, 2), "[EAST]" = list(0, 2), "[SOUTH]" = list( 0, 2), "[WEST]" = list(0, 2)), - slot_head_str = list("[NORTH]" = list(0, 2), "[EAST]" = list(0, 2), "[SOUTH]" = list( 0, 2), "[WEST]" = list(0, 2)) + _equip_adjust = list( + (slot_glasses_str) = list( + "[NORTH]" = list(0, 2), + "[EAST]" = list(0, 2), + "[SOUTH]" = list( 0, 2), + "[WEST]" = list(0, 2) + ), + (slot_wear_mask_str) = list( + "[NORTH]" = list(0, 2), + "[EAST]" = list(0, 2), + "[SOUTH]" = list( 0, 2), + "[WEST]" = list(0, 2) + ), + (slot_head_str) = list( + "[NORTH]" = list(0, 2), + "[EAST]" = list(0, 2), + "[SOUTH]" = list( 0, 2), + "[WEST]" = list(0, 2) + ) ) . = ..() diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index 3d16db25762..dc5afea4ea4 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -134,48 +134,48 @@ ARMOR_BOMB = ARMOR_BOMB_PADDED ) - var/list/sitting_equip_adjust - var/list/lying_equip_adjust + VAR_PRIVATE/list/_sitting_equip_adjust + VAR_PRIVATE/list/_lying_equip_adjust /decl/bodytype/quadruped/grafadreka/Initialize() - if(!length(equip_adjust)) - equip_adjust = list( - slot_head_str = list( + if(!length(_equip_adjust)) + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list(16, -8), "[SOUTH]" = list(16, -12), - "[EAST]" = list(38, -8), - "[WEST]" = list(-6, -8) + "[EAST]" = list(38, -8), + "[WEST]" = list(-6, -8) ) ) - if(!length(sitting_equip_adjust)) - sitting_equip_adjust = list( - slot_head_str = list( + if(!length(_sitting_equip_adjust)) + _sitting_equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list(16, -2), "[SOUTH]" = list(16, -2), - "[EAST]" = list(22, -2), - "[WEST]" = list(12, -2) + "[EAST]" = list(22, -2), + "[WEST]" = list(12, -2) ) ) - if(!length(lying_equip_adjust)) - lying_equip_adjust = list( - slot_head_str = list( + if(!length(_lying_equip_adjust)) + _lying_equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 24, -24), "[SOUTH]" = list( 24, -24), - "[EAST]" = list( 24, -24), - "[WEST]" = list(-10, -24) + "[EAST]" = list( 24, -24), + "[WEST]" = list(-10, -24) ) ) return ..() -/decl/bodytype/quadruped/grafadreka/get_equip_adjust(mob/mob) +/decl/bodytype/quadruped/grafadreka/get_equip_adjustments(mob/mob) switch(mob.current_posture?.name) if("lying", "resting") - return lying_equip_adjust + return _lying_equip_adjust if("sitting") - return sitting_equip_adjust + return _sitting_equip_adjust return ..() /decl/bodytype/quadruped/grafadreka/hatchling @@ -206,31 +206,31 @@ uid = "bodytype_drake_hatchling" /decl/bodytype/quadruped/grafadreka/hatchling/Initialize() - if(!length(equip_adjust)) - equip_adjust = list( - slot_head_str = list( + if(!length(_equip_adjust)) + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 0, -18), "[SOUTH]" = list( 0, -18), - "[EAST]" = list( 8, -18), - "[WEST]" = list(-8, -18) + "[EAST]" = list( 8, -18), + "[WEST]" = list(-8, -18) ) ) - if(!length(sitting_equip_adjust)) - sitting_equip_adjust = list( - slot_head_str = list( + if(!length(_sitting_equip_adjust)) + _sitting_equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 0, -14), "[SOUTH]" = list( 0, -14), - "[EAST]" = list( 4, -14), - "[WEST]" = list(-4, -14) + "[EAST]" = list( 4, -14), + "[WEST]" = list(-4, -14) ) ) - if(!length(lying_equip_adjust)) - lying_equip_adjust = list( - slot_head_str = list( + if(!length(_lying_equip_adjust)) + _lying_equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 0, -24), "[SOUTH]" = list( 0, -24), - "[EAST]" = list( 0, -24), - "[WEST]" = list( 0, -24) + "[EAST]" = list( 0, -24), + "[WEST]" = list( 0, -24) ) ) return ..() diff --git a/mods/species/neoavians/datum/species_bodytypes.dm b/mods/species/neoavians/datum/species_bodytypes.dm index 5843792a090..35eb54d9a7f 100644 --- a/mods/species/neoavians/datum/species_bodytypes.dm +++ b/mods/species/neoavians/datum/species_bodytypes.dm @@ -94,19 +94,79 @@ uid = "bodytype_avian_additive_raptor" /decl/bodytype/avian/Initialize() - equip_adjust = list( - slot_l_ear_str = list("[NORTH]" = list( 1, -5), "[EAST]" = list(-2, -5), "[SOUTH]" = list(-1, -5), "[WEST]" = list( 0, -5)), - slot_r_ear_str = list("[NORTH]" = list( 1, -5), "[EAST]" = list( 0, -5), "[SOUTH]" = list(-1, -5), "[WEST]" = list( 2, -5)), - BP_L_HAND = list("[NORTH]" = list( 3, -3), "[EAST]" = list( 1, -3), "[SOUTH]" = list(-3, -3), "[WEST]" = list(-5, -3)), - BP_R_HAND = list("[NORTH]" = list(-3, -3), "[EAST]" = list( 5, -3), "[SOUTH]" = list( 3, -3), "[WEST]" = list(-1, -3)), - slot_head_str = list("[NORTH]" = list( 0, -5), "[EAST]" = list( 1, -5), "[SOUTH]" = list( 0, -5), "[WEST]" = list(-1, -5)), - slot_wear_mask_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list( 2, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-2, -6)), - slot_glasses_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list( 1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-1, -6)), - slot_back_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list( 3, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-3, -6)), - slot_w_uniform_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list(-1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list( 1, -6)), - slot_wear_id_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list(-1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list( 1, -6)), - slot_wear_suit_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list(-1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list( 1, -6)), - slot_belt_str = list("[NORTH]" = list( 0, -6), "[EAST]" = list(-1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list( 1, -6)) + _equip_adjust = list( + (slot_l_ear_str) = list( + "[NORTH]" = list( 1, -5), + "[EAST]" = list(-2, -5), + "[SOUTH]" = list(-1, -5), + "[WEST]" = list( 0, -5) + ), + (slot_r_ear_str) = list( + "[NORTH]" = list( 1, -5), + "[EAST]" = list( 0, -5), + "[SOUTH]" = list(-1, -5), + "[WEST]" = list( 2, -5) + ), + (BP_L_HAND) = list( + "[NORTH]" = list( 3, -3), + "[EAST]" = list( 1, -3), + "[SOUTH]" = list(-3, -3), + "[WEST]" = list(-5, -3) + ), + (BP_R_HAND) = list( + "[NORTH]" = list(-3, -3), + "[EAST]" = list( 5, -3), + "[SOUTH]" = list( 3, -3), + "[WEST]" = list(-1, -3) + ), + (slot_head_str) = list( + "[NORTH]" = list( 0, -5), + "[EAST]" = list( 1, -5), + "[SOUTH]" = list( 0, -5), + "[WEST]" = list(-1, -5) + ), + (slot_wear_mask_str) = list( + "[NORTH]" = list( 0, -6), + "[EAST]" = list( 2, -6), + "[SOUTH]" = list( 0, -6), + "[WEST]" = list(-2, -6) + ), + (slot_glasses_str) = list( + "[NORTH]" = list( 0, -6), + "[EAST]" = list( 1, -6), + "[SOUTH]" = list( 0, -6), + "[WEST]" = list(-1, -6) + ), + (slot_back_str) = list( + "[NORTH]" = list( 0, -6), + "[EAST]" = list( 3, -6), + "[SOUTH]" = list( 0, -6), + "[WEST]" = list(-3, -6) + ), + (slot_w_uniform_str) = list( + "[NORTH]" = list( 0, -6), + "[EAST]" = list(-1, -6), + "[SOUTH]" = list( 0, -6), + "[WEST]" = list( 1, -6) + ), + (slot_wear_id_str) = list( + "[NORTH]" = list( 0, -6), + "[EAST]" = list(-1, -6), + "[SOUTH]" = list( 0, -6), + "[WEST]" = list( 1, -6) + ), + (slot_wear_suit_str) = list( + "[NORTH]" = list( 0, -6), + "[EAST]" = list(-1, -6), + "[SOUTH]" = list( 0, -6), + "[WEST]" = list( 1, -6) + ), + (slot_belt_str) = list( + "[NORTH]" = list( 0, -6), + "[EAST]" = list(-1, -6), + "[SOUTH]" = list( 0, -6), + "[WEST]" = list( 1, -6) + ) ) . = ..() diff --git a/mods/species/serpentid/datum/species_bodytypes.dm b/mods/species/serpentid/datum/species_bodytypes.dm index de0c77e659f..6c4e562b451 100644 --- a/mods/species/serpentid/datum/species_bodytypes.dm +++ b/mods/species/serpentid/datum/species_bodytypes.dm @@ -65,15 +65,55 @@ ) /decl/bodytype/serpentid/Initialize() - equip_adjust = list( - BP_L_HAND_UPPER = list("[NORTH]" = list( 0, 8), "[EAST]" = list(0, 8), "[SOUTH]" = list(-0, 8), "[WEST]" = list( 0, 8)), - BP_R_HAND_UPPER = list("[NORTH]" = list( 0, 8), "[EAST]" = list(0, 8), "[SOUTH]" = list( 0, 8), "[WEST]" = list( 0, 8)), - BP_L_HAND = list("[NORTH]" = list( 4, 0), "[EAST]" = list(0, 0), "[SOUTH]" = list(-4, 0), "[WEST]" = list( 0, 0)), - BP_R_HAND = list("[NORTH]" = list(-4, 0), "[EAST]" = list(0, 0), "[SOUTH]" = list( 4, 0), "[WEST]" = list( 0, 0)), - slot_head_str = list("[NORTH]" = list( 0, 7), "[EAST]" = list(0, 8), "[SOUTH]" = list( 0, 8), "[WEST]" = list( 0, 8)), - slot_back_str = list("[NORTH]" = list( 0, 7), "[EAST]" = list(0, 8), "[SOUTH]" = list( 0, 8), "[WEST]" = list( 0, 8)), - slot_belt_str = list("[NORTH]" = list( 0, 0), "[EAST]" = list(8, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list(-8, 0)), - slot_glasses_str = list("[NORTH]" = list( 0, 10), "[EAST]" = list(0, 11), "[SOUTH]" = list( 0, 11), "[WEST]" = list( 0, 11)) + _equip_adjust = list( + (BP_L_HAND_UPPER) = list( + "[NORTH]" = list( 0, 8), + "[EAST]" = list( 0, 8), + "[SOUTH]" = list(-0, 8), + "[WEST]" = list( 0, 8) + ), + (BP_R_HAND_UPPER) = list( + "[NORTH]" = list( 0, 8), + "[EAST]" = list( 0, 8), + "[SOUTH]" = list( 0, 8), + "[WEST]" = list( 0, 8) + ), + (BP_L_HAND) = list( + "[NORTH]" = list( 4, 0), + "[EAST]" = list( 0, 0), + "[SOUTH]" = list(-4, 0), + "[WEST]" = list( 0, 0) + ), + (BP_R_HAND) = list( + "[NORTH]" = list(-4, 0), + "[EAST]" = list( 0, 0), + "[SOUTH]" = list( 4, 0), + "[WEST]" = list( 0, 0) + ), + (slot_head_str) = list( + "[NORTH]" = list( 0, 7), + "[EAST]" = list( 0, 8), + "[SOUTH]" = list( 0, 8), + "[WEST]" = list( 0, 8) + ), + (slot_back_str) = list( + "[NORTH]" = list( 0, 7), + "[EAST]" = list( 0, 8), + "[SOUTH]" = list( 0, 8), + "[WEST]" = list( 0, 8) + ), + (slot_belt_str) = list( + "[NORTH]" = list( 0, 0), + "[EAST]" = list( 8, 0), + "[SOUTH]" = list( 0, 0), + "[WEST]" = list(-8, 0) + ), + (slot_glasses_str) = list( + "[NORTH]" = list( 0, 10), + "[EAST]" = list( 0, 11), + "[SOUTH]" = list( 0, 11), + "[WEST]" = list( 0, 11) + ) ) . = ..() diff --git a/mods/species/utility_frames/species_bodytypes.dm b/mods/species/utility_frames/species_bodytypes.dm index 378c5d86f08..59b71e3abd4 100644 --- a/mods/species/utility_frames/species_bodytypes.dm +++ b/mods/species/utility_frames/species_bodytypes.dm @@ -32,14 +32,14 @@ uid = "bodytype_prosthetic_utility_frame" /decl/bodytype/prosthetic/utility_frame/Initialize() - equip_adjust = list( - "[slot_l_ear_str]" = list( + _equip_adjust = list( + (slot_l_ear_str) = list( "[NORTH]" = list( 2, 0), "[EAST]" = list( 0, 0), "[SOUTH]" = list(-2, 0), "[WEST]" = list( 0, 0) ), - "[slot_r_ear_str]" = list( + (slot_r_ear_str) = list( "[NORTH]" = list(-2, 0), "[EAST]" = list( 0, 0), "[SOUTH]" = list( 2, 0), @@ -48,4 +48,4 @@ ) . = ..() -DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/utility_frame, utility_frame) \ No newline at end of file +DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/utility_frame, utility_frame) diff --git a/mods/species/vox/datum/species_bodytypes.dm b/mods/species/vox/datum/species_bodytypes.dm index 25f4e64c180..ee3c6ba7f39 100644 --- a/mods/species/vox/datum/species_bodytypes.dm +++ b/mods/species/vox/datum/species_bodytypes.dm @@ -60,17 +60,17 @@ var/icon/vox_marking_icon = 'mods/species/vox/icons/body/soldier/markings.dmi' /decl/bodytype/vox/Initialize() - if(!length(equip_adjust)) - equip_adjust = list( - BP_L_HAND = list("[NORTH]" = list(0, -2), "[EAST]" = list(0, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list( 0, -2)), - BP_R_HAND = list("[NORTH]" = list(0, -2), "[EAST]" = list(0, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list( 0, -2)), - slot_head_str = list("[NORTH]" = list(0, -2), "[EAST]" = list(3, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list(-3, -2)), - slot_wear_mask_str = list("[NORTH]" = list(0, 0), "[EAST]" = list(4, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list(-4, 0)), - slot_wear_suit_str = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), - slot_w_uniform_str = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), - slot_underpants_str = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), - slot_undershirt_str = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), - slot_back_str = list("[NORTH]" = list(0, 0), "[EAST]" = list(3, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list(-3, 0)) + if(!length(_equip_adjust)) + _equip_adjust = list( + (BP_L_HAND) = list("[NORTH]" = list(0, -2), "[EAST]" = list(0, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list( 0, -2)), + (BP_R_HAND) = list("[NORTH]" = list(0, -2), "[EAST]" = list(0, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list( 0, -2)), + (slot_head_str) = list("[NORTH]" = list(0, -2), "[EAST]" = list(3, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list(-3, -2)), + (slot_wear_mask_str) = list("[NORTH]" = list(0, 0), "[EAST]" = list(4, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list(-4, 0)), + (slot_wear_suit_str) = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), + (slot_w_uniform_str) = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), + (slot_underpants_str) = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), + (slot_undershirt_str) = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), + (slot_back_str) = list("[NORTH]" = list(0, 0), "[EAST]" = list(3, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list(-3, 0)) ) return ..() From 996e803786df59487a026098fa6cfd27ade070c8 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 12 Dec 2024 18:44:10 +1100 Subject: [PATCH 261/554] Allows overriding organ appearance bodytype for future work. --- .../organs/external/_external_icons.dm | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index 7c7c5b2e24e..887bdb0f6c6 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -27,11 +27,14 @@ var/global/list/limb_icon_cache = list() _icon_cache_key = null skin_tone = null skin_colour = null + var/decl/bodytype/icon_bodytype = get_organ_appearance_bodytype() + if(!icon_bodytype) + return // This used to do a bodytype set but that was *really really bad.* Things that need that should do it themselves. - skin_blend = bodytype.limb_blend - if(!isnull(human.skin_tone) && bodytype?.appearance_flags & HAS_A_SKIN_TONE) + skin_blend = icon_bodytype.limb_blend + if(!isnull(human.skin_tone) && (icon_bodytype.appearance_flags & HAS_A_SKIN_TONE)) skin_tone = human.skin_tone - if(bodytype.appearance_flags & HAS_SKIN_COLOR) + if(icon_bodytype.appearance_flags & HAS_SKIN_COLOR) skin_colour = human.get_skin_colour() /obj/item/organ/external/head/sync_colour_to_human(var/mob/living/human/human) @@ -46,21 +49,28 @@ var/global/list/limb_icon_cache = list() addtimer(CALLBACK(last_owner, TYPE_PROC_REF(/mob, update_hair)), 1, TIMER_UNIQUE) return ..() +// For overriding on shapeshifters/changelings in the future. +/obj/item/organ/external/proc/get_organ_appearance_bodytype() + RETURN_TYPE(/decl/bodytype) + return bodytype + /obj/item/organ/external/proc/update_limb_icon_file() - if(!bodytype) // This should not happen. + var/decl/bodytype/icon_bodytype = get_organ_appearance_bodytype() + if(!icon_bodytype) // This should not happen. icon = initial(icon) else if(limb_flags & ORGAN_FLAG_SKELETAL) - icon = bodytype.get_skeletal_icon(owner) + icon = icon_bodytype.get_skeletal_icon(owner) else if(!BP_IS_PROSTHETIC(src) && (status & ORGAN_MUTATED)) - icon = bodytype.get_base_icon(owner, get_deform = TRUE) + icon = icon_bodytype.get_base_icon(owner, get_deform = TRUE) else - icon = bodytype.get_base_icon(owner) + icon = icon_bodytype.get_base_icon(owner) var/global/list/organ_icon_cache = list() /obj/item/organ/external/proc/generate_mob_icon() // Generate base icon with colour and tone. - var/icon/ret = bodytype.apply_limb_colouration(src, new /icon(icon, icon_state)) + var/decl/bodytype/icon_bodytype = get_organ_appearance_bodytype() + var/icon/ret = icon_bodytype.apply_limb_colouration(src, new /icon(icon, icon_state)) if(limb_flags & ORGAN_FLAG_SKELETAL) global.organ_icon_cache[_icon_cache_key] = ret return ret @@ -75,7 +85,7 @@ var/global/list/organ_icon_cache = list() else ret.Blend(rgb(-skin_tone, -skin_tone, -skin_tone), ICON_SUBTRACT) - if((bodytype.appearance_flags & HAS_SKIN_COLOR) && skin_colour) + if((icon_bodytype.appearance_flags & HAS_SKIN_COLOR) && skin_colour) ret.Blend(skin_colour, skin_blend) // Body markings, hair, lips, etc. @@ -111,7 +121,7 @@ var/global/list/organ_icon_cache = list() /obj/item/organ/external/proc/get_icon_cache_key_components() - . = list("[icon_state]_[species.name]_[bodytype?.name || "BAD_BODYTYPE"]_[render_alpha]_[icon]") + . = list("[icon_state]_[species.name]_[get_organ_appearance_bodytype()?.name || "BAD_BODYTYPE"]_[render_alpha]_[icon]") // Skeletons don't care about most icon appearance stuff. if(limb_flags & ORGAN_FLAG_SKELETAL) @@ -191,7 +201,7 @@ var/global/list/organ_icon_cache = list() var/list/refresh_accessories if(accessory_metadata) - if(!accessory_decl.accessory_is_available(owner, species, bodytype, (owner ? owner.get_traits() : FALSE))) + if(!accessory_decl.accessory_is_available(owner, species, get_organ_appearance_bodytype(), (owner ? owner.get_traits() : FALSE))) return FALSE var/list/existing_metadata = LAZYACCESS(accessories, accessory_type) if(same_entries(existing_metadata, accessory_metadata)) @@ -324,9 +334,10 @@ var/global/list/robot_hud_colours = list("#ffffff","#cccccc","#aaaaaa","#888888" var/image/temp = image(limb_icon_cache[cache_key]) if(species) // Calculate the required colour matrix. - var/r = 0.30 * bodytype.health_hud_intensity - var/g = 0.59 * bodytype.health_hud_intensity - var/b = 0.11 * bodytype.health_hud_intensity + var/hud_intensity = get_organ_appearance_bodytype()?.health_hud_intensity || 1 + var/r = 0.30 * hud_intensity + var/g = 0.59 * hud_intensity + var/b = 0.11 * hud_intensity temp.color = list(r, r, r, g, g, g, b, b, b) temp.pixel_x = owner.default_pixel_x temp.pixel_y = owner.default_pixel_y @@ -361,7 +372,7 @@ var/global/list/robot_hud_colours = list("#ffffff","#cccccc","#aaaaaa","#888888" if(ispath(accessory_style)) accessory_style = GET_DECL(accessory_style) // Check if this style is permitted for this species, period. - if(!istype(accessory_style) || !accessory_style?.accessory_is_available(owner, species, bodytype, (owner ? owner.get_traits() : FALSE))) + if(!istype(accessory_style) || !accessory_style?.accessory_is_available(owner, species, get_organ_appearance_bodytype(), (owner ? owner.get_traits() : FALSE))) return null // Check if we are concealed (long hair under a hat for example). if(accessory_style.is_hidden(src)) @@ -372,7 +383,7 @@ var/global/list/robot_hud_colours = list("#ffffff","#cccccc","#aaaaaa","#888888" for(var/acc_cat in _sprite_accessories) for(var/accessory in _sprite_accessories[acc_cat]) var/decl/sprite_accessory/accessory_style = GET_DECL(accessory) - if(!istype(accessory_style) || !accessory_style?.accessory_is_available(owner, species, bodytype, (owner ? owner.get_traits() : FALSE))) + if(!istype(accessory_style) || !accessory_style?.accessory_is_available(owner, species, get_organ_appearance_bodytype(), (owner ? owner.get_traits() : FALSE))) _sprite_accessories[acc_cat] -= accessory . = TRUE if(.) From f466649d1f41217b345990adba47c1850261f299 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 12 Dec 2024 19:12:17 +1100 Subject: [PATCH 262/554] Adding some supporting code for shapeshifters. --- code/game/objects/item_mob_overlay.dm | 4 ++-- code/modules/bodytype/bodytype_offsets.dm | 4 ++++ code/modules/mob/living/living_organs.dm | 12 ----------- code/modules/mob/mob.dm | 10 ++++++++- code/modules/mob/mob_grabs.dm | 9 -------- code/modules/mob/mob_organs.dm | 21 +++++++++++++++++++ .../organs/external/_external_icons.dm | 16 +++++++++----- code/modules/organs/internal/eyes.dm | 20 +++++++++++------- code/modules/organs/organ.dm | 14 +++++++++++++ nebula.dme | 1 + 10 files changed, 75 insertions(+), 36 deletions(-) create mode 100644 code/modules/mob/mob_organs.dm diff --git a/code/game/objects/item_mob_overlay.dm b/code/game/objects/item_mob_overlay.dm index be29ad618ca..d6881129c23 100644 --- a/code/game/objects/item_mob_overlay.dm +++ b/code/game/objects/item_mob_overlay.dm @@ -68,7 +68,7 @@ var/global/list/icon_state_cache = list() if(!use_single_icon) var/mob_state = "[item_state || icon_state][state_modifier]" var/mob_icon = global.default_onmob_icons[slot] - var/decl/bodytype/root_bodytype = user_mob?.get_bodytype() + var/decl/bodytype/root_bodytype = user_mob?.get_equipment_bodytype(slot, bodypart) if(istype(root_bodytype)) var/use_slot = (bodypart in root_bodytype.get_equip_adjustments(user_mob)) ? bodypart : slot return root_bodytype.get_offset_overlay_image(user_mob, mob_icon, mob_state, color, use_slot) @@ -153,7 +153,7 @@ var/global/list/icon_state_cache = list() overlay.icon_state = wielded_state apply_additional_mob_overlays(user_mob, bodytype, overlay, slot, bodypart, use_fallback_if_icon_missing) - var/decl/bodytype/root_bodytype = user_mob?.get_bodytype() + var/decl/bodytype/root_bodytype = user_mob?.get_equipment_bodytype(slot, bodypart) if(root_bodytype && root_bodytype.bodytype_category != bodytype) var/list/overlays_to_offset = overlay.overlays overlay = root_bodytype.get_offset_overlay_image(user_mob, overlay.icon, overlay.icon_state, color, (bodypart || slot)) diff --git a/code/modules/bodytype/bodytype_offsets.dm b/code/modules/bodytype/bodytype_offsets.dm index 279b43e9918..0a149de8192 100644 --- a/code/modules/bodytype/bodytype_offsets.dm +++ b/code/modules/bodytype/bodytype_offsets.dm @@ -21,6 +21,10 @@ The slots that you can use are found in items_clothing.dm and are the inventory VAR_PRIVATE/list/_equip_adjust VAR_PRIVATE/list/equip_overlays = list() +// Will be used by changelings/shapeshifters in the future +/decl/bodytype/proc/resolve_to_equipment_bodytype(mob/living/user) + return src + /decl/bodytype/proc/get_equip_adjustments(mob/mob) return _equip_adjust diff --git a/code/modules/mob/living/living_organs.dm b/code/modules/mob/living/living_organs.dm index 9fefc64c894..dce22c9a993 100644 --- a/code/modules/mob/living/living_organs.dm +++ b/code/modules/mob/living/living_organs.dm @@ -1,15 +1,3 @@ -/mob/living/get_organs() - for(var/organ in get_external_organs()) - LAZYADD(., organ) - for(var/organ in get_internal_organs()) - LAZYADD(., organ) - -/mob/living/proc/get_external_organs() - return - -/mob/living/proc/get_internal_organs() - return - /mob/living/proc/get_organs_by_categories(var/category) return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 449c6a76a2a..03827667a28 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1110,10 +1110,18 @@ /mob/proc/get_bodytype() RETURN_TYPE(/decl/bodytype) +// Bit of a stub for now, but should return the bodytype specific +// to the slot and organ being checked in the future instead of +// always using the mob root bodytype. +/mob/proc/get_equipment_bodytype(slot, bodypart) + RETURN_TYPE(/decl/bodytype) + var/decl/bodytype/root_bodytype = get_bodytype() + return root_bodytype?.resolve_to_equipment_bodytype(src) + /mob/proc/has_body_flag(flag, default = FALSE) var/decl/bodytype/root_bodytype = get_bodytype() if(istype(root_bodytype)) - return root_bodytype.body_flags & flag + return (root_bodytype.body_flags & flag) return default /// Update the mouse pointer of the attached client in this mob. diff --git a/code/modules/mob/mob_grabs.dm b/code/modules/mob/mob_grabs.dm index e02bed4b3dc..0cea8113ed7 100644 --- a/code/modules/mob/mob_grabs.dm +++ b/code/modules/mob/mob_grabs.dm @@ -7,15 +7,6 @@ return /mob/proc/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0) return -/mob/proc/has_organ(organ_tag) - return !!get_organ(organ_tag, /obj/item/organ) -/mob/proc/get_organ(var/organ_tag, var/expected_type) - RETURN_TYPE(/obj/item/organ) - return -/mob/proc/get_injured_organs() - return -/mob/proc/get_organs() - return // End grab casting stubs. /mob/can_be_grabbed(var/mob/grabber, var/target_zone) diff --git a/code/modules/mob/mob_organs.dm b/code/modules/mob/mob_organs.dm new file mode 100644 index 00000000000..eb5b763c95f --- /dev/null +++ b/code/modules/mob/mob_organs.dm @@ -0,0 +1,21 @@ +/mob/proc/has_organ(organ_tag) + return !!get_organ(organ_tag, /obj/item/organ) + +/mob/proc/get_organ(var/organ_tag, var/expected_type) + RETURN_TYPE(/obj/item/organ) + return + +/mob/proc/get_injured_organs() + return + +/mob/proc/get_external_organs() + return + +/mob/proc/get_internal_organs() + return + +/mob/proc/get_organs() + for(var/organ in get_external_organs()) + LAZYADD(., organ) + for(var/organ in get_internal_organs()) + LAZYADD(., organ) diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index 887bdb0f6c6..8f9b601a8c5 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -49,10 +49,16 @@ var/global/list/limb_icon_cache = list() addtimer(CALLBACK(last_owner, TYPE_PROC_REF(/mob, update_hair)), 1, TIMER_UNIQUE) return ..() -// For overriding on shapeshifters/changelings in the future. -/obj/item/organ/external/proc/get_organ_appearance_bodytype() - RETURN_TYPE(/decl/bodytype) - return bodytype +/obj/item/organ/external/set_organ_appearance_bodytype(decl/bodytype/new_bodytype, update_sprite_accessories = TRUE, skip_owner_update = FALSE) + . = ..() + if(.) + if(update_sprite_accessories) + sanitize_sprite_accessories(skip_update = TRUE) + _icon_cache_key = null + get_icon_for_bodytype() + update_icon() + if(owner && !skip_owner_update) + owner.update_body() /obj/item/organ/external/proc/update_limb_icon_file() var/decl/bodytype/icon_bodytype = get_organ_appearance_bodytype() @@ -121,7 +127,7 @@ var/global/list/organ_icon_cache = list() /obj/item/organ/external/proc/get_icon_cache_key_components() - . = list("[icon_state]_[species.name]_[get_organ_appearance_bodytype()?.name || "BAD_BODYTYPE"]_[render_alpha]_[icon]") + . = list("[icon_state]_[species.name]_[get_organ_appearance_bodytype()?.uid || "BAD_BODYTYPE"]_[render_alpha]_[icon]") // Skeletons don't care about most icon appearance stuff. if(limb_flags & ORGAN_FLAG_SKELETAL) diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index f193afaa4da..7dbc75053e6 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -36,19 +36,25 @@ verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color_verb verbs |= /obj/item/organ/internal/eyes/proc/toggle_eye_glow +/obj/item/organ/external/eyes/set_organ_appearance_bodytype(decl/bodytype/new_bodytype, update_sprite_accessories = TRUE, skip_owner_update = FALSE) + . = ..() + if(. && owner && !skip_owner_update) + owner.update_eyes() + /obj/item/organ/internal/eyes/proc/get_onhead_icon() + var/decl/bodytype/icon_bodytype = get_organ_appearance_bodytype() var/modifier = owner?.get_overlay_state_modifier() var/eye_state = modifier ? "eyes[modifier]" : "eyes" last_cached_eye_colour = eye_colour - last_eye_cache_key = "[type]-[bodytype.eye_icon]-[last_cached_eye_colour]-[bodytype.eye_offset]-[eye_state]" - if(!bodytype.eye_icon) + last_eye_cache_key = "[type]-[icon_bodytype.eye_icon]-[last_cached_eye_colour]-[icon_bodytype.eye_offset]-[eye_state]" + if(!icon_bodytype.eye_icon) return if(!global.eye_icon_cache[last_eye_cache_key]) - var/icon/eyes_icon = icon(icon = bodytype.eye_icon, icon_state = eye_state) - if(bodytype.eye_offset) - eyes_icon.Shift(NORTH, bodytype.eye_offset) - if(bodytype.apply_eye_colour) - eyes_icon.Blend(last_cached_eye_colour, bodytype.eye_blend) + var/icon/eyes_icon = icon(icon = icon_bodytype.eye_icon, icon_state = eye_state) + if(icon_bodytype.eye_offset) + eyes_icon.Shift(NORTH, icon_bodytype.eye_offset) + if(icon_bodytype.apply_eye_colour) + eyes_icon.Blend(last_cached_eye_colour, icon_bodytype.eye_blend) global.eye_icon_cache[last_eye_cache_key] = eyes_icon return global.eye_icon_cache[last_eye_cache_key] diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 8de64cc2272..92bcc2d8ed7 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -22,6 +22,7 @@ var/mob/living/human/owner // Current mob owning the organ. var/decl/species/species // Original species. var/decl/bodytype/bodytype // Original bodytype. + var/decl/bodytype/appearance_bodytype // A bodytype used only for icons, marking validation and equipment offsets. var/list/ailments // Current active ailments if any. var/meat_name // Taken from first owner. @@ -674,3 +675,16 @@ var/global/list/ailment_reference_cache = list() new /obj/effect/decal/cleanable/ash(loc) if(!QDELETED(src)) qdel(src) + +// For overriding on shapeshifters/changelings in the future. +/obj/item/organ/proc/set_organ_appearance_bodytype(decl/bodytype/new_bodytype, update_sprite_accessories = TRUE, skip_owner_update = FALSE) + if(ispath(new_bodytype, /decl/bodytype)) + new_bodytype = GET_DECL(new_bodytype) + if((new_bodytype && !istype(new_bodytype)) || appearance_bodytype == new_bodytype || bodytype == new_bodytype) + return FALSE + appearance_bodytype = new_bodytype + return TRUE + +/obj/item/organ/proc/get_organ_appearance_bodytype() + RETURN_TYPE(/decl/bodytype) + return appearance_bodytype || bodytype diff --git a/nebula.dme b/nebula.dme index c08cae0b5a9..a0c5a4609a2 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2827,6 +2827,7 @@ #include "code\modules\mob\mob_intent.dm" #include "code\modules\mob\mob_layering.dm" #include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_organs.dm" #include "code\modules\mob\mob_snapshot.dm" #include "code\modules\mob\mob_status.dm" #include "code\modules\mob\mob_temperature.dm" From ee0259599969a82d60d248fc389855b4375dc13f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 12 Dec 2024 19:46:50 +1100 Subject: [PATCH 263/554] Removing old shapeshifter species/bodytype pending rewrite. --- code/modules/species/species_getters.dm | 3 - code/modules/species/species_shapeshifter.dm | 129 ------------------ .../species/species_shapeshifter_bodytypes.dm | 48 ------- mods/species/vox/datum/species_bodytypes.dm | 63 +++++++-- nebula.dme | 2 - 5 files changed, 54 insertions(+), 191 deletions(-) delete mode 100644 code/modules/species/species_shapeshifter.dm delete mode 100644 code/modules/species/species_shapeshifter_bodytypes.dm diff --git a/code/modules/species/species_getters.dm b/code/modules/species/species_getters.dm index f2e3abce845..4bf80fd91e7 100644 --- a/code/modules/species/species_getters.dm +++ b/code/modules/species/species_getters.dm @@ -1,6 +1,3 @@ -/decl/species/proc/get_valid_shapeshifter_forms(var/mob/living/human/H) - return list() - /decl/species/proc/get_additional_examine_text(var/mob/living/human/H) return diff --git a/code/modules/species/species_shapeshifter.dm b/code/modules/species/species_shapeshifter.dm deleted file mode 100644 index f49e307387e..00000000000 --- a/code/modules/species/species_shapeshifter.dm +++ /dev/null @@ -1,129 +0,0 @@ -// This is something of an intermediary species used for species that -// need to emulate the appearance of another race. Currently it is only -// used for slimes but it may be useful for other species later. -var/global/list/wrapped_species_by_ref = list() - -/decl/species/shapeshifter - available_bodytypes = list(/decl/bodytype/shapeshifter) - inherent_verbs = list( - /mob/living/human/proc/shapeshifter_select_shape, - /mob/living/human/proc/shapeshifter_select_hair, - /mob/living/human/proc/shapeshifter_select_gender, - /mob/living/human/proc/shapeshifter_select_colour - ) - hidden_from_codex = TRUE - var/list/valid_transform_species = list() - var/monochromatic - var/default_form - -/decl/species/shapeshifter/Initialize() - default_form = global.using_map.default_species - valid_transform_species |= default_form - . = ..() - -/decl/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/human/H) - return valid_transform_species - -/decl/species/shapeshifter/get_root_species_name(var/mob/living/human/H) - if(!H) return ..() - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - return S.get_root_species_name(H) - -/decl/species/shapeshifter/handle_pre_spawn(var/mob/living/human/H) - ..() - wrapped_species_by_ref["\ref[H]"] = default_form - -/decl/species/shapeshifter/handle_post_spawn(var/mob/living/human/H) - if(monochromatic) - var/skin_colour = H.get_skin_colour() - SET_HAIR_COLOR(H, skin_colour, TRUE) - SET_FACIAL_HAIR_COLOR(H, skin_colour, TRUE) - ..() - -/decl/species/shapeshifter/get_pain_emote(var/mob/living/human/H, var/pain_power) - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - return S.get_pain_emote(H, pain_power) - -// Verbs follow. -/mob/living/human/proc/shapeshifter_select_hair() - - set name = "Select Hair" - set category = "Abilities" - - if(stat || is_on_special_ability_cooldown()) - return - - set_special_ability_cooldown(1 SECOND) - - visible_message("\The [src]'s form contorts subtly.") - var/decl/bodytype/root_bodytype = get_bodytype() - var/list/hairstyles = species.get_available_accessory_types(root_bodytype, SAC_HAIR) - if(length(hairstyles)) - var/decl/sprite_accessory/new_hair = input("Select a hairstyle.", "Shapeshifter Hair") as null|anything in hairstyles - SET_HAIR_STYLE(src, (new_hair ? new_hair.type : /decl/sprite_accessory/hair/bald), FALSE) - - var/list/beardstyles = species.get_available_accessory_types(root_bodytype, SAC_FACIAL_HAIR) - if(length(beardstyles)) - var/decl/sprite_accessory/new_hair = input("Select a facial hair style.", "Shapeshifter Hair") as null|anything in beardstyles - SET_FACIAL_HAIR_STYLE(src, (new_hair ? new_hair.type : /decl/sprite_accessory/facial_hair/shaved), FALSE) - -/mob/living/human/proc/shapeshifter_select_gender() - - set name = "Select Gender" - set category = "Abilities" - - if(stat || is_on_special_ability_cooldown()) - return - - set_special_ability_cooldown(5 SECONDS) - - var/new_gender = input("Please select a gender.", "Shapeshifter Gender") as null|anything in list(FEMALE, MALE, NEUTER, PLURAL) - if(!new_gender) - return - - visible_message("\The [src]'s form contorts subtly.") - set_gender(new_gender, TRUE) - -/mob/living/human/proc/shapeshifter_select_shape() - - set name = "Select Body Shape" - set category = "Abilities" - - if(stat ||is_on_special_ability_cooldown()) - return - - set_special_ability_cooldown(5 SECONDS) - - var/new_species = input("Please select a species to emulate.", "Shapeshifter Body") as null|anything in species.get_valid_shapeshifter_forms(src) - if(!new_species || !get_species_by_key(new_species) || wrapped_species_by_ref["\ref[src]"] == new_species) - return - - wrapped_species_by_ref["\ref[src]"] = new_species - visible_message("\The [src] shifts and contorts, taking the form of \a ["\improper [new_species]"]!") - try_refresh_visible_overlays() - -/mob/living/human/proc/shapeshifter_select_colour() - - set name = "Select Body Colour" - set category = "Abilities" - - if(stat || is_on_special_ability_cooldown()) - return - - set_special_ability_cooldown(5 SECONDS) - - var/new_skin = input("Please select a new body color.", "Shapeshifter Colour") as color - if(!new_skin) - return - shapeshifter_set_colour(new_skin) - -/mob/living/human/proc/shapeshifter_set_colour(var/new_skin) - set_skin_colour(new_skin, skip_update = TRUE) - var/decl/species/shapeshifter/S = species - if(S.monochromatic) - var/skin_colour = get_skin_colour() - SET_HAIR_COLOR(src, skin_colour, TRUE) - SET_FACIAL_HAIR_COLOR(src, skin_colour, TRUE) - for(var/obj/item/organ/external/E in get_external_organs()) - E.sync_colour_to_human(src) - try_refresh_visible_overlays() diff --git a/code/modules/species/species_shapeshifter_bodytypes.dm b/code/modules/species/species_shapeshifter_bodytypes.dm deleted file mode 100644 index a1ee2815579..00000000000 --- a/code/modules/species/species_shapeshifter_bodytypes.dm +++ /dev/null @@ -1,48 +0,0 @@ -/decl/bodytype/shapeshifter - name = "protean form" - bodytype_category = BODYTYPE_HUMANOID - uid = "bodytype_shapeshifter" - -/decl/bodytype/shapeshifter/apply_limb_colouration(var/obj/item/organ/external/E, var/icon/applying) - applying.MapColors("#4d4d4d","#969696","#1c1c1c", "#000000") - applying = ..() - applying += rgb(,,,180) // Makes the icon translucent, SO INTUITIVE TY BYOND - return applying - -/decl/bodytype/shapeshifter/check_dismember_type_override(var/disintegrate) - if(disintegrate == DISMEMBER_METHOD_EDGE) - return DISMEMBER_METHOD_BLUNT - return ..() - -/decl/bodytype/shapeshifter/get_base_icon(var/mob/living/human/H, var/get_deform) - if(!H) return ..(null, get_deform) - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - return S.default_bodytype.get_base_icon(H, get_deform) - -/decl/bodytype/shapeshifter/get_blood_overlays(var/mob/living/human/H) - if(!H) return ..() - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - return S.default_bodytype.get_blood_overlays(H) - -/decl/bodytype/shapeshifter/get_damage_overlays(var/mob/living/human/H) - if(!H) return ..() - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - return S.default_bodytype.get_damage_overlays(H) - -/decl/bodytype/shapeshifter/get_husk_icon(var/mob/living/human/H) - if(H) - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - if(S) return S.default_bodytype.get_husk_icon(H) - return ..() - -/decl/bodytype/shapeshifter/get_icon_cache_uid(var/mob/H) - . = ..() - if(H) - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - if(S) return S.default_bodytype.get_icon_cache_uid(H) - -/decl/bodytype/shapeshifter/apply_bodytype_organ_modifications(obj/item/organ/org) - ..() - var/obj/item/organ/external/E = org - if(istype(E) && E.owner) - E.sync_colour_to_human(E.owner) \ No newline at end of file diff --git a/mods/species/vox/datum/species_bodytypes.dm b/mods/species/vox/datum/species_bodytypes.dm index ee3c6ba7f39..cff74b6141d 100644 --- a/mods/species/vox/datum/species_bodytypes.dm +++ b/mods/species/vox/datum/species_bodytypes.dm @@ -62,15 +62,60 @@ /decl/bodytype/vox/Initialize() if(!length(_equip_adjust)) _equip_adjust = list( - (BP_L_HAND) = list("[NORTH]" = list(0, -2), "[EAST]" = list(0, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list( 0, -2)), - (BP_R_HAND) = list("[NORTH]" = list(0, -2), "[EAST]" = list(0, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list( 0, -2)), - (slot_head_str) = list("[NORTH]" = list(0, -2), "[EAST]" = list(3, -2), "[SOUTH]" = list( 0, -2), "[WEST]" = list(-3, -2)), - (slot_wear_mask_str) = list("[NORTH]" = list(0, 0), "[EAST]" = list(4, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list(-4, 0)), - (slot_wear_suit_str) = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), - (slot_w_uniform_str) = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), - (slot_underpants_str) = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), - (slot_undershirt_str) = list("[NORTH]" = list(0, -1), "[EAST]" = list(0, -1), "[SOUTH]" = list( 0, -1), "[WEST]" = list( 0, -1)), - (slot_back_str) = list("[NORTH]" = list(0, 0), "[EAST]" = list(3, 0), "[SOUTH]" = list( 0, 0), "[WEST]" = list(-3, 0)) + (BP_L_HAND) = list( + "[NORTH]" = list(0, -2), + "[EAST]" = list(0, -2), + "[SOUTH]" = list( 0, -2), + "[WEST]" = list( 0, -2) + ), + (BP_R_HAND) = list( + "[NORTH]" = list(0, -2), + "[EAST]" = list(0, -2), + "[SOUTH]" = list( 0, -2), + "[WEST]" = list( 0, -2) + ), + (slot_head_str) = list( + "[NORTH]" = list(0, -2), + "[EAST]" = list(3, -2), + "[SOUTH]" = list( 0, -2), + "[WEST]" = list(-3, -2) + ), + (slot_wear_mask_str) = list( + "[NORTH]" = list(0, 0), + "[EAST]" = list(4, 0), + "[SOUTH]" = list( 0, 0), + "[WEST]" = list(-4, 0) + ), + (slot_wear_suit_str) = list( + "[NORTH]" = list(0, -1), + "[EAST]" = list(0, -1), + "[SOUTH]" = list( 0, -1), + "[WEST]" = list( 0, -1) + ), + (slot_w_uniform_str) = list( + "[NORTH]" = list(0, -1), + "[EAST]" = list(0, -1), + "[SOUTH]" = list( 0, -1), + "[WEST]" = list( 0, -1) + ), + (slot_underpants_str) = list( + "[NORTH]" = list(0, -1), + "[EAST]" = list(0, -1), + "[SOUTH]" = list( 0, -1), + "[WEST]" = list( 0, -1) + ), + (slot_undershirt_str) = list( + "[NORTH]" = list(0, -1), + "[EAST]" = list(0, -1), + "[SOUTH]" = list( 0, -1), + "[WEST]" = list( 0, -1) + ), + (slot_back_str) = list( + "[NORTH]" = list(0, 0), + "[EAST]" = list(3, 0), + "[SOUTH]" = list( 0, 0), + "[WEST]" = list(-3, 0) + ) ) return ..() diff --git a/nebula.dme b/nebula.dme index a0c5a4609a2..f7c82a45cff 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3771,8 +3771,6 @@ #include "code\modules\species\species_getters.dm" #include "code\modules\species\species_helpers.dm" #include "code\modules\species\species_hud.dm" -#include "code\modules\species\species_shapeshifter.dm" -#include "code\modules\species\species_shapeshifter_bodytypes.dm" #include "code\modules\species\outsider\random.dm" #include "code\modules\species\station\golem.dm" #include "code\modules\species\station\human.dm" From 8ef8f6857f5231d0dd7c5b162175edea1f57e3b2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 29 Dec 2024 12:42:28 +1100 Subject: [PATCH 264/554] Cleaning up attack_hand interactions. --- code/_onclick/click.dm | 19 +----- code/_onclick/other_mobs.dm | 6 ++ code/datums/ai/aggressive.dm | 60 +++++++++++-------- code/game/objects/items/__item.dm | 3 +- .../mob/living/human/human_attackhand.dm | 4 -- 5 files changed, 46 insertions(+), 46 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 7e4d29c799a..c2d4cfb5862 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -118,7 +118,7 @@ if(holding) // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && (!do_attack_windup_checking(A) || holding != get_active_held_item())) + if(a_intent == I_HURT && istype(A) && (!(A) || holding != get_active_held_item())) return TRUE var/resolved = holding.resolve_attackby(A, src, params) @@ -143,10 +143,6 @@ if(A.Adjacent(src)) // see adjacent.dm if(holding) - // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && (!do_attack_windup_checking(A) || holding != get_active_held_item())) - return TRUE - // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) @@ -217,18 +213,7 @@ if(istype(G) && G.Touch(A,1)) return TRUE - // Pick up items. - if(check_dexterity(DEXTERITY_HOLD_ITEM, silent = TRUE)) - return A.attack_hand(src) - - // TODO: some way to check if we SHOULD be doing an attack windup here; - // corgis attacking a tree, for example, will do the windup animation despite - // having no interaction or message shown at the end of it. - // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && !do_attack_windup_checking(A)) - return TRUE - - return FALSE + return A.attack_hand(src) /* Ranged unarmed attack: diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 77c594dd375..49bf7f7047f 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -8,9 +8,15 @@ /atom/proc/can_interact_with_storage(user, strict = FALSE) return isliving(user) +/atom/proc/get_required_interaction_dexterity() + return DEXTERITY_NONE + /atom/proc/attack_hand(mob/user) SHOULD_CALL_PARENT(TRUE) + if(!user.check_dexterity(get_required_interaction_dexterity(), silent = TRUE)) + return FALSE + if(can_interact_with_storage(user, strict = TRUE) && storage && user.check_dexterity((DEXTERITY_HOLD_ITEM|DEXTERITY_EQUIP_ITEM), TRUE)) add_fingerprint(user) storage.open(user) diff --git a/code/datums/ai/aggressive.dm b/code/datums/ai/aggressive.dm index 9335610bcde..84296f856bf 100644 --- a/code/datums/ai/aggressive.dm +++ b/code/datums/ai/aggressive.dm @@ -92,10 +92,14 @@ return TRUE /datum/mob_controller/aggressive/proc/attack_target() + + set waitfor = FALSE + var/atom/target = get_target() if(!istype(target)) lose_target() return + if(isliving(target) && body.buckled_mob == target && (!body.faction || body.buckled_mob.faction != body.faction)) body.visible_message(SPAN_DANGER("\The [body] attempts to unseat \the [body.buckled_mob]!")) body.set_dir(pick(global.cardinal)) @@ -107,11 +111,21 @@ var/mob/living/victim = target SET_STATUS_MAX(victim, STAT_WEAK, 3) return target - if(body.Adjacent(target)) - body.a_intent = I_HURT - body.ClickOn(target) + + if(!body.Adjacent(target)) + return target + + // AI-driven mobs have a melee telegraph that needs to be handled here. + if(!body.do_attack_windup_checking(target)) + return target + + if(QDELETED(body) || body.incapacitated() || QDELETED(target)) return target + body.a_intent = I_HURT + body.ClickOn(target) + return target + /datum/mob_controller/aggressive/destroy_surroundings() if(!body.can_act()) @@ -174,27 +188,25 @@ if(!(. = ..())) return - if(!only_attack_enemies) - if(source) - set_target(source) - move_to_target(move_only = TRUE) - return - - var/list/allies - var/list/around = view(body, 7) - for(var/atom/movable/A in around) - if(A == body || !isliving(A)) - continue - var/mob/living/M = A - if(attack_same_faction || M.faction != body.faction) - add_enemy(M) - else if(istype(M.ai)) - LAZYADD(allies, M.ai) - - var/list/enemies = get_enemies() - if(LAZYLEN(enemies) && LAZYLEN(allies)) - for(var/datum/mob_controller/ally as anything in allies) - ally.add_enemies(enemies) + if(only_attack_enemies) + var/list/allies + var/list/around = view(body, 7) + for(var/atom/movable/A in around) + if(A == body || !isliving(A)) + continue + var/mob/living/M = A + if(attack_same_faction || M.faction != body.faction) + add_enemy(M) + else if(istype(M.ai)) + LAZYADD(allies, M.ai) + var/list/enemies = get_enemies() + if(LAZYLEN(enemies) && LAZYLEN(allies)) + for(var/datum/mob_controller/ally as anything in allies) + ally.add_enemies(enemies) + + if(source) + set_target(source) + move_to_target(move_only = TRUE) /datum/mob_controller/aggressive/move_to_target(var/move_only = FALSE) if(!body.can_act()) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index f5b5cc7eff2..e86feb7173b 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -96,7 +96,8 @@ var/paint_verb /// What dexterity is required to attack with this item? - var/needs_attack_dexterity = DEXTERITY_WIELD_ITEM + var/needs_attack_dexterity = DEXTERITY_WIELD_ITEM + var/needs_interaction_dexterity = DEXTERITY_HOLD_ITEM /// Vars relating to wielding the item with two or more hands. var/can_be_twohanded = FALSE diff --git a/code/modules/mob/living/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm index 3ad1462e59a..68fd260a161 100644 --- a/code/modules/mob/living/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -125,10 +125,6 @@ to_chat(user, SPAN_WARNING("You can't attack while incapacitated.")) return TRUE - // AI driven mobs have a melee telegraph that needs to be handled here. - if(user.a_intent == I_HURT && !user.do_attack_windup_checking(src)) - return TRUE - if(!ishuman(user)) attack_generic(user, rand(1,3), "punched") return TRUE From b88309ea111b2f1a7c96d9e40b4b46d26132d0a8 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 29 Dec 2024 13:33:39 +1100 Subject: [PATCH 265/554] Buffs hook hand dexterity. --- .../organs/prosthetics/prosthetics_manufacturer_models.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm index ad3b2c5e9ea..14f0e7bdac2 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm @@ -10,7 +10,7 @@ icon_base = 'icons/mob/human_races/cyberlimbs/morgan/morgan_main.dmi' modifier_string = "wooden" hardiness = 0.75 - manual_dexterity = DEXTERITY_SIMPLE_MACHINES + manual_dexterity = DEXTERITY_SIMPLE_MACHINES | DEXTERITY_HOLD_ITEM | DEXTERITY_EQUIP_ITEM | DEXTERITY_KEYBOARDS | DEXTERITY_GRAPPLE movement_slowdown = 1 is_robotic = FALSE modular_limb_tier = MODULAR_BODYPART_ANYWHERE From d8924ed40dbbd361365a5deea0986a0e64934a7c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 29 Dec 2024 13:38:39 +1100 Subject: [PATCH 266/554] Attempts to fix cleanbots becoming fixated on 1 bit of dirt they can't reach. --- code/modules/mob/living/bot/bot.dm | 8 ++-- code/modules/mob/living/bot/cleanbot.dm | 41 +++++++++--------- code/modules/mob/living/bot/farmbot.dm | 10 ++--- code/modules/mob/living/bot/floorbot.dm | 12 +++--- code/modules/mob/living/bot/medibot.dm | 57 +++++++++++++------------ code/modules/mob/living/bot/mulebot.dm | 2 +- code/modules/mob/living/bot/secbot.dm | 4 +- 7 files changed, 69 insertions(+), 65 deletions(-) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index fab8219c169..933e58b3afb 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -283,12 +283,12 @@ /mob/living/bot/proc/lookForTargets() return -/mob/living/bot/proc/confirmTarget(var/atom/A) - if(A.invisibility >= INVISIBILITY_LEVEL_ONE) +/mob/living/bot/proc/confirmTarget(atom/target) + if(target.invisibility >= INVISIBILITY_LEVEL_ONE) return 0 - if(A in ignore_list) + if(target in ignore_list) return 0 - if(!A.loc) + if(!target.loc) return 0 return 1 diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index e989ba53b32..95fac4ce948 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -1,5 +1,5 @@ /mob/living/bot/cleanbot - name = "Cleanbot" + name = "cleanbot" desc = "A little cleaning robot, he looks so excited!" icon = 'icons/mob/bot/cleanbot.dmi' icon_state = "cleanbot0" @@ -35,44 +35,47 @@ ignore_list -= g /mob/living/bot/cleanbot/lookForTargets() - for(var/obj/effect/decal/cleanable/D in view(world.view + 1, src)) - if(confirmTarget(D)) - target = D + for(var/obj/effect/decal/cleanable/decal in view(world.view + 1, src)) + if(confirmTarget(decal)) + target = decal playsound(src, 'sound/machines/boop1.ogg', 30) return -/mob/living/bot/cleanbot/confirmTarget(var/obj/effect/decal/cleanable/D) - if(!..()) - return 0 - for(var/T in target_types) - if(istype(D, T)) - return 1 - return 0 +/mob/living/bot/cleanbot/confirmTarget(atom/target) + . = ..() + if(.) + var/turf/decal_turf = get_turf(target) + if(!istype(decal_turf) || decal_turf.contains_dense_objects()) + return FALSE // Stop trying to clean under full-tile windows. + if(istype(target, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = target + return dirt.dirt_amount >= 50 // Stop trying to clean invisible dirt. + return is_type_in_list(target, target_types) /mob/living/bot/cleanbot/handleAdjacentTarget() if(get_turf(target) == src.loc) UnarmedAttack(target, TRUE) -/mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) +/mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/decal, var/proximity) . = ..() if(.) return - if(!istype(D)) + if(!istype(decal)) return TRUE - if(D.loc != loc) + if(decal.loc != loc) return FALSE busy = 1 - visible_message("\The [src] begins to clean up \the [D].") + visible_message("\The [src] begins to clean up \the [decal].") update_icon() - var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50 - if(do_after(src, cleantime, progress = 0) && !QDELETED(D)) - if(D == target) + var/cleantime = istype(decal, /obj/effect/decal/cleanable/dirt) ? 10 : 50 + if(do_after(src, cleantime, progress = 0) && !QDELETED(decal)) + if(decal == target) target = null - qdel(D) + qdel(decal) playsound(src, 'sound/machines/boop2.ogg', 30) busy = 0 update_icon() diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 86a8a941189..5244a343d74 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -240,21 +240,21 @@ if(prob(50)) new /obj/item/robot_parts/l_arm(my_turf) -/mob/living/bot/farmbot/confirmTarget(var/atom/targ) +/mob/living/bot/farmbot/confirmTarget(atom/target) if(!..()) return 0 - if(emagged && ishuman(targ)) - if(targ in view(world.view, src)) + if(emagged && ishuman(target)) + if(target in view(world.view, src)) return 1 return 0 - if(istype(targ, /obj/structure/hygiene/sink)) + if(istype(target, /obj/structure/hygiene/sink)) if(!tank || tank.reagents.total_volume >= tank.reagents.maximum_volume) return 0 return 1 - var/obj/machinery/portable_atmospherics/hydroponics/tray = targ + var/obj/machinery/portable_atmospherics/hydroponics/tray = target if(!istype(tray)) return 0 diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index b772273fd66..23125250d07 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -109,23 +109,23 @@ target = S return -/mob/living/bot/floorbot/confirmTarget(var/atom/A) // The fact that we do some checks twice may seem confusing but remember that the bot's settings may be toggled while it's moving and we want them to stop in that case +/mob/living/bot/floorbot/confirmTarget(atom/target) // The fact that we do some checks twice may seem confusing but remember that the bot's settings may be toggled while it's moving and we want them to stop in that case anchored = FALSE if(!..()) return 0 - if(istype(A, /obj/item/stack/tile/floor)) + if(istype(target, /obj/item/stack/tile/floor)) return (amount < maxAmount && eattiles) - if(istype(A, /obj/item/stack/material)) - var/obj/item/stack/material/S = A + if(istype(target, /obj/item/stack/material)) + var/obj/item/stack/material/S = target if(S.material?.type == /decl/material/solid/metal/steel) return (amount < maxAmount && maketiles) - if(A.loc.name == "Space") + if(target.loc.name == "Space") return 0 - var/turf/floor/T = A + var/turf/floor/T = target if(istype(T)) if(emagged) return 1 diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index 8084e5eaaeb..8ba09af58d3 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -78,35 +78,35 @@ /mob/living/bot/medbot/lookForTargets() if(is_tipped) // Don't look for targets if we're incapacitated! return - for(var/mob/living/human/H in view(7, src)) // Time to find a patient! - if(confirmTarget(H)) - target = H + for(var/mob/living/human/patient in view(7, src)) // Time to find a patient! + if(confirmTarget(patient)) + target = patient if(last_newpatient_speak + 300 < world.time && vocal) if(vocal) var/message_options = list( - "Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/medbot/mcoming.ogg', - "Wait [H.name]! I want to help!" = 'sound/voice/medbot/mhelp.ogg', - "[H.name], you appear to be injured!" = 'sound/voice/medbot/minjured.ogg' + "Hey, [patient.name]! Hold on, I'm coming." = 'sound/voice/medbot/mcoming.ogg', + "Wait [patient.name]! I want to help!" = 'sound/voice/medbot/mhelp.ogg', + "[patient.name], you appear to be injured!" = 'sound/voice/medbot/minjured.ogg' ) var/message = pick(message_options) say(message) playsound(src, message_options[message], 50, 0) - custom_emote(1, "points at [H.name].") + custom_emote(1, "points at [patient.name].") last_newpatient_speak = world.time break -/mob/living/bot/medbot/UnarmedAttack(var/mob/living/human/H, var/proximity) +/mob/living/bot/medbot/UnarmedAttack(var/mob/living/human/target, var/proximity) . = ..() if(.) return - if(!on || !istype(H)) + if(!on || !istype(target)) return FALSE if(busy) return TRUE - if(H.stat == DEAD) + if(target.stat == DEAD) if(vocal) var/static/death_messages = list( "No! Stay with me!" = 'sound/voice/medbot/mno.ogg', @@ -117,7 +117,7 @@ say(message) playsound(src, death_messages[message], 50, 0) - var/t = confirmTarget(H) + var/t = confirmTarget(target) if(!t) if(vocal) var/static/possible_messages = list( @@ -130,18 +130,18 @@ playsound(src, possible_messages[message], 50, 0) icon_state = "medibots" - visible_message("[src] is trying to inject [H]!") + visible_message("[src] is trying to inject [target]!") if(declare_treatment) var/area/location = get_area(src) - broadcast_medical_hud_message("[src] is treating [H] in [location.proper_name]", src) + broadcast_medical_hud_message("[src] is treating [target] in [location.proper_name]", src) busy = 1 update_icon() - if(do_mob(src, H, 30)) + if(do_mob(src, target, 30)) if(t == 1) - reagent_glass.reagents.trans_to_mob(H, injection_amount, CHEM_INJECT) + reagent_glass.reagents.trans_to_mob(target, injection_amount, CHEM_INJECT) else - H.add_to_reagents(t, injection_amount) - visible_message("[src] injects [H] with the syringe!") + target.add_to_reagents(t, injection_amount) + visible_message("[src] injects [target] with the syringe!") busy = 0 update_icon() return TRUE @@ -297,33 +297,34 @@ reagent_glass.forceMove(my_turf) reagent_glass = null -/mob/living/bot/medbot/confirmTarget(var/mob/living/human/H) - if(!..()) - return 0 +/mob/living/bot/medbot/confirmTarget(atom/target) + if(!(. = ..())) + return - if(H.stat == DEAD) // He's dead, Jim - return 0 + var/mob/living/human/patient = target + if(!istype(patient) || patient.stat == DEAD) // He's dead, Jim + return FALSE if(emagged) return treatment_emag // If they're injured, we're using a beaker, and they don't have on of the chems in the beaker - if(reagent_glass && use_beaker && ((H.get_damage(BRUTE) >= heal_threshold) || (H.get_damage(TOX) >= heal_threshold) || (H.get_damage(TOX) >= heal_threshold) || (H.get_damage(OXY) >= (heal_threshold + 15)))) + if(reagent_glass && use_beaker && ((patient.get_damage(BRUTE) >= heal_threshold) || (patient.get_damage(TOX) >= heal_threshold) || (patient.get_damage(TOX) >= heal_threshold) || (patient.get_damage(OXY) >= (heal_threshold + 15)))) for(var/R in reagent_glass.reagents.reagent_volumes) - if(!H.reagents.has_reagent(R)) + if(!patient.reagents.has_reagent(R)) return 1 continue - if((H.get_damage(BRUTE) >= heal_threshold) && (!H.reagents.has_reagent(treatment_brute))) + if((patient.get_damage(BRUTE) >= heal_threshold) && (!patient.reagents.has_reagent(treatment_brute))) return treatment_brute //If they're already medicated don't bother! - if((H.get_damage(OXY) >= (15 + heal_threshold)) && (!H.reagents.has_reagent(treatment_oxy))) + if((patient.get_damage(OXY) >= (15 + heal_threshold)) && (!patient.reagents.has_reagent(treatment_oxy))) return treatment_oxy - if((H.get_damage(BURN) >= heal_threshold) && (!H.reagents.has_reagent(treatment_fire))) + if((patient.get_damage(BURN) >= heal_threshold) && (!patient.reagents.has_reagent(treatment_fire))) return treatment_fire - if((H.get_damage(TOX) >= heal_threshold) && (!H.reagents.has_reagent(treatment_tox))) + if((patient.get_damage(TOX) >= heal_threshold) && (!patient.reagents.has_reagent(treatment_tox))) return treatment_tox /mob/living/bot/medbot/proc/tip_over(mob/user) diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index bb9cf31e58e..c70a617e2c1 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -178,7 +178,7 @@ target = home targetName = "Home" -/mob/living/bot/mulebot/confirmTarget() +/mob/living/bot/mulebot/confirmTarget(atom/target) return 1 /mob/living/bot/mulebot/calcTargetPath() diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 2e47d627b53..8d6737b9347 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -157,10 +157,10 @@ return ..() -/mob/living/bot/secbot/confirmTarget(var/atom/A) +/mob/living/bot/secbot/confirmTarget(atom/target) if(!..()) return 0 - return (check_threat(A) >= SECBOT_THREAT_ARREST) + return (check_threat(target) >= SECBOT_THREAT_ARREST) /mob/living/bot/secbot/lookForTargets() for(var/mob/living/M in view(src)) From bda2770399c4ffc61f5c05a2af3262f95be27016 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 29 Dec 2024 13:50:10 +1100 Subject: [PATCH 267/554] Enables melting of items inside stomachs. --- code/_onclick/click.dm | 5 ----- code/game/objects/items/_item_melting.dm | 26 +++++++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index c2d4cfb5862..4c2f9a9c03b 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -116,11 +116,6 @@ var/sdepth = A.storage_depth(src) if((!isturf(A) && A == loc) || (sdepth != -1 && sdepth <= 1)) if(holding) - - // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && (!(A) || holding != get_active_held_item())) - return TRUE - var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency diff --git a/code/game/objects/items/_item_melting.dm b/code/game/objects/items/_item_melting.dm index d835d7d1c7d..318d8f28823 100644 --- a/code/game/objects/items/_item_melting.dm +++ b/code/game/objects/items/_item_melting.dm @@ -16,16 +16,22 @@ try_burn_wearer(holder, holder.get_equipped_slot_for_item(src)) // Temp gate until generalized temperature-based melting works properly. - if(istype(loc, /obj/item/chems/crucible)) - // Check if this is meltable at all. - var/list/meltable_materials - for(var/mat in matter) - var/decl/material/melt_material = GET_DECL(mat) - if(!isnull(melt_material.melting_point) && temperature >= melt_material.melting_point) - LAZYDISTINCTADD(meltable_materials, melt_material) - if(length(meltable_materials)) - . = null // Don't return PROCESS_KILL here. - handle_melting(meltable_materials) + var/static/list/_melting_containers = list( + /obj/item/chems/crucible, + /obj/item/organ/internal/stomach + ) + if(!is_type_in_list(loc, _melting_containers)) + return + + // Check if this is meltable at all. + var/list/meltable_materials + for(var/mat in matter) + var/decl/material/melt_material = GET_DECL(mat) + if(!isnull(melt_material.melting_point) && temperature >= melt_material.melting_point) + LAZYDISTINCTADD(meltable_materials, melt_material) + if(length(meltable_materials)) + . = null // Don't return PROCESS_KILL here. + handle_melting(meltable_materials) /obj/item/place_melted_product(list/meltable_materials) From e6bc4446f4c1a187edfba2e31fbca319f9d0b672 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 30 Dec 2024 14:46:44 +1100 Subject: [PATCH 268/554] Cleaning up floorbot logic. --- code/modules/mob/living/bot/floorbot.dm | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 23125250d07..7f0e4f67541 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -122,15 +122,11 @@ if(S.material?.type == /decl/material/solid/metal/steel) return (amount < maxAmount && maketiles) - if(target.loc.name == "Space") - return 0 + var/turf/floor/my_turf = target + if(!istype(my_turf) || (isturf(my_turf) && my_turf.is_open())) + return FALSE - var/turf/floor/T = target - if(istype(T)) - if(emagged) - return 1 - else - return (amount && (T.is_floor_damaged() || (improvefloors && !T.has_flooring()))) + return emagged || (amount && (my_turf.is_floor_damaged() || (improvefloors && !my_turf.has_flooring()))) /mob/living/bot/floorbot/UnarmedAttack(var/atom/A, var/proximity) From 07fabaa68293217a8f46130b2c63cf624a99004d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 21 Dec 2024 11:08:30 +1100 Subject: [PATCH 269/554] Ported chicken nuggets from Polaris. --- code/datums/supplypacks/galley.dm | 6 ++ .../objects/items/weapons/storage/nuggets.dm | 63 ++++++++++++++++++ code/modules/food/nuggets.dm | 24 +++++++ icons/obj/food/nuggets/nugget.dmi | Bin 0 -> 313 bytes icons/obj/food/nuggets/nugget_corgi.dmi | Bin 0 -> 318 bytes icons/obj/food/nuggets/nugget_lizard.dmi | Bin 0 -> 319 bytes icons/obj/food/nuggets/nugget_star.dmi | Bin 0 -> 317 bytes icons/obj/items/storage/nugget_box.dmi | Bin 0 -> 818 bytes nebula.dme | 2 + 9 files changed, 95 insertions(+) create mode 100644 code/game/objects/items/weapons/storage/nuggets.dm create mode 100644 code/modules/food/nuggets.dm create mode 100644 icons/obj/food/nuggets/nugget.dmi create mode 100644 icons/obj/food/nuggets/nugget_corgi.dmi create mode 100644 icons/obj/food/nuggets/nugget_lizard.dmi create mode 100644 icons/obj/food/nuggets/nugget_star.dmi create mode 100644 icons/obj/items/storage/nugget_box.dmi diff --git a/code/datums/supplypacks/galley.dm b/code/datums/supplypacks/galley.dm index 5eb7cc9f071..45c2c05ea16 100644 --- a/code/datums/supplypacks/galley.dm +++ b/code/datums/supplypacks/galley.dm @@ -72,6 +72,12 @@ containername = "pizza crate" supply_method = /decl/supply_method/randomized +/decl/hierarchy/supply_pack/galley/nuggets + name = "Emergency - Nugget crate" + contains = list(/obj/item/box/nuggets = 2) + containertype = /obj/structure/closet/crate/freezer + containername = "nugget crate" + /decl/hierarchy/supply_pack/galley/rations num_contained = 6 name = "Emergency - MREs" diff --git a/code/game/objects/items/weapons/storage/nuggets.dm b/code/game/objects/items/weapons/storage/nuggets.dm new file mode 100644 index 00000000000..3ecc72ce227 --- /dev/null +++ b/code/game/objects/items/weapons/storage/nuggets.dm @@ -0,0 +1,63 @@ +/datum/storage/box/nuggets + can_hold = list(/obj/item/food/nugget) + var/expected_nugget_count = 10 + +/datum/storage/box/nuggets/New() + max_storage_space = /obj/item/food/nugget::w_class * expected_nugget_count + ..() + +/datum/storage/box/nuggets/twenty + expected_nugget_count = 20 + +/datum/storage/box/nuggets/forty + expected_nugget_count = 40 + +/obj/item/box/nuggets + name = "10-piece nuggets box" + icon = 'icons/obj/items/storage/nugget_box.dmi' + icon_state = "nuggetbox_ten" + desc = "A share pack of golden chicken nuggets in various fun shapes. Rumours of the rare and deadly 'fifth nugget shape' remain unsubstantiated." + storage = /datum/storage/box/nuggets + center_of_mass = @'{"x":16,"y":9}' + +/obj/item/box/nuggets/Initialize(ml, material_key) + . = ..() + update_icon() + +/obj/item/box/nuggets/WillContain() + . = list() + if(istype(storage, /datum/storage/box/nuggets)) + var/datum/storage/box/nuggets/nugget_box = storage + for(var/i = 1 to nugget_box.expected_nugget_count) + . += /obj/item/food/nugget + +/obj/item/box/nuggets/on_update_icon() + var/datum/storage/box/nuggets/nugget_box = storage + if(length(contents) == 0 || !istype(nugget_box)) + icon_state = "[initial(icon_state)]_empty" + else if(length(contents) >= nugget_box.expected_nugget_count) + icon_state = "[initial(icon_state)]_full" + else + icon_state = initial(icon_state) + +// Subtypes below. +/obj/item/box/nuggets/twenty + name = "20-piece nuggets box" + icon_state = "nuggetbox_twenty" + storage = /datum/storage/box/nuggets/twenty + +/obj/item/box/nuggets/twenty/WillContain() + . = list() + for(var/i = 1 to 20) + . += /obj/item/food/nugget + +/obj/item/box/nuggets/twenty/empty/WillContain() + return + +/obj/item/box/nuggets/forty + name = "40-piece nuggets box" + icon_state = "nuggetbox_forty" + storage = /datum/storage/box/nuggets/forty + +/obj/item/box/nuggets/forty/empty/WillContain() + return diff --git a/code/modules/food/nuggets.dm b/code/modules/food/nuggets.dm new file mode 100644 index 00000000000..c2171198fa1 --- /dev/null +++ b/code/modules/food/nuggets.dm @@ -0,0 +1,24 @@ +/obj/item/food/nugget + name = "chicken nugget" + icon = 'icons/obj/food/nuggets/nugget.dmi' + icon_state = ICON_STATE_WORLD + nutriment_desc = "mild battered chicken" + nutriment_amt = 6 + nutriment_type = /decl/material/solid/organic/meat/chicken + material = /decl/material/solid/organic/meat/chicken + bitesize = 3 + var/shape = null + var/static/list/nugget_icons = list( + "lump" = 'icons/obj/food/nuggets/nugget.dmi', + "star" = 'icons/obj/food/nuggets/nugget_star.dmi', + "lizard" = 'icons/obj/food/nuggets/nugget_lizard.dmi', + "corgi" = 'icons/obj/food/nuggets/nugget_corgi.dmi' + ) + +/obj/item/food/nugget/Initialize() + . = ..() + if(isnull(shape)) + shape = pick(nugget_icons) + set_icon(nugget_icons[shape]) + desc = "A chicken nugget vaguely shaped like a [shape]." + add_allergen_flags(ALLERGEN_GLUTEN) // flour diff --git a/icons/obj/food/nuggets/nugget.dmi b/icons/obj/food/nuggets/nugget.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6022a38314e4f5b4f265c566cd2c8a7bb453ad5e GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*8>L*JZNKhIfLQlWTlVu z7%o>bJf5v|FpnYL=-ynQ8pe_!zhDN3XE)M-oXo0_h!U67;^d;tf|AVqJO+k}Il*BC zMWx@r1Q&e#`b5iHSL@uF^T8WJ4K5l#c%*aQNAn~@QBUs<3*#W;%f?;`a~@4PGATqM zc%{vL4RzPfZe!KWDsKY8S%?RCbtb;DHAn7=UxjxjMmLC@hd@G@Nnucss0)Y0&K(x4S}T=U4#muAsG7qi zkhX-Ox1i9O!(hX7ZY|BuMHWi}0t`g1X1;mK%Hu4L*JZNKhIfLQjJcfgL z3@;}uoy%eYN-{8(1o;IsI6S+N2IOQ`g+!FNq!uR^WfqiV=I1dmRLltuD<~@c{w28J zc*Y}^>MK*4FYfX9&=91B|l0}O5i+>E%$ zsP{-ige#;;MPbE~B_cU3i=12o0yq=dE(k1GqOd7CreVg>#zYTBhV8q!?T=hP>mdKI;Vst045H0+yDRo literal 0 HcmV?d00001 diff --git a/icons/obj/food/nuggets/nugget_lizard.dmi b/icons/obj/food/nuggets/nugget_lizard.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7eb06bd525ed141241b0779e7e7facefd7e9775f GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*8>L*JZNKhIfLQjJcfgL z3`MQJ+ksMyB|(0{3=Yq3qyagZRUr{2E~&-IMVSR9nfZAP3>9;N!wQN@zkdlX`1tjS zmbb3fxija3H-s8oG=A_%=e&>RNrs}H-W?XkLB^Mjy%gp=nsj7Rh(hp6oBbNL*T&`qz(8h2ukKyHH zrI#}pKF(vflo4tSRKQpgeukTAW;zSx}OhpU1#ZF(){zps4iw zm*9erU!Q1s>uQ}lb3S-OsKG_!2aj~l`)HnIDC+6mVPPC(eA(DbVa}sTM<#_R1h2H& zuc7YR*=?-4d4wXA0N{oI+S=Ox|NpCE0EtcjemH(+GiEcH0RPMYmUGIX00001 zbW%=J06^y0W&i*Hn|f4ObVOxyV{&P5bZKvH004NLQ&wU+WT!!Nk?Oj%{36oTlj=5z zCcI8lR&e!m0Y^Uow*R9KN8+mg0006BNklu!TE425x%KnT#i|J%;2>*m`Q zWk!`I`OxyCCw3q}`<+fxC=_~`KH%IK2kggszvJtUOJFtd`BOfQ_3aH`xHB6#eLMnsljO_&367)Uc6?sN z%YFHnT<(WLp-?FF5=rhG{Z;DM3;G@=_gU)@xA_(_x;y3_WC?OSPh&$&kt4ur_b|)ahrR6ksox1 z@cPz+eyJY{g+ihKAPf6OzR~;j27C|kd%xab;~{?U)|&$c_`O@-TSc#rN6^jfy%FNN{9-Jkeoe>#Ck2e>uo1dQLIiFB|m8|81aKlQEt zlpR$%5CH*cT#5U}LqI1`bPpWxy}qV||U>Hf+0yn)l#bgz!k=f7Zr w9j}tOP&A@=eIuXnh~o8s_%6K84~2Ys2i96Vq}~T{D*ylh07*qoM6N<$g38g1nE(I) literal 0 HcmV?d00001 diff --git a/nebula.dme b/nebula.dme index 1c258d2fd94..611d8983058 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1369,6 +1369,7 @@ #include "code\game\objects\items\weapons\storage\med_pouch.dm" #include "code\game\objects\items\weapons\storage\misc.dm" #include "code\game\objects\items\weapons\storage\mre.dm" +#include "code\game\objects\items\weapons\storage\nuggets.dm" #include "code\game\objects\items\weapons\storage\parachute.dm" #include "code\game\objects\items\weapons\storage\picnic_basket.dm" #include "code\game\objects\items\weapons\storage\secure.dm" @@ -2439,6 +2440,7 @@ #include "code\modules\fluids\fluid_flood.dm" #include "code\modules\fluids\fluid_mapped.dm" #include "code\modules\food\assembled.dm" +#include "code\modules\food\nuggets.dm" #include "code\modules\food\cooking\_recipe.dm" #include "code\modules\food\cooking\cooking_vessels\_cooking_vessel.dm" #include "code\modules\food\cooking\cooking_vessels\baking_dish.dm" From 5d7c35fa699e9c0fc61359546188eea80d491fb9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 27 Dec 2024 11:53:33 +1100 Subject: [PATCH 270/554] Reworking oil subtypes and lantern fuel. --- code/_helpers/emissive.dm | 3 +- .../game/objects/structures/barrels/barrel.dm | 2 +- code/game/objects/structures/barrels/cask.dm | 2 +- .../butchery/butchery_products_meat_fish.dm | 2 +- .../hydroponics/plant_types/seeds_misc.dm | 14 ++-- code/modules/hydroponics/seed_packets.dm | 2 +- .../living/simple_animal/_simple_animal.dm | 9 ++- .../simple_animal/aquatic/aquatic_fish.dm | 22 +++--- .../aquatic/aquatic_fish_lantern.dm | 26 +++++++ code/modules/mob_holder/_holder.dm | 7 ++ code/modules/organs/internal/_internal.dm | 2 +- code/modules/organs/internal/brain.dm | 4 +- .../modules/reagents/chems/chems_nutriment.dm | 13 ---- code/modules/reagents/chems/chems_oil.dm | 66 ++++++++++++------ .../reagents/reactions/reaction_alcohol.dm | 2 +- .../reagents/reactions/reaction_compounds.dm | 24 +++++++ .../reagents/reactions/reaction_recipe.dm | 2 +- .../reactions/reaction_recipe_food.dm | 2 +- .../reagents/reactions/reaction_synthesis.dm | 16 +++-- .../condiments/condiment_appearance.dm | 2 +- .../real_instruments/Violin/violin.dm | 2 +- icons/mob/simple_animal/fish_cave.dmi | Bin 0 -> 4028 bytes icons/mob/simple_animal/fish_lantern.dmi | Bin 0 -> 5654 bytes maps/shaded_hills/areas/grassland.dm | 4 +- maps/shaded_hills/shaded_hills_map.dm | 2 +- nebula.dme | 1 + 26 files changed, 156 insertions(+), 75 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm create mode 100644 icons/mob/simple_animal/fish_cave.dmi create mode 100644 icons/mob/simple_animal/fish_lantern.dmi diff --git a/code/_helpers/emissive.dm b/code/_helpers/emissive.dm index 4ea0ca7e7cf..98cde2aadb3 100644 --- a/code/_helpers/emissive.dm +++ b/code/_helpers/emissive.dm @@ -1,5 +1,6 @@ -/proc/emissive_overlay(var/icon, var/icon_state, var/loc, var/dir, var/color) +/proc/emissive_overlay(icon, icon_state, loc, dir, color, flags) var/image/I = image(icon, loc, icon_state, EMISSIVE_LAYER, dir) I.plane = EMISSIVE_PLANE I.color = color + I.appearance_flags |= flags return I diff --git a/code/game/objects/structures/barrels/barrel.dm b/code/game/objects/structures/barrels/barrel.dm index 4b7f0d2e87c..b28986d5592 100644 --- a/code/game/objects/structures/barrels/barrel.dm +++ b/code/game/objects/structures/barrels/barrel.dm @@ -110,4 +110,4 @@ /obj/structure/reagent_dispensers/barrel/ebony/oil/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/oil/plant, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/oil, reagents.maximum_volume) diff --git a/code/game/objects/structures/barrels/cask.dm b/code/game/objects/structures/barrels/cask.dm index 8a704ad55cf..d3755dfe55e 100644 --- a/code/game/objects/structures/barrels/cask.dm +++ b/code/game/objects/structures/barrels/cask.dm @@ -39,4 +39,4 @@ /obj/structure/reagent_dispensers/barrel/cask/ebony/oil/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/oil/plant, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/oil, reagents.maximum_volume) diff --git a/code/modules/butchery/butchery_products_meat_fish.dm b/code/modules/butchery/butchery_products_meat_fish.dm index 8361c4af74c..2ea9678087d 100644 --- a/code/modules/butchery/butchery_products_meat_fish.dm +++ b/code/modules/butchery/butchery_products_meat_fish.dm @@ -16,7 +16,7 @@ slice_num = 3 butchery_data = /decl/butchery_data/animal/fish allergen_flags = ALLERGEN_FISH - var/oil_type = /decl/material/liquid/nutriment/oil/fish + var/oil_type = /decl/material/liquid/oil/fish var/oil_amount = 2 /obj/item/food/butchery/meat/fish/oily diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index db5d4739d6d..e98328e4b39 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -4,7 +4,7 @@ display_name = "cotton patch" product_material = /decl/material/solid/organic/plantmatter/pith/husk chems = list( - /decl/material/liquid/nutriment/oil/plant = list(3,10), + /decl/material/liquid/oil/plant = list(3,10), /decl/material/solid/organic/cloth = list(10,1) ) slice_product = null @@ -28,7 +28,7 @@ display_name = "flax patch" // Do we want linseed oil at some point? chems = list( - /decl/material/liquid/nutriment/oil/plant = list(5,12), + /decl/material/liquid/oil/plant = list(5,12), /decl/material/solid/organic/cloth/linen = list(8,1) ) @@ -400,7 +400,7 @@ display_name = "hemp patch" mutants = null chems = list( - /decl/material/liquid/nutriment/oil/plant = list(3,10), + /decl/material/liquid/oil/plant = list(3,10), /decl/material/solid/organic/cloth/hemp = list(8,1), /decl/material/liquid/nutriment = list(1) ) @@ -725,7 +725,7 @@ product_name = "sunflower" display_name = "sunflower patch" chems = list( - /decl/material/liquid/nutriment/oil/plant = list(10,10) + /decl/material/liquid/oil/plant = list(10,10) ) /datum/seed/flower/sunflower/New() @@ -800,7 +800,7 @@ display_name = "peanut vine" chems = list( /decl/material/liquid/nutriment = list(1,10), - /decl/material/liquid/nutriment/oil/plant = list(1,10) + /decl/material/liquid/oil/plant = list(1,10) ) slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -890,7 +890,7 @@ name = "corn" product_name = "corn" display_name = "ears of corn" - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/nutriment/cornoil = list(1,10)) + chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/oil/plant/corn = list(1,10)) grown_tag = "corn" trash_type = /obj/item/corncob backyard_grilling_product = /obj/item/food/popcorn @@ -987,7 +987,7 @@ display_name = "soybean patch" chems = list( /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/nutriment/oil/plant = list(3,20), + /decl/material/liquid/oil/plant = list(3,20), /decl/material/liquid/drink/milk/soymilk = list(7,20) ) grown_tag = "soybeans" diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index d9033c86f84..21efe8deead 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -26,7 +26,7 @@ /obj/item/seeds/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/oil/plant, 3) + add_to_reagents(/decl/material/liquid/oil/plant, 3) /obj/item/seeds/get_single_monetary_worth() . = seed ? seed.get_monetary_value() : ..() diff --git a/code/modules/mob/living/simple_animal/_simple_animal.dm b/code/modules/mob/living/simple_animal/_simple_animal.dm index 2e1b6d8e3b4..77c479915f8 100644 --- a/code/modules/mob/living/simple_animal/_simple_animal.dm +++ b/code/modules/mob/living/simple_animal/_simple_animal.dm @@ -164,16 +164,23 @@ var/global/list/simplemob_icon_bitflag_cache = list() mob_icon_state_flags |= MOB_ICON_HAS_PARALYZED_STATE global.simplemob_icon_bitflag_cache[type] = mob_icon_state_flags +/mob/living/simple_animal/proc/add_additional_visible_overlays(list/accumulator) + return + /mob/living/simple_animal/refresh_visible_overlays() + var/list/add_overlays = list() if(length(draw_visible_overlays)) - var/list/add_overlays = list() for(var/overlay_state in draw_visible_overlays) var/overlay_color = draw_visible_overlays[overlay_state] if(overlay_state == "base") add_overlays += overlay_image(icon, icon_state, overlay_color, RESET_COLOR) else add_overlays += overlay_image(icon, "[icon_state]-[overlay_state]", overlay_color, RESET_COLOR) + + add_additional_visible_overlays(add_overlays) + + if(length(add_overlays)) set_current_mob_overlay(HO_SKIN_LAYER, add_overlays) else set_current_mob_overlay(HO_SKIN_LAYER, null) diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm index 7de69b83944..bbd6b916d82 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm @@ -16,26 +16,20 @@ name = "small fish" icon = 'icons/mob/simple_animal/fish_grump.dmi' -/mob/living/simple_animal/aquatic/fish/lantern - name = "lantern-fish" - desc = "An oily, glowing fish sometimes caught in cave rivers, rumoured to have cousins in the deep ocean." - // TODO: icon = 'icons/mob/simple_animal/fish_lantern.dmi' - butchery_data = /decl/butchery_data/animal/fish/oily - -/mob/living/simple_animal/aquatic/fish/cave - name = "blind cave fish" - desc = "A pale, blobby fish that lives its entire life in the cold darkness of cave rivers, and hence has no need for eyes." - // TODO: icon = 'icons/mob/simple_animal/fish_cave.dmi' - -/mob/living/simple_animal/aquatic/fish/cave/is_blind() - return TRUE - /mob/living/simple_animal/aquatic/fish/large name = "smallmouth bass" icon = 'icons/mob/simple_animal/fish_judge.dmi' butchery_data = /decl/butchery_data/animal/fish/medium mob_size = MOB_SIZE_SMALL +/mob/living/simple_animal/aquatic/fish/large/cave + name = "blind cave fish" + desc = "A pale, blobby fish that lives its entire life in the cold darkness of cave rivers, and hence has no need for eyes." + icon = 'icons/mob/simple_animal/fish_cave.dmi' + +/mob/living/simple_animal/aquatic/fish/large/cave/is_blind() + return TRUE + /mob/living/simple_animal/aquatic/fish/large/bass name = "largemouth bass" icon = 'icons/mob/simple_animal/fish_bass.dmi' diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm new file mode 100644 index 00000000000..179605c12c9 --- /dev/null +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm @@ -0,0 +1,26 @@ +/mob/living/simple_animal/aquatic/fish/large/lantern + name = "lantern fish" + desc = "An oily, glowing fish. They are sometimes caught in cave rivers, and are rumoured to have cousins in the deep ocean." + icon = 'icons/mob/simple_animal/fish_lantern.dmi' + butchery_data = /decl/butchery_data/animal/fish/oily + holder_type = /obj/item/holder/lanternfish + var/glow_color = COLOR_LIME + var/glow_power = 0.5 + var/glow_range = 2 + +/mob/living/simple_animal/aquatic/fish/large/lantern/Initialize() + . = ..() + set_light(glow_range, glow_power, glow_color) + refresh_visible_overlays() + +/mob/living/simple_animal/aquatic/fish/large/lantern/add_additional_visible_overlays(list/accumulator) + var/glow_state = "[icon_state]-glow" + if(check_state_in_icon(glow_state, icon)) + accumulator += emissive_overlay(icon, glow_state, color = light_color, flags = RESET_COLOR) + +/obj/item/holder/lanternfish/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay && (slot in global.all_hand_slots)) + var/glow_state = "[overlay.icon_state]-glow" + if(check_state_in_icon(glow_state, overlay.icon)) + overlay.overlays += emissive_overlay(overlay.icon, glow_state, color = light_color, flags = RESET_COLOR) + return ..() diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm index ec0dcd39482..002814c0c09 100644 --- a/code/modules/mob_holder/_holder.dm +++ b/code/modules/mob_holder/_holder.dm @@ -132,8 +132,15 @@ return ..() /obj/item/holder/proc/sync(var/mob/living/M) + SetName(M.name) desc = M.desc + + if(QDELETED(src) || QDELETED(M) || !istype(M)) + set_light(0) + else + set_light(M.light_range, M.light_power, M.light_color) + var/mob/living/human/H = loc if(istype(H)) last_holder = H diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index e8e076a057c..a62006b938d 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -171,7 +171,7 @@ // We clamp/round here so that we don't accidentally heal past the threshold and // cheat our way into a full second threshold of healing. - damage = clamp(damage - max(0, get_organ_heal_amount() * GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN)), min_heal_val, absolute_max_damage) + damage = clamp(damage - max(0, get_organ_heal_amount()), min_heal_val, absolute_max_damage) // If we're within 1 damage of the nearest threshold (such as 0), round us down. // This should be removed when float-aware modulo comes in in 515, but for now is needed diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index a26e424aba8..c4980c3a303 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -105,7 +105,9 @@ return (!owner || GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) <= 0) && ..() /obj/item/organ/internal/brain/get_organ_heal_amount() - return 1 + if(!has_limited_healing()) + . = 1 // We have full healing, so we always heal at least 1 unit of damage. + . += (owner ? GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) : 0) /obj/item/organ/internal/brain/Process() if(owner) diff --git a/code/modules/reagents/chems/chems_nutriment.dm b/code/modules/reagents/chems/chems_nutriment.dm index 3b5567d3f36..d96d2b840d7 100644 --- a/code/modules/reagents/chems/chems_nutriment.dm +++ b/code/modules/reagents/chems/chems_nutriment.dm @@ -296,19 +296,6 @@ boiling_point = 373 allergen_flags = ALLERGEN_FRUIT -/decl/material/liquid/nutriment/cornoil - name = "corn oil" - lore_text = "An oil derived from various types of corn." - taste_description = "slime" - taste_mult = 0.1 - nutriment_factor = 20 - color = "#302000" - slipperiness = 8 - uid = "chem_nutriment_cornoil" - melting_point = 273 - boiling_point = 373 - allergen_flags = ALLERGEN_VEGETABLE - /decl/material/liquid/nutriment/sprinkles name = "sprinkles" lore_text = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." diff --git a/code/modules/reagents/chems/chems_oil.dm b/code/modules/reagents/chems/chems_oil.dm index 5395daacc11..ad359dd61ca 100644 --- a/code/modules/reagents/chems/chems_oil.dm +++ b/code/modules/reagents/chems/chems_oil.dm @@ -1,28 +1,52 @@ -/decl/material/liquid/nutriment/oil - abstract_type = /decl/material/liquid/nutriment/oil - burn_product = /decl/material/gas/carbon_monoxide - ignition_point = T0C+150 - accelerant_value = FUEL_VALUE_ACCELERANT - gas_flags = XGM_GAS_FUEL - melting_point = 273 - boiling_point = 373 +/decl/material/liquid/oil + name = "fuel oil" // paraffin etc + lore_text = "Clarified fuel oil, perfect for fuelling a lantern." + burn_product = /decl/material/gas/carbon_monoxide + ignition_point = T0C+150 + accelerant_value = FUEL_VALUE_ACCELERANT + gas_flags = XGM_GAS_FUEL + melting_point = 273 + boiling_point = 373 + uid = "chem_oil_lamp" + color = "#664330" + value = 1.5 + fishing_bait_value = 0 + taste_mult = 4 + metabolism = REM * 4 + exoplanet_rarity_gas = MAT_RARITY_NOWHERE + affect_blood_on_ingest = 0 + affect_blood_on_inhale = 0 + slipperiness = 8 -/decl/material/liquid/nutriment/oil/plant - name = "plant oil" - lore_text = "A thin yellow oil pressed from vegetables or nuts. Useful as fuel, or in cooking." - uid = "chem_nutriment_plant_oil" - taste_description = "oily blandness" - allergen_flags = ALLERGEN_VEGETABLE +/decl/material/liquid/oil/plant + name = "plant oil" + lore_text = "A thin yellow oil pressed from vegetables or nuts. Useful as fuel, or in cooking." + uid = "chem_oil_plant" + taste_description = "oily blandness" + allergen_flags = ALLERGEN_VEGETABLE + compost_value = 1 + nutriment_factor = 8 -/decl/material/liquid/nutriment/oil/fish - name = "fish oil" - lore_text = "A pungent yellow oil pressed from fish meat and fish skin. Useful as fuel, or in cooking, or for encouraging recovery after brain injuries." - uid = "chem_nutriment_fish_oil" - taste_description = "pungent, oily fish" - allergen_flags = ALLERGEN_FISH +/decl/material/liquid/oil/plant/corn + name = "corn oil" + lore_text = "An oil derived from various types of corn." + taste_description = "slime" + nutriment_factor = 20 + color = "#302000" + uid = "chem_oil_corn" + taste_mult = 0.1 + +/decl/material/liquid/oil/fish + name = "fish oil" + lore_text = "A pungent yellow oil pressed from fish meat and fish skin. Useful as fuel, or in cooking, or for encouraging recovery after brain injuries." + uid = "chem_oil_fish" + taste_description = "pungent, oily fish" + allergen_flags = ALLERGEN_FISH + compost_value = 1 + nutriment_factor = 6 // Copied from neuroannealer; yes, it's silly, but we need a way to treat brain damage on the medieval map. // Should possibly be an ingredient rather than the be-all end-all medication. -/decl/material/liquid/nutriment/oil/fish/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/oil/fish/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() M.add_chemical_effect(CE_BRAIN_REGEN, 0.5) // Half as effective as neuroannealer, without the side-effects. diff --git a/code/modules/reagents/reactions/reaction_alcohol.dm b/code/modules/reagents/reactions/reaction_alcohol.dm index 121c4a9bf2f..4d96bdb5d12 100644 --- a/code/modules/reagents/reactions/reaction_alcohol.dm +++ b/code/modules/reagents/reactions/reaction_alcohol.dm @@ -62,7 +62,7 @@ /decl/chemical_reaction/recipe/beer name = "Plain Beer" result = /decl/material/liquid/alcohol/beer - required_reagents = list(/decl/material/liquid/nutriment/cornoil = 10) + required_reagents = list(/decl/material/liquid/oil/plant/corn = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 mix_message = "The solution roils as it rapidly ferments into a foaming amber liquid." diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index ea0b5114215..8e530dacaa5 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -158,3 +158,27 @@ /decl/chemical_reaction/compound/condensed_capsaicin/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) . = ..() holder?.add_reagent(/decl/material/liquid/water, created_volume) + +// This is a bit silly, but we need a way to unify oil types until someone rewrites lanterns. +/decl/chemical_reaction/compound/fuel_oil + name = "Plant Fuel Oil" + result = /decl/material/liquid/oil + result_amount = 3 + required_reagents = list( + /decl/material/liquid/oil/plant = 2, + /decl/material/solid/graphite = 1 + ) + +/decl/chemical_reaction/compound/fuel_oil/corn + name = "Corn Fuel Oil" + required_reagents = list( + /decl/material/liquid/oil/plant/corn = 2, + /decl/material/solid/graphite = 1 + ) + +/decl/chemical_reaction/compound/fuel_oil/fish + name = "Fish Fuel Oil" + required_reagents = list( + /decl/material/liquid/oil/fish = 2, + /decl/material/solid/graphite = 1 + ) diff --git a/code/modules/reagents/reactions/reaction_recipe.dm b/code/modules/reagents/reactions/reaction_recipe.dm index bcd93c0e8af..a113d821cc5 100644 --- a/code/modules/reagents/reactions/reaction_recipe.dm +++ b/code/modules/reagents/reactions/reaction_recipe.dm @@ -37,7 +37,7 @@ /decl/chemical_reaction/recipe/garlicsauce name = "Garlic Sauce" result = /decl/material/liquid/nutriment/garlicsauce - required_reagents = list(/decl/material/liquid/drink/juice/garlic = 1, /decl/material/liquid/nutriment/cornoil = 1) + required_reagents = list(/decl/material/liquid/drink/juice/garlic = 1, /decl/material/liquid/oil/plant/corn = 1) result_amount = 2 mix_message = "The solution thickens into a creamy white oil." diff --git a/code/modules/reagents/reactions/reaction_recipe_food.dm b/code/modules/reagents/reactions/reaction_recipe_food.dm index ef99755711d..bc052960e91 100644 --- a/code/modules/reagents/reactions/reaction_recipe_food.dm +++ b/code/modules/reagents/reactions/reaction_recipe_food.dm @@ -58,7 +58,7 @@ name = "Enzyme Margarine" required_reagents = list( /decl/material/solid/sodiumchloride = 1, - /decl/material/liquid/nutriment/oil/plant = 20 + /decl/material/liquid/oil/plant = 20 ) catalysts = list(/decl/material/liquid/enzyme = 5) mix_message = "The solution thickens and curdles into a pale yellow solid." diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index d12783c8f7a..5c4f5b710f4 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -126,11 +126,11 @@ new /obj/item/stack/medical/resin/crafted(T, create_stacks) /decl/chemical_reaction/synthesis/soap - name = "Handmade Soap" + name = "Handmade Plant Soap" required_reagents = list( - /decl/material/solid/carbon/ashes = 5, - /decl/material/liquid/water = 5, - /decl/material/liquid/nutriment/oil/plant = 10 + /decl/material/solid/carbon/ashes = 5, + /decl/material/liquid/water = 5, + /decl/material/liquid/oil/plant = 10 ) result_amount = 1 mix_message = "The solution thickens and solidifies." @@ -147,6 +147,14 @@ for(var/i = 1 to create_soap) new /obj/item/soap/crafted(T) +/decl/chemical_reaction/synthesis/soap/corn + name = "Handmade Corn Soap" + required_reagents = list( + /decl/material/solid/carbon/ashes = 5, + /decl/material/liquid/water = 5, + /decl/material/liquid/oil/plant/corn = 10 + ) + // Making chipboard out of wood scraps/recycled wood. /decl/chemical_reaction/synthesis/chipboard name = "Oak Chipboard" diff --git a/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm b/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm index b534f6bc812..4236c186754 100644 --- a/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm +++ b/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm @@ -75,7 +75,7 @@ condiment_center_of_mass = @'{"x":16,"y":8}' /decl/condiment_appearance/cornoil - condiment_type = /decl/material/liquid/nutriment/cornoil + condiment_type = /decl/material/liquid/oil/plant/corn condiment_name = "corn oil" condiment_desc = "A delicious oil used in cooking. Made from corn." condiment_icon = 'icons/obj/food/condiments/cornoil.dmi' diff --git a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm index f3baab9aa07..0e08f5bfd16 100644 --- a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm +++ b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm @@ -12,4 +12,4 @@ matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) /obj/structure/synthesized_instrument/synthesizer/shouldStopPlaying(mob/user) - return !(src && in_range(src, user)) \ No newline at end of file + return !(src && in_range(src, user)) diff --git a/icons/mob/simple_animal/fish_cave.dmi b/icons/mob/simple_animal/fish_cave.dmi new file mode 100644 index 0000000000000000000000000000000000000000..40e1f162f86382302d12e99368da340644ca121f GIT binary patch literal 4028 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 a3CU{Ct)kTBgn`#_kcR40NV$q-*uMZdFNsJ1 literal 0 HcmV?d00001 diff --git a/icons/mob/simple_animal/fish_lantern.dmi b/icons/mob/simple_animal/fish_lantern.dmi new file mode 100644 index 0000000000000000000000000000000000000000..eea9923c6d45211bedfbf06a955ac40695f270a2 GIT binary patch literal 5654 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 B+V21W literal 0 HcmV?d00001 diff --git a/maps/shaded_hills/areas/grassland.dm b/maps/shaded_hills/areas/grassland.dm index 3fa264b4392..9b7de6659e1 100644 --- a/maps/shaded_hills/areas/grassland.dm +++ b/maps/shaded_hills/areas/grassland.dm @@ -54,8 +54,8 @@ sound_env = CAVE area_flags = AREA_FLAG_IS_BACKGROUND fishing_results = list( - /mob/living/simple_animal/aquatic/fish/cave = 13 - /mob/living/simple_animal/aquatic/fish/lantern = 7 + /mob/living/simple_animal/aquatic/fish/large/cave = 13, + /mob/living/simple_animal/aquatic/fish/large/lantern = 7, /obj/item/mollusc = 5, /obj/item/mollusc/barnacle/fished = 5, /obj/item/mollusc/clam/fished/pearl = 3, diff --git a/maps/shaded_hills/shaded_hills_map.dm b/maps/shaded_hills/shaded_hills_map.dm index 0b545c07a61..09bf988942e 100644 --- a/maps/shaded_hills/shaded_hills_map.dm +++ b/maps/shaded_hills/shaded_hills_map.dm @@ -1,5 +1,5 @@ /datum/map/shaded_hills - default_liquid_fuel_type = /decl/material/liquid/nutriment/oil/plant + default_liquid_fuel_type = /decl/material/liquid/oil default_species = SPECIES_KOBALOI loadout_categories = list( /decl/loadout_category/fantasy/clothing, diff --git a/nebula.dme b/nebula.dme index dcafae477c0..d2e41d9119a 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3024,6 +3024,7 @@ #include "code\modules\mob\living\simple_animal\aquatic\_aquatic_retaliate.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_carp.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_fish.dm" +#include "code\modules\mob\living\simple_animal\aquatic\aquatic_fish_lantern.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_sharks.dm" #include "code\modules\mob\living\simple_animal\crow\crow.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" From 37dcd2ca5760bf9beb9502cb37986c923342d422 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 15:28:57 -0500 Subject: [PATCH 271/554] Rename code files with spaces in their name --- .../uplink/{devices and tools.dm => devices_and_tools.dm} | 0 .../ZAS/{Variable Settings.dm => VariableSettings.dm} | 0 .../keycard_authentication.dm | 0 nebula.dme | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) rename code/datums/uplink/{devices and tools.dm => devices_and_tools.dm} (100%) rename code/modules/ZAS/{Variable Settings.dm => VariableSettings.dm} (100%) rename code/modules/{security levels => security_levels}/keycard_authentication.dm (100%) diff --git a/code/datums/uplink/devices and tools.dm b/code/datums/uplink/devices_and_tools.dm similarity index 100% rename from code/datums/uplink/devices and tools.dm rename to code/datums/uplink/devices_and_tools.dm diff --git a/code/modules/ZAS/Variable Settings.dm b/code/modules/ZAS/VariableSettings.dm similarity index 100% rename from code/modules/ZAS/Variable Settings.dm rename to code/modules/ZAS/VariableSettings.dm diff --git a/code/modules/security levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm similarity index 100% rename from code/modules/security levels/keycard_authentication.dm rename to code/modules/security_levels/keycard_authentication.dm diff --git a/nebula.dme b/nebula.dme index c08cae0b5a9..2c7c6835f1d 100644 --- a/nebula.dme +++ b/nebula.dme @@ -693,7 +693,7 @@ #include "code\datums\underwear\underwear.dm" #include "code\datums\uplink\ammunition.dm" #include "code\datums\uplink\badassery.dm" -#include "code\datums\uplink\devices and tools.dm" +#include "code\datums\uplink\devices_and_tools.dm" #include "code\datums\uplink\grenades.dm" #include "code\datums\uplink\hardsuit_modules.dm" #include "code\datums\uplink\highly_visible_and_dangerous_weapons.dm" @@ -3738,7 +3738,7 @@ #include "code\modules\sealant_gun\sealant_injector.dm" #include "code\modules\sealant_gun\sealant_rack.dm" #include "code\modules\sealant_gun\sealant_tank.dm" -#include "code\modules\security levels\keycard_authentication.dm" +#include "code\modules\security_levels\keycard_authentication.dm" #include "code\modules\shield_generators\floor_diffuser.dm" #include "code\modules\shield_generators\handheld_diffuser.dm" #include "code\modules\shield_generators\modes.dm" @@ -4002,7 +4002,7 @@ #include "code\modules\ZAS\Diagnostic.dm" #include "code\modules\ZAS\Fire.dm" #include "code\modules\ZAS\Turf.dm" -#include "code\modules\ZAS\Variable Settings.dm" +#include "code\modules\ZAS\VariableSettings.dm" #include "code\modules\ZAS\Zone.dm" #include "code\procs\announce.dm" #include "code\procs\dbcore.dm" From 75945001df749d15895e349117e5269a09f477e6 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 15:31:08 -0500 Subject: [PATCH 272/554] Rename asset files with spaces in their path --- code/datums/music_tracks/europa.dm | 2 +- .../{Martian Cowboy.ogg => MartianCowboy.ogg} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename sound/music/europa/{Martian Cowboy.ogg => MartianCowboy.ogg} (100%) diff --git a/code/datums/music_tracks/europa.dm b/code/datums/music_tracks/europa.dm index ccbc948eda0..b1b050118ba 100644 --- a/code/datums/music_tracks/europa.dm +++ b/code/datums/music_tracks/europa.dm @@ -8,7 +8,7 @@ /decl/music_track/martiancowboy artist = "Kevin MacLeod" title = "Martian Cowboy" - song = 'sound/music/europa/Martian Cowboy.ogg' + song = 'sound/music/europa/MartianCowboy.ogg' license = /decl/license/cc_by_3_0 url = "https://incompetech.com/music/royalty-free/index.html?isrc=usuan1100349" diff --git a/sound/music/europa/Martian Cowboy.ogg b/sound/music/europa/MartianCowboy.ogg similarity index 100% rename from sound/music/europa/Martian Cowboy.ogg rename to sound/music/europa/MartianCowboy.ogg From 570908975268471779955f45a8d8df346af19042 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 15:32:26 -0500 Subject: [PATCH 273/554] Move security levels into security levels module folder --- code/datums/security_state.dm | 335 ------------------ .../security_levels/_security_level.dm | 48 +++ .../security_levels/alarm_appearance.dm | 61 ++++ .../security_levels/security_levels.dm | 93 +++++ .../modules/security_levels/security_state.dm | 134 +++++++ nebula.dme | 5 +- 6 files changed, 340 insertions(+), 336 deletions(-) delete mode 100644 code/datums/security_state.dm create mode 100644 code/modules/security_levels/_security_level.dm create mode 100644 code/modules/security_levels/alarm_appearance.dm create mode 100644 code/modules/security_levels/security_levels.dm create mode 100644 code/modules/security_levels/security_state.dm diff --git a/code/datums/security_state.dm b/code/datums/security_state.dm deleted file mode 100644 index 1863d4ae860..00000000000 --- a/code/datums/security_state.dm +++ /dev/null @@ -1,335 +0,0 @@ -/decl/security_state - abstract_type = /decl/security_state - // When defining any of these values type paths should be used, not instances. Instances will be acquired in /New() - - var/decl/security_level/severe_security_level // At which security level (and higher) the use of nuclear fission devices and other extreme measures are allowed. Defaults to the last entry in all_security_levels if unset. - var/decl/security_level/high_security_level // At which security level (and higher) transfer votes are disabled, ERT may be requested, and other similar high alert implications. Defaults to the second to last entry in all_security_levels if unset. - // All security levels within the above convention: Low, Guarded, Elevated, High, Severe - - - // Under normal conditions the crew may not raise the current security level higher than the highest_standard_security_level - // The crew may also not adjust the security level once it is above the highest_standard_security_level. - // Defaults to the second to last entry in all_security_levels if unset/null. - // Set to FALSE/0 if there should be no restrictions. - var/decl/security_level/highest_standard_security_level - - var/decl/security_level/current_security_level // The current security level. Defaults to the first entry in all_security_levels if unset. - var/decl/security_level/stored_security_level // The security level that we are escalating to high security from - we will return to this level once we choose to revert. - var/list/all_security_levels // List of all available security levels - var/list/standard_security_levels // List of all normally selectable security levels - var/list/comm_console_security_levels // List of all selectable security levels for the command and communication console - basically standard_security_levels - 1 - -/decl/security_state/Initialize() - - . = ..() - - // Setup the severe security level - if(!(severe_security_level in all_security_levels)) - severe_security_level = all_security_levels[all_security_levels.len] - severe_security_level = GET_DECL(severe_security_level) - - // Setup the high security level - if(!(high_security_level in all_security_levels)) - high_security_level = all_security_levels[all_security_levels.len - 1] - high_security_level = GET_DECL(high_security_level) - - // Setup the highest standard security level - if(highest_standard_security_level || isnull(highest_standard_security_level)) - if(!(highest_standard_security_level in all_security_levels)) - highest_standard_security_level = all_security_levels[all_security_levels.len - 1] - highest_standard_security_level = GET_DECL(highest_standard_security_level) - else - highest_standard_security_level = null - - // Setup the current security level - if(current_security_level in all_security_levels) - current_security_level = GET_DECL(current_security_level) - else - current_security_level = GET_DECL(all_security_levels[1]) - - // Setup the full list of available security levels now that we no longer need to use "x in all_security_levels" - var/list/security_level_instances = list() - for(var/security_level_type in all_security_levels) - security_level_instances += GET_DECL(security_level_type) - all_security_levels = security_level_instances - - standard_security_levels = list() - // Setup the list of normally selectable security levels - for(var/security_level in all_security_levels) - standard_security_levels += security_level - if(security_level == highest_standard_security_level) - break - - comm_console_security_levels = list() - // Setup the list of selectable security levels available in the comm. console - for(var/security_level in all_security_levels) - if(security_level == highest_standard_security_level) - break - comm_console_security_levels += security_level - - // Now we ensure the high security level is not above the severe one (but we allow them to be equal) - var/severe_index = all_security_levels.Find(severe_security_level) - var/high_index = all_security_levels.Find(high_security_level) - if(high_index > severe_index) - high_security_level = severe_security_level - - // Finally switch up to the default starting security level. - current_security_level.switching_up_to() - -/decl/security_state/proc/can_change_security_level() - return current_security_level in standard_security_levels - -/decl/security_state/proc/can_switch_to(var/given_security_level) - if(!can_change_security_level()) - return FALSE - return given_security_level in standard_security_levels - -/decl/security_state/proc/current_security_level_is_lower_than(var/given_security_level) - var/current_index = all_security_levels.Find(current_security_level) - var/given_index = all_security_levels.Find(given_security_level) - - return given_index && current_index < given_index - -/decl/security_state/proc/current_security_level_is_same_or_higher_than(var/given_security_level) - var/current_index = all_security_levels.Find(current_security_level) - var/given_index = all_security_levels.Find(given_security_level) - - return given_index && current_index >= given_index - -/decl/security_state/proc/current_security_level_is_higher_than(var/given_security_level) - var/current_index = all_security_levels.Find(current_security_level) - var/given_index = all_security_levels.Find(given_security_level) - - return given_index && current_index > given_index - -/decl/security_state/proc/set_security_level(var/decl/security_level/new_security_level, var/force_change = FALSE) - if(new_security_level == current_security_level) - return FALSE - if(!(new_security_level in all_security_levels)) - return FALSE - if(!force_change && !can_switch_to(new_security_level)) - return FALSE - - var/decl/security_level/previous_security_level = current_security_level - current_security_level = new_security_level - - var/previous_index = all_security_levels.Find(previous_security_level) - var/new_index = all_security_levels.Find(new_security_level) - - if(new_index > previous_index) - previous_security_level.switching_up_from() - new_security_level.switching_up_to() - else - previous_security_level.switching_down_from() - new_security_level.switching_down_to() - - log_and_message_admins("has changed the security level from [previous_security_level.name] to [new_security_level.name].") - return TRUE - -// This proc decreases the current security level, if possible -/decl/security_state/proc/decrease_security_level(var/force_change = FALSE) - var/current_index = all_security_levels.Find(current_security_level) - if(current_index == 1) - return FALSE - return set_security_level(all_security_levels[current_index - 1], force_change) - -/decl/security_level - var/icon - var/name - - // These values are primarily for station alarms and status displays, and which light colors and overlays to use - var/light_range - var/light_power - var/light_color_alarm - var/light_color_class - var/light_color_status_display - - var/up_description - var/down_description - - var/datum/alarm_appearance/alarm_appearance - - abstract_type = /decl/security_level - -/decl/security_level/Initialize() - . = ..() - if(ispath(alarm_appearance, /datum/alarm_appearance)) - alarm_appearance = new alarm_appearance - -/decl/security_level/validate() - . = ..() - var/initial_appearance = initial(alarm_appearance) - if(!initial_appearance) - . += "alarm_appearance was not set" - else if(!ispath(initial_appearance)) - . += "alarm_appearance was not set to a /datum/alarm_appearance subpath" - else if(!istype(alarm_appearance, /datum/alarm_appearance)) - . += "alarm_appearance creation failed (check runtimes?)" - -// Called when we're switching from a lower security level to this one. -/decl/security_level/proc/switching_up_to() - return - -// Called when we're switching from a higher security level to this one. -/decl/security_level/proc/switching_down_to() - return - -// Called when we're switching from this security level to a higher one. -/decl/security_level/proc/switching_up_from() - return - -// Called when we're switching from this security level to a lower one. -/decl/security_level/proc/switching_down_from() - return - -/* -* The default security state and levels setup -*/ -/decl/security_state/default - all_security_levels = list(/decl/security_level/default/code_green, /decl/security_level/default/code_blue, /decl/security_level/default/code_red, /decl/security_level/default/code_delta) - -/decl/security_level/default - abstract_type = /decl/security_level/default - icon = 'icons/misc/security_state.dmi' - - var/static/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) - var/static/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) - -/decl/security_level/default/switching_up_to() - if(up_description) - security_announcement_up.Announce(up_description, "Attention! Alert level elevated to [name]!") - notify_station() - -/decl/security_level/default/switching_down_to() - if(down_description) - security_announcement_down.Announce(down_description, "Attention! Alert level changed to [name]!") - notify_station() - -/decl/security_level/default/proc/notify_station() - for(var/obj/machinery/firealarm/FA in SSmachines.machinery) - if(isContactLevel(FA.z)) - FA.update_icon() - post_status("alert") - -/decl/security_level/default/code_green - name = "code green" - - light_range = 2 - light_power = 1 - - light_color_alarm = COLOR_GREEN - light_color_class = "font_green" - light_color_status_display = COLOR_GREEN - - - alarm_appearance = /datum/alarm_appearance/green - - down_description = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." - -/decl/security_level/default/code_blue - name = "code blue" - - light_range = 2 - light_power = 1 - light_color_alarm = COLOR_BLUE - light_color_class = "font_blue" - light_color_status_display = COLOR_BLUE - - alarm_appearance = /datum/alarm_appearance/blue - - up_description = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted." - down_description = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed." - -/decl/security_level/default/code_red - name = "code red" - - light_range = 4 - light_power = 2 - light_color_alarm = COLOR_RED - light_color_class = "font_red" - light_color_status_display = COLOR_RED - - alarm_appearance = /datum/alarm_appearance/red - - up_description = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." - down_description = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." - -/decl/security_level/default/code_delta - name = "code delta" - - light_range = 4 - light_power = 2 - light_color_alarm = COLOR_RED - light_color_class = "font_red" - light_color_status_display = COLOR_RED - - alarm_appearance = /datum/alarm_appearance/delta - - - var/static/datum/announcement/priority/security/security_announcement_delta = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/effects/siren.ogg')) - -/decl/security_level/default/code_delta/switching_up_to() - security_announcement_delta.Announce("The self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.", "Attention! Delta security level reached!") - notify_station() - -/datum/alarm_appearance - var/display_icon //The icon_state for the displays. Normally only one is used, unless uses_twotone_displays is TRUE. - var/display_icon_color //The color for the display icon. - - var/display_icon_twotone //Used for two-tone displays. - var/display_icon_twotone_color //The color for the display icon. - - var/display_emblem //The icon_state for the emblem, i.e for delta, a radstorm, alerts. - var/display_emblem_color //The color for the emblem. - - var/alarm_icon //The icon_state for the alarms - var/alarm_icon_color //the color for the icon_state - - var/alarm_icon_twotone //Used for two-tone alarms (i.e delta). - var/alarm_icon_twotone_color //The color for the secondary tone icon. - -/datum/alarm_appearance/green - display_icon = "status_display_lines" - display_icon_color = PIPE_COLOR_GREEN - - display_emblem = "status_display_alert" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_normal" - alarm_icon_color = PIPE_COLOR_GREEN - -/datum/alarm_appearance/blue - display_icon = "status_display_lines" - display_icon_color = COLOR_BLUE - - display_emblem = "status_display_alert" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_normal" - alarm_icon_color = COLOR_BLUE - -/datum/alarm_appearance/red - display_icon = "status_display_lines" - display_icon_color = COLOR_RED - - display_emblem = "status_display_alert" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_blinking" - alarm_icon_color = COLOR_RED - -/datum/alarm_appearance/delta - display_icon = "status_display_twotone1" - display_icon_color = COLOR_RED - - display_icon_twotone = "status_display_twotone2" - display_icon_twotone_color = COLOR_YELLOW - - display_emblem = "delta" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_blinking_twotone1" - alarm_icon_color = COLOR_RED - - alarm_icon_twotone = "alarm_blinking_twotone2" - alarm_icon_twotone_color = PIPE_COLOR_YELLOW \ No newline at end of file diff --git a/code/modules/security_levels/_security_level.dm b/code/modules/security_levels/_security_level.dm new file mode 100644 index 00000000000..ea9d88b442a --- /dev/null +++ b/code/modules/security_levels/_security_level.dm @@ -0,0 +1,48 @@ +/decl/security_level + var/icon + var/name + + // These values are primarily for station alarms and status displays, and which light colors and overlays to use + var/light_range + var/light_power + var/light_color_alarm + var/light_color_class + var/light_color_status_display + + var/up_description + var/down_description + + var/datum/alarm_appearance/alarm_appearance + + abstract_type = /decl/security_level + +/decl/security_level/Initialize() + . = ..() + if(ispath(alarm_appearance, /datum/alarm_appearance)) + alarm_appearance = new alarm_appearance + +/decl/security_level/validate() + . = ..() + var/initial_appearance = initial(alarm_appearance) + if(!initial_appearance) + . += "alarm_appearance was not set" + else if(!ispath(initial_appearance)) + . += "alarm_appearance was not set to a /datum/alarm_appearance subpath" + else if(!istype(alarm_appearance, /datum/alarm_appearance)) + . += "alarm_appearance creation failed (check runtimes?)" + +// Called when we're switching from a lower security level to this one. +/decl/security_level/proc/switching_up_to() + return + +// Called when we're switching from a higher security level to this one. +/decl/security_level/proc/switching_down_to() + return + +// Called when we're switching from this security level to a higher one. +/decl/security_level/proc/switching_up_from() + return + +// Called when we're switching from this security level to a lower one. +/decl/security_level/proc/switching_down_from() + return \ No newline at end of file diff --git a/code/modules/security_levels/alarm_appearance.dm b/code/modules/security_levels/alarm_appearance.dm new file mode 100644 index 00000000000..494158a6039 --- /dev/null +++ b/code/modules/security_levels/alarm_appearance.dm @@ -0,0 +1,61 @@ +/datum/alarm_appearance + var/display_icon //The icon_state for the displays. Normally only one is used, unless uses_twotone_displays is TRUE. + var/display_icon_color //The color for the display icon. + + var/display_icon_twotone //Used for two-tone displays. + var/display_icon_twotone_color //The color for the display icon. + + var/display_emblem //The icon_state for the emblem, i.e for delta, a radstorm, alerts. + var/display_emblem_color //The color for the emblem. + + var/alarm_icon //The icon_state for the alarms + var/alarm_icon_color //the color for the icon_state + + var/alarm_icon_twotone //Used for two-tone alarms (i.e delta). + var/alarm_icon_twotone_color //The color for the secondary tone icon. + +/datum/alarm_appearance/green + display_icon = "status_display_lines" + display_icon_color = PIPE_COLOR_GREEN + + display_emblem = "status_display_alert" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_normal" + alarm_icon_color = PIPE_COLOR_GREEN + +/datum/alarm_appearance/blue + display_icon = "status_display_lines" + display_icon_color = COLOR_BLUE + + display_emblem = "status_display_alert" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_normal" + alarm_icon_color = COLOR_BLUE + +/datum/alarm_appearance/red + display_icon = "status_display_lines" + display_icon_color = COLOR_RED + + display_emblem = "status_display_alert" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_blinking" + alarm_icon_color = COLOR_RED + +/datum/alarm_appearance/delta + display_icon = "status_display_twotone1" + display_icon_color = COLOR_RED + + display_icon_twotone = "status_display_twotone2" + display_icon_twotone_color = COLOR_YELLOW + + display_emblem = "delta" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_blinking_twotone1" + alarm_icon_color = COLOR_RED + + alarm_icon_twotone = "alarm_blinking_twotone2" + alarm_icon_twotone_color = PIPE_COLOR_YELLOW \ No newline at end of file diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm new file mode 100644 index 00000000000..a1825bd9be8 --- /dev/null +++ b/code/modules/security_levels/security_levels.dm @@ -0,0 +1,93 @@ +/// The default security state used on most space maps. +/decl/security_state/default + all_security_levels = list( + /decl/security_level/default/code_green, + /decl/security_level/default/code_blue, + /decl/security_level/default/code_red, + /decl/security_level/default/code_delta + ) + +/// An abstract security level type that supports announcements on level change. +/decl/security_level/default + abstract_type = /decl/security_level/default + icon = 'icons/misc/security_state.dmi' + + var/static/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) + var/static/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) + +/decl/security_level/default/switching_up_to() + if(up_description) + security_announcement_up.Announce(up_description, "Attention! Alert level elevated to [name]!") + notify_station() + +/decl/security_level/default/switching_down_to() + if(down_description) + security_announcement_down.Announce(down_description, "Attention! Alert level changed to [name]!") + notify_station() + +/decl/security_level/default/proc/notify_station() + for(var/obj/machinery/firealarm/FA in SSmachines.machinery) + if(isContactLevel(FA.z)) + FA.update_icon() + post_status("alert") + +/decl/security_level/default/code_green + name = "code green" + + light_range = 2 + light_power = 1 + + light_color_alarm = COLOR_GREEN + light_color_class = "font_green" + light_color_status_display = COLOR_GREEN + + + alarm_appearance = /datum/alarm_appearance/green + + down_description = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + +/decl/security_level/default/code_blue + name = "code blue" + + light_range = 2 + light_power = 1 + light_color_alarm = COLOR_BLUE + light_color_class = "font_blue" + light_color_status_display = COLOR_BLUE + + alarm_appearance = /datum/alarm_appearance/blue + + up_description = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted." + down_description = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed." + +/decl/security_level/default/code_red + name = "code red" + + light_range = 4 + light_power = 2 + light_color_alarm = COLOR_RED + light_color_class = "font_red" + light_color_status_display = COLOR_RED + + alarm_appearance = /datum/alarm_appearance/red + + up_description = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." + down_description = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." + +/decl/security_level/default/code_delta + name = "code delta" + + light_range = 4 + light_power = 2 + light_color_alarm = COLOR_RED + light_color_class = "font_red" + light_color_status_display = COLOR_RED + + alarm_appearance = /datum/alarm_appearance/delta + + + var/static/datum/announcement/priority/security/security_announcement_delta = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/effects/siren.ogg')) + +/decl/security_level/default/code_delta/switching_up_to() + security_announcement_delta.Announce("The self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.", "Attention! Delta security level reached!") + notify_station() \ No newline at end of file diff --git a/code/modules/security_levels/security_state.dm b/code/modules/security_levels/security_state.dm new file mode 100644 index 00000000000..0f115f8c57b --- /dev/null +++ b/code/modules/security_levels/security_state.dm @@ -0,0 +1,134 @@ +/decl/security_state + abstract_type = /decl/security_state + // When defining any of these values type paths should be used, not instances. Instances will be acquired in /New() + + var/decl/security_level/severe_security_level // At which security level (and higher) the use of nuclear fission devices and other extreme measures are allowed. Defaults to the last entry in all_security_levels if unset. + var/decl/security_level/high_security_level // At which security level (and higher) transfer votes are disabled, ERT may be requested, and other similar high alert implications. Defaults to the second to last entry in all_security_levels if unset. + // All security levels within the above convention: Low, Guarded, Elevated, High, Severe + + + // Under normal conditions the crew may not raise the current security level higher than the highest_standard_security_level + // The crew may also not adjust the security level once it is above the highest_standard_security_level. + // Defaults to the second to last entry in all_security_levels if unset/null. + // Set to FALSE/0 if there should be no restrictions. + var/decl/security_level/highest_standard_security_level + + var/decl/security_level/current_security_level // The current security level. Defaults to the first entry in all_security_levels if unset. + var/decl/security_level/stored_security_level // The security level that we are escalating to high security from - we will return to this level once we choose to revert. + var/list/all_security_levels // List of all available security levels + var/list/standard_security_levels // List of all normally selectable security levels + var/list/comm_console_security_levels // List of all selectable security levels for the command and communication console - basically standard_security_levels - 1 + +/decl/security_state/Initialize() + + . = ..() + + // Setup the severe security level + if(!(severe_security_level in all_security_levels)) + severe_security_level = all_security_levels[all_security_levels.len] + severe_security_level = GET_DECL(severe_security_level) + + // Setup the high security level + if(!(high_security_level in all_security_levels)) + high_security_level = all_security_levels[all_security_levels.len - 1] + high_security_level = GET_DECL(high_security_level) + + // Setup the highest standard security level + if(highest_standard_security_level || isnull(highest_standard_security_level)) + if(!(highest_standard_security_level in all_security_levels)) + highest_standard_security_level = all_security_levels[all_security_levels.len - 1] + highest_standard_security_level = GET_DECL(highest_standard_security_level) + else + highest_standard_security_level = null + + // Setup the current security level + if(current_security_level in all_security_levels) + current_security_level = GET_DECL(current_security_level) + else + current_security_level = GET_DECL(all_security_levels[1]) + + // Setup the full list of available security levels now that we no longer need to use "x in all_security_levels" + var/list/security_level_instances = list() + for(var/security_level_type in all_security_levels) + security_level_instances += GET_DECL(security_level_type) + all_security_levels = security_level_instances + + standard_security_levels = list() + // Setup the list of normally selectable security levels + for(var/security_level in all_security_levels) + standard_security_levels += security_level + if(security_level == highest_standard_security_level) + break + + comm_console_security_levels = list() + // Setup the list of selectable security levels available in the comm. console + for(var/security_level in all_security_levels) + if(security_level == highest_standard_security_level) + break + comm_console_security_levels += security_level + + // Now we ensure the high security level is not above the severe one (but we allow them to be equal) + var/severe_index = all_security_levels.Find(severe_security_level) + var/high_index = all_security_levels.Find(high_security_level) + if(high_index > severe_index) + high_security_level = severe_security_level + + // Finally switch up to the default starting security level. + current_security_level.switching_up_to() + +/decl/security_state/proc/can_change_security_level() + return current_security_level in standard_security_levels + +/decl/security_state/proc/can_switch_to(var/given_security_level) + if(!can_change_security_level()) + return FALSE + return given_security_level in standard_security_levels + +/decl/security_state/proc/current_security_level_is_lower_than(var/given_security_level) + var/current_index = all_security_levels.Find(current_security_level) + var/given_index = all_security_levels.Find(given_security_level) + + return given_index && current_index < given_index + +/decl/security_state/proc/current_security_level_is_same_or_higher_than(var/given_security_level) + var/current_index = all_security_levels.Find(current_security_level) + var/given_index = all_security_levels.Find(given_security_level) + + return given_index && current_index >= given_index + +/decl/security_state/proc/current_security_level_is_higher_than(var/given_security_level) + var/current_index = all_security_levels.Find(current_security_level) + var/given_index = all_security_levels.Find(given_security_level) + + return given_index && current_index > given_index + +/decl/security_state/proc/set_security_level(var/decl/security_level/new_security_level, var/force_change = FALSE) + if(new_security_level == current_security_level) + return FALSE + if(!(new_security_level in all_security_levels)) + return FALSE + if(!force_change && !can_switch_to(new_security_level)) + return FALSE + + var/decl/security_level/previous_security_level = current_security_level + current_security_level = new_security_level + + var/previous_index = all_security_levels.Find(previous_security_level) + var/new_index = all_security_levels.Find(new_security_level) + + if(new_index > previous_index) + previous_security_level.switching_up_from() + new_security_level.switching_up_to() + else + previous_security_level.switching_down_from() + new_security_level.switching_down_to() + + log_and_message_admins("has changed the security level from [previous_security_level.name] to [new_security_level.name].") + return TRUE + +// This proc decreases the current security level, if possible +/decl/security_state/proc/decrease_security_level(var/force_change = FALSE) + var/current_index = all_security_levels.Find(current_security_level) + if(current_index == 1) + return FALSE + return set_security_level(all_security_levels[current_index - 1], force_change) diff --git a/nebula.dme b/nebula.dme index 2c7c6835f1d..324850fd28f 100644 --- a/nebula.dme +++ b/nebula.dme @@ -349,7 +349,6 @@ #include "code\datums\mutable_appearance.dm" #include "code\datums\position_point_vector.dm" #include "code\datums\progressbar.dm" -#include "code\datums\security_state.dm" #include "code\datums\sound_player.dm" #include "code\datums\suit_sensor_jammer_method.dm" #include "code\datums\sun.dm" @@ -3738,7 +3737,11 @@ #include "code\modules\sealant_gun\sealant_injector.dm" #include "code\modules\sealant_gun\sealant_rack.dm" #include "code\modules\sealant_gun\sealant_tank.dm" +#include "code\modules\security_levels\_security_level.dm" +#include "code\modules\security_levels\alarm_appearance.dm" #include "code\modules\security_levels\keycard_authentication.dm" +#include "code\modules\security_levels\security_levels.dm" +#include "code\modules\security_levels\security_state.dm" #include "code\modules\shield_generators\floor_diffuser.dm" #include "code\modules\shield_generators\handheld_diffuser.dm" #include "code\modules\shield_generators\modes.dm" From 62365c50efa42f0ea827451b37984ca6ac6228de Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 19:22:27 -0500 Subject: [PATCH 274/554] Disable security state on Shaded Hills --- code/modules/mob/new_player/login.dm | 11 +++++------ code/modules/security_levels/_security_level.dm | 2 +- code/modules/security_levels/security_levels.dm | 16 ++++++++++++++-- code/modules/security_levels/security_state.dm | 2 ++ maps/shaded_hills/shaded_hills_define.dm | 1 + 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 6951ec383e3..6c3a0d04ada 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -36,12 +36,11 @@ show_lobby_menu(TRUE) var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) - var/decl/security_level/SL = security_state.current_security_level - var/alert_desc = "" - if(SL.up_description) - alert_desc = SL.up_description - - to_chat(src, SPAN_NOTICE("The alert level on the [station_name()] is currently: [SL.name]. [alert_desc]")) + if(security_state?.show_on_login) + var/decl/security_level/SL = security_state.current_security_level + // todo: allow maps to oevrride this string for things like the fantasy map being on high alert? + // eg "The alert level *in* Karzerfeste Keep is currently high alert." or "Karzerfeste Keep is currently on high alert." + to_chat(src, SPAN_NOTICE("The alert level on the [station_name()] is currently: [SL.name]. [SL?.up_description]")) // bolds the changelog button on the interface so we know there are updates. if(client.prefs?.lastchangelog != global.changelog_hash) diff --git a/code/modules/security_levels/_security_level.dm b/code/modules/security_levels/_security_level.dm index ea9d88b442a..ca4ba811c82 100644 --- a/code/modules/security_levels/_security_level.dm +++ b/code/modules/security_levels/_security_level.dm @@ -1,5 +1,5 @@ /decl/security_level - var/icon + var/icon = 'icons/misc/security_state.dmi' var/name // These values are primarily for station alarms and status displays, and which light colors and overlays to use diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index a1825bd9be8..186fd37fbbe 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -10,7 +10,6 @@ /// An abstract security level type that supports announcements on level change. /decl/security_level/default abstract_type = /decl/security_level/default - icon = 'icons/misc/security_state.dmi' var/static/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) var/static/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) @@ -90,4 +89,17 @@ /decl/security_level/default/code_delta/switching_up_to() security_announcement_delta.Announce("The self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.", "Attention! Delta security level reached!") - notify_station() \ No newline at end of file + notify_station() + +// The following are dummy states and levels to soft-disable security levels on some maps. +/// A security state used for maps that don't have security levels exposed to players. +/decl/security_state/none + all_security_levels = list( + /decl/security_level/none + ) + +/// A dummy security level with no effects. +/decl/security_level/none + name = "none" + // Since currently we're required to have an alarm_appearance, we just use a blank one. + alarm_appearance = /datum/alarm_appearance \ No newline at end of file diff --git a/code/modules/security_levels/security_state.dm b/code/modules/security_levels/security_state.dm index 0f115f8c57b..dfc0c78a94c 100644 --- a/code/modules/security_levels/security_state.dm +++ b/code/modules/security_levels/security_state.dm @@ -1,5 +1,7 @@ /decl/security_state abstract_type = /decl/security_state + /// Whether or not security level information should be shown to new players on login. + var/show_on_login = TRUE // When defining any of these values type paths should be used, not instances. Instances will be acquired in /New() var/decl/security_level/severe_security_level // At which security level (and higher) the use of nuclear fission devices and other extreme measures are allowed. Defaults to the last entry in all_security_levels if unset. diff --git a/maps/shaded_hills/shaded_hills_define.dm b/maps/shaded_hills/shaded_hills_define.dm index 757f9948826..6266ab2a09e 100644 --- a/maps/shaded_hills/shaded_hills_define.dm +++ b/maps/shaded_hills/shaded_hills_define.dm @@ -31,6 +31,7 @@ 'sound/music/Miris-Magic-Dance.ogg' ) game_year = -914 // in 2024, the year should be 1110, roughly a century after the fall of the Imperial Aegis + security_state = /decl/security_state/none char_preview_bgstate_options = list( "000", From 8be56cccfa49f3810e4571435ccd64ddeeea0d49 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 19:44:04 -0500 Subject: [PATCH 275/554] Move inertial dampener into a modpack --- code/datums/supplypacks/engineering.dm | 7 --- code/modules/events/event_container.dm | 1 - .../imprinter/designs_misc_circuits.dm | 3 -- .../overmap/ships/computers/engine_control.dm | 23 ++++++--- code/modules/overmap/ships/ship.dm | 19 -------- maps/modpack_testing/modpack_testing.dm | 1 + mods/content/inertia/_inertia.dm | 3 ++ mods/content/inertia/_inertia.dme | 13 ++++++ .../content/inertia/fabrication.dm | 5 +- .../inertia/icons}/inertial_damper.dmi | Bin mods/content/inertia/inertia_controller.dm | 24 ++++++++++ .../content/inertia/inertia_failure.dm | 11 +++++ .../content/inertia}/inertial_damper.dm | 35 ++++---------- mods/content/inertia/ship_inertia.dm | 44 ++++++++++++++++++ mods/content/inertia/supplies.dm | 6 +++ .../content/inertia/wires.dm | 9 ++-- nebula.dme | 4 -- 17 files changed, 135 insertions(+), 73 deletions(-) create mode 100644 mods/content/inertia/_inertia.dm create mode 100644 mods/content/inertia/_inertia.dme rename code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm => mods/content/inertia/fabrication.dm (80%) rename {icons/obj/machines => mods/content/inertia/icons}/inertial_damper.dmi (100%) create mode 100644 mods/content/inertia/inertia_controller.dm rename code/modules/events/inertial_damper.dm => mods/content/inertia/inertia_failure.dm (78%) rename {code/modules/inertial_damper => mods/content/inertia}/inertial_damper.dm (88%) create mode 100644 mods/content/inertia/ship_inertia.dm create mode 100644 mods/content/inertia/supplies.dm rename code/datums/wires/inertial_damper.dm => mods/content/inertia/wires.dm (71%) diff --git a/code/datums/supplypacks/engineering.dm b/code/datums/supplypacks/engineering.dm index 91b8006a194..3c771acd1e4 100644 --- a/code/datums/supplypacks/engineering.dm +++ b/code/datums/supplypacks/engineering.dm @@ -155,13 +155,6 @@ containername = "shield generator construction kit crate" access = access_engine -/decl/hierarchy/supply_pack/engineering/inertial_damper - name = "Equipment - inertial damper construction kit" - contains = list(/obj/item/stock_parts/circuitboard/inertial_damper, /obj/item/stock_parts/capacitor, /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/console_screen) - containertype = /obj/structure/closet/crate/secure - containername = "inertial damper construction kit crate" - access = access_engine - /decl/hierarchy/supply_pack/engineering/smbig name = "Power - Supermatter core" contains = list(/obj/machinery/power/supermatter) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 97dc8f97f3f..2e0256a4706 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -157,7 +157,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta/no_overmap(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 10, list(ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 10)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravity Failure", /datum/event/gravity, 75, list(ASSIGNMENT_ENGINEER = 25)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 10)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Inertial Damper Recalibration", /datum/event/inertial_damper, 75, list(ASSIGNMENT_ENGINEER = 25)), new /datum/event_meta/no_overmap(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_COMPUTER = 50, ASSIGNMENT_ROBOT = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)), new /datum/event_meta/no_overmap(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 20)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)), diff --git a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm index c817352197f..44f481a550c 100644 --- a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm +++ b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm @@ -467,9 +467,6 @@ /datum/fabricator_recipe/imprinter/circuit/long_range_relay path = /obj/item/stock_parts/circuitboard/relay/long_range -/datum/fabricator_recipe/imprinter/circuit/inertial_damper - path = /obj/item/stock_parts/circuitboard/inertial_damper - /datum/fabricator_recipe/imprinter/circuit/docking_beacon path = /obj/item/stock_parts/circuitboard/docking_beacon diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index a62b7258705..f7f37fcb346 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -6,6 +6,21 @@ icon_screen = "engines" var/display_state = "status" +/// A stub used for modpacks to modify per-ship readout information. +/// This mutates the UI data list, so it can be used to mask or remove features +/// as well as to add entirely new ones. +/// It does not return a value. +/// While it can access per-engine data, it should be dispreferred for that compared to modify_engine_ui_data(). +/obj/machinery/computer/ship/engines/proc/modify_ship_ui_data(list/ui_data) + return + +/// A stub used for modpacks to modify per-engine readout information. +/// This mutates the engine's data list, so it can be used to mask or remove features +/// as well as to add entirely new ones. +/// It does not return a value. +/obj/machinery/computer/ship/engines/proc/modify_engine_ui_data(datum/extension/ship_engine/engine, list/engine_data) + return + /obj/machinery/computer/ship/engines/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!linked) display_reconnect_dialog(user, "ship control systems") @@ -29,17 +44,13 @@ var/thrust = E.get_exhaust_velocity() total_thrust += thrust rdata["eng_thrust"] = "[thrust] m/s" + modify_engine_ui_data(E, rdata) enginfo.Add(list(rdata)) data["engines_info"] = enginfo data["total_thrust"] = "[total_thrust] m/s" - var/damping_strength = 0 - for(var/datum/ship_inertial_damper/I in linked.inertial_dampers) - var/obj/machinery/inertial_damper/ID = I.holder - damping_strength += ID.get_damping_strength(FALSE) - data["damping_strength"] = damping_strength - data["needs_dampers"] = linked.needs_dampers + modify_ship_ui_data(data) ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index f4f1a734c88..133c506ffa6 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -19,9 +19,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) var/skill_needed = SKILL_ADEPT //piloting skill needed to steer it without going in random dir var/operator_skill - var/needs_dampers = FALSE - var/list/inertial_dampers = list() - var/damping_strength = null var/vessel_size = SHIP_SIZE_LARGE // arbitrary number, affects how likely are we to evade meteors var/list/navigation_viewers // list of weakrefs to people viewing the overmap via this ship @@ -85,15 +82,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) /obj/effect/overmap/visitable/ship/adjust_speed(n_x, n_y) . = ..() - var/magnitude = norm(n_x, n_y) - var/inertia_dir = magnitude >= 0 ? turn(fore_dir, 180) : fore_dir - var/inertia_strength = magnitude * 1e3 - if(needs_dampers && damping_strength < inertia_strength) - var/list/areas_by_name = area_repository.get_areas_by_z_level() - for(var/area_name in areas_by_name) - var/area/A = areas_by_name[area_name] - if(area_belongs_to_zlevels(A, map_z)) - A.throw_unbuckled_occupants(inertia_strength+2, inertia_strength, inertia_dir) for(var/zz in map_z) if(is_still()) toggle_move_stars(zz) @@ -119,10 +107,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) return round(num_burns / burns_per_grid) /obj/effect/overmap/visitable/ship/Process(wait, tick) - damping_strength = 0 - for(var/datum/ship_inertial_damper/I in inertial_dampers) - var/obj/machinery/inertial_damper/ID = I.holder - damping_strength += ID.get_damping_strength(TRUE) sensor_visibility = min(round(base_sensor_visibility + get_speed_sensor_increase(), 1), 100) /obj/effect/overmap/visitable/ship/on_update_icon() @@ -181,9 +165,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) for(var/datum/extension/ship_engine/E in global.ship_engines) if(check_ownership(E.holder)) engines |= E - for(var/datum/ship_inertial_damper/I in global.ship_inertial_dampers) - if(check_ownership(I.holder)) - inertial_dampers |= I var/v_mass = recalculate_vessel_mass() if(v_mass) vessel_mass = v_mass diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index de68e49bc7b..f94fbbc844c 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -29,6 +29,7 @@ #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/species/drakes/_drakes.dme" // include before _fantasy.dme so overrides work #include "../../mods/content/fantasy/_fantasy.dme" + #include "../../mods/content/inertia/_inertia.dme" #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" diff --git a/mods/content/inertia/_inertia.dm b/mods/content/inertia/_inertia.dm new file mode 100644 index 00000000000..97bee4de9a0 --- /dev/null +++ b/mods/content/inertia/_inertia.dm @@ -0,0 +1,3 @@ +/decl/modpack/inertia + name = "Ship Inertia Content" + desc = "This modpack adds support for inertia (throwing unsecured mobs) when ship thrusters fire, and adds an inertial dampener machine to counteract this." \ No newline at end of file diff --git a/mods/content/inertia/_inertia.dme b/mods/content/inertia/_inertia.dme new file mode 100644 index 00000000000..2407851eca3 --- /dev/null +++ b/mods/content/inertia/_inertia.dme @@ -0,0 +1,13 @@ +#ifndef MODPACK_SHIP_INERTIA +#define MODPACK_SHIP_INERTIA +// BEGIN_INCLUDE +#include "_inertia.dm" +#include "fabrication.dm" +#include "inertia_controller.dm" +#include "inertia_failure.dm" +#include "inertial_damper.dm" +#include "ship_inertia.dm" +#include "supplies.dm" +#include "wires.dm" +// END_INCLUDE +#endif diff --git a/code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm b/mods/content/inertia/fabrication.dm similarity index 80% rename from code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm rename to mods/content/inertia/fabrication.dm index 3bf3f65219e..72a1837b513 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm +++ b/mods/content/inertia/fabrication.dm @@ -10,4 +10,7 @@ /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/keyboard = 1, /obj/item/stock_parts/power/apc/buildable = 1 - ) \ No newline at end of file + ) + +/datum/fabricator_recipe/imprinter/circuit/inertial_damper + path = /obj/item/stock_parts/circuitboard/inertial_damper diff --git a/icons/obj/machines/inertial_damper.dmi b/mods/content/inertia/icons/inertial_damper.dmi similarity index 100% rename from icons/obj/machines/inertial_damper.dmi rename to mods/content/inertia/icons/inertial_damper.dmi diff --git a/mods/content/inertia/inertia_controller.dm b/mods/content/inertia/inertia_controller.dm new file mode 100644 index 00000000000..6b020a67b60 --- /dev/null +++ b/mods/content/inertia/inertia_controller.dm @@ -0,0 +1,24 @@ +/// A list of all inertial dampers in existence. This is only used for assigning them to ships at roundstart. +var/global/list/ship_inertial_dampers = list() + +/datum/ship_inertial_damper + var/name = "ship inertial damper" + var/obj/machinery/holder + +/datum/ship_inertial_damper/proc/get_damping_strength(var/reliable) + return 0 + +/datum/ship_inertial_damper/New(var/obj/machinery/_holder) + ..() + holder = _holder + global.ship_inertial_dampers += src + +/datum/ship_inertial_damper/Destroy() + global.ship_inertial_dampers -= src + // This may need some future optimization for servers with lots of ships. + // Just track what ship we're assigned to somehow, and then use that here. + // You'd also have to register it to clear that ref if/when the ship object is destroyed. + for(var/obj/effect/overmap/visitable/ship/S in SSshuttle.ships) + S.inertial_dampers -= src + holder = null + . = ..() \ No newline at end of file diff --git a/code/modules/events/inertial_damper.dm b/mods/content/inertia/inertia_failure.dm similarity index 78% rename from code/modules/events/inertial_damper.dm rename to mods/content/inertia/inertia_failure.dm index e8d14585967..ce7d147f770 100644 --- a/code/modules/events/inertial_damper.dm +++ b/mods/content/inertia/inertia_failure.dm @@ -1,7 +1,18 @@ +// TODO: This should either be removed, or reworked to announce to specifically only the affected ship or its associated map. /datum/event/inertial_damper announceWhen = 5 check_proc = /proc/inertial_dampener_event_can_fire +/datum/event_container/moderate/New() + ..() + available_events += new /datum/event_meta( + EVENT_LEVEL_MODERATE, + "Inertial Damper Recalibration", + /datum/event/inertial_damper, + 75, + list(ASSIGNMENT_ENGINEER = 25) + ) + /datum/event/inertial_damper/setup() endWhen = rand(45, 120) diff --git a/code/modules/inertial_damper/inertial_damper.dm b/mods/content/inertia/inertial_damper.dm similarity index 88% rename from code/modules/inertial_damper/inertial_damper.dm rename to mods/content/inertia/inertial_damper.dm index 60eea516044..4cb9905a95c 100644 --- a/code/modules/inertial_damper/inertial_damper.dm +++ b/mods/content/inertia/inertial_damper.dm @@ -1,28 +1,6 @@ -#define WARNING_DELAY 80 //seconds between warnings. -var/global/list/ship_inertial_dampers = list() - -/datum/ship_inertial_damper - var/name = "ship inertial damper" - var/obj/machinery/holder - -/datum/ship_inertial_damper/proc/get_damping_strength(var/reliable) - return 0 - -/datum/ship_inertial_damper/New(var/obj/machinery/_holder) - ..() - holder = _holder - global.ship_inertial_dampers += src - -/datum/ship_inertial_damper/Destroy() - global.ship_inertial_dampers -= src - for(var/obj/effect/overmap/visitable/ship/S in SSshuttle.ships) - S.inertial_dampers -= src - holder = null - . = ..() - /obj/machinery/inertial_damper name = "inertial damper" - icon = 'icons/obj/machines/inertial_damper.dmi' + icon = 'mods/content/inertia/icons/inertial_damper.dmi' desc = "An inertial damper, a very large machine that balances against engine thrust to prevent harm to the crew." density = TRUE icon_state = "damper_on" @@ -67,6 +45,9 @@ var/global/list/ship_inertial_dampers = list() var/width = 3 var/height = 2 + /// The cooldown between announcements that the inertial damping system is off. + var/const/WARNING_DELAY = 8 SECONDS + /obj/machinery/inertial_damper/Initialize() . = ..() SetBounds() @@ -117,8 +98,10 @@ var/global/list/ship_inertial_dampers = list() /obj/machinery/inertial_damper/proc/is_on() return active -/obj/machinery/inertial_damper/proc/get_damping_strength(var/reliable) - if(hacked && !reliable) +/// Returns either the true damping strength including modifiers (include_modifiers == TRUE), +/// or just the value the damper is set to (include_modifiers == FALSE). +/obj/machinery/inertial_damper/proc/get_damping_strength(var/include_modifiers) + if(hacked && !include_modifiers) return initial(damping_strength) return damping_strength + damping_modifier @@ -203,5 +186,3 @@ var/global/list/ship_inertial_dampers = list() /obj/machinery/inertial_damper/dismantle() if((. = ..())) update_nearby_tiles(locs) - -#undef WARNING_DELAY \ No newline at end of file diff --git a/mods/content/inertia/ship_inertia.dm b/mods/content/inertia/ship_inertia.dm new file mode 100644 index 00000000000..d903ef02aa1 --- /dev/null +++ b/mods/content/inertia/ship_inertia.dm @@ -0,0 +1,44 @@ +/obj/effect/overmap/visitable/ship + /// Whether or not this ship throws mobs on acceleration if dampers are inactive. + var/needs_dampers = FALSE + /// A list of inertial damping controller datums associated with this ship. + var/list/datum/ship_inertial_damper/inertial_dampers = list() + /// The current damping strength from all inertial dampers, recalculated every tick in the ship's Process(). + var/tmp/damping_strength = null + +/obj/effect/overmap/visitable/ship/populate_sector_objects() + ..() + for(var/datum/ship_inertial_damper/I in global.ship_inertial_dampers) + if(check_ownership(I.holder)) + inertial_dampers |= I + +// Theoretically there's no need to recalculate this every tick, +// instead it should be recalculated any time damping strength changes +// based only on the damper that changed. +/obj/effect/overmap/visitable/ship/Process(wait, tick) + . = ..() + damping_strength = 0 + for(var/datum/ship_inertial_damper/I in inertial_dampers) + var/obj/machinery/inertial_damper/ID = I.holder + damping_strength += ID.get_damping_strength(TRUE) + +/obj/effect/overmap/visitable/ship/adjust_speed(n_x, n_y) + . = ..() + var/magnitude = norm(n_x, n_y) + var/inertia_dir = magnitude >= 0 ? turn(fore_dir, 180) : fore_dir + var/inertia_strength = magnitude * 1e3 + if(needs_dampers && damping_strength < inertia_strength) + var/list/areas_by_name = area_repository.get_areas_by_z_level() + for(var/area_name in areas_by_name) + var/area/A = areas_by_name[area_name] + if(area_belongs_to_zlevels(A, map_z)) + A.throw_unbuckled_occupants(inertia_strength+2, inertia_strength, inertia_dir) + +// Add additional data to the engine console. +/obj/machinery/computer/ship/engines/modify_ship_ui_data(list/ui_data) + var/damping_strength = 0 + for(var/datum/ship_inertial_damper/inertia_controller in linked.inertial_dampers) + var/obj/machinery/inertial_damper/damper = inertia_controller.holder + damping_strength += damper.get_damping_strength(FALSE) // get only the level it's set to, not the actual level + ui_data["damping_strength"] = damping_strength + ui_data["needs_dampers"] = linked.needs_dampers \ No newline at end of file diff --git a/mods/content/inertia/supplies.dm b/mods/content/inertia/supplies.dm new file mode 100644 index 00000000000..fbe975ab7cb --- /dev/null +++ b/mods/content/inertia/supplies.dm @@ -0,0 +1,6 @@ +/decl/hierarchy/supply_pack/engineering/inertial_damper + name = "Equipment - inertial damper construction kit" + contains = list(/obj/item/stock_parts/circuitboard/inertial_damper, /obj/item/stock_parts/capacitor, /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/console_screen) + containertype = /obj/structure/closet/crate/secure + containername = "inertial damper construction kit crate" + access = access_engine \ No newline at end of file diff --git a/code/datums/wires/inertial_damper.dm b/mods/content/inertia/wires.dm similarity index 71% rename from code/datums/wires/inertial_damper.dm rename to mods/content/inertia/wires.dm index 4ea708f73be..4cc74f8bc94 100644 --- a/code/datums/wires/inertial_damper.dm +++ b/mods/content/inertia/wires.dm @@ -7,11 +7,10 @@ new /datum/wire_description(DAMPER_WIRE_CONTROL, "This wire connects to the main control panel."), new /datum/wire_description(DAMPER_WIRE_AICONTROL, "This wire connects to automated control systems.") ) - -var/global/const/DAMPER_WIRE_POWER = 1 // Cut to disable power input into the generator. Pulse does nothing. Mend to restore. -var/global/const/DAMPER_WIRE_HACK = 2 // Pulse to hack the dampener, causing false display on engine consoles. Cut to unhack. Mend does nothing. -var/global/const/DAMPER_WIRE_CONTROL = 4 // Cut to lock controls. Mend to unlock them. Pulse does nothing. -var/global/const/DAMPER_WIRE_AICONTROL = 8 // Cut to disable AI control. Mend to restore. + var/const/DAMPER_WIRE_POWER = 1 // Cut to disable power input into the generator. Pulse does nothing. Mend to restore. + var/const/DAMPER_WIRE_HACK = 2 // Pulse to hack the dampener, causing false display on engine consoles. Cut to unhack. Mend does nothing. + var/const/DAMPER_WIRE_CONTROL = 4 // Cut to lock controls. Mend to unlock them. Pulse does nothing. + var/const/DAMPER_WIRE_AICONTROL = 8 // Cut to disable AI control. Mend to restore. /datum/wires/inertial_damper/CanUse() var/obj/machinery/inertial_damper/I = holder diff --git a/nebula.dme b/nebula.dme index 324850fd28f..5272f7674a0 100644 --- a/nebula.dme +++ b/nebula.dme @@ -720,7 +720,6 @@ #include "code\datums\wires\camera.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\fabricator.dm" -#include "code\datums\wires\inertial_damper.dm" #include "code\datums\wires\nuclearbomb.dm" #include "code\datums\wires\particle_accelerator.dm" #include "code\datums\wires\radio.dm" @@ -1286,7 +1285,6 @@ #include "code\game\objects\items\weapons\circuitboards\machinery\forensic.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\holomap.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\household.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\inertial_damper.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\medical.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mining.dm" @@ -2336,7 +2334,6 @@ #include "code\modules\events\event_dynamic.dm" #include "code\modules\events\gravity.dm" #include "code\modules\events\grid_check.dm" -#include "code\modules\events\inertial_damper.dm" #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" #include "code\modules\events\location_event.dm" @@ -2599,7 +2596,6 @@ #include "code\modules\hydroponics\trays\tray_soil.dm" #include "code\modules\hydroponics\trays\tray_tools.dm" #include "code\modules\hydroponics\trays\tray_update_icons.dm" -#include "code\modules\inertial_damper\inertial_damper.dm" #include "code\modules\integrated_electronics\_defines.dm" #include "code\modules\integrated_electronics\core\_electronics.dm" #include "code\modules\integrated_electronics\core\analyzer.dm" From 20f95d633b5bd10464bbff91b270828746d79395 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 31 Dec 2024 19:46:00 -0500 Subject: [PATCH 276/554] Allow modpacks to include NanoUI template folders --- .../subsystems/initialization/modpacks.dm | 1 + code/modules/client/asset_cache.dm | 41 +++++++++++++------ mods/_modpack.dm | 11 +++++ mods/content/inertia/_inertia.dm | 3 +- .../nano_templates}/inertial_damper.tmpl | 0 nano/templates/engines_control.tmpl | 2 + scripts/server.sh | 2 +- 7 files changed, 46 insertions(+), 14 deletions(-) rename {nano/templates => mods/content/inertia/nano_templates}/inertial_damper.tmpl (100%) diff --git a/code/controllers/subsystems/initialization/modpacks.dm b/code/controllers/subsystems/initialization/modpacks.dm index 5fad4ec549c..f2f6c65a2e6 100644 --- a/code/controllers/subsystems/initialization/modpacks.dm +++ b/code/controllers/subsystems/initialization/modpacks.dm @@ -7,6 +7,7 @@ SUBSYSTEM_DEF(modpacks) // Compiled modpack information. var/list/default_submap_whitelisted_species = list() var/list/default_submap_blacklisted_species = list(SPECIES_ALIEN, SPECIES_GOLEM) + var/list/modpack_nanoui_directories = list() /datum/controller/subsystem/modpacks/Initialize() var/list/all_modpacks = decls_repository.get_decls_of_subtype(/decl/modpack) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 8e8c90860c4..d582783e091 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -185,7 +185,7 @@ var/global/template_file_name = "all_templates.json" if(fexists(path + filename)) register_asset(filename, fcopy_rsc(path + filename)) - merge_and_register_templates() + merge_and_register_all_templates() var/list/mapnames = list() for(var/z in SSmapping.map_levels) @@ -199,13 +199,18 @@ var/global/template_file_name = "all_templates.json" common[filename] = fcopy_rsc(file_path) register_asset(filename, common[filename]) -/datum/asset/nanoui/proc/merge_and_register_templates() - var/list/templates = flist(template_dir) - for(var/filename in templates) - if(copytext(filename, length(filename)) != "/") - templates[filename] = replacetext(replacetext(file2text(template_dir + filename), "\n", ""), "\t", "") - else - templates -= filename +/datum/asset/nanoui/proc/merge_and_register_all_templates() + . = merge_templates(template_dir) + . += merge_modpack_templates() + register_templates(.) + +/datum/asset/nanoui/proc/merge_modpack_templates() + PRIVATE_PROC(TRUE) + . = list() + for(var/mod_template_dir in SSmodpacks.modpack_nanoui_directories) + . += merge_templates(mod_template_dir) + +/datum/asset/nanoui/proc/register_templates(templates) var/full_file_name = template_temp_dir + global.template_file_name if(fexists(full_file_name)) fdel(file(full_file_name)) @@ -213,6 +218,17 @@ var/global/template_file_name = "all_templates.json" to_file(template_file, json_encode(templates)) register_asset(global.template_file_name, fcopy_rsc(template_file)) +/// Handles adding a directory's templates to the compiled templates list. +/datum/asset/nanoui/proc/merge_templates(use_dir) + PRIVATE_PROC(TRUE) + var/list/templates = flist(use_dir) + for(var/filename in templates) + if(copytext(filename, length(filename)) != "/") + templates[filename] = replacetext(replacetext(file2text(use_dir + filename), "\n", ""), "\t", "") + else + templates -= filename + return templates + /datum/asset/nanoui/send(client, uncommon) if(!islist(uncommon)) uncommon = list(uncommon) @@ -223,11 +239,12 @@ var/global/template_file_name = "all_templates.json" // Note: this is intended for dev work, and is unsafe. Do not use outside of that. /datum/asset/nanoui/proc/recompute_and_resend_templates() - merge_and_register_templates() + merge_and_register_all_templates() for(var/client/C in clients) - if(C) // there are sleeps here, potentially - send_asset(C, global.template_file_name, FALSE, FALSE) - to_chat(C, SPAN_WARNING("Nanoui templates have been updated. Please close and reopen any browser windows.")) + spawn() // there are sleeps here, potentially + if(C) + send_asset(C, global.template_file_name, FALSE, FALSE) + to_chat(C, SPAN_WARNING("Nanoui templates have been updated. Please close and reopen any browser windows.")) /client/proc/resend_nanoui_templates() set category = "Debug" diff --git a/mods/_modpack.dm b/mods/_modpack.dm index 1e8accdf306..81c16e69f7a 100644 --- a/mods/_modpack.dm +++ b/mods/_modpack.dm @@ -6,6 +6,8 @@ /// A string with authors of this modpack. var/author var/secrets_directory + /// The folder to load additional NanoUI templates from. Must be relative to the DME's location (root game folder). + var/nanoui_directory var/list/dreams //! A list of strings to be added to the random dream proc. var/list/credits_other //! A list of strings that are used by the end of round credits roll. @@ -32,6 +34,15 @@ if(!fexists(secrets_directory)) return "Modpack secrets_directory does not exist." SSsecrets.load_directories |= secrets_directory + if(nanoui_directory) + nanoui_directory = trim(lowertext(nanoui_directory)) + if(!length(nanoui_directory)) + return "Modpack nanoui_directory is zero length after trim." + if(copytext(nanoui_directory, -1) != "/") + nanoui_directory = "[nanoui_directory]/" + if(!fexists(nanoui_directory)) + return "Modpack nanoui_directory does not exist." + SSmodpacks.modpack_nanoui_directories |= nanoui_directory /decl/modpack/proc/initialize() return diff --git a/mods/content/inertia/_inertia.dm b/mods/content/inertia/_inertia.dm index 97bee4de9a0..585525241f1 100644 --- a/mods/content/inertia/_inertia.dm +++ b/mods/content/inertia/_inertia.dm @@ -1,3 +1,4 @@ /decl/modpack/inertia name = "Ship Inertia Content" - desc = "This modpack adds support for inertia (throwing unsecured mobs) when ship thrusters fire, and adds an inertial dampener machine to counteract this." \ No newline at end of file + desc = "This modpack adds support for inertia (throwing unsecured mobs) when ship thrusters fire, and adds an inertial dampener machine to counteract this." + nanoui_directory = "mods/content/inertia/nano_templates/" \ No newline at end of file diff --git a/nano/templates/inertial_damper.tmpl b/mods/content/inertia/nano_templates/inertial_damper.tmpl similarity index 100% rename from nano/templates/inertial_damper.tmpl rename to mods/content/inertia/nano_templates/inertial_damper.tmpl diff --git a/nano/templates/engines_control.tmpl b/nano/templates/engines_control.tmpl index 4df88e86014..c9ec27c77c7 100644 --- a/nano/templates/engines_control.tmpl +++ b/nano/templates/engines_control.tmpl @@ -29,6 +29,8 @@ {{:data.total_thrust}}
+ + {{if data.needs_dampers}}
diff --git a/scripts/server.sh b/scripts/server.sh index b65b6b33d16..bc89d45b7c4 100755 --- a/scripts/server.sh +++ b/scripts/server.sh @@ -63,7 +63,7 @@ while [[ ! -e stopserver ]]; do cp "$GITDIR/$DME.rsc" . cp -r "$GITDIR/nano" . # Necessary for NanoUI cp -r "$GITDIR/maps" . # Necessary for runtime submap loading - cp -r "$GITDIR/mods" . # Also necessary for runtime submap loading. TODO: a better solution + cp -r "$GITDIR/mods" . # Also necessary for runtime submap and NanoUI loading. TODO: a better solution? [[ ! -e btime.so && -e "$GITDIR/btime.so" ]] && cp "$GITDIR/btime.so" . [[ ! -e .git/logs ]] && mkdir -p .git/logs cp "$GITDIR/.git/HEAD" ./.git/HEAD From ae35726b6f8356bffad45908c7026bdccbc0466b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 1 Jan 2025 00:51:08 -0500 Subject: [PATCH 277/554] Fix runtime from security states with fewer than two levels --- code/modules/security_levels/security_state.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/security_levels/security_state.dm b/code/modules/security_levels/security_state.dm index dfc0c78a94c..2e997845d41 100644 --- a/code/modules/security_levels/security_state.dm +++ b/code/modules/security_levels/security_state.dm @@ -32,13 +32,13 @@ // Setup the high security level if(!(high_security_level in all_security_levels)) - high_security_level = all_security_levels[all_security_levels.len - 1] + high_security_level = all_security_levels[max(1, all_security_levels.len - 1)] high_security_level = GET_DECL(high_security_level) // Setup the highest standard security level if(highest_standard_security_level || isnull(highest_standard_security_level)) if(!(highest_standard_security_level in all_security_levels)) - highest_standard_security_level = all_security_levels[all_security_levels.len - 1] + highest_standard_security_level = all_security_levels[max(1, all_security_levels.len - 1)] highest_standard_security_level = GET_DECL(highest_standard_security_level) else highest_standard_security_level = null From 15239692021c8a7430db9d49235e0ec3cd48d055 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 2 Jan 2025 12:33:14 +1100 Subject: [PATCH 278/554] Automatic changelog generation for PR #4677 [ci skip] --- html/changelogs/AutoChangeLog-pr-4677.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4677.yml diff --git a/html/changelogs/AutoChangeLog-pr-4677.yml b/html/changelogs/AutoChangeLog-pr-4677.yml new file mode 100644 index 00000000000..81f376b535a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4677.yml @@ -0,0 +1,5 @@ +author: MistakeNot4892 +changes: + - {tweak: Raw plant oil no longer works as lantern fuel; it must be mixed with powdered + graphite first.} +delete-after: true From 8dec28a7db45109a2088e19d8577ae91a1c479e5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 31 May 2024 19:47:54 -0400 Subject: [PATCH 279/554] Add a hack for interior ambience and multiz daycycle --- code/controllers/subsystems/ambience.dm | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/ambience.dm b/code/controllers/subsystems/ambience.dm index ad9d2a1c52b..757f846c640 100644 --- a/code/controllers/subsystems/ambience.dm +++ b/code/controllers/subsystems/ambience.dm @@ -63,10 +63,23 @@ SUBSYSTEM_DEF(ambience) // Grab what we need to set ambient light from our level handler. var/datum/level_data/level_data = SSmapping.levels_by_z[z] + var/daycycle_id = level_data.daycycle_id + // if we don't have a daycycle ourselves, and we're indoors because of a turf blocking us + // find the first daycycle above us to use + if(!outsideness && !daycycle_id && HasAbove(z)) + var/turf/above = src + var/datum/level_data/above_level_data + while ((above = GetAbove(above))) + if((above.z_flags & ZM_TERMINATOR) || !HasAbove(above.z)) + break + above_level_data = SSmapping.levels_by_z[above.z] + if(above_level_data.daycycle_id) + daycycle_id = above_level_data.daycycle_id + break // Check for daycycle ambience. - if(level_data.daycycle_id) - var/datum/daycycle/daycycle = SSdaycycle.get_daycycle(level_data.daycycle_id) + if(daycycle_id) + var/datum/daycycle/daycycle = SSdaycycle.get_daycycle(daycycle_id) var/new_power = daycycle?.current_period?.power if(!isnull(new_power)) if(new_power > 0) From 7e1d5459952c5747e7264a1c644d0c917ba2133c Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 3 Jan 2025 00:50:18 +0000 Subject: [PATCH 280/554] Automatic changelog generation [ci skip] --- html/changelog.html | 12 ++++++------ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-4677.yml | 5 ----- 3 files changed, 10 insertions(+), 11 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4677.yml diff --git a/html/changelog.html b/html/changelog.html index b64a9c790da..e3ca3498482 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
+

03 January 2025

+

MistakeNot4892 updated:

+
    +
  • Raw plant oil no longer works as lantern fuel; it must be mixed with powdered graphite first.
  • +
+

23 December 2024

ophelia v0.8 updated:

    @@ -100,12 +106,6 @@

    Neerti updated:

  • Microlasers added to mining drills no longer multiply ore out of the ground, but make the drill mine faster, proportionally increasing the energy usage.
  • Capacitors added to mining drills are less powerful.
- -

01 November 2024

-

MistakeNot4892 updated:

-
    -
  • Curries, soups and stews have been rewritten, please refer to the codex for recipes.
  • -
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 9e2102536fb..894f308ccdb 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14941,3 +14941,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - imageadd: added new dirt and mud tile sprites - imageadd: added new wooden chest sprites, by Doe - tweak: mud and soil plots are now properly greyscaled to soil material color +2025-01-03: + MistakeNot4892: + - tweak: Raw plant oil no longer works as lantern fuel; it must be mixed with powdered + graphite first. diff --git a/html/changelogs/AutoChangeLog-pr-4677.yml b/html/changelogs/AutoChangeLog-pr-4677.yml deleted file mode 100644 index 81f376b535a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4677.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: Raw plant oil no longer works as lantern fuel; it must be mixed with powdered - graphite first.} -delete-after: true From e4e2ff429ec3bfe92d4eb71fdb34705dc5aba340 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:28:36 -0500 Subject: [PATCH 281/554] Simplify kharmaan nymph contains_crystals check --- mods/species/ascent/mobs/nymph/nymph_inventory.dm | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/mods/species/ascent/mobs/nymph/nymph_inventory.dm b/mods/species/ascent/mobs/nymph/nymph_inventory.dm index 12396419807..e79adb9931d 100644 --- a/mods/species/ascent/mobs/nymph/nymph_inventory.dm +++ b/mods/species/ascent/mobs/nymph/nymph_inventory.dm @@ -1,13 +1,8 @@ -/mob/living/simple_animal/alien/kharmaan/proc/contains_crystals(var/obj/item/W) - for(var/mat in W.matter) - if(mat == /decl/material/solid/sand) - . += W.matter[mat] - else if(mat == /decl/material/solid/gemstone/crystal) - . += W.matter[mat] - else if(mat == /decl/material/solid/quartz) - . += W.matter[mat] - else if(mat == /decl/material/solid/glass) - . += W.matter[mat] +/mob/living/simple_animal/alien/kharmaan/proc/contains_crystals(var/obj/item/prop) + . += prop.matter[/decl/material/solid/sand] + . += prop.matter[/decl/material/solid/gemstone/crystal] + . += prop.matter[/decl/material/solid/quartz] + . += prop.matter[/decl/material/solid/glass] /datum/inventory_slot/gripper/mouth/nymph/ascent/equipped(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE, var/delete_old_item = TRUE) var/mob/living/simple_animal/alien/kharmaan/nimp = user From 3202ca28a1f12fca306ac462a1b5db345536ab37 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:07:56 -0500 Subject: [PATCH 282/554] Rename supermatter material presets to exotic matter --- code/game/objects/items/blades/spear_improvised.dm | 2 +- code/modules/clothing/suits/armor/craftable.dm | 2 +- code/modules/power/fuel_assembly/fuel_assembly.dm | 2 +- code/modules/power/fusion/fusion_reactions.dm | 11 +++++------ 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/blades/spear_improvised.dm b/code/game/objects/items/blades/spear_improvised.dm index d9846e8a1a0..9f1a1da2425 100644 --- a/code/game/objects/items/blades/spear_improvised.dm +++ b/code/game/objects/items/blades/spear_improvised.dm @@ -34,7 +34,7 @@ hilt_material = /decl/material/solid/organic/wood/oak force_binding_color = COLOR_GREEN -/obj/item/bladed/polearm/spear/improvised/supermatter +/obj/item/bladed/polearm/spear/improvised/exotic_matter material = /decl/material/solid/exotic_matter hilt_material = /decl/material/solid/organic/wood/ebony force_binding_color = COLOR_INDIGO diff --git a/code/modules/clothing/suits/armor/craftable.dm b/code/modules/clothing/suits/armor/craftable.dm index c73e38510fc..824a7c5b553 100644 --- a/code/modules/clothing/suits/armor/craftable.dm +++ b/code/modules/clothing/suits/armor/craftable.dm @@ -33,5 +33,5 @@ material = /decl/material/solid/gemstone/diamond /obj/item/clothing/suit/armor/crafted/gold material = /decl/material/solid/metal/gold -/obj/item/clothing/suit/armor/crafted/supermatter +/obj/item/clothing/suit/armor/crafted/exotic_matter material = /decl/material/solid/exotic_matter diff --git a/code/modules/power/fuel_assembly/fuel_assembly.dm b/code/modules/power/fuel_assembly/fuel_assembly.dm index 6958f2431d2..0527ee14941 100644 --- a/code/modules/power/fuel_assembly/fuel_assembly.dm +++ b/code/modules/power/fuel_assembly/fuel_assembly.dm @@ -87,7 +87,7 @@ /obj/item/fuel_assembly/tritium material = /decl/material/gas/hydrogen/tritium -/obj/item/fuel_assembly/supermatter +/obj/item/fuel_assembly/exotic_matter material = /decl/material/solid/exotic_matter /obj/item/fuel_assembly/hydrogen diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm index 73cffcc1529..5ff951b477b 100644 --- a/code/modules/power/fusion/fusion_reactions.dm +++ b/code/modules/power/fusion/fusion_reactions.dm @@ -92,7 +92,7 @@ minimum_reaction_temperature = 10000 // VERY UNIDEAL REACTIONS. -/decl/fusion_reaction/helium_supermatter +/decl/fusion_reaction/helium_exotic_matter p_react = /decl/material/solid/exotic_matter s_react = /decl/material/gas/helium energy_consumption = 0 @@ -101,7 +101,7 @@ instability = 20 * FUSION_PROCESSING_TIME_MULT hidden_from_codex = TRUE -/decl/fusion_reaction/helium_supermatter/handle_reaction_special(var/obj/effect/fusion_em_field/holder) +/decl/fusion_reaction/helium_exotic_matter/handle_reaction_special(var/obj/effect/fusion_em_field/holder) set waitfor = FALSE . = 1 var/datum/event/wormholes/WM = new /datum/event/wormholes(new /datum/event_meta(EVENT_LEVEL_MAJOR)) @@ -112,8 +112,7 @@ qdel(holder) var/radiation_level = rand(100, 200) - // Copied from the SM for proof of concept. //Not any more --Cirra //Use the whole z proc --Leshana - SSradiation.z_radiate(locate(1, 1, holder.z), radiation_level, 1) + SSradiation.z_radiate(origin, radiation_level, respect_maint = TRUE) for(var/mob/living/human/H in global.living_mob_list_) var/turf/T = get_turf(H) @@ -121,10 +120,10 @@ H.set_hallucination(rand(100,150), 51) for(var/obj/machinery/fusion_fuel_injector/I in range(world.view, origin)) - if(I.cur_assembly && I.cur_assembly.material && I.cur_assembly.material.type == /decl/material/solid/exotic_matter) + if(I.cur_assembly && I.cur_assembly.material && I.cur_assembly.material.type == p_react) explosion(get_turf(I), 1, 2, 3) if(!QDELETED(I)) - QDEL_IN(I, 5) + addtimer(CALLBACK(I, TYPE_PROC_REF(/atom, physically_destroyed)), 0.5 SECONDS) sleep(5) explosion(origin, 1, 2, 5) From 070c898c79548cecc678956fa38f9eefb086c89d Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:20:36 -0500 Subject: [PATCH 283/554] Improve modpack modularity for niche edge cases --- code/game/gamemodes/endgame/endgame.dm | 1 + .../endgame/supermatter_cascade/universe.dm | 3 -- code/game/gamemodes/game_mode.dm | 16 +++--- .../objects/items/weapons/secrets_disk.dm | 42 +++++++++++---- code/modules/admin/verbs/grief_fixers.dm | 54 ++++++++++++++----- 5 files changed, 83 insertions(+), 33 deletions(-) diff --git a/code/game/gamemodes/endgame/endgame.dm b/code/game/gamemodes/endgame/endgame.dm index 6d81b42d639..c1c03164c55 100644 --- a/code/game/gamemodes/endgame/endgame.dm +++ b/code/game/gamemodes/endgame/endgame.dm @@ -1,3 +1,4 @@ +var/global/universe_has_ended = 0 /********************** * ENDGAME STUFF **********************/ diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index e9b2d2e40fd..507097a121e 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -1,6 +1,3 @@ -var/global/universe_has_ended = 0 - - /datum/universal_state/supermatter_cascade name = "Supermatter Cascade" desc = "Unknown harmonance affecting universal substructure, converting nearby matter to supermatter." diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index be38f8871ef..c8cc812c486 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -283,11 +283,10 @@ var/global/list/additional_antag_types = list() for(var/decl/special_role/antag in antag_templates) antag.reset_antag_selection() -/decl/game_mode/proc/announce_ert_disabled() - if(!ert_disabled) - return - - var/list/reasons = list( +/// Gets a list of default reasons for the ERT to be disabled. +/decl/game_mode/proc/possible_ert_disabled_reasons() + // This uses a static var so that modpacks can add default reasons, e.g. "supermatter dust". + var/static/list/reasons = list( "political instability", "quantum fluctuations", "hostile raiders", @@ -319,7 +318,12 @@ var/global/list/additional_antag_types = list() "classified security operations", "a gargantuan glowing goat" ) - command_announcement.Announce("The presence of [pick(reasons)] in the region is tying up all available local emergency resources; emergency response teams cannot be called at this time, and post-evacuation recovery efforts will be substantially delayed.","Emergency Transmission") + return reasons + +/decl/game_mode/proc/announce_ert_disabled() + if(!ert_disabled) + return + command_announcement.Announce("The presence of [pick(possible_ert_disabled_reasons())] in the region is tying up all available local emergency resources; emergency response teams cannot be called at this time, and post-evacuation recovery efforts will be substantially delayed.","Emergency Transmission") /decl/game_mode/proc/check_finished() if(SSevac.evacuation_controller?.round_over() || station_was_nuked) diff --git a/code/game/objects/items/weapons/secrets_disk.dm b/code/game/objects/items/weapons/secrets_disk.dm index ee152b86151..c5bbf89afb1 100644 --- a/code/game/objects/items/weapons/secrets_disk.dm +++ b/code/game/objects/items/weapons/secrets_disk.dm @@ -13,19 +13,39 @@ This one has a lengthy legal label on it denoting it the private, copyrighted property of the Expeditionary Corps Organisation." req_access = list(access_rd) +/obj/item/disk/secret_project/proc/get_secret_project_codenames() + var/static/list/codenames = list( + "gamma", "delta", "epsilon", "zeta", "theta", "lambda", "omicron", "sigma", "tau", + "upsilon", "omega", "echelon", "prism", "calypso", "bernoulli", "harmony", "nyx", "fresnel" + ) + +/obj/item/disk/secret_project/proc/get_secret_project_types() + var/static/list/types = list( + "an experimental design for", + "a blueprint to build", + "a long set of theoretical formulas detailing the functioning of" + ) + return types + +/obj/item/disk/secret_project/proc/get_secret_project_nouns() + var/static/list/nouns = list( + "a superluminal artillery cannon", "a supermatter engine", "a fusion engine", "an atmospheric scrubber",\ + "a human cloning pod", "a microwave oven", "a wormhole generator", "a laser carbine", "an energy pistol",\ + "a wormhole", "a teleporter", "a huge mining drill", "a strange spacecraft", "a space station",\ + "a sleek-looking fighter spacecraft", "a ballistic rifle", "an energy sword", "an inanimate carbon rod" + ) + return nouns + +/obj/item/disk/secret_project/proc/get_secret_project_descriptors() + var/static/list/descriptors = list( + "that is extremely powerful", "which is highly efficient", "which is incredibly compact", "created by aliens", + "that runs off of an exotic form of matter", "that runs off of hydrogen gas", "that just looks really cool" + ) + /obj/item/disk/secret_project/Initialize() . = ..() - var/codename = pick("gamma", "delta", "epsilon", "zeta", "theta", "lambda", "omicron", "sigma", "tau",\ - "upsilon", "omega", "echelon", "prism", "calypso", "bernoulli", "harmony", "nyx", "fresnel") - name = "'[codename]' project data disk" - subject = pick("an experimental design for", "a blueprint to build",\ - "a long set of theoretical formulas detailing the functioning of") - subject += " " + pick("a superluminal artillery cannon", "a supermatter engine", "a fusion engine", "an atmospheric scrubber",\ - "a human cloning pod", "a microwave oven", "a wormhole generator", "a laser carbine", "an energy pistol",\ - "a wormhole", "a teleporter", "a huge mining drill", "a strange spacecraft", "a space station",\ - "a sleek-looking fighter spacecraft", "a ballistic rifle", "an energy sword", "an inanimate carbon rod") - subject += " " + pick("that is extremely powerful", "which is highly efficient", "which is incredibly compact",\ - "that runs off of an exotic form of matter", "that runs off of hydrogen gas", "created by aliens", "that just looks really cool") + name = "'[pick(get_secret_project_codenames())]' project data disk" + subject = "[pick(get_secret_project_types())] [pick(get_secret_project_nouns())] [pick(get_secret_project_descriptors())]" /obj/item/disk/secret_project/examine(mob/user) . = ..() diff --git a/code/modules/admin/verbs/grief_fixers.dm b/code/modules/admin/verbs/grief_fixers.dm index 2394d2a8197..03b4f40f77b 100644 --- a/code/modules/admin/verbs/grief_fixers.dm +++ b/code/modules/admin/verbs/grief_fixers.dm @@ -4,35 +4,64 @@ if(!check_rights(R_ADMIN|R_DEBUG)) return - if(alert("WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. The supermatter engine will also be stopped (to prevent overheat due to removal of coolant). Do not use unless the map is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", "No", "Yes") == "No") + if(alert("WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. This may require any atmos-based generators to shut down. Do not use unless the map is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", "No", "Yes") == "No") return SSstatistics.add_field_details("admin_verb","FA") log_and_message_admins("Full atmosphere reset initiated by [usr].") - to_world("Initiating restart of atmosphere. The server may lag a bit.") + to_world(SPAN_DANGER("Initiating restart of atmosphere. The server may lag a bit.")) sleep(10) var/current_time = world.timeofday + var/list/steps = sortTim(decls_repository.get_decls_of_subtype_unassociated(/decl/atmos_grief_fix_step), /proc/cmp_decl_sort_value_asc) + var/step_count = length(steps) + for(var/step_index in 1 to length(step_count)) + var/decl/atmos_grief_fix_step/fix_step = steps[step_index] + to_chat(usr, "\[[step_index]/[step_count]\] - [fix_step.name].") + fix_step.act() + to_world(SPAN_DANGER("Atmosphere restart completed in [(world.timeofday - current_time)/(1 SECOND)] seconds.")) + +/decl/atmos_grief_fix_step + abstract_type = /decl/atmos_grief_fix_step + var/name + +/decl/atmos_grief_fix_step/proc/act() + return + +/decl/atmos_grief_fix_step/supermatter + name = "Supermatter depowered" + sort_order = 0 + +/decl/atmos_grief_fix_step/supermatter/act() // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. for(var/obj/machinery/power/supermatter/S in SSmachines.machinery) S.power = 0 - to_chat(usr, "\[1/5\] - Supermatter depowered") +/decl/atmos_grief_fix_step/purge_pipenets + name = "All pipenets purged of gas" + sort_order = 1 + +/decl/atmos_grief_fix_step/purge_pipenets/act() // Remove all gases from all pipenets - for(var/net in SSmachines.pipenets) - var/datum/pipe_network/PN = net + for(var/datum/pipe_network/PN as anything in SSmachines.pipenets) for(var/datum/gas_mixture/G in PN.gases) - G.gas = list() + G.gas.Cut() G.update_values() - to_chat(usr, "\[2/5\] - All pipenets purged of gas.") +/decl/atmos_grief_fix_step/delete_zones + name = "All ZAS Zones removed" + sort_order = 2 +/decl/atmos_grief_fix_step/delete_zones/act() // Delete all zones. for(var/zone/Z in SSair.zones) Z.c_invalidate() - to_chat(usr, "\[3/5\] - All ZAS Zones removed.") +/decl/atmos_grief_fix_step/reset_turfs + name = "All turfs reset to roundstart values" + sort_order = 3 +/decl/atmos_grief_fix_step/reset_turfs/act() var/list/unsorted_overlays = list() var/list/all_gasses = decls_repository.get_decls_of_subtype(/decl/material/gas) for(var/id in all_gasses) @@ -41,12 +70,11 @@ for(var/turf/T in world) T.air = null - T.overlays.Remove(unsorted_overlays) T.zone = null - to_chat(usr, "\[4/5\] - All turfs reset to roundstart values.") +/decl/atmos_grief_fix_step/reboot_zas + name = "ZAS Rebooted" + sort_order = 4 +/decl/atmos_grief_fix_step/reboot_zas/act() SSair.reboot() - - to_chat(usr, "\[5/5\] - ZAS Rebooted") - to_world("Atmosphere restart completed in [(world.timeofday - current_time)/10] seconds.") From 1bb2ab4ded41e6e412210da115421685200e52a3 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:25:34 -0500 Subject: [PATCH 284/554] Fix hardcoded stage checks in singularity code --- code/modules/power/singularity/singularity.dm | 11 ++++----- .../power/singularity/singularity_events.dm | 11 ++++----- .../power/singularity/singularity_stages.dm | 23 +++++++++++++++++++ 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 6482521407e..c1c8ea8295e 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -13,7 +13,7 @@ var/global/list/singularities = list() /// Category used for investigation entries relating to this atom. var/const/investigation_label = "singulo" - /// A list of events. Toxins is in here twice to double the chance of proccing. + /// A weighted list of events. var/static/list/singularity_events = list( /decl/singularity_event/empulse = 1, /decl/singularity_event/toxins = 2, @@ -63,7 +63,7 @@ var/global/list/singularities = list() /obj/effect/singularity/explosion_act(severity) SHOULD_CALL_PARENT(FALSE) - if(current_stage.stage_size == STAGE_SUPER)//IT'S UNSTOPPABLE + if(!current_stage.explosion_vulnerable)//IT'S UNSTOPPABLE return if(severity == 1) if(prob(25)) @@ -153,16 +153,13 @@ var/global/list/singularities = list() // Handle random events. if(prob(current_stage.event_chance)) - if(current_stage.stage_size >= STAGE_SUPER) - var/decl/singularity_event/wave_event = GET_DECL(/decl/singularity_event/supermatter_wave) - wave_event.handle_event(src) - var/decl/singularity_event/singularity_event = pickweight(singularity_events) + var/decl/singularity_event/singularity_event = current_stage.forced_event || pickweight(singularity_events) singularity_event = GET_DECL(singularity_event) singularity_event.handle_event(src) /obj/effect/singularity/proc/try_move(var/movement_dir, var/vertical_move) set waitfor = FALSE - if(current_stage.stage_size >= STAGE_FIVE)//The superlarge one does not care about things in its way + if(current_stage.ignore_obstacles)//The superlarge one does not care about things in its way step(src, movement_dir) if(!vertical_move) sleep(1) diff --git a/code/modules/power/singularity/singularity_events.dm b/code/modules/power/singularity/singularity_events.dm index e48a040231b..083fe459573 100644 --- a/code/modules/power/singularity/singularity_events.dm +++ b/code/modules/power/singularity/singularity_events.dm @@ -7,10 +7,7 @@ /decl/singularity_event/nothing // Nothing happens. /decl/singularity_event/empulse/handle_event(obj/effect/singularity/source) - if(source.current_stage.stage_size != STAGE_SUPER) - empulse(source, 8, 10) - else - empulse(source, 12, 16) + empulse(source, source.current_stage.em_heavy_range, source.current_stage.em_light_range) /decl/singularity_event/toxins var/toxrange = 10 @@ -35,11 +32,11 @@ if(ishuman(M)) var/mob/living/human/H = M if(istype(H.get_equipped_item(slot_glasses_str), /obj/item/clothing/glasses/meson)) - if(source.current_stage.stage_size != STAGE_SUPER) + if(!source.current_stage.the_goggles_do_nothing) to_chat(H, SPAN_WARNING("You look directly into \the [source]. Good thing you had your protective eyewear on!")) continue to_chat(H, SPAN_WARNING("Your eyewear does absolutely nothing to protect you from \the [source]")) - to_chat(M, SPAN_DANGER("You look directly into \the [source] and feel [source.current_stage.stage_size == STAGE_SUPER ? "helpless" : "weak"].")) + to_chat(M, SPAN_DANGER("You look directly into \the [source] and feel [source.current_stage.mesmerize_text].")) M.apply_effect(3, STUN) M.visible_message(SPAN_DANGER("\The [M] stares blankly at \the [source]!")) @@ -51,4 +48,4 @@ else to_chat(M, SPAN_DANGER("You don't even have a moment to react as you are reduced to ashes by the intense radiation.")) M.dust() - SSradiation.radiate(source, rand(source.energy)) + SSradiation.radiate(source, rand(source.energy)) \ No newline at end of file diff --git a/code/modules/power/singularity/singularity_stages.dm b/code/modules/power/singularity/singularity_stages.dm index 831cacd48c5..b95595f4839 100644 --- a/code/modules/power/singularity/singularity_stages.dm +++ b/code/modules/power/singularity/singularity_stages.dm @@ -32,8 +32,22 @@ var/dissipation_energy_loss = 1 /// What is the percent chance of an event each tick? var/event_chance + /// Do we force a specific event when we proc events? + var/decl/singularity_event/forced_event = null /// Will we wander around? var/wander + /// Can explosions destroy the singularity? + var/explosion_vulnerable + /// What is the heavy range for the EM pulse event in this stage? + var/em_heavy_range = 8 + /// What is the light range for the EM pulse event in this stage? + var/em_light_range = 10 + /// What do characters feel when they're mesmerized during this stage? + var/mesmerize_text = "weak" + /// Do we ignore PPE for mesmerizing in this stage? + var/the_goggles_do_nothing = FALSE + /// Do we ignore obstacles in our way? + var/ignore_obstacles = FALSE /decl/singularity_stage/validate() . = ..() @@ -171,6 +185,7 @@ dissipates_over_time = FALSE //It cant go smaller due to e loss. wander = TRUE event_chance = 20 + ignore_obstacles = TRUE /decl/singularity_stage/stage_five/grow_to(obj/effect/singularity/source) source.visible_message(SPAN_DANGER("\The [source] has grown out of control!")) @@ -178,6 +193,7 @@ /decl/singularity_stage/stage_five/shrink_to(obj/effect/singularity/source) source.visible_message(SPAN_WARNING("\The [source] miraculously reduces in size and loses its supermatter properties.")) +/// A singularity that has the mass of a supermatter crystal. /decl/singularity_stage/stage_super name = "super gravitational singularity" desc = "A gravitational singularity with the properties of supermatter. It has the power to destroy worlds." @@ -193,7 +209,14 @@ consume_range = 5 dissipates_over_time = 0 //It cant go smaller due to e loss event_chance = 25 //Events will fire off more often. + forced_event = /decl/singularity_event/supermatter_wave wander = TRUE + explosion_vulnerable = FALSE + em_heavy_range = 12 + em_light_range = 16 + mesmerize_text = "helpless" + the_goggles_do_nothing = TRUE + ignore_obstacles = TRUE /decl/singularity_stage/stage_super/grow_to(obj/effect/singularity/source) source.visible_message(SPAN_SINISTER("You witness the creation of a destructive force that cannot possibly be stopped by human hands.")) From b33391cf126aead77caa2f07cd0c5a6b582b8558 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 3 Jan 2025 23:21:18 +1100 Subject: [PATCH 285/554] Adding footguns section to contributing.md. --- CONTRIBUTING.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c858b868b2..3940d892dd0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,3 +30,14 @@ This is a quick and dirty set of agreed-upon standards for contributions to the - If there's a personal dislike of the PR, post about it for discussion. Maybe have an 'on hold for discussion' label. Try to reach a consensus/compromise. Failing a compromise, a majority maintainer vote will decide. - First person to review approves the PR, second person to review can merge it. If 24 hours pass with no objections, first person can merge the PR themselves. - PRs can have a 24 hour grace period applied by maintainers if it seems important for discussion and responses to be involved. Don't merge for the grace period if applied (reviews are fine). + +### Footguns +A footgun is a pattern, function, assumption etc. that stands a strong chance to shoot you in the foot. They are documented here for ease of reference by new contributors. + +#### List footguns +- Adding lists to lists will actually perform a merge, rather than inserting the list as a new record. If you want to insert a list into a list, you need to either: + - double-wrap it, ex. `my_list += list(list("some_new_data" = 25))` + - set the index directly, ex. `my_list[my_list.len] = list("some_new_data" = 25)` +- Using variables and macros as associative list keys have some notable behavior. + - If declaring an associative list using a macro as a key, in a case where the macro does not exist (due to misspelling, etc.), that macro name will be treated as a string value for the associative list. You can guard against this by wrapping the macro in parens, ex. `list( (MY_MACRO_NAME) = "some_value" )`, which will fail to compile instead in cases where the macro doesn't exist. + - If a variable is used as the associative key, it *must* be wrapped in parens, or it will be used as a string key. \ No newline at end of file From dec798e4bbec3a5699503e7f4f1cff0ef9acc4bc Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 4 Jan 2025 22:45:38 +1100 Subject: [PATCH 286/554] Disambiguating some language in human examine code. --- code/modules/mob/living/human/examine.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/human/examine.dm b/code/modules/mob/living/human/examine.dm index 389e209440c..00c79f54619 100644 --- a/code/modules/mob/living/human/examine.dm +++ b/code/modules/mob/living/human/examine.dm @@ -72,24 +72,24 @@ to_chat(user, "[use_He] [use_has] a pulse!") var/datum/reagents/touching_reagents = get_contact_reagents() - if(touching_reagents?.total_volume) + if(touching_reagents?.total_volume >= 1) var/saturation = touching_reagents.total_volume / touching_reagents.maximum_volume if(saturation > 0.9) msg += "[use_He] [use_is] completely saturated.\n" else if(saturation > 0.6) - msg += "[use_He] [use_is] looking like a drowned cat.\n" + msg += "[use_He] [use_is] looking half-drowned.\n" else if(saturation > 0.3) msg += "[use_He] [use_is] looking notably soggy.\n" else - msg += "[use_He] [use_is] looking a bit damp.\n" + msg += "[use_He] [use_is] looking a bit soggy.\n" if(fire_stacks > 0) msg += "[use_He] [use_is] looking highly flammable!\n" else if(fire_stacks < 0) - msg += "[use_He] [use_is] looking rather damp.\n" + msg += "[use_He] [use_is] looking rather incombustible.\n" if(on_fire) - msg += "[use_He] [use_is] on fire!.\n" + msg += "[use_He] [use_is] on fire!\n" var/ssd_msg = species.get_ssd(src) if(ssd_msg && (!should_have_organ(BP_BRAIN) || has_brain()) && stat != DEAD) From bd4ba52583750d291be6beaaae62c697a2c82cdf Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 4 Jan 2025 22:49:17 +1100 Subject: [PATCH 287/554] Adjusting fluid dripping and turf slipperiness from fluid_act(). --- code/game/turfs/turf_fluids.dm | 3 +++ code/modules/mob/living/life.dm | 5 +++-- code/modules/reagents/Chemistry-Holder.dm | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index e377ec4b32f..0a0c90400fc 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -177,6 +177,8 @@ var/decl/material/primary_reagent = reagents.get_primary_reagent_decl() if(primary_reagent && (REAGENT_VOLUME(reagents, primary_reagent.type) >= primary_reagent.slippery_amount)) last_slipperiness = primary_reagent.slipperiness + else + last_slipperiness = 0 if(!fluid_overlay) fluid_overlay = new(src, TRUE) fluid_overlay.update_icon() @@ -188,6 +190,7 @@ SSfluids.pending_flows -= src if(last_slipperiness > 0) wet_floor(last_slipperiness) + last_slipperiness = 0 for(var/checkdir in global.cardinal) var/turf/neighbor = get_step_resolving_mimic(src, checkdir) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index f81a0412fcc..b229cb58972 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -273,9 +273,10 @@ if(!loc) return var/datum/reagents/touching_reagents = get_contact_reagents() - if(!touching_reagents?.total_volume) + if(touching_reagents?.total_volume < 1) + touching_reagents?.clear_reagents() return - var/drip_amount = max(1, round(touching_reagents.total_volume * 0.1)) + var/drip_amount = max(1, round(touching_reagents.total_volume * 0.2)) if(drip_amount) touching_reagents.trans_to(loc, drip_amount) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 08d3c9323c9..17939c21f28 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -890,7 +890,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new trans_to_holder(target.reagents, amount, multiplier, copy, defer_update = defer_update, transferred_phases = transferred_phases) // Deferred updates are presumably being done by SSfluids. // Do an immediate fluid_act call rather than waiting for SSfluids to proc. - if(!defer_update) + if(!defer_update && target.reagents.total_volume >= FLUID_PUDDLE) target.fluid_act(target.reagents) // Objects may or may not have reagents; if they do, it's probably a beaker or something and we need to transfer properly; otherwise, just touch. From fc0408183e10d6e41ce6348a944399445e0d1353 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 4 Jan 2025 23:00:13 +1100 Subject: [PATCH 288/554] Dirt will no longer fall through open space. --- code/game/objects/effects/dirty_floor.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/objects/effects/dirty_floor.dm b/code/game/objects/effects/dirty_floor.dm index ae0c3c0cd9b..e67ac44b059 100644 --- a/code/game/objects/effects/dirty_floor.dm +++ b/code/game/objects/effects/dirty_floor.dm @@ -9,6 +9,12 @@ alpha = 0 var/dirt_amount = 0 +// 'the dirt falls through the x' is pretty silly, dirt is generated by people walking. +/obj/effect/decal/cleanable/dirt/begin_falling(lastloc, below) + SHOULD_CALL_PARENT(FALSE) + qdel(src) + return TRUE + /obj/effect/decal/cleanable/dirt/visible dirt_amount = 60 persistent = FALSE // This is a subtype for mapping. From b4d2fcdda3352cad56f4ab98717969f29dd4ef46 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 4 Jan 2025 23:04:03 +1100 Subject: [PATCH 289/554] Further tweaks to dripping logic. --- code/modules/mob/living/life.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index b229cb58972..fecb57bc769 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -273,10 +273,10 @@ if(!loc) return var/datum/reagents/touching_reagents = get_contact_reagents() - if(touching_reagents?.total_volume < 1) + if(touching_reagents?.total_volume <= FLUID_MINIMUM_TRANSFER) touching_reagents?.clear_reagents() return - var/drip_amount = max(1, round(touching_reagents.total_volume * 0.2)) + var/drip_amount = max(FLUID_MINIMUM_TRANSFER, round(touching_reagents.total_volume * 0.2)) if(drip_amount) touching_reagents.trans_to(loc, drip_amount) From 87d44df5f23fc64a7bd060eefd8585a60caf8419 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 4 Jan 2025 23:05:13 +1100 Subject: [PATCH 290/554] Corrects paper solvent check. --- code/modules/materials/_materials.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index b1d88770adf..dc42a7b4411 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -708,12 +708,12 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /decl/material/proc/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) // Acid melting, cleaner cleaning, etc - if(solvent_power >= MAT_SOLVENT_MILD) - if(istype(O, /obj/item/paper)) + if(solvent_power >= MAT_SOLVENT_MODERATE) + if(istype(O, /obj/item/paper) && amount >= FLUID_MINIMUM_TRANSFER) var/obj/item/paper/paperaffected = O paperaffected.clearpaper() O.visible_message(SPAN_NOTICE("The solution dissolves the ink on the paper."), range = 1) - else if(istype(O, /obj/item/book) && amount >= 5) + else if(istype(O, /obj/item/book) && amount >= FLUID_PUDDLE) var/obj/item/book/affectedbook = O if(affectedbook.can_dissolve_text) affectedbook.dat = null From 3ead82c4898ad1780d945d795375a934be952523 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 4 Jan 2025 23:16:22 +1100 Subject: [PATCH 291/554] Fixing tiny amounts of paint colouring turfs. --- code/game/objects/items/_item_reagents.dm | 5 +++-- .../crafting/pottery/pottery_structures.dm | 16 ++++++++-------- code/modules/mob/living/living.dm | 4 ++-- code/modules/reagents/chems/chems_pigments.dm | 10 +++++----- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/code/game/objects/items/_item_reagents.dm b/code/game/objects/items/_item_reagents.dm index 7f28940eb25..c38f8967496 100644 --- a/code/game/objects/items/_item_reagents.dm +++ b/code/game/objects/items/_item_reagents.dm @@ -64,12 +64,13 @@ return TRUE var/had_liquids = length(reagents.liquid_volumes) - var/trans = reagents.trans_to(target, amount) + var/had_units = target.reagents?.total_volume + reagents.trans_to(target, amount) if(had_liquids) playsound(src, 'sound/effects/pour.ogg', 25, 1) else // Sounds more like pouring small pellets or dust. playsound(src, 'sound/effects/refill.ogg', 25, 1) - to_chat(user, SPAN_NOTICE("You transfer [trans] unit\s of the solution to \the [target]. \The [src] now contains [src.reagents.total_volume] units.")) + to_chat(user, SPAN_NOTICE("You transfer [target.reagents?.total_volume - had_units] unit\s of the solution to \the [target]. \The [src] now contains [reagents.total_volume] unit\s.")) return TRUE diff --git a/code/modules/crafting/pottery/pottery_structures.dm b/code/modules/crafting/pottery/pottery_structures.dm index 34f021019fa..b83f27284cf 100644 --- a/code/modules/crafting/pottery/pottery_structures.dm +++ b/code/modules/crafting/pottery/pottery_structures.dm @@ -6,7 +6,7 @@ density = TRUE cap_last_fuel_burn = null - var/list/pottery = list() + var/list/pottery var/maximum_items = 3 var/firebox_open = TRUE @@ -17,12 +17,12 @@ /obj/structure/fire_source/kiln/high_temperature material = /decl/material/solid/stone/pottery -/obj/structure/fire_source/kiln/remove_atom(atom/movable/thing) +/obj/structure/fire_source/kiln/Exited(atom/movable/thing) . = ..() - pottery -= thing + LAZYREMOVE(pottery, thing) /obj/structure/fire_source/kiln/get_removable_atoms() - . = pottery?.Copy() + . = pottery?.Copy() || list() if(firebox_open) . |= ..() @@ -38,14 +38,14 @@ if(length(other)) LAZYDISTINCTADD(., other) -/obj/structure/fire_source/kiln/attackby(obj/item/W, mob/user) +/obj/structure/fire_source/kiln/attackby(obj/item/used_item, mob/user) if(firebox_open) return ..() if(length(pottery) >= maximum_items) to_chat(user, SPAN_WARNING("\The [src] is full, take something out first.")) - else if(user.try_unequip(W, src)) - user.visible_message("\The [user] slides \the [W] into \the [src].") - pottery += W + else if(user.try_unequip(used_item, src)) + user.visible_message("\The [user] slides \the [used_item] into \the [src].") + LAZYADD(pottery, used_item) return TRUE /obj/structure/fire_source/kiln/get_alt_interactions(var/mob/user) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 11dbe82ed4a..556fb9d1c8c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -857,10 +857,10 @@ default behaviour is: /mob/living/fluid_act(var/datum/reagents/fluids) ..() - if(QDELETED(src) || !fluids?.total_volume) + if(QDELETED(src) || fluids?.total_volume < FLUID_PUDDLE) return fluids.touch_mob(src) - if(QDELETED(src) || !fluids.total_volume) + if(QDELETED(src) || fluids?.total_volume < FLUID_PUDDLE) return for(var/atom/movable/A as anything in get_equipped_items(TRUE)) if(!A.simulated) diff --git a/code/modules/reagents/chems/chems_pigments.dm b/code/modules/reagents/chems/chems_pigments.dm index d110680a76e..c5fc4192862 100644 --- a/code/modules/reagents/chems/chems_pigments.dm +++ b/code/modules/reagents/chems/chems_pigments.dm @@ -107,20 +107,20 @@ uid = "chem_pigment_paint" exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/liquid/paint/proc/apply_paint(var/atom/painting, var/datum/reagents/holder) - if(istype(painting) && istype(holder)) +/decl/material/liquid/paint/proc/apply_paint(var/atom/painting, var/datum/reagents/holder, var/threshold = 1) + if(istype(painting) && istype(holder) && REAGENT_VOLUME(holder, type) >= threshold) var/keep_alpha = painting.alpha painting.set_color(holder.get_color()) painting.set_alpha(keep_alpha) /decl/material/liquid/paint/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) if(istype(T) && !isspaceturf(T)) - apply_paint(T, holder) + apply_paint(T, holder, FLUID_MINIMUM_TRANSFER) /decl/material/liquid/paint/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) if(istype(O)) - apply_paint(O, holder) + apply_paint(O, holder, O.get_object_size()) /decl/material/liquid/paint/touch_mob(var/mob/living/M, var/amount, var/datum/reagents/holder) if(istype(M)) - apply_paint(M, holder) \ No newline at end of file + apply_paint(M, holder, M.get_object_size()) From 4926f3dc7f6c56540d54933257032bc37c0464f9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 4 Jan 2025 23:43:35 +1100 Subject: [PATCH 292/554] Fix inability to use mortars. --- code/game/objects/structures/well.dm | 7 ---- code/game/turfs/turf.dm | 13 ------- .../interactions/interactions_reagents.dm | 10 ++++-- .../reagents/reagent_containers/_glass.dm | 36 ++++++++----------- 4 files changed, 22 insertions(+), 44 deletions(-) diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index 3da3c4eb2e7..ff2c2f75c53 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -57,13 +57,6 @@ if(!is_processing && auto_refill) START_PROCESSING(SSobj, src) -/obj/structure/reagent_dispensers/well/attackby(obj/item/W, mob/user) - . = ..() - if(!. && user.a_intent == I_HELP && reagents?.total_volume > FLUID_PUDDLE) - user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) - W.fluid_act(reagents) - return TRUE - /obj/structure/reagent_dispensers/well/Process() if(!reagents || !auto_refill) // if we're full, we only stop at the end of the proc; we need to check for contaminants first return PROCESS_KILL diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 8a11da3ca3a..ebbf35140a7 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -284,19 +284,6 @@ if(IS_COIL(W) && try_build_cable(W, user)) return TRUE - if(reagents?.total_volume >= FLUID_PUDDLE) - if(ATOM_IS_OPEN_CONTAINER(W) && W.reagents) - var/taking = min(reagents.total_volume, REAGENTS_FREE_SPACE(W.reagents)) - if(taking > 0) - to_chat(user, SPAN_NOTICE("You fill \the [W] with [reagents.get_primary_reagent_name()] from \the [src].")) - reagents.trans_to(W, taking) - return TRUE - - if(user.a_intent == I_HELP) - user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) - W.fluid_act(reagents) - return TRUE - return ..() /turf/Enter(atom/movable/mover, atom/forget) diff --git a/code/modules/interactions/interactions_reagents.dm b/code/modules/interactions/interactions_reagents.dm index c99ffad81ab..79885549cc4 100644 --- a/code/modules/interactions/interactions_reagents.dm +++ b/code/modules/interactions/interactions_reagents.dm @@ -3,11 +3,17 @@ interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC /decl/interaction_handler/dip_item/is_possible(atom/target, mob/user, obj/item/prop) - return ..() && target.reagents?.total_volume >= FLUID_PUDDLE && istype(prop) && target.can_be_poured_from(user, prop) + return ..() && target.reagents?.total_volume >= FLUID_MINIMUM_TRANSFER && istype(prop) && target.can_be_poured_from(user, prop) /decl/interaction_handler/dip_item/invoked(atom/target, mob/user, obj/item/prop) user.visible_message(SPAN_NOTICE("\The [user] dips \the [prop] into \the [target.reagents.get_primary_reagent_name()].")) - prop.fluid_act(target.reagents) + if(istype(prop, /obj/item/food) && isobj(target)) + var/obj/target_obj = target + var/transferring = min(target_obj.get_food_default_transfer_amount(user), REAGENTS_FREE_SPACE(prop.reagents)) + if(transferring) + target.reagents.trans_to_holder(prop.reagents, transferring) + if(target.reagents?.total_volume >= FLUID_MINIMUM_TRANSFER) + prop.fluid_act(target.reagents) return TRUE /decl/interaction_handler/fill_from diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index ddaa812b4df..ceecfec74aa 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -123,30 +123,22 @@ // Should we consider moving this down to /chems for any open container? Medicine from a bottle using a spoon, etc. /obj/item/chems/glass/attackby(obj/item/used_item, mob/living/user) - if(ATOM_IS_OPEN_CONTAINER(src)) - if(istype(used_item, /obj/item/food)) - if(!reagents?.total_volume) - to_chat(user, SPAN_WARNING("\The [src] is empty.")) - return TRUE - var/transferring = min(get_food_default_transfer_amount(user), REAGENTS_FREE_SPACE(used_item.reagents)) - if(!transferring) - to_chat(user, SPAN_WARNING("You cannot dip \the [used_item] in \the [src].")) - return TRUE - reagents.trans_to_holder(used_item.reagents, transferring) - user.visible_message(SPAN_NOTICE("\The [user] dunks \the [used_item] in \the [src].")) + if(!ATOM_IS_OPEN_CONTAINER(src)) + return ..() + + var/obj/item/utensil/utensil = used_item + if(istype(utensil) && (utensil.utensil_flags & UTENSIL_FLAG_SCOOP)) + if(utensil.loaded_food) + to_chat(user, SPAN_WARNING("You already have something on \the [utensil].")) return TRUE - var/obj/item/utensil/utensil = used_item - if(istype(utensil) && (utensil.utensil_flags & UTENSIL_FLAG_SCOOP)) - if(utensil.loaded_food) - to_chat(user, SPAN_WARNING("You already have something on \the [utensil].")) - return TRUE - if(!reagents?.total_volume) - to_chat(user, SPAN_WARNING("\The [src] is empty.")) - return TRUE - seperate_food_chunk(utensil, user) - if(utensil.loaded_food?.reagents?.total_volume) - to_chat(user, SPAN_NOTICE("You scoop up some of \the [utensil.loaded_food.reagents.get_primary_reagent_name()] with \the [utensil].")) + if(!reagents?.total_volume) + to_chat(user, SPAN_WARNING("\The [src] is empty.")) return TRUE + seperate_food_chunk(utensil, user) + if(utensil.loaded_food?.reagents?.total_volume) + to_chat(user, SPAN_NOTICE("You scoop up some of \the [utensil.loaded_food.reagents.get_primary_reagent_name()] with \the [utensil].")) + return TRUE + return ..() /obj/structure/glass/get_alt_interactions(mob/user) From cb776721aa4adbc288d318f7e638f6d36f47971e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 4 Jan 2025 23:55:22 +1100 Subject: [PATCH 293/554] Reboot will only be announced once. --- code/game/world.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/world.dm b/code/game/world.dm index 420c09757f5..f3d6538f5bf 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -129,11 +129,14 @@ var/global/world_topic_last = world.timeofday return command.try_use(T, addr, master, key) +var/global/_reboot_announced = FALSE /world/Reboot(var/reason) if(get_config_value(/decl/config/toggle/wait_for_sigusr1_reboot) && reason != 3) text2file("foo", "reboot_called") - to_world("World reboot waiting for external scripts. Please be patient.") + if(!global._reboot_announced) + to_world("World reboot waiting for external scripts. Please be patient.") + global._reboot_announced = TRUE global.Master.restart_timeout = 5 MINUTES return From d29df4d34fbe4a454f3f61bccc66c6369bb8439e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 01:27:53 +1100 Subject: [PATCH 294/554] Fixing several runtimes from Pyrelight testing. --- code/modules/admin/verbs/modifyvariables.dm | 1 + .../client/preference_setup/background/01_species.dm | 2 ++ code/modules/events/dust.dm | 6 +++++- code/modules/multiz/zmimic/mimic_movable.dm | 2 +- code/modules/random_map/random_map.dm | 2 +- 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 8605ad977a8..06c04257bab 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -318,6 +318,7 @@ variable = param_var_name + // TODO: check for list-typed O? Proc does not exist on non-datum types. var_value = O.get_variable_value(variable) if(autodetect_class) diff --git a/code/modules/client/preference_setup/background/01_species.dm b/code/modules/client/preference_setup/background/01_species.dm index 3f8e52d19e7..d8575db5f52 100644 --- a/code/modules/client/preference_setup/background/01_species.dm +++ b/code/modules/client/preference_setup/background/01_species.dm @@ -49,6 +49,8 @@ . += "
" for(var/s in get_playable_species()) var/decl/species/list_species = get_species_by_key(s) + if(!istype(list_species)) + continue // Runtime observed in a round where the playable species list was edited. if(pref.species == list_species.name) . += "[list_species.name] " else diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 736b18d1c97..b1c6d7c5981 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -14,13 +14,17 @@ The "dust" will damage the hull of the station causin minor hull breaches. command_announcement.Announce("The [location_name()] is now passing through a belt of space dust.", "[location_name()] Sensor Array", zlevels = affecting_z) /datum/event/dust/tick() - if(world.time > last_wave + min_delay && prob(10)) + if(world.time > last_wave + min_delay && prob(10) && length(affecting_z)) dust_swarm(severity, affecting_z) /datum/event/dust/end() command_announcement.Announce("The [location_name()] has now passed through the belt of space dust.", "[location_name()] Sensor Array", zlevels = affecting_z) /proc/dust_swarm(var/strength = EVENT_LEVEL_MUNDANE, var/list/zlevels) + + if(!length(zlevels)) + return // Not sure how this happened, but saw it in a runtime on Pyrelight. + var/numbers = rand(strength * 10, strength * 15) var/start_dir = pick(global.cardinal) diff --git a/code/modules/multiz/zmimic/mimic_movable.dm b/code/modules/multiz/zmimic/mimic_movable.dm index 32f5f80e691..04644bcdde7 100644 --- a/code/modules/multiz/zmimic/mimic_movable.dm +++ b/code/modules/multiz/zmimic/mimic_movable.dm @@ -166,7 +166,7 @@ if (destruction_timer) deltimer(destruction_timer) destruction_timer = null - if (old_loc.z != loc.z) + if (old_loc?.z != loc?.z) // Null checking in case of qdel(), observed with dirt effect falling through multiz. reset_internal_layering() else if (!destruction_timer) destruction_timer = ZM_DESTRUCTION_TIMER(src) diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm index f6e13113077..a9331ed9097 100644 --- a/code/modules/random_map/random_map.dm +++ b/code/modules/random_map/random_map.dm @@ -167,7 +167,7 @@ var/global/list/map_count = list() /datum/random_map/proc/apply_to_turf(var/x,var/y) var/current_cell = TRANSLATE_COORD(x,y) - if(!current_cell) + if(!current_cell || current_cell > length(map)) return 0 var/turf/T = locate((origin_x-1)+x,(origin_y-1)+y,origin_z) if(!T || (target_turf_type && !istype(T,target_turf_type))) From 4a4fa065813bdb09c14cf1fc06c7fa509c7702b8 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 10:26:38 +1100 Subject: [PATCH 295/554] Fixes issues with pry_door() parameters. --- code/datums/ai/aggressive.dm | 2 +- code/modules/mob/living/living.dm | 2 +- .../modules/mob/living/simple_animal/_simple_animal.dm | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/datums/ai/aggressive.dm b/code/datums/ai/aggressive.dm index 84296f856bf..cb90d87d4f6 100644 --- a/code/datums/ai/aggressive.dm +++ b/code/datums/ai/aggressive.dm @@ -180,7 +180,7 @@ if(!obstacle.can_open(1)) return body.face_atom(obstacle) - body.pry_door(obstacle, (obstacle.pry_mod * body.get_door_pry_time())) + body.pry_door((obstacle.pry_mod * body.get_door_pry_time()), obstacle) return /datum/mob_controller/aggressive/retaliate(atom/source) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 556fb9d1c8c..216f52acd3d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1798,7 +1798,7 @@ default behaviour is: /mob/living/proc/get_door_pry_time() return 7 SECONDS -/mob/living/proc/pry_door(atom/target, pry_time) +/mob/living/proc/pry_door(delay, obj/machinery/door/target) return /mob/living/proc/turf_is_safe(turf/target) diff --git a/code/modules/mob/living/simple_animal/_simple_animal.dm b/code/modules/mob/living/simple_animal/_simple_animal.dm index 699bc575285..f0915f7398b 100644 --- a/code/modules/mob/living/simple_animal/_simple_animal.dm +++ b/code/modules/mob/living/simple_animal/_simple_animal.dm @@ -527,16 +527,16 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/proc/get_pry_desc() return "prying" -/mob/living/simple_animal/pry_door(var/mob/user, var/delay, var/obj/machinery/door/pesky_door) +/mob/living/simple_animal/pry_door(delay, obj/machinery/door/target) if(!can_pry_door()) return - visible_message(SPAN_DANGER("\The [user] begins [get_pry_desc()] at \the [pesky_door]!")) + visible_message(SPAN_DANGER("\The [src] begins [get_pry_desc()] at \the [target]!")) if(istype(ai)) ai.pause() - if(do_after(user, delay, pesky_door)) - pesky_door.open(1) + if(do_after(src, delay, target)) + target.open(1) else - visible_message(SPAN_NOTICE("\The [user] is interrupted.")) + visible_message(SPAN_NOTICE("\The [src] is interrupted.")) if(istype(ai)) ai.resume() From 07faf75f068bdd57a57204bb086d979bae3352a8 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 10:29:34 +1100 Subject: [PATCH 296/554] Fixes some null holder issues with rig modules. --- .../clothing/spacesuits/rig/modules/combat.dm | 2 +- .../clothing/spacesuits/rig/modules/utility.dm | 14 ++++++++------ .../clothing/spacesuits/rig/modules/vision.dm | 10 ++++++++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index a06b83ab8f6..f1a499d0f3b 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -48,7 +48,7 @@ /obj/item/rig_module/device/flash/installed() . = ..() - if(!holder.gloves)//gives select option for gloveless suits, why even use rig at this point + if(!holder?.gloves)//gives select option for gloveless suits, why even use rig at this point selectable = 1 activates_on_touch = 0 toggleable = 0 diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index b3d1533d3b6..c3aaa393ee4 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -313,14 +313,16 @@ voice_holder.active = 0 /obj/item/rig_module/voice/installed() - ..() - holder.speech = src - holder.verbs |= /obj/item/rig/proc/alter_voice + . = ..() + if(holder) + holder.speech = src + holder.verbs |= /obj/item/rig/proc/alter_voice /obj/item/rig_module/voice/removed() - ..() - holder.speech = null - holder.verbs -= /obj/item/rig/proc/alter_voice + if(holder) + holder.speech = null + holder.verbs -= /obj/item/rig/proc/alter_voice + . = ..() /obj/item/rig_module/voice/engage() diff --git a/code/modules/clothing/spacesuits/rig/modules/vision.dm b/code/modules/clothing/spacesuits/rig/modules/vision.dm index 3b19bf49653..9ba365b34fa 100644 --- a/code/modules/clothing/spacesuits/rig/modules/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/vision.dm @@ -160,8 +160,14 @@ // There should only ever be one vision module installed in a suit. /obj/item/rig_module/vision/installed() - ..() - holder.visor = src + . = ..() + if(holder) + holder.visor = src + +/obj/item/rig_module/vision/removed() + if(holder) + holder.visor = null + . = ..() /obj/item/rig_module/vision/engage() From bc91fcc8e5f616ca79d87c62b6321fa1efba4d42 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 10:31:47 +1100 Subject: [PATCH 297/554] Fixing runtime in slapcrafting with stacks. --- code/modules/crafting/slapcrafting/_crafting_stage.dm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/modules/crafting/slapcrafting/_crafting_stage.dm b/code/modules/crafting/slapcrafting/_crafting_stage.dm index b72c4d4cb8e..a8474a04dd7 100644 --- a/code/modules/crafting/slapcrafting/_crafting_stage.dm +++ b/code/modules/crafting/slapcrafting/_crafting_stage.dm @@ -76,17 +76,18 @@ . = !consume_completion_trigger || user.try_unequip(thing, target) if(. && stack_consume_amount > 0) var/obj/item/stack/stack = thing - if(!istype(stack) || stack.amount < stack_consume_amount) + if(!istype(stack) || stack.get_amount() < stack_consume_amount) on_insufficient_material(user, stack) return FALSE var/obj/item/stack/used_stack - if(stack.amount == stack_consume_amount) + if(stack.amount > stack_consume_amount) + used_stack = stack.split(stack_consume_amount) + else if(!user.try_unequip(thing, target)) return FALSE used_stack = stack - else - used_stack = stack.split(stack_consume_amount) - used_stack.forceMove(target) + if(used_stack) + used_stack.forceMove(target) target?.update_icon() /decl/crafting_stage/proc/on_insufficient_material(var/mob/user, var/obj/item/stack/thing) From 45643425ec581bce7358161faf77678be574066f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 10:33:50 +1100 Subject: [PATCH 298/554] Fixing missing lazylist macro in overlay add. --- code/controllers/subsystems/overlays.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystems/overlays.dm b/code/controllers/subsystems/overlays.dm index 42e919ae980..88650811392 100644 --- a/code/controllers/subsystems/overlays.dm +++ b/code/controllers/subsystems/overlays.dm @@ -209,7 +209,7 @@ SUBSYSTEM_DEF(overlays) if(cut_old) our_overlays = cached_other.Copy() else - our_overlays |= cached_other + LAZYDISTINCTADD(our_overlays, cached_other) if(NOT_QUEUED_ALREADY) QUEUE_FOR_COMPILE else if(cut_old) From 45d3eba9bb87781bcc7ba75d1e3205c05ee7e9da Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 10:41:21 +1100 Subject: [PATCH 299/554] Correcting typing on glass alt interaction override. --- code/modules/reagents/reagent_containers/_glass.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index ceecfec74aa..3defa7b8e00 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -141,7 +141,7 @@ return ..() -/obj/structure/glass/get_alt_interactions(mob/user) +/obj/item/chems/glass/get_alt_interactions(mob/user) . = ..() if(reagents?.total_volume >= FLUID_PUDDLE) LAZYADD(., /decl/interaction_handler/dip_item) From 767934966009a76523c111d9bf94e40b2eed7ba3 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 12:41:25 +1100 Subject: [PATCH 300/554] Vomit and mud can now be tracked around the floor. --- code/_helpers/global_lists.dm | 11 +++- .../effects/decals/Cleanable/humans.dm | 26 +++------ .../objects/effects/decals/Cleanable/misc.dm | 13 ++++- code/game/objects/items/__item.dm | 45 ++++++++-------- code/game/objects/items/_item_materials.dm | 4 +- .../objects/items/weapons/swords_axes_etc.dm | 4 +- code/game/turfs/flooring/_flooring.dm | 6 +++ code/game/turfs/flooring/flooring_mud.dm | 9 ++++ code/game/turfs/floors/_floor.dm | 8 +++ code/game/turfs/turf.dm | 3 ++ code/modules/detectivework/tools/uvlight.dm | 7 +-- code/modules/mob/living/human/human.dm | 34 ------------ code/modules/mob/living/life.dm | 5 +- code/modules/mob/living/living.dm | 54 +++++++++++++++++-- maps/away/mining/mining-signal.dmm | 4 +- maps/away/smugglers/smugglers.dmm | 2 +- maps/away/unishi/unishi-2.dmm | 4 +- .../crashed_pod/crashed_pod.dmm | 2 +- .../deserted_lab/deserted_lab.dmm | 2 +- .../exoplanet_ruins/playablecolony/colony.dmm | 2 +- .../spider_nest/spider_nest.dmm | 4 +- maps/tradeship/tradeship-1.dmm | 2 +- 22 files changed, 150 insertions(+), 101 deletions(-) diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 84463762e67..7b98b5f58af 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -107,4 +107,13 @@ var/global/list/bodytype_species_pairs = list() // A list of bodytypes -> specie . = global.playable_species /proc/get_bodytype_species_pairs() build_species_lists() - . = global.bodytype_species_pairs \ No newline at end of file + . = global.bodytype_species_pairs + +// Used to avoid constantly generating new lists during movement. +var/global/list/all_stance_limbs = list( + ORGAN_CATEGORY_STANCE, + ORGAN_CATEGORY_STANCE_ROOT +) +var/global/list/child_stance_limbs = list( + ORGAN_CATEGORY_STANCE +) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 3cc2dd4bf5e..cbd3f166ddb 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -91,26 +91,12 @@ /obj/effect/decal/cleanable/blood/Crossed(atom/movable/AM) if(!isliving(AM) || amount < 1) return - - var/mob/living/M = AM - var/obj/item/organ/external/l_foot = GET_EXTERNAL_ORGAN(M, BP_L_FOOT) - var/obj/item/organ/external/r_foot = GET_EXTERNAL_ORGAN(M, BP_R_FOOT) - var/hasfeet = l_foot && r_foot - - var/transferred_data = blood_data ? blood_data[pick(blood_data)] : null - var/obj/item/clothing/shoes/shoes = M.get_equipped_item(slot_shoes_str) - if(istype(shoes) && !M.buckled)//Adding blood to shoes - shoes.add_coating(chemical, amount, transferred_data) - else if (hasfeet)//Or feet - if(l_foot) - l_foot.add_coating(chemical, amount, transferred_data) - if(r_foot) - r_foot.add_coating(chemical, amount, transferred_data) - else if (M.buckled && istype(M.buckled, /obj/structure/bed/chair/wheelchair)) - var/obj/structure/bed/chair/wheelchair/W = M.buckled - W.bloodiness = 4 - - M.update_equipment_overlay(slot_shoes_str) + var/mob/living/walker = AM + if(istype(walker.buckled, /obj/structure/bed/chair/wheelchair)) + var/obj/structure/bed/chair/wheelchair/wheelchair = walker.buckled + wheelchair.bloodiness = 4 + else + walker.add_walking_contaminant(chemical, amount, (blood_data ? blood_data[pick(blood_data)] : null)) amount-- /obj/effect/decal/cleanable/blood/proc/dry() diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 2a22a171886..6fe6ea7441a 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -90,9 +90,20 @@ if(prob(75)) set_rotation(pick(90, 180, 270)) +/obj/effect/decal/cleanable/vomit/mapped/Initialize(ml, _age) + . = ..() + add_to_reagents(/decl/material/liquid/acid/stomach, rand(3,5)) + add_to_reagents(/decl/material/liquid/nutriment, rand(5,8)) + /obj/effect/decal/cleanable/vomit/on_update_icon() . = ..() - color = reagents.get_color() + color = reagents?.get_color() + +/obj/effect/decal/cleanable/vomit/Crossed(atom/movable/AM) + . = ..() + if(!QDELETED(src) && reagents?.total_volume >= 1 && isliving(AM)) + var/mob/living/walker = AM + walker.add_walking_contaminant(reagents, rand(2, 3)) /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index b02237a6b2f..20c732782fa 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -12,7 +12,8 @@ /// Set to false to skip state checking and never draw an icon on the mob (except when held) var/draw_on_mob_when_equipped = TRUE - var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite + /// this saves our blood splatter/coating overlay, which will be processed not to go over the edges of the sprite. + var/image/coating_overlay var/randpixel = 6 var/material_health_multiplier = 0.2 var/hitsound @@ -245,7 +246,7 @@ /obj/item/PopulateClone(obj/item/clone) clone = ..() clone.contaminated = contaminated - clone.blood_overlay = image(blood_overlay) + clone.coating_overlay = image(coating_overlay) clone.current_health = current_health //#TODO: once item damage in, check health! @@ -790,7 +791,7 @@ if(was_bloodied && !fluorescent) fluorescent = FLUORESCENT_GLOWS blood_color = COLOR_LUMINOL - blood_overlay.color = COLOR_LUMINOL + coating_overlay.color = COLOR_LUMINOL update_icon() /obj/item/add_blood(mob/living/M, amount = 2, list/blood_data) @@ -814,21 +815,21 @@ LAZYSET(blood_DNA, unique_enzymes, blood_type) return TRUE -var/global/list/_blood_overlay_cache = list() -var/global/icon/_item_blood_mask = icon('icons/effects/blood.dmi', "itemblood") -/obj/item/proc/generate_blood_overlay(force = FALSE) - if(blood_overlay && !force) +var/global/list/_coating_overlay_cache = list() +var/global/icon/_item_coating_mask = icon('icons/effects/blood.dmi', "itemblood") +/obj/item/proc/generate_coating_overlay(force = FALSE) + if(coating_overlay && !force) return var/cache_key = "[icon]-[icon_state]" - if(global._blood_overlay_cache[cache_key]) - blood_overlay = global._blood_overlay_cache[cache_key] + if(global._coating_overlay_cache[cache_key]) + coating_overlay = global._coating_overlay_cache[cache_key] return var/icon/I = new /icon(icon, icon_state) I.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) // Sets the icon RGB channel to pure white. - I.Blend(global._item_blood_mask, ICON_MULTIPLY) // Masks the blood overlay against the generated mask. - blood_overlay = image(I) - blood_overlay.appearance_flags |= NO_CLIENT_COLOR|RESET_COLOR - global._blood_overlay_cache[cache_key] = blood_overlay + I.Blend(global._item_coating_mask, ICON_MULTIPLY) // Masks the coating overlay against the generated mask. + coating_overlay = image(I) + coating_overlay.appearance_flags |= NO_CLIENT_COLOR|RESET_COLOR + global._coating_overlay_cache[cache_key] = coating_overlay /obj/item/proc/showoff(mob/user) for(var/mob/M in view(user)) @@ -1018,13 +1019,15 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. /obj/item/proc/add_coating(reagent_type, amount, data) if(!coating) - coating = new/datum/reagents(10, src) - coating.add_reagent(reagent_type, amount, data) - - if(!blood_overlay) - generate_blood_overlay() - blood_overlay.color = coating.get_color() - + coating = new /datum/reagents(10, src) + if(ispath(reagent_type)) + coating.add_reagent(reagent_type, amount, data) + else if(istype(reagent_type, /datum/reagents)) + var/datum/reagents/source = reagent_type + source.trans_to_holder(coating, amount) + if(!coating_overlay) + generate_coating_overlay() + coating_overlay.color = coating.get_color() update_icon() /obj/item/proc/remove_coating(amount) @@ -1037,7 +1040,7 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. /obj/item/clean(clean_forensics=TRUE) . = ..() QDEL_NULL(coating) - blood_overlay = null + coating_overlay = null if(clean_forensics) var/datum/extension/forensic_evidence/forensics = get_extension(src, /datum/extension/forensic_evidence) if(forensics) diff --git a/code/game/objects/items/_item_materials.dm b/code/game/objects/items/_item_materials.dm index 261a8c5f5d0..ecf48b7029e 100644 --- a/code/game/objects/items/_item_materials.dm +++ b/code/game/objects/items/_item_materials.dm @@ -5,8 +5,8 @@ if((material_alteration & MAT_FLAG_ALTERATION_COLOR) && material) alpha = 100 + material.opacity * 255 color = get_color() // avoiding set_color() here as that will set it on paint_color - if(blood_overlay) - add_overlay(blood_overlay) + if(coating_overlay) + add_overlay(coating_overlay) if(global.contamination_overlay && contaminated) add_overlay(global.contamination_overlay) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 124bfb02526..25ecca6f856 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -66,8 +66,8 @@ update_held_icon() /obj/item/telebaton/on_update_icon() - if(length(blood_DNA)) - generate_blood_overlay(TRUE) // Force recheck. + if(coating?.total_volume || blood_DNA) + generate_coating_overlay(TRUE) // Force recheck. . = ..() if(on) icon = 'icons/obj/items/weapon/telebaton_extended.dmi' diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index a02efe3cb84..8150d0abd34 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -350,3 +350,9 @@ var/global/list/flooring_cache = list() /decl/flooring/proc/handle_turf_digging(turf/floor/target) return TRUE + +/decl/flooring/proc/turf_crossed(atom/movable/crosser) + return + +/decl/flooring/proc/can_show_footsteps(turf/target) + return TRUE diff --git a/code/game/turfs/flooring/flooring_mud.dm b/code/game/turfs/flooring/flooring_mud.dm index fd4866144b9..2b5fa2c5063 100644 --- a/code/game/turfs/flooring/flooring_mud.dm +++ b/code/game/turfs/flooring/flooring_mud.dm @@ -19,6 +19,15 @@ return return ..() +/decl/flooring/mud/turf_crossed(atom/movable/crosser) + if(!isliving(crosser)) + return + var/mob/living/walker = crosser + walker.add_walking_contaminant(/decl/material/solid/soil, rand(2,3)) + +/decl/flooring/mud/can_show_footsteps(turf/target) + return FALSE // So we don't end up covered in a million footsteps that we provided. + /decl/flooring/dry_mud name = "dry mud" desc = "This was once mud, but forgot to keep hydrated." diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index 8a5562d03ad..e8ede4d119e 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -297,3 +297,11 @@ /turf/floor/get_plant_growth_rate() var/decl/flooring/flooring = get_topmost_flooring() return flooring ? flooring.growth_value : ..() + +/turf/floor/Crossed(atom/movable/AM) + var/decl/flooring/flooring = get_topmost_flooring() + flooring?.turf_crossed(AM) + return ..() + +/turf/floor/can_show_footsteps() + return ..() && get_topmost_flooring()?.can_show_footsteps(src) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index bdd356e5322..cf4d6f67920 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -822,6 +822,9 @@ if(IS_HOE(held) && can_dig_farm(held.material?.hardness)) LAZYDISTINCTADD(., /decl/interaction_handler/dig/farm) +/turf/proc/can_show_footsteps() + return simulated + /decl/interaction_handler/show_turf_contents name = "Show Turf Contents" expected_user_type = /mob diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm index 1b5c3a86b71..90152aa387f 100644 --- a/code/modules/detectivework/tools/uvlight.dm +++ b/code/modules/detectivework/tools/uvlight.dm @@ -47,6 +47,7 @@ add_overlay(emissive_overlay(icon, "[icon_state]-on")) z_flags |= ZMM_MANGLE_PLANES +// TODO: does this even work with SSoverlays? /obj/item/uv_light/proc/clear_last_scan() if(scanned.len) for(var/atom/O in scanned) @@ -62,7 +63,7 @@ stored_alpha.Cut() if(reset_objects.len) for(var/obj/item/I in reset_objects) - I.overlays -= I.blood_overlay + I.overlays -= I.coating_overlay if(I.fluorescent == FLUORESCENT_GLOWING) I.fluorescent = FLUORESCENT_GLOWS reset_objects.Cut() @@ -86,6 +87,6 @@ A.alpha = use_alpha if(istype(A, /obj/item)) var/obj/item/O = A - if(O.was_bloodied && !(O.blood_overlay in O.overlays)) - O.overlays |= O.blood_overlay + if(O.was_bloodied && !(O.coating_overlay in O.overlays)) + O.overlays |= O.coating_overlay reset_objects |= O \ No newline at end of file diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 884babdc916..38e6f1d6c10 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -1071,40 +1071,6 @@ var/datum/appearance_descriptor/age = LAZYACCESS(bodytype.appearance_descriptors, "age") LAZYSET(appearance_descriptors, "age", (age ? age.sanitize_value(val) : 30)) -/mob/living/human/HandleBloodTrail(turf/T, old_loc) - // Tracking blood - var/obj/item/source - var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) - if(istype(shoes)) - shoes.handle_movement(src, MOVING_QUICKLY(src)) - if(shoes.coating && shoes.coating.total_volume > 1) - source = shoes - else - for(var/foot_tag in list(BP_L_FOOT, BP_R_FOOT)) - var/obj/item/organ/external/stomper = GET_EXTERNAL_ORGAN(src, foot_tag) - if(stomper && stomper.coating && stomper.coating.total_volume > 1) - source = stomper - if(!source) - species.handle_trail(src, T, old_loc) - return - - var/list/bloodDNA - var/bloodcolor - var/list/blood_data = REAGENT_DATA(source.coating, /decl/material/liquid/blood) - if(blood_data) - bloodDNA = list(blood_data[DATA_BLOOD_DNA] = blood_data[DATA_BLOOD_TYPE]) - else - bloodDNA = list() - bloodcolor = source.coating.get_color() - source.remove_coating(1) - update_equipment_overlay(slot_shoes_str) - - if(species.get_move_trail(src)) - T.AddTracks(species.get_move_trail(src),bloodDNA, dir, 0, bloodcolor) // Coming - if(isturf(old_loc)) - var/turf/old_turf = old_loc - old_turf.AddTracks(species.get_move_trail(src), bloodDNA, 0, dir, bloodcolor) // Going - /mob/living/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) if((. = ..()) && !surgical_removal) shock_stage += 20 diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index fd868a66a6c..446bbe39a05 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -585,8 +585,7 @@ if(!root_bodytype) return - var/static/list/all_stance_limbs = list(ORGAN_CATEGORY_STANCE, ORGAN_CATEGORY_STANCE_ROOT) - var/expected_limbs_for_bodytype = root_bodytype.get_expected_organ_count_for_categories(all_stance_limbs) + var/expected_limbs_for_bodytype = root_bodytype.get_expected_organ_count_for_categories(global.all_stance_limbs) if(expected_limbs_for_bodytype <= 0) return // we don't care about stance for whatever reason. @@ -598,7 +597,7 @@ var/found_limbs = 0 var/had_limb_pain = FALSE - for(var/obj/item/organ/external/limb in get_organs_by_categories(all_stance_limbs)) + for(var/obj/item/organ/external/limb in get_organs_by_categories(global.all_stance_limbs)) found_limbs++ var/add_stance_damage = 0 if(limb.is_malfunctioning()) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fbb42a1db1a..7685c69fda5 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1552,7 +1552,7 @@ default behaviour is: /mob/living/OnSimulatedTurfEntered(turf/T, old_loc) T.add_dirt(0.5) - HandleBloodTrail(T, old_loc) + handle_walking_tracks(T, old_loc) if(current_posture.prone) return @@ -1583,8 +1583,46 @@ default behaviour is: step(src, dir) sleep(1) -/mob/living/proc/HandleBloodTrail(turf/T, old_loc) - return +/mob/living/proc/handle_walking_tracks(turf/T, old_loc) + + if(!T.can_show_footsteps()) + return + + // Tracking blood or other contaminants + var/obj/item/source + var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) + if(istype(shoes)) + shoes.handle_movement(src, MOVING_QUICKLY(src)) + if(shoes.coating && shoes.coating.total_volume > 1) + source = shoes + else + for(var/obj/item/organ/external/stomper in get_organs_by_categories(global.child_stance_limbs)) + if(stomper.coating?.total_volume > 1) + source = stomper + break + + var/decl/species/my_species = get_species() + if(!source) + my_species?.handle_trail(src, T, old_loc) + return + + var/list/bloodDNA + var/bloodcolor + var/list/blood_data = REAGENT_DATA(source.coating, /decl/material/liquid/blood) + if(blood_data) + bloodDNA = list(blood_data[DATA_BLOOD_DNA] = blood_data[DATA_BLOOD_TYPE]) + else + bloodDNA = list() + bloodcolor = source.coating.get_color() + source.remove_coating(1) + update_equipment_overlay(slot_shoes_str) + + var/use_move_trail = my_species?.get_move_trail(src) + if(use_move_trail) + T.AddTracks(use_move_trail, bloodDNA, dir, 0, bloodcolor) // Coming + if(isturf(old_loc)) + var/turf/old_turf = old_loc + old_turf.AddTracks(use_move_trail, bloodDNA, 0, dir, bloodcolor) // Going /mob/living/proc/handle_general_grooming(user, obj/item/grooming/tool) if(tool.grooming_flags & (GROOMABLE_BRUSH|GROOMABLE_COMB)) @@ -1944,3 +1982,13 @@ default behaviour is: /mob/living/proc/get_age() . = LAZYACCESS(appearance_descriptors, "age") || 30 + +/mob/living/proc/add_walking_contaminant(material_type, amount, data) + var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) + if(istype(shoes)) + if(!buckled) + shoes.add_coating(material_type, amount, data) + else + for(var/obj/item/organ/external/limb in get_organs_by_categories(global.child_stance_limbs)) + limb.add_coating(material_type, amount, data) + update_equipment_overlay(slot_shoes_str) diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 68863f23666..867c49b5614 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -1561,7 +1561,7 @@ /area/outpost/abandoned) "fs" = ( /obj/effect/decal/cleanable/dirt/visible, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /turf/floor/tiled/airless, /area/outpost/abandoned) "ft" = ( @@ -2428,7 +2428,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 4 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/dirt/visible, diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index 911447bf612..1881db19743 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -854,7 +854,7 @@ /turf/floor, /area/smugglers/dorms) "cp" = ( -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/random/medical/lite, /turf/floor/plating/airless, /area/smugglers/dorms) diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index 19aad746cee..f31f2097fe4 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -2283,7 +2283,7 @@ /turf/space, /area/unishi/smresearch) "go" = ( -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/item/defibrillator, /turf/floor/tiled/techfloor, /area/unishi/smresearch) @@ -2397,7 +2397,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index b944f249800..c7ef24bae56 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -119,7 +119,7 @@ "ap" = ( /obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/dirt/visible, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/effect/decal/cleanable/filth, /obj/structure/curtain/open/shower/engineering, /obj/structure/hygiene/toilet{ diff --git a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm index f88a3a7043a..1552d243610 100644 --- a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm +++ b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm @@ -184,7 +184,7 @@ /turf/floor/tiled/white, /area/template_noop) "aM" = ( -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/item/chems/glass/paint/random, /obj/structure/closet/medical_wall/filled{ pixel_y = 32 diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 6d33bc94adb..c210e95884c 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -4708,7 +4708,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /turf/floor/tiled/white/monotile, /area/map_template/colony/bathroom) "jl" = ( diff --git a/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm b/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm index dd4f13ac109..c3c28c3bdc9 100644 --- a/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm +++ b/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm @@ -83,7 +83,7 @@ /obj/effect/decal/cleanable/blood, /obj/item/shard, /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /turf/floor/tiled/techfloor, /area/template_noop) "q" = ( @@ -242,7 +242,7 @@ /obj/effect/spider/stickyweb, /obj/random/voidsuit, /obj/random/loot, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/structure/extinguisher_cabinet{ pixel_x = -29; dir = 4 diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index 8c98a303b76..8a068ace688 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -3161,7 +3161,7 @@ dir = 1; pixel_y = -21 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/structure/hygiene/toilet{ dir = 1 }, From c6e84ff2097d15e9421ad4c4fd54b06bf686ed02 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 13:33:24 +1100 Subject: [PATCH 301/554] Put a cap on the amount of damage you can take from hail. --- code/modules/weather/weather_fsm_states.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/weather/weather_fsm_states.dm b/code/modules/weather/weather_fsm_states.dm index ca38c75279a..f82767798fa 100644 --- a/code/modules/weather/weather_fsm_states.dm +++ b/code/modules/weather/weather_fsm_states.dm @@ -201,7 +201,8 @@ /decl/state/weather/rain/hail/handle_exposure_effects(var/mob/living/M, var/obj/abstract/weather_system/weather) to_chat(M, SPAN_DANGER("You are pelted by a shower of hail!")) - M.take_damage(rand(1, 3)) + if(M.getBruteLoss() < 20) // Put a cap on it to make it annoying but not lethal. + M.take_damage(rand(1, 3)) /decl/state/weather/ash name = "Ash" From 40b4aaa72930cea6b4d128e6d3de3e107bb4dd16 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 14:45:44 +1100 Subject: [PATCH 302/554] Notes towards ambient light fixes. --- code/modules/lighting/lighting_corner.dm | 1 + code/modules/lighting/lighting_turf.dm | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 687dcc2a49d..b1e8d111ed7 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -237,6 +237,7 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, update_overlays(TRUE) /datum/lighting_corner/proc/update_ambient_lumcount(delta_r, delta_g, delta_b, skip_update = FALSE) + ambient_r += delta_r ambient_g += delta_g ambient_b += delta_b diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index de8134d5e51..0f788ec5a2b 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -43,9 +43,9 @@ var/ambient_b = 0 if (ambient_light) - ambient_r = ((HEX_RED(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_r - ambient_g = ((HEX_GREEN(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_g - ambient_b = ((HEX_BLUE(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_b + ambient_r = round(((HEX_RED(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_r, LIGHTING_ROUND_VALUE) + ambient_g = round(((HEX_GREEN(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_g, LIGHTING_ROUND_VALUE) + ambient_b = round(((HEX_BLUE(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_b, LIGHTING_ROUND_VALUE) else ambient_r = -ambient_light_old_r ambient_g = -ambient_light_old_g @@ -55,7 +55,7 @@ ambient_light_old_g += ambient_g ambient_light_old_b += ambient_b - if (ambient_r + ambient_g + ambient_b == 0) + if (abs(ambient_r + ambient_g + ambient_b) == 0) return // Unlit turfs will have corners if they have a lit neighbor -- don't generate corners for them, but do update them if they're there. From b125df27b4965b072b5ced210e3c6ef69a7a8e12 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 23:20:48 +1100 Subject: [PATCH 303/554] Fixes return value of trans_to_turf(). --- code/game/objects/items/_item_reagents.dm | 5 ++--- code/modules/reagents/Chemistry-Holder.dm | 14 +++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/code/game/objects/items/_item_reagents.dm b/code/game/objects/items/_item_reagents.dm index c38f8967496..c9237fe4859 100644 --- a/code/game/objects/items/_item_reagents.dm +++ b/code/game/objects/items/_item_reagents.dm @@ -64,13 +64,12 @@ return TRUE var/had_liquids = length(reagents.liquid_volumes) - var/had_units = target.reagents?.total_volume - reagents.trans_to(target, amount) + var/transferred_amount = reagents.trans_to(target, amount) if(had_liquids) playsound(src, 'sound/effects/pour.ogg', 25, 1) else // Sounds more like pouring small pellets or dust. playsound(src, 'sound/effects/refill.ogg', 25, 1) - to_chat(user, SPAN_NOTICE("You transfer [target.reagents?.total_volume - had_units] unit\s of the solution to \the [target]. \The [src] now contains [reagents.total_volume] unit\s.")) + to_chat(user, SPAN_NOTICE("You transfer [transferred_amount] unit\s of the solution to \the [target]. \The [src] now contains [reagents.total_volume] unit\s.")) return TRUE diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 17939c21f28..ac0d58447be 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -549,11 +549,11 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new /datum/reagents/proc/trans_to_holder(var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/safety = 0, var/defer_update = FALSE, var/list/skip_reagents, var/transferred_phases = (MAT_PHASE_LIQUID | MAT_PHASE_SOLID)) if(!target || !istype(target)) - return + return 0 amount = max(0, min(amount, total_volume, REAGENTS_FREE_SPACE(target) / multiplier)) if(!amount) - return + return 0 var/part = amount if(skip_reagents) @@ -561,7 +561,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new for(var/rtype in skip_reagents) using_volume -= LAZYACCESS(reagent_volumes, rtype) if(using_volume <= 0) - return + return 0 part /= using_volume else var/using_volume = total_volume @@ -872,13 +872,13 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new /datum/reagents/proc/trans_to_turf(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/defer_update = FALSE, var/transferred_phases = (MAT_PHASE_LIQUID | MAT_PHASE_SOLID)) if(!target?.simulated) - return + return 0 // If we're only dumping solids, and there's not enough liquid present on the turf to make a slurry, we dump the solids directly. // This avoids creating an unnecessary reagent holder that won't be immediately deleted. if((!(transferred_phases & MAT_PHASE_LIQUID) || !total_liquid_volume) && (target.reagents?.total_liquid_volume < FLUID_SLURRY)) var/datum/reagents/R = new /datum/reagents(amount, global.temp_reagents_holder) - trans_to_holder(R, amount, multiplier, copy, TRUE, defer_update = defer_update, transferred_phases = MAT_PHASE_SOLID) + . = trans_to_holder(R, amount, multiplier, copy, TRUE, defer_update = defer_update, transferred_phases = MAT_PHASE_SOLID) R.touch_turf(target) target.dump_solid_reagents(R) qdel(R) @@ -887,7 +887,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new if(!target.reagents) target.create_reagents(FLUID_MAX_DEPTH) - trans_to_holder(target.reagents, amount, multiplier, copy, defer_update = defer_update, transferred_phases = transferred_phases) + . = trans_to_holder(target.reagents, amount, multiplier, copy, defer_update = defer_update, transferred_phases = transferred_phases) // Deferred updates are presumably being done by SSfluids. // Do an immediate fluid_act call rather than waiting for SSfluids to proc. if(!defer_update && target.reagents.total_volume >= FLUID_PUDDLE) @@ -896,7 +896,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new // Objects may or may not have reagents; if they do, it's probably a beaker or something and we need to transfer properly; otherwise, just touch. /datum/reagents/proc/trans_to_obj(var/obj/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/defer_update = FALSE, var/transferred_phases = (MAT_PHASE_LIQUID | MAT_PHASE_SOLID)) if(!target || !target.simulated) - return + return 0 if(!target.reagents) var/datum/reagents/R = new /datum/reagents(amount * multiplier, global.temp_reagents_holder) From 9db721103dd0d00f75a2a1296b6f19ecf62b4a56 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 23:25:33 +1100 Subject: [PATCH 304/554] Fixing glass containrs like bottles being drunk from instead of toggling lid. --- code/game/turfs/turf.dm | 3 +++ .../preference_setup/background/01_species.dm | 2 -- code/modules/materials/_materials.dm | 4 +++ .../reagents/reagent_containers/_glass.dm | 27 ++++++++++++------- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index ebbf35140a7..c1736216935 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -788,6 +788,9 @@ /turf/get_affecting_weather() return weather +/turf/can_be_poured_into(atom/source) + return !density + /turf/get_alt_interactions(mob/user) . = ..() LAZYADD(., /decl/interaction_handler/show_turf_contents) diff --git a/code/modules/client/preference_setup/background/01_species.dm b/code/modules/client/preference_setup/background/01_species.dm index d8575db5f52..3f8e52d19e7 100644 --- a/code/modules/client/preference_setup/background/01_species.dm +++ b/code/modules/client/preference_setup/background/01_species.dm @@ -49,8 +49,6 @@ . += "
" for(var/s in get_playable_species()) var/decl/species/list_species = get_species_by_key(s) - if(!istype(list_species)) - continue // Runtime observed in a round where the playable species list was edited. if(pref.species == list_species.name) . += "[list_species.name] " else diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index dc42a7b4411..986ecb5e4cc 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -1190,3 +1190,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /decl/material/proc/can_hold_edge() return hardness > MAT_VALUE_FLEXIBLE + +// TODO: expand this to more than just Actual Poison. +/decl/material/proc/is_unsafe_to_drink(mob/user) + return toxicity > 0 diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index 3defa7b8e00..3d609f811c7 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -58,16 +58,28 @@ /obj/item/chems/glass/proc/can_lid() return TRUE -/obj/item/chems/glass/attack_self() - . = ..() - if(!. && can_lid()) +/obj/item/chems/glass/proc/should_drink_from(mob/drinker) + . = reagents?.total_volume > 0 + if(.) + var/decl/material/drinking = reagents.get_primary_reagent_decl() + return drinking ? !drinking.is_unsafe_to_drink(drinker) : FALSE + +/obj/item/chems/glass/attack_self(mob/user) + + if(can_lid() && user.a_intent == I_HELP) if(ATOM_IS_OPEN_CONTAINER(src)) - to_chat(usr, SPAN_NOTICE("You put the lid on \the [src].")) + to_chat(user, SPAN_NOTICE("You put the lid on \the [src].")) atom_flags ^= ATOM_FLAG_OPEN_CONTAINER else - to_chat(usr, SPAN_NOTICE("You take the lid off \the [src].")) + to_chat(user, SPAN_NOTICE("You take the lid off \the [src].")) atom_flags |= ATOM_FLAG_OPEN_CONTAINER update_icon() + return TRUE + + if(should_drink_from(user) && is_edible(user) && handle_eaten_by_mob(user, user) != EATEN_INVALID) + return TRUE + + return ..() /obj/item/chems/glass/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(get_attack_force(user) && !(item_flags & ITEM_FLAG_NO_BLUDGEON) && user.a_intent == I_HURT) @@ -102,11 +114,6 @@ . = ..() // Drinking out of bowls. -/obj/item/chems/glass/attack_self(mob/user) - if(is_edible(user) && handle_eaten_by_mob(user, user) != EATEN_INVALID) - return TRUE - return ..() - /obj/item/chems/glass/get_food_default_transfer_amount(mob/eater) return eater?.get_eaten_transfer_amount(amount_per_transfer_from_this) From 4fbeb0fd95038f767daa1ee1283559de55d59486 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 23:39:39 +1100 Subject: [PATCH 305/554] Maps will now validate their level lists during unit testing. --- .../crafting/slapcrafting/_crafting_stage.dm | 2 +- code/unit_tests/~unit_test_subsystems.dm | 6 +++ maps/~mapsystem/maps.dm | 53 ++++++++++++++----- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/code/modules/crafting/slapcrafting/_crafting_stage.dm b/code/modules/crafting/slapcrafting/_crafting_stage.dm index a8474a04dd7..50ede2c90bd 100644 --- a/code/modules/crafting/slapcrafting/_crafting_stage.dm +++ b/code/modules/crafting/slapcrafting/_crafting_stage.dm @@ -86,7 +86,7 @@ if(!user.try_unequip(thing, target)) return FALSE used_stack = stack - if(used_stack) + if(!QDELETED(used_stack)) used_stack.forceMove(target) target?.update_icon() diff --git a/code/unit_tests/~unit_test_subsystems.dm b/code/unit_tests/~unit_test_subsystems.dm index 23d8aab1d0b..eea8a75f692 100644 --- a/code/unit_tests/~unit_test_subsystems.dm +++ b/code/unit_tests/~unit_test_subsystems.dm @@ -31,6 +31,12 @@ SUBSYSTEM_DEF(unit_tests) #endif log_unit_test("Initializing Unit Testing") + // Misc validation. + if(istype(global.using_map)) + global.using_map.validate() + else + log_error("global.using_map is null or invalid!") + // //Start the Round. // diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index fa0aaa49977..574f9745e85 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -1,21 +1,30 @@ -var/global/datum/map/using_map = new USING_MAP_DATUM -var/global/list/all_maps = list() +var/global/datum/map/using_map = new USING_MAP_DATUM +var/global/list/all_maps = list() +var/global/list/votable_maps = list() var/global/const/MAP_HAS_BRANCH = 1 //Branch system for occupations, togglable -var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable +var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable /hook/startup/proc/initialise_map_list() - for(var/type in subtypesof(/datum/map)) - var/datum/map/M - if(type == global.using_map.type) - M = global.using_map - M.setup_map() - else - M = new type - if(!M.path) - log_error("Map '[M]' ([type]) does not have a defined path, not adding to map list!") + for(var/map_type in subtypesof(/datum/map)) + + var/datum/map/map_instance = map_type + if(TYPE_IS_ABSTRACT(map_instance)) + continue + + if(map_type == global.using_map.type) + map_instance = global.using_map + map_instance.setup_map() + else if(map_type::map_path) + map_instance = new map_type else - global.all_maps[M.path] = M + log_error("Map '[map_type]' does not have a defined path, not adding to map list!") + continue + + global.all_maps[map_instance.path] = map_instance + if(map_instance.votable) + global.votable_maps[map_instance.path] = map_instance + return 1 /datum/map @@ -127,6 +136,9 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/default_species = SPECIES_HUMAN + // Can this map be voted for by players? + var/votable = TRUE + var/list/available_background_info = list( /decl/background_category/homeworld = list(/decl/background_detail/location/other), /decl/background_category/faction = list(/decl/background_detail/faction/other), @@ -527,3 +539,18 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable /datum/map/proc/finalize_map_generation() return + +/datum/map/proc/validate() + . = TRUE + if(!length(SSmapping.player_levels)) + log_error("[name] has no player levels!") + . = FALSE + if(!length(SSmapping.station_levels)) + log_error("[name] has no station levels!") + . = FALSE + if(!length(SSmapping.admin_levels)) + log_error("[name] has no admin levels!") + . = FALSE + if(!length(SSmapping.contact_levels)) + log_error("[name] has no contact levels!") + . = FALSE From e55d256c0ad14830943a3ee19a3b0f49f4b66437 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 23:57:33 +1100 Subject: [PATCH 306/554] Removes testing maps from votable maps. --- code/_onclick/hud/screen/screen_ai_button.dm | 9 +++++---- code/controllers/subsystems/ticker.dm | 2 +- code/datums/vote/map.dm | 4 ++-- maps/away_sites_testing/away_sites_testing_define.dm | 4 ++++ maps/example/example-3.dmm | 3 +-- maps/example/example_define.dm | 1 + maps/modpack_testing/modpack_testing_define.dm | 4 ++++ maps/planets_testing/planets_testing_define.dm | 6 +++++- maps/~mapsystem/maps.dm | 4 ++-- 9 files changed, 25 insertions(+), 12 deletions(-) diff --git a/code/_onclick/hud/screen/screen_ai_button.dm b/code/_onclick/hud/screen/screen_ai_button.dm index 03371223da7..e2060d6b8a1 100644 --- a/code/_onclick/hud/screen/screen_ai_button.dm +++ b/code/_onclick/hud/screen/screen_ai_button.dm @@ -1,16 +1,18 @@ /obj/screen/ai_button icon = 'icons/mob/screen/ai.dmi' requires_ui_style = FALSE - var/mob/living/silicon/ai/ai_verb + var/ai_verb var/list/input_procs var/list/input_args var/list/template_icon = list(null, "template") var/image/template_undelay /obj/screen/ai_button/handle_click(mob/user, params) - if(!isAI(usr)) + + var/mob/living/silicon/ai/A = user + if(!istype(A)) return TRUE - var/mob/living/silicon/ai/A = usr + if(!(ai_verb in A.verbs)) return TRUE @@ -30,7 +32,6 @@ if(!(ai_verb in A.verbs) || A.incapacitated()) return - input_arguments += input_arg if(length(input_args)) diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 4855a9a86c5..aba3e4aaa0d 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -113,7 +113,7 @@ SUBSYSTEM_DEF(ticker) Master.SetRunLevel(RUNLEVEL_POSTGAME) end_game_state = END_GAME_READY_TO_END INVOKE_ASYNC(src, PROC_REF(declare_completion)) - if(get_config_value(/decl/config/toggle/allow_map_switching) && get_config_value(/decl/config/toggle/auto_map_vote) && global.all_maps.len > 1) + if(get_config_value(/decl/config/toggle/allow_map_switching) && get_config_value(/decl/config/toggle/auto_map_vote) && length(global.votable_maps) > 1) SSvote.initiate_vote(/datum/vote/map/end_game, automatic = 1) else if(mode_finished && (end_game_state <= END_GAME_NOT_OVER)) diff --git a/code/datums/vote/map.dm b/code/datums/vote/map.dm index 9e64ac63bcb..aabfdde2845 100644 --- a/code/datums/vote/map.dm +++ b/code/datums/vote/map.dm @@ -9,14 +9,14 @@ return ..() /datum/vote/map/setup_vote() - for(var/name in global.all_maps) + for(var/name in global.votable_maps) choices += name ..() /datum/vote/map/report_result() if(..()) return 1 - var/datum/map/M = global.all_maps[result[1]] + var/datum/map/M = global.votable_maps[result[1]] fdel("use_map") text2file(M.path, "use_map") diff --git a/maps/away_sites_testing/away_sites_testing_define.dm b/maps/away_sites_testing/away_sites_testing_define.dm index 6f3a96274ee..8b605741a84 100644 --- a/maps/away_sites_testing/away_sites_testing_define.dm +++ b/maps/away_sites_testing/away_sites_testing_define.dm @@ -4,10 +4,14 @@ full_name = "Away Sites Testing Land" path = "away_sites_testing" overmap_ids = list(OVERMAP_ID_SPACE) + votable = FALSE allowed_latejoin_spawns = list() default_spawn = null +/datum/map/away_sites_testing/validate() + return TRUE // Do not check for level lists, this is not a playable map. + // Set the observer spawn to include every flag so that CI flag checks pass. /decl/spawnpoint/observer spawn_flags = (SPAWN_FLAG_GHOSTS_CAN_SPAWN | SPAWN_FLAG_JOBS_CAN_SPAWN | SPAWN_FLAG_PRISONERS_CAN_SPAWN | SPAWN_FLAG_PERSISTENCE_CAN_SPAWN) diff --git a/maps/example/example-3.dmm b/maps/example/example-3.dmm index 5b89fac02e5..abffda753cc 100644 --- a/maps/example/example-3.dmm +++ b/maps/example/example-3.dmm @@ -227,9 +227,8 @@ /turf/floor, /area/example/third) "MO" = ( -/obj/abstract/level_data_spawner/main_level{ +/obj/abstract/level_data_spawner/admin_level{ name = "Example Third Deck"; - }, /turf/space, /area/space) diff --git a/maps/example/example_define.dm b/maps/example/example_define.dm index 9c48d50899f..5f8a3a80c16 100644 --- a/maps/example/example_define.dm +++ b/maps/example/example_define.dm @@ -2,6 +2,7 @@ name = "Testing" full_name = "Testing Site" path = "example" + votable = FALSE lobby_screens = list( 'maps/example/example_lobby.png' diff --git a/maps/modpack_testing/modpack_testing_define.dm b/maps/modpack_testing/modpack_testing_define.dm index f5b09decd1f..8ed4837727c 100644 --- a/maps/modpack_testing/modpack_testing_define.dm +++ b/maps/modpack_testing/modpack_testing_define.dm @@ -4,3 +4,7 @@ path = "modpack_testing" allowed_latejoin_spawns = list() default_spawn = null + votable = FALSE + +/datum/map/modpack_testing/validate() + return TRUE // Do not check for level lists, this is not a playable map. diff --git a/maps/planets_testing/planets_testing_define.dm b/maps/planets_testing/planets_testing_define.dm index c82359943fd..8380842377f 100644 --- a/maps/planets_testing/planets_testing_define.dm +++ b/maps/planets_testing/planets_testing_define.dm @@ -3,8 +3,12 @@ full_name = "Planets Testing" path = "planets_testing" overmap_ids = list(OVERMAP_ID_SPACE) - allowed_latejoin_spawns = list() default_spawn = null + votable = FALSE + allowed_latejoin_spawns = list() + +/datum/map/planet_testing/validate() + return FALSE // Testing map, do not validate levels. // Set the observer spawn to include every flag so that CI flag checks pass. /decl/spawnpoint/observer diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 574f9745e85..08e99aac5d9 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -15,8 +15,8 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable if(map_type == global.using_map.type) map_instance = global.using_map map_instance.setup_map() - else if(map_type::map_path) - map_instance = new map_type + else if(map_instance::path) + map_instance = new map_instance else log_error("Map '[map_type]' does not have a defined path, not adding to map list!") continue From 0e8b2bff5908b9645e6f71f1b95c2fe8dedc7f24 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 6 Jan 2025 00:15:01 +1100 Subject: [PATCH 307/554] Commenting out admin levels check. --- code/modules/events/rogue_drones.dm | 2 -- maps/~mapsystem/maps.dm | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm index a6decd690ff..c5d0df69341 100644 --- a/code/modules/events/rogue_drones.dm +++ b/code/modules/events/rogue_drones.dm @@ -38,9 +38,7 @@ var/num_recovered = 0 for(var/mob/living/simple_animal/hostile/malf_drone/D in drones_list) spark_at(D.loc) - D.z = SSmapping.admin_levels[1] D.has_loot = 0 - qdel(D) num_recovered++ diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 08e99aac5d9..ca7f5deff7e 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -548,9 +548,12 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable if(!length(SSmapping.station_levels)) log_error("[name] has no station levels!") . = FALSE + // TODO: add an admin level loaded from template for maps like tradeship (generic admin level modpack?) + /* if(!length(SSmapping.admin_levels)) log_error("[name] has no admin levels!") . = FALSE + */ if(!length(SSmapping.contact_levels)) log_error("[name] has no contact levels!") . = FALSE From 780a30ee29f8a44a1e5ccdb29468f94086303e73 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 6 Jan 2025 00:25:37 +1100 Subject: [PATCH 308/554] Fixing AI verb proc references. --- code/_onclick/hud/ai_hud.dm | 40 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/code/_onclick/hud/ai_hud.dm b/code/_onclick/hud/ai_hud.dm index b8edcf540c4..fa4e2200bb6 100644 --- a/code/_onclick/hud/ai_hud.dm +++ b/code/_onclick/hud/ai_hud.dm @@ -11,70 +11,70 @@ screen_loc = ui_ai_core name = "AI Core" icon_state = "ai_core" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, core) + proc_path = /mob/living/silicon/ai/proc/core /decl/ai_hud/ai_announcement screen_loc = ui_ai_announcement name = "AI Announcement" icon_state = "announcement" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_announcement) + proc_path = /mob/living/silicon/ai/proc/ai_announcement /decl/ai_hud/ai_cam_track screen_loc = ui_ai_cam_track name = "Track With Camera" icon_state = "track" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_camera_track) + proc_path = /mob/living/silicon/ai/proc/ai_camera_track input_procs = list(/mob/living/silicon/ai/proc/trackable_mobs = (AI_BUTTON_PROC_BELONGS_TO_CALLER|AI_BUTTON_INPUT_REQUIRES_SELECTION)) /decl/ai_hud/ai_cam_light screen_loc = ui_ai_cam_light name = "Toggle Camera Lights" icon_state = "camera_light" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, toggle_camera_light) + proc_path = /mob/living/silicon/ai/proc/toggle_camera_light /decl/ai_hud/ai_cam_change_channel screen_loc = ui_ai_cam_change_channel name = "Jump to Camera Channel" icon_state = "camera" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_channel_change) + proc_path = /mob/living/silicon/ai/proc/ai_channel_change input_procs = list(/mob/living/silicon/ai/proc/get_camera_channel_list = (AI_BUTTON_PROC_BELONGS_TO_CALLER|AI_BUTTON_INPUT_REQUIRES_SELECTION)) /decl/ai_hud/ai_sensor screen_loc = ui_ai_sensor name = "Set Sensor Mode" icon_state = "ai_sensor" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, sensor_mode) + proc_path = /mob/living/silicon/ai/proc/sensor_mode /decl/ai_hud/ai_manifest screen_loc = ui_ai_crew_manifest name = "Show Crew Manifest" icon_state = "manifest" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, run_program) + proc_path = /mob/living/silicon/ai/proc/run_program input_args = list("crewmanifest") /decl/ai_hud/ai_take_image screen_loc = ui_ai_take_image name = "Toggle Camera Mode" icon_state = "take_picture" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_take_image) + proc_path = /mob/living/silicon/ai/proc/ai_take_image /decl/ai_hud/ai_view_images screen_loc = ui_ai_view_images name = "View Images" icon_state = "view_images" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_view_images) + proc_path = /mob/living/silicon/ai/proc/ai_view_images /decl/ai_hud/ai_laws screen_loc = ui_ai_state_laws name = "State Laws" icon_state = "state_laws" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_checklaws) + proc_path = /mob/living/silicon/ai/proc/ai_checklaws /decl/ai_hud/ai_call_shuttle screen_loc = ui_ai_call_shuttle name = "Call Shuttle" icon_state = "call_shuttle" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_call_shuttle) + proc_path = /mob/living/silicon/ai/proc/ai_call_shuttle /decl/ai_hud/ai_up screen_loc = ui_ai_up @@ -92,53 +92,53 @@ screen_loc = ui_ai_color name = "Change Floor Color" icon_state = "ai_floor" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, change_floor) + proc_path = /mob/living/silicon/ai/proc/change_floor /decl/ai_hud/ai_hologram screen_loc = ui_ai_holo_change name = "Change Hologram" icon_state = "ai_holo_change" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_hologram_change) + proc_path = /mob/living/silicon/ai/proc/ai_hologram_change /decl/ai_hud/ai_crew_monitor screen_loc = ui_ai_crew_mon name = "Crew Monitor" icon_state = "crew_monitor" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, run_program) + proc_path = /mob/living/silicon/ai/proc/run_program input_args = list("sensormonitor") /decl/ai_hud/ai_power_override screen_loc = ui_ai_power_override name = "Toggle Power Override" icon_state = "ai_p_override" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_power_override) + proc_path = /mob/living/silicon/ai/proc/ai_power_override /decl/ai_hud/ai_shutdown screen_loc = ui_ai_shutdown name = "Shutdown" icon_state = "ai_shutdown" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_shutdown) + proc_path = /mob/living/silicon/ai/proc/ai_shutdown /decl/ai_hud/ai_move_hologram screen_loc = ui_ai_holo_mov name = "Toggle Hologram Movement" icon_state = "ai_holo_mov" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, toggle_hologram_movement) + proc_path = /mob/living/silicon/ai/proc/toggle_hologram_movement /decl/ai_hud/ai_core_icon screen_loc = ui_ai_core_icon name = "Pick Icon" icon_state = "ai_core_pick" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, pick_icon) + proc_path = /mob/living/silicon/ai/proc/pick_icon /decl/ai_hud/ai_status screen_loc = ui_ai_status name = "Pick Status" icon_state = "ai_status" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_statuschange) + proc_path = /mob/living/silicon/ai/proc/ai_statuschange /decl/ai_hud/ai_inbuilt_comp screen_loc = ui_ai_crew_rec name = "Inbuilt Computer" icon_state = "ai_crew_rec" - proc_path = TYPE_PROC_REF(/mob/living/silicon, access_computer) + proc_path = /mob/living/silicon/proc/access_computer From 7474702caa94da4bfea224947c1f773d1374309f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 6 Jan 2025 00:27:43 +1100 Subject: [PATCH 309/554] Shaded Hills level data changed to main_level instead of player_level. --- maps/shaded_hills/levels/_levels.dm | 36 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/maps/shaded_hills/levels/_levels.dm b/maps/shaded_hills/levels/_levels.dm index 9150072af91..fc96452d2d1 100644 --- a/maps/shaded_hills/levels/_levels.dm +++ b/maps/shaded_hills/levels/_levels.dm @@ -1,11 +1,11 @@ /obj/abstract/map_data/shaded_hills height = 2 -/datum/level_data/player_level/shaded_hills +/datum/level_data/main_level/shaded_hills use_global_exterior_ambience = FALSE base_area = null base_turf = /turf/floor/dirt - abstract_type = /datum/level_data/player_level/shaded_hills + abstract_type = /datum/level_data/main_level/shaded_hills ambient_light_level = 1 ambient_light_color = "#f3e6ca" strata = /decl/strata/shaded_hills @@ -29,16 +29,16 @@ time_in_cycle = rand(cycle_duration) ..() -/datum/level_data/player_level/shaded_hills/get_subtemplate_areas(template_category, blacklist, whitelist) +/datum/level_data/main_level/shaded_hills/get_subtemplate_areas(template_category, blacklist, whitelist) return submap_area ? (islist(submap_area) ? submap_area : list(submap_area)) : null -/datum/level_data/player_level/shaded_hills/get_subtemplate_budget() +/datum/level_data/main_level/shaded_hills/get_subtemplate_budget() return submap_budget -/datum/level_data/player_level/shaded_hills/get_subtemplate_category() +/datum/level_data/main_level/shaded_hills/get_subtemplate_category() return submap_category -/datum/level_data/player_level/shaded_hills/after_generate_level() +/datum/level_data/main_level/shaded_hills/after_generate_level() . = ..() if(length(mobs_to_spawn)) for(var/list/mob_category in mobs_to_spawn) @@ -55,7 +55,7 @@ mob_count-- CHECK_TICK -/datum/level_data/player_level/shaded_hills/grassland +/datum/level_data/main_level/shaded_hills/grassland name = "Shaded Hills - Grassland" level_id = "shaded_hills_grassland" level_generators = list( @@ -87,7 +87,7 @@ ) -/datum/level_data/player_level/shaded_hills/swamp +/datum/level_data/main_level/shaded_hills/swamp name = "Shaded Hills - Swamp" level_id = "shaded_hills_swamp" connected_levels = list( @@ -128,7 +128,7 @@ ) ) -/datum/level_data/player_level/shaded_hills/woods +/datum/level_data/main_level/shaded_hills/woods name = "Shaded Hills - Woods" level_id = "shaded_hills_woods" connected_levels = list( @@ -163,7 +163,7 @@ ) ) -/datum/level_data/player_level/shaded_hills/downlands +/datum/level_data/main_level/shaded_hills/downlands name = "Shaded Hills - Downlands" level_id = "shaded_hills_downlands" level_generators = list( @@ -177,7 +177,7 @@ submap_category = MAP_TEMPLATE_CATEGORY_SH_DOWNLANDS submap_area = /area/shaded_hills/outside/downlands/poi -/datum/level_data/player_level/shaded_hills/caverns +/datum/level_data/main_level/shaded_hills/caverns name = "Shaded Hills - Caverns" level_id = "shaded_hills_caverns" connected_levels = list( @@ -192,7 +192,7 @@ ) base_turf = /turf/floor/rock/basalt -/datum/level_data/player_level/shaded_hills/dungeon +/datum/level_data/main_level/shaded_hills/dungeon name = "Shaded Hills - Dungeon" level_id = "shaded_hills_dungeon" connected_levels = list( @@ -204,19 +204,19 @@ base_turf = /turf/floor/rock/basalt /obj/abstract/level_data_spawner/shaded_hills_grassland - level_data_type = /datum/level_data/player_level/shaded_hills/grassland + level_data_type = /datum/level_data/main_level/shaded_hills/grassland /obj/abstract/level_data_spawner/shaded_hills_swamp - level_data_type = /datum/level_data/player_level/shaded_hills/swamp + level_data_type = /datum/level_data/main_level/shaded_hills/swamp /obj/abstract/level_data_spawner/shaded_hills_woods - level_data_type = /datum/level_data/player_level/shaded_hills/woods + level_data_type = /datum/level_data/main_level/shaded_hills/woods /obj/abstract/level_data_spawner/shaded_hills_downlands - level_data_type = /datum/level_data/player_level/shaded_hills/downlands + level_data_type = /datum/level_data/main_level/shaded_hills/downlands /obj/abstract/level_data_spawner/shaded_hills_caverns - level_data_type = /datum/level_data/player_level/shaded_hills/caverns + level_data_type = /datum/level_data/main_level/shaded_hills/caverns /obj/abstract/level_data_spawner/shaded_hills_dungeon - level_data_type = /datum/level_data/player_level/shaded_hills/dungeon + level_data_type = /datum/level_data/main_level/shaded_hills/dungeon From a753ab6fcd7d9595e1d1b026c99be95264134280 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 6 Jan 2025 00:47:10 +1100 Subject: [PATCH 310/554] Adding map previews for Shaded Hills. --- nano/images/shaded_hills/shaded_hills-1.png | Bin 0 -> 204640 bytes nano/images/shaded_hills/shaded_hills-2.png | Bin 0 -> 530107 bytes nano/images/shaded_hills/shaded_hills-3.png | Bin 0 -> 198450 bytes nano/images/shaded_hills/shaded_hills-4.png | Bin 0 -> 222998 bytes nano/images/shaded_hills/shaded_hills-5.png | Bin 0 -> 501209 bytes nano/images/shaded_hills/shaded_hills-6.png | Bin 0 -> 547818 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 nano/images/shaded_hills/shaded_hills-1.png create mode 100644 nano/images/shaded_hills/shaded_hills-2.png create mode 100644 nano/images/shaded_hills/shaded_hills-3.png create mode 100644 nano/images/shaded_hills/shaded_hills-4.png create mode 100644 nano/images/shaded_hills/shaded_hills-5.png create mode 100644 nano/images/shaded_hills/shaded_hills-6.png diff --git a/nano/images/shaded_hills/shaded_hills-1.png b/nano/images/shaded_hills/shaded_hills-1.png new file mode 100644 index 0000000000000000000000000000000000000000..862e93356aac54d18a807fd77b8c8d841e77ff3a GIT binary patch literal 204640 zcmYJa2UHVH`~OW*QE4jD0})YCQHt~$x$zb|c2G)ysEBkzi=?24h?J-(pp>YHsFZ+o z2njt>11bavBtU?O0YV5QfwVvO?>X;z_gv@f?wpx9dwu3RyR&o6BwxPdqPSCQr<9bG z;@LB&u1ZO5*}U8$wOw}ebf%3`Atfb^xP0OIzZx1Es;a8$>gsznG}P48G&MDWK%m;* zy=od7+Q5B#)zs8AG}JXU_wL=Rp`*KbY~HJ>t7~g(YiVhzYiRyop}j}<>;bB%Y^JKI ztEz8i->Z=ar>gZ9Bgs+yW=8k+i`lK=ofU0rqm{{4VM1{#}*S{fSq`da(-Rn^q? zs;X*gYXc4)($Lte1JnWN=xjcRmX5ZLj?P{Hz|_?2gsHiOg{761wWX!ii4*2FHnx@) zRu&dk=H`~RHnvul)@CQnt*va#%q+~!EsTzv7#o|OFf}`N%-F>Eg#LbmLkEu>J#yT@ z;OLRV#|#b~-3L6df4>1xSAXBW1G>8Vj~_SLzyDBkb8~5F>A=81OG^uIGlSkCAW$EV z#}f#Io}L~(y+cMuCVF}Y+uPf_y1EV?I9y*}Us+kXZ{I;}?R|Rt4(jUaTbNtEwUGX3 zDIIq}+CxVQZ71{AMCOaN%-a((SSOieTbUed>6fN5&x~X;Psrrh$|M>}H^7$2Qd0Y* z&Yp6*9-F(+6qp0(dRfR&dvnppbYkr2@UHmNKm88+#Z<{S{XHR&NZz$h^vCtue>*yu z8`>jx_G9HyBcv(sM>iyTVMN1p8m_}2B-M#llGYqi4#O4CJZ6|)_$G;ROFgGS8Q4!D z8B!&`>}`=vY-mj#QoO8(#)wiWwiRR6C=81riWaJ^8#;7I_Da}7mQ7|%Ra@+z(6mbL z)mbKx!UhPm+8Sc|c)n>Z1k7R?FaoFB^%A-g`@Q3(0SNx10`$<)O@Ol{;RFjNJc5hv<+;%P zOUsXQH>yWxsQh5##fw~V=vV@o%W!A7$7Xt0NxpL1wJOW}S>d8^p66HwV^Sy+CN|xe zT^F(g0YuEOKv)^;Ew+~&(kKUgdjgXzY#?4lt?P!f9poSy?s zfH@$-5yJE18qVGs5D!FZ#a!LSFspKcKZ{1)!9n{u_)!K9%|2$ANA80L9)m9UgL@ed zFic^&f6ZcI_cv6II^3i z7h(7&^meo@!+iE2%U_bRV|4Kd~(iUaZ5$(tR75tKfgHHK|M z3`0tpxJ%?p-dJTgBX{^8(j&3Pgc5@7E+^h77jN{r7KMh}Gsp?y!eB2BN&@---7R5( z#RQHln|3dW;{$gG!hsA#EuUVIjv@Ebl_iMWPFVk@QmYD$gDdlRA6(}NIFe!{*M{P2 zzZ5!ST~9^KZ*cy|buK$bEI<{s0!@^WV2J%N1C`Fp5x=?F_wQy}6ys8nDD zMvV zwsKjK1}yj`uO$rcOIpPQICv&boAZvS2Z#GrMqy0AX-Tj@O#@49cgs?V$nCxp>Yux6 zW+8`jo4k|R&{v6GG|9E~>*=}9r9;kXJW~|wj|TV|Vm~CXcDdS7Eh3GH3^QW+6FPrc z^?4zmOPao_j$5oez4uMZqy0#U%hj@0n3H)?iK~I9RimO_LZfYM!kz-}tf5xtB z5QZxj(Fjy22qdXmbQNA$$O>l))*3(>JgsYD&p1@21HG~-X_z2T+^CG~XHSTrgZZVq zTW6C4+hU~^zAyK~lmMXco>sCC7h=ICP5Qy*e5mV=adH_69iJVL*C?IOR6M$AQrq%a zU}_zT%E`I#eL`Zxnng^NTVfOA7|iy2OuVa&RcD)hESP^@BfM{ILDsWIsKsFUG$&3a zURzACCP_YvZ|0=(>>VjNbzyyOj$7bIaIV@Un@MMzk7-#=7K~5a1^Gccv081Bx?>u6 z&5S={?Z&F4fh~A8N@4c&TTok;7xV#Mi^|ZLYjO^L^lu}gxsc=EIYcD$I<$&~yP)2D zyUetzrwj9Bu7P0AO+hcmh;Z41hzD(mHy-Oy#O_RmO#XD9j~OR(1vkpRF#{Tf;Ms;cW$a= z*-@}n-zYVPD{YiRe@jS^_K%yqPE{8>QaXvdT1Pqjpip1os=WPUFGe-a7;aZlOa2>} z7BeNp241T22XAMs)DGz4rQupVhkBF`z>np6#PTRv>q_`)!RYDnV;En%S*@=$UD+@RY%1#1if4yk*wh}t|;vTZm zvA3H_ioj!`t!$OrWANhuD^?ysTfHYnYR)V8z}&5Dz_Cn?FJZXwa-m|Plha=8IHBD4 zfMXC33-uulb!t^IGTg7Y!zN;ciWi0$ErM2X>$A?l*1JAY0=+{|)h|^mKQ^ZDHBu{w zsI7@E>$_&oPa%AXP$m9lHSu6fsaD}VFjiGLwwH$TF@o*iIX5=qCJP`Ge z)*DR{l+UloS4S-fAQa4p>L7s%=vNRL!5$Vb*Hv!{Xp%F02?*roGpRh^b@Pv7+PwZn z(s1jYPDf&^TJp`K=^H-q))|JJ)yQoPGj>;U${s;+UcprB`UBH*#B;FSDWE+BT=Te( zAALnOs4>l1Kaw^n>4!*hy(rCU?O`5qm8@2F@{UBhs=uptAEdJc?@?2s^Bu8lL0`^Z za2Z5Q!iiBNNPE`XBH|$VB!8UEwmHq3ETB5hsOMB-NxWuC`#w=+#PQD`uC z?q5X?(QqWBS~UTQ2|SMKe3vlyl$MOlTD;>i<`3q=menPT&~>=!=UG`P!LegUj%~l^ zso^)JVzQWAXrQ*cW*ej*B9Aqqovbmd)yVeu%^Xdi&Prd~S*el&jx~TVXzIf^aKH-+ zPrb8+L4m$sEz?`yjaoUTtnQe>&Dr$L#)Z-kdF*Q2>iXEZg*`bjBsPBjrsp&#oBe(6 zX>jv=l`{SwAT^m;r=05=gs3j$e`kCRU$r<4&tEi1niQ@W>KyjzRi2L&99|%d-Qr))HmI0Cyl}2$ zZ*Q5q5WJr8k~gDH74AB}$;Pp-a_qMIw@&HdNZQJ+UiJxW;@1eghc@s|%D$)PX*x;y zbQ7xR{OL+g%I&fHI%eMeY>0MP14RxT_#YfN&>94wh|a)AId=fTip`9ChRtb;8(E+g zE32w6&g4hKCrR7I0Bl0t-oWwRyBz}){lurY5~9|`4NI7i#;3KFw01Fn*H5J^QJa>V z9YtK94xXI32fDzd#2t`(F|NpcHtd_`6t_9_6gz$cuVwM(NBwj@_xV#Gzw-yim+b~a zCuMIzJCmY+n|0equxNHMtEPo-(3EJ~(H42yM!63rBMbDs#PE zd#-bO0HQ&{LyRQp>t@3inX|xyUlKz*tCcg)$O(mv$>!Wx zawhimiDxpc)%^%G1{pWRvzyC?ctK*_1R>n{wMgKKXyhqhb%AC3Zc#>C(#Qot4MD2m zd^xx^^q5V)M^9mFfMkxaouTyuQkAyW2PFtwaOiql*U4{*m?st={faxsF)H-1e2s(r zml`GE)OD{GHYFOw51Ojz5lxQ4mP*Aop+=9(dAYLWe$xvITOB>zVPZRM9uF}nY!0?Q zyZP54z%j^&Q~y>JVq+&gtdX?dUzklkq1%sjI2a-h?Yq~H*kv{S02OimM`9h7v~Cf)*2G;Z(qd{Q zET5>CDKS7y3Mv%+(>riZaa$aFg8cDV1ZR~+k>uyBC=EBjTNSe%b8Rx;a6b66j|(Wu zpX(gso>~4%3TJtaPazGJSr1YadBoib5=ld}R!zHLAl!;uvHT_$J zq>m*JQU72#a~j*@NH$@MfVTF_la(-10}B_8h&(E3sSBR^gw+a+s3MOfUeTl+2W7em z`nTTa5r!nulJ-z}bqs%(f_?Zz>-yW;%du=$4hZ4}U?mg!5UA)907%I*zF5S56kpLJ z_i`N3A7j*k%VdWk`<%vwv-&Ulejwtt!>d8{2m2H2##tN&u7_yC;0C3)X*nZrNG_F0 zG0y_^Xv&tJ(Yc5KbhH24MYuZ&{5xB`B*H-TSj9q~=G=dR3jNuN0y<$|8O!0* z|8W?{$WV#XhxV4eF6Nou-{RAbK^fXHgY zI8~sCZ3l%NUfSvCVQs6Te>&nvf$yAR!JGivubld=LS*4Z2+(K9R0(K*2{hDn zc`}Daxlczm?ab`4JX?%wOI6)n+_24M}T)i)qI3^!a{VWAk z(NRE)%Wu5-_n!Ufpy-|eAdDr{uk6*czkAG2s=;J1#a@tp#i^t?ulf(;QUACwD(KgVy03l5)$x?WMOTnXWo9q<-&b&>S|Ok2ynZa+ zgx+yj!6Ba#@{vh%HeZ9YYB*Y&^3(e9;N5&(-G{yJ9DKauYk)QO2t>sfdTZ%jFuHOf zr7Ye;VUHnQjy>kWOM60mj=>B_I{EswJD;Gp~siuD>uiiR(6gFx2;k* zs;LEuiD_8#8rY)!B??o7L*s&~6o&2ZkVf3DW| zR0@d~70f-T>qtE9-9%r+^@qp5VJDPxeZphcQdI@+W`5ImR}Tz4AJ8o?OXM;aaw;@y z0}(%3{1>}`+ebHNSZp<+3id!@|Cr)h0Bs9I^qa5hkLhIgQ61za&%b8*db=t;5;?AH z%~PMSF>pNBe2ZVWQjNA|A2MA&pKmv^V^bQIPm*p5`R&K$i!KV?V05(4ZoJu{xt`cy zQl%Bk+h$yv5a+jV{Xaftv_@JyG7c}pF;(-fGYz+}e+0{|;fUJ*boVF)XqMFYgUl`& zD{Qs0H=W*C6+feWU@APBUgm>_t+%~8H9gq_p4MpM(-02BHt4lt>KhKov@A%Y+fa@a zm-br!5n2kl6_?OnIG?Z&OSSgoWXNw+Fy^swi8lrhH{(CV@}I*Du~giPdLU!Q80 zg76hX$LCKEpRCkuNVLF8Y)(^I^R<5|UNWA6&#TE=umTz8=u28EgF$U49ba_{@1R zFsK)8u>jkEp@kZSS9T3+`dl3P%)Yrq?RGK;@+0vT#<+2V}~$v z$*`QrmkIF@I7eSq!gIhsfGQ4+0k!+r3^7i!0`Y88CR}(Z08)W%G9Z5K zHs1?!LrEG56tqrLZP-_;j8FHtIaZ}TMS;9w2FQ7h!y}2j_K0?Kk9;Tc-8hp@v`NUV zPT82mu{*pQR7-?8aI2}O?`MyNhf;+qVL!Bgm4A;Mw>@2pjz@-HOPiC`xH7)L7R)JA zqjN62c4r+H?o0=biE0Q7lg0yKtZN1DW9gu5i9E0!5+wLQX`+C6HcNzljIAL!G!^@X243ItL=Rb@kO68({xUXdO${b*7-^ z^>+<-BImLDV+tZ%wa9HqtmQ_rS2vM!`S#X@HvPS2NP2F5TeSj%)}6NPWaV=el>#ai zH1uWC2usJw_w4?)0Ndt}1+u%J8#6($?oNFK2$*luG?r(Mx=34jW(W8-+US|Q8`A@Q zfXoi5*-%^KmkEvi01XB4V>;;ygg+=utEIPUx|OJdh#6JNlTW~lXye&$^rX{|V4J=Y z5WAL#t55&Y3yBWpGLVovv%lz}6*r|}I{dBuw3bS37GXjXH|Hvrj@ur6vk8BZw-NIoQm%&;*Me3>!u^~$r07rjP1 zr?-AE9RoRmLDosA**Bi?D(JVwg>3e$17h1Fd``JM%g4s=UDINI4^X||j%S>jkp33F zokP0tx8b1oHl`-#IY{x|x$z8*XkR1v?rzsV?l9l|Q?VxdgrOT2L~ZYey0y7`Oe(Ms zh+7og4J1CCWt8WCu%2=gaPmfNk<(OW4FJR z=bS6{DNS1WnMLpy^_{hEWQ!>xLZG-CR8BZ2eiMQ+-~J=~NM9o3wtrgfisdViGzv2g z53^^-m>>QDUe?$U3$p5_5?YY_;@rj$qN&Z`!r29@iqi?gquoS37ro%j+gqtg8}Bx_ z^>C%GK#eRhDI=r?OMlP=maboI6PPCg1 z2Y4W*=8H--D&V_k49rUa^72WP52y|OOvP;pgh_to+99O9L@E>ts@aEh02>Sgemcgh zAge+6y%6_0-hHAe3)l;4U0-psgZBQ}bo{@j_MItBgDT9#HQN!5O;A?(!8pmHm}ZJ% z0DpiJQH2zsq6|m(Q+>Qc3G}6nbU$So>5iA0olBr66R;?kS>yW(6tM^Mtz&jsfab8) z3)-FZVz$f5TOTj87^%h==wB<|t+%(1fu_HW+r_jIRvs8hc`p4fB4`R8CGT}fm5*L& z`jc;0^HA31mK^Jm26Cz>sMzFSoj1ZdA2dGvbb=G)`#WY9SpGDQXZXUuv|}}veZFKQ zaBs|b_>I+}RhMhzoWP}A*}k*f2RNC&*$N^tLylEfd-_H_Es3bz21uOo8`zHVK^LAk zSdwN>J|8XcrCBIGPz?GNDTfTh<>}!XBS*ot_l4-+B93*VK^IPhP^>v!i%YzZOc_go zh72bj^TvnQ@s=%Xr~j=Q4pg)y$4A``raawnuT=K`jd-U}zhk7->Ih~F{24+~*D%yK zMZgnz$5o`mkYUzKxq@7Gm*=gVrRKX(~Fah-|UjA#4|2DY4 zEO{yc)9gDLYGQ#nHZH249+lTVn~+y$$5->JwoxhrkC=TF?mQtI+fC1d=HVYDo3=zW zB-IH*2kkF3=$6^o$o1}s`yiRCKgIsJo*-kS-;YK~18hD%IFjw6?Cnn-oNmu>C9N^| z$)j|G>>B4^@3GRBi@E6*_ks@79bX>@S5Id|WJGYQ^gI$*mo5011^4 z#{KmlSaO|DC8k(^Pot=aeevj4*&-{Il>KOS>K zlKuAk`{6{_NfSEC_rb=lC8R<}rN77h@}%jdNy>||v3E&jU}6lRbtNjkNQ2c1hT_e* z55WIWoyQSu3=G?N|?$ff#!5`@vjN)Ec`rw_JHpqTHptB3Kh!)wv4 zne1!d5gY2VvF%Xj-b{`|`vm&SCXvwp1oAFpeg1p$`uND~eQ=Eq?`AGdoS1_!dz5D3 zz1+ZXz$O*sL%znEn8vN|$ZQ%kzaJQX(XI%RuBkok@h6(@$WZy?42Zko9Y6Qj%P6qf zzCroHdxim_twxxwTD)Nd4Gp5u$VLs4mr7p(9HDkQ`=ky@R?HiEcn?@Ivb~oXP=t%~$BV zS<@f?1v96{w~LS|BMZLv!U(Y!^CU6}xAH)aF)N=!{eIq@|C~Z?nK$H+oRdt$+0sgk zr`Fh0+-C*8e-6Ld!EIBXLrn!e5xmklYWz7^vZ9BxMKQI;BTG%<)svj zbx(Q|=mru&`USQ=&m+YRE<^2>S&8Ji@G#cy#Kh)C&eofL0@1hn%b)?v$UY41P{+lJMzixUw+{F9Sm_m#q~Ef+N>YBYpm zBu&9E^FROJS^((XoN=Is(aB*IW;Lz3H2sFW$(_U$MP4;A@6ez*^ex*cDKcp)C3He zm6hd$QmZ+uB*)$;S73@r-RDQws8MPzPHuiPz{Y0(((Uhf(XVa$XrxyQ@$GHc<^O2- z3jhN~f4Dw*-Z?0;Z8qYAnNQ9^a>9nfA1(WjDe>EYhk1$Xy&(YKN@%i%m#(mSHJN5DsCOGYbk@_y9roq;e@FRPcRFGQT#oNxm1sbIz z>Bp>;9J4D|R@M8b#iL2)!rrwcl(KgZ3<&}F=+V7q(*@XX%h_V2Tgh;?a1Q5pr&bWl-w=2)lgh%E<&8Wc@3*4csCJ|TIR=>elD%S>RgI%a6>7OTEP1R*W+AJk; zjBd+OUcUVMtQ7{u6r#Q?nUYky2h{vtX(xVW)I6Zb*Y2>pSyEFTQx#hacD|G|EqA$X zvIUtGFDuyr=2T($rlHj zW(~gpq?P-}6KnDd3u7h)Uj^rC_y5)tqu*yf3aVHns4Ans5q;9P-WFZVdjC1@I>z>p z#D&AS(^%%eOF7PNM*jy<&4qmY$6EPfj^Yhk#ouG6JTh*|o88t)jRDyf9dT_Gf07pd zpT#PQP47z)S)Zlb`DbPSXUkeb$bi&z%rB|AtW=D-RHqqQbgwfgKk^8Ug{|tRf_8IM>Z1$c* z|9`g2=JEUq^LS2d8~v&A|B^ShOU}yP-zFp$NVmIN`(*8}Jay}JiQULuyr-_w&YYxk zUmq3m4>0deWCnSpBll8>DgP;q}z*#omp=W)Q~FYPCUI0%4*$=uI3`ZC-OfH=j^@J z_2+yh_~*Pwef;Yo$^?TfXh;OuQ=Uvu)fIgMu_j4^IQ9=kaO~$Jq9J*BmM?C z759t`4htW^a5o(v#j#Zf+|F>*+4>B(LaCpaJ*{-U*FX3}tZU&1uBsk8C|Jb2ybcnC zcC;O=Mju~pi$}{77#mYL%XM=VH@i;|`PJPDWv0kA{#*I+y&HbUC2K)fGx?Pf!4Vf3 z)$Lr^u;<^aOn=a6dm1Q-6*vape(iMDe*Hs7N&@Fsja)$_yjWjPzGv?h%bzRKQz=3|{3> zI!JAyIQ8nn(@!~yE_(FQUq#Ex`2nY=EbdL!avrkx;olr^_=!|Bmd|QX?8r(wz#A{> zKEBUanb^8G2~IwWc|o+$9qk=?6Y==WzulWcdCYo)^~u<|<$Oxxfbh($t2Ekb>D20q zs+cOJ>)ItY8X}3$A1H~CH*$E1%=W(Bi~w^--&fr+ygPb+*AJLZlj59T$WBCs`rOHe z*M-7cqg1xle==cxPrUK5<>0o;v^a)%Zbh{#REqu>n;MYb`fs95>c1;LwjcOqb)@>w zo)~#eJz3iFboOG^9(Lv#@V+^rb;H(mT{_&W5xSw%%^yR;ygz$qu^ zpz$sIJx6!POv=7xXw(+n!?=tvety~(H!m&lAC4+ms9AC-xBC7v@-=h-(OEMY*7>uX zwY#%xAt?n1L`6nMWsLKXd7{3is5ZANS0%(6<5q^I~`rfZIpRd)Fa?-Cw z9HYH_BxkI&_U{fp47g{$v+U@4(kJ_?0*-h0mVSJ1nLDW>16xUzvei3V9 zoeo>Qy48V;t|CDGw%(CvdIVRlXx{fMkhv@ZAh zY%}@=aH2k`C3W(Atj=q{c)?%~;IXeuh${5wVnINm+%jpo9a6jdja(}t^N&Ai9^b6g zI;EQuW=Y>_Pzmg1s)vBd+i7%z_?Sn=K7GzGr3LlQK1YpGLY)~(XhWz_pLK0B_ys#^ z6!-pBB0r7#4#oS|gbD+Zb^x|;(Lxno|Ac3Ec!cye`(WQI^i=R3mt(1CzuK}tbjihg zC;_!_)cVDC@XJS5-q&y0o@*uvUYwC@yt<-%7MA7e7NmX2++OG&>w=eg6QC}cjGO*C z6HW@h+C9LI2+N%tJg>Tsr8Ec89hrR}8Nd9%SoNeGM{BMTeo!8D2pH$fdYTaT_3?i= zRPl$59|>i%HgW6%CrSw0vUkIe#373IwzU$qcsIUbt}4xaqPSf9k4H&dJ3B_GLwK>| z{E=p}IS@l7gx7UmwQf8oYXXLwEMNKuzi-(=xHVRtFLOdIAErb#)~bbZ#7!$FymJWj z4S(&xV=G1V@H_OcBgW2M|E&K9#T>kap2y?lHaq!9et~rYfTB^@-~^0Dx#;b9L*>l_jHfqJ4SF0dAU`$5*MbK?`8Tpl|{n6a)r{ zZ+?4!uFKS$&eVU-b6EU*Vh4YBGfGy_jry1g8cTAvu}{+`JPI$j(d{}520he)rt6$`wDNeQW+~MA)GHF^0!DQ0Q`jBH_?!A2HSqs3N zSvhGOb5{(0i{dfhb)%T4uJ`C)FLUExC5}1A%!O{k@PZCPW#m3AV(N>Q@;vDKW2V}| zO0sybBME*MS z_iag<2E;$o)xWKP?|2VIF8}SrW`05uS*@`F8T!3l>ezn@I3y;8H2ZmKM?XHWweYwN0$pF37VV0&E(eHp&+idm=i7 z0{l)&X!Q`8;?8eD?-W#jcX|gZ;H%_dpRToo^l6tj_N?MzD!-F>QOq1$yLTaNyfpuo z{2IYX?(VEDaNl3{H3E(64`fgS+LE`2IUT=o>)}hxN5{xEq>Id>}6K*jD6?S zn|yWdiRiYC)^MMHSNd9rVTDsn741S=IvXZOe(a070j>&E*n51Nv7;qIF^@iRTkdrM znco~MFGzL?#_R|Wp1MD_Rp5J`;>zX;1M4Y~x^2e)jE`$cGpr}qI3WwgF+qU;-UVqmO63?>#-zYY2LqwrV?>-`A?$DezA@q1Ao_+(eh zmsjy_IjsfF#AfIn#E#W%vFHu{j3|gntv7%h%>#d6ooQ>;f9&eV-AcA8f%#{`qr((8 zq?b9#S+=N?^*xhj=hojAELg|Q?W~Ku-6qkYbCk-qw%xOr6xWmbk7S4Y5+^gz7r{L! zJ#UBD7oOsDT1#xQU4}~<>5fP#^We>63-UK-@ri}WgcKqzcxQ}XdQP1Ue9igpUqK_( zXf^%fKN|{_h;tKe0WH5#@dR41*3r=)S`|+_Gyd8=xyVj@&6>$YpBtxx;{BcK9}4vb z&uxpy$JeaYptgDj!Ev2C=VAiRjyWujt^jp!k?yY>dC~*lG_qm|5sIy|`v_yCJx9IH zPeDKt@##{Z%innZ4x1jFi!BdNjdIg-LfHS z-&9cop6G3T+nI6nq8x}YT?kAVmzuIJ-@iWBNmTWhoSv^zlvt(Gs4APnm|80Kg1qlK z=;q-JOj=@E_ZC~}UN@3F-K0@;vA00Y8>--CJr=97VBj%^bg3h$TXs-6g?07oe_wxP zvEZhQP?>ARuK)FgLDZjEave|a1mUs8Ppz@czm$>d_+1MxYpieD@s)ck-IbsB>^W3M z-q?Vz&90>%o=CpWN>%MegA$^%94s7bJ8-XAtrqy3^@4=|RH1yU|0SNW_S(qP`NO#H zow6+?;($%;;kndFR>R0|&)3s8XP}=PlBw}gazgmLgUFlL|AusTtQz6VQFf>~7f`Qe z7#e%@_KvD&Pd}Wde*|`PME5&7s7+rT8LGHG6~y>Q8_MwVI070oFGC*7-Eq3HTAa(I zc1{;vsu#S;$;(~R*9u9wiM;&ux`M8KfO`C305L(Qz{PW#k>p37mHlHnt{)5H+H^XX z{yRmnY?0$JzVoJ2u+iyZy8p)JPZA4)GU&$%r*#c6?az*ivcxYh%1>`wBIkx)ENFqI z&Fxc&70mjdpk{{Zk0AzE42}Xna1A}TFN{Pe&*dNWlB!J(Y0l5Wa=4=MBJb6tV@#-0@Z5*@*gh2M)9NT$0A zkA&C>!fNPOmoCPHP3YS_nrKd%yKLTM%a`u_(~5UFj*SweQVRU)9C$LvE-s7(>Jhfu zOZxxy?_18Xf5}J>c@(LTE7)bHp3fe`en803{Q5lJq4+KX@3JM6PfYxg#Lf>E^Yy#K z?3T?Q)v|-L-Sj})`IuY)s91o?|0iIfnjT^ zcBtqJzckK;KZL--D;CY(1KESJh!gC!LADtQKQGg4cv8-&8^!(ufX$j_W8d=)L@(VY zR&cL%8jiZiV3AL>N!B*hG)+SlH&68~k{pwC@n|!BM2{bFT#d#9umX zi}mV00ed`aiO;*Oy2dQmCr)@(g(*a&3{+| zR%`zsu4ZkmMhK}%>b#vg1^`<>KIxd+`EQKT6X79e*wV1hi*%=1k2}H~Oxh58cXEs} zZ9lu(T(XRQPl=fUSOUJ$f+7Dgc~Y;lVx}3|Q)}8@Y@)GOY`}UVveiCO;d z^qkCh?&-1m+{x1yJ)wdFk|Tac$l20AIxU=Qn=afm`8r&X(yg?mDK7cyBlBL(oFbw+frsb&7v zih-qXhxn0ystT7|Y}UI2v3Oy)x?&dSx{@W)Kj$s)r2Vk<&F#j|lwBf?Hk|2~039Uk z&!x_k2Skm~CVTXt`Lv}j0oUQzJS>f{# zjflY}UB2_}3zXT#E{>dRqbBFbt81u~IgcHzCPnQY@b3t=MdzxsPtMPEyPX_62IM-X z#;K>cwkf4@PwP_krFw!WHOyOZ5&ug3u-tf72XgP#bj|C~1H2pbJF&o%2nv^{&8VV5 z`?NzIffPD(t#^z&d9T4st-qM;wM9-IT(%q06+R7_)cU7K`ee*N)b=?hG`z0msuw*Z zPZrD!RcUz4$%U?fZlpU_+@7wOj3}>U0!)yz4!h6?V<@)++mnoKW5Wz=<)jo(hWY$J zI+L}Dr`K%;o+Y@jM#A=nEO6zFZPkGk3(pJb_JHW}`uYt|EORn96fYIPgDQkHkl{6@ zxv_NsuKY7bh?n3nko2ro?3M8f7iVHhjzs(@OStdt0C^33Y`>#!Bg|^qrJOvkqFqwq zDZI{=wa9x?mf(axNuGrej!T{dHLl-_^g=2fyqQFiAw5D2tsmz<{f84RZf=5Njxy$8 zhf(kNjcfC&ZWc?Iy)EG3ki+x*M_J9R;TCmdWys_~IjM=3pIhB+WzjPa6ABwTz5Wgv z;4P!ylug>YT*9x6%^Tjfk0!BE(Tb0E=^kP|ial0OnK@a-U;donzjTT&^+3(GK@}F(!vve=?TI4w1Av+!O7U>H!Y%Es}O#a1MsLdHL z^gpSdIWE;1v3Bhit$hAKq>jSM)&?V>AlN%0*oxM>;(SNE&0QxX1*%c_%@zNda%`WMZ?VV4qFzKy(5hrv#X}2@2b}=y66-r3vTJ2%aHt) zAE^>_U^TjRei(nfrh=;T66!5oi`tX=VV3UX-~3K_*zGd4$)o}su<^o6?&Z2=Id4$w z$?f9zcqz-v{Ylj_H{_ck^&4Ls@W7EgxEwczX1EM#rx9x=tTM#viw5Nlb;tXI2k<8h z3OE8-NH(ttI&*bq+~Yzx9&p~9T9+P`*>!YSd0YLTS_{nMoBCJIh{0&Tx!(+u=C$kYP1}3vuBCbrV{_AVR)I6F5 z1SoBrrFy#z+AwfVevZXnv5TQX-F=tMSrDiVIw$j(tgsLx5%@g$k-jCtkiWF#Hk zuGBu?)p3&X9(uTB?Y-9C`y4Ok>DyLL;xzJK!BB!}E-7Al3r$I^DTr~jYOEG99?E7p zn7hYu2Mh(+K+6Gjq!t7H0{cN7uFeHUw|n=pN*f*{Bru0In-jc#k(p>lH`KIam*e}- znss%5i#lS68-+)rhe8`IFs-eo-51rPJ^A^$56!m$TrrE$B}ahL^~_1bzdtoIQqH4m zJluPh1LsvbD~VQ&4vlO>*v1XCk*VRx_~!NxWz6XS2EqcJS695gVmg9+*$owf$6AIj@zp=Gt-)M-==uu-?hK| z%`YB97doT+ofwy2D6_Qo{w$~)PP+r(TX`3=h+>auCp69R#p>c~)al!bFROQG$O^E3 z74JBvGG(6sdTiOo6kr1^zZeV6XV9l+1L4Gegk&`RxAG_PjCR!4S`qQ#1Ie1_Yb(+y z_?O@F$pmeSzUGd#gS^uvw0C~$q8jDCA`{9!D-m}7v0Mr~5_iq?E~C?`GAaGXKfI-@f(oewk*4%%co(XqNuffiee$8f=K8k7YmQ=?`vEd;ZVqos== zN*-K;9BMz%+#GGp1(Soqz}#Q$pF;zho+Xx3#BJ%{-Aaj@3@BpGCWBdv(0suhJYyCc zt|WpV&%F`O(anlEmQnY`FK>5L8YSRetjqP|jUMJoO%Yt0*Wbd9-5v`#j#QPxkpG<8 zYcfwG_IvLoOdd3#oiN>ki~iI_Cf3o z)8#TIOQR&SRGVZ81^6>|tDZxPx+!NE4Pj5ePI$?1Xs>OWeX_XVaeqyzT!q;nK7B?a6*OvU%?z(r zsh1|N*OfgMI*g#c1TT>4u$&JVJxa*hQ3~E~oV;GHyX4BX%K8_-m-VX$?yk%u+TO>U zFkXnrQx_|4G&(Ai8I!hHA7C+o$q7R!QE&4&;yA{z*}VVV!%2>N<5=OG{@_EIJKO+i z4Z92)gj>3bk~m9atcyH=eRlATvXfYC#z=j6UKH(h<)k$}ER(5zv}~st=DPz!u2UN1npE1t=Ih z#N)BqXsE@&^=9!{QK9M=#KX5}a+}Bkb8;_ZOQRpNLao1R2Qn-mmaBg*u7fcw?KVC3)QaLN{yBev{wv91O(}NEPX{^WvO0cQ@vvWw zVKjc|k_UJyeOl**-9^FuuY*YTgj?KTAntqs>QSra@a2Aw zFwjeSC-5h1>okX$lD*#gF{>eB`gN9COX)OaW_SGJ!+vqcr9M}cKR^u+ONFJiy0NqW zHSU12SeI!YZ!r14 z#7qhG@Aki1zJ(VhM#L{#|BtBm3~Oo)*1zeflz@mJB|%Y9ktV$cMa4#Oqk^0~m0m*)p#}&f)R2$_UiLZvbG_f!m-)^8tZO|p_sn|P^R0|2 zn0Vw8VW)IO4Mc*3Os*+olNHSgyB^Fk`}y#iX$)P$r4Mx6;%<}LSdp-1hsv4ob$ zQn9AvAaj!g(pgF=H60m4$X6{3RCatiQ{72_QG#7o`_MW49A@RZz81PYP_P%KVfNcG z@E!7W>D_h1R8de&Am}#4ftp}Qo&V10T&|O-qgDZ`>)-aTz572efXJ^x1~=7Kh0+kF zwmAPgho9P3)29aidi)YXOU*ujWSw(b>=J_Yc|Ur%s_3HhK`biTbZRSU$x06CAmuCn zGm#_gL+zKUg?`1P``Wl&encdY*A`RQ^4oQJo?l>AHE%EZd`tg z1G+apv?>_6@TyA~Axsv32F-7b$TvAeOn5D1DQcxg0W}AI+&50;4rrg{jOi0kdm}Yt zjlb0lX@+j*zw)^FNwXO``&8$f{eLJ-B&VT*It!?#Z)3l9gu8K>^ndpG7Xnowox1Bc zlzDRixQ)eVxg~7h-ni!CpJ>17gerJdH5%n>5C98m0=qiB6lwg0f%#rW9Lln9;gwFQ zEY@S(8GTXOpwt~;@r#>V0@aKw7NEn2LAl2m9JRQRA?Ub3?~t{bP@hDPG4y%sMiaq# zT#-bc;4aN`{e5`bhlBY#href!P^W6)!dPiO^*5G3MH+dV`ETZCw{OP)BH|CYf0vqM zx3xmaL~Crmw*EJo!!a0G;a54IB|dXhI?3VQlZfKl`ws=-&cbRv&#;{pf*#|h3{@sD zwL5Dj7J#c2?{>fbDbCQ z9C@O`ZXSh3SF-RnSxCMnoKoV9hjP{=mm36AKB)Kr#IZN#qdDVC^IVYFPz5AbFAi-$ z$N6RAYg(YQ-jxxEQ3*Ni81~Ixlinj1zDsu(>SF}NBJDzvIrEN8bbd5mbD}cXcR-^z z(RF+~FW1$4&q>)amkQG*`ET)F(Ijbk8z1=}Qlz!k)(bn*rNSPAH~5|yG`At1TN_nV zitmO+b)7v`r&$!puc3`m>B0?a?(bpT5W6(8x161v7gOS!DXYf{Qb>lL}-#ay14`nOU zZ0a3A!#tHf@pW{D=g^m=3FN+Ci1&k~V)kHOY}Wmid+A0m_6t@+X`2yM`>9IS&9;Km zp;lOh8sg~>`Q^8djAQ%xl^0s;IGlX91{6-8-TOGh49AHl{Mis_j;*GAoMRE~0!C$3 zgq)xI{RjXgr5N3<=%YW@<#O*0MxS9btaWzWTjD$9?bZ8tg(qd|qG{gBv8odGJI}eD zt(R(6x;1kf6&6S0uWyzUtya`tcyjjAX|~kl=XRlvGJ;TzLUO%%3}aiWE3sj>VVAc7 zle^|AbZZ)rs9?&KFO)eg1)6D;(j(zyP!blr_fRswLiq1y0eEX; zwz8ncn3e4bUlZ*876OVArpec_35r{wFl?n;bKuMRe`!{~`8%k?4q@jqmI8GEvHnbz zg0*?g59nF#b-OL~h0yv?AI8=6KCeZMV-j&qe@r1ZucqACgg)z%r&+sO0ygu4)9M|J zmYRi{jmm3Kd+PQDA~+iK5(;Sv1ilaQREei>rv!*%}-6V9UTa>GQ@{ zrMsUiN4Sidy0rMQHpPQ-4YpQW3g|W)Ki>C77LRD-&Vu>Ny);huv^1N_n>C=soDLc* zi5n8#0*t24?1*U3)4$Mc<7D}Ukb;2oCD{tyj#AJ_0#^6@g2nH?XQ_8yif5XtfcV2Q z!!!*dM$fl{V0(aO5B`d^7?u2h33>Ls$i;T|y`5Ph)Gb!f@le$z{usZrV|Hqt zuWyx1qi2|mWW_5IQrH-s{!XiQ2IE`KZeiGu@?yUqRpU$dNvA~ybQDbsM*6u!hw}Z( z8GA*krZ(E;P!FQ${GN;*BHnep)xIs9Y3i)o<302-8#jDZX@NQSyO9R~{#TQ7?F3ZA zh3u|QN~O#>5sQv%tY?{Xuoz{X#`^*}{4+beyR!8f^XGo1q9VWL1XDr}5>Zur++j^U zzNylw+&gDykGetsjM3M=1xbS^^2Yw%2mA&2BjEdiKqHLMijv4-b+qx+o56TN@;}W; zV(s?T{siOVGO{@_(8c#(&)9q}(EF%w6s|}pd&z(YsUM9KF1Z|e_`5DG|15T>DUgx# zApdFa$`jo#hM(&Dx&Pv<@@eYN*1gXEV@P^IEh1ymmC`G%L+ zy&qz?@(%4ryx2Amde8m^=|(=O0V9`r+)zXHV=(>mU7hH|$2d}W zz+}r5_IBGXtC>5l7elAjh+rAiU4G#7+}?uV9YyTug-O^ysah`G!;*5?ELuaN+yQqG zKzo}0J;!Hm%qIgX;QVq+Cc^OsE^&k0!sxBz2e)Zsm*N%O4y~)yXOhYrMvEpwg$;EX zTe>CLMk7*f)AVxz8KvOip(o_?AqwBNb=|o%LK#(F^P}XBRbx<6cC+J3QH>i@~t%SwkHNvD*|yJ`|G&V z3fn^Or1>2fm5ZqP{fA^*Mw5t_c#!&WDtIoh*urJLwa75aqSyH4qFc_#eVF2@Pe$qRon=M%8EuE;hHnm_8N`LP zK7UK@x03n?vNeFixEv@{_-}(-YR|OfnNH)-*xf?IwVS2KpnTnD%(->t-3|48EKqzC z2YxFg;9H|FRr1gCe|dXwy@&n7AD_e8$^K?^uIj{h#iVMNJ2*eb`|R5+<)yA>hC=5| zfCRC)0DQd{!;pyRq}e7yvePdxE<)_qO*Vz+umpXH9c*4cCqVi^f%R;|_snaOkHW_A zic81S{ZZ8}W9?Sju9y#H4J7uqP_W#H-BJX;7`tcx)$yMMbE!)SAUxW zNuwK1alTv(ee-APMjde)bS(mQ-C2=ox&gYm3JfWI^;|okUL2?VK=%{lhS9$yqHd@V zXTafR%WrH;7{4dO!>G33tTP3C8_nr-^ie1AzffLQwAU{P#boD_P&QGEP2h}Nd&o5y zUw3%(kyvh$jgltyt+_$Bd;ND~jV?^Q`vs_$UGpA?>%I!uid;AK5U(|V)@4DoUDckT z#!*e|lShnfMHZBo0ZRK~3v1cY*K?vDDVfy7`?eaz*;mZTPJvAiSGeVtiuXFP*o|L| zk5fT}n&?(#c{F)*Jt^c({i5vMA~Bn;r!e6|{!>=?__`}vGv!$S&wesFTf0%EH54*( zE2tZPOTW*auQRFxw*&`u5AB_P@qo47`1ZyX!&k5&@u}`Ccx47bF`JW1)Ow ze-DsdX4t!SzLTX;DM`x_F2o^7Ob8r_LX zVrUVx=jLr9hw@T4f~j6bM@Ft6sTb^WYU9UL)J9Q%glD1-9#C|sY*4wa=eHWVmcgN8 zO%A4|xOY08Ahr2ozO?UyO7HF{!8+2()T8K(>2009X;$q0reG9REqvZ&)^>;Sx<>yZ zq0?&~*cMVw$y1f5XEz@2)IysUa|rK?eo*8z;sGSCxga8oy=Ta~<#W@dIEU&`9f{#| zvAxzPMAt54LO)7+gT88YAPC&s<+sJ}1mjLusz2j~8hIj!0SPh!FwGqpS`I zRnql+B>nShS|th`WXKf0x-JEu`{%8Cv;Kh^9Vp;DG;_-V8!|BtMS8GGNYN8R&VsFLw&PgVWm&uxCk z3j}Z3khvaIZn~?nvQ4JAXBk1BOejxPHK4`Q{h9Y z-xW*Cc)R{vxn83C*uh2L)+#_BdEm-1(&y;lsixXlNRKFBvA*px4p)XJGgs?(>?n=9 ze5`|G2OWE5OJ~8j6mnlwL~bPWU1cX-ow(mu?q>!G4V)Pfwhw_CeU#2`j7j)dN2rny zz|tDSdkzP3L>BSc)EI{y3i*q+B@?xEuYV0*(<(V2-puFdy6F7K=r?}Lw2U%j(LUA= zP@B1J51{KT3EYt$tm6MHe^z>0AMYXEYuIEYl)wAotmaCyun==3xZP)$aJVu*Jh5Vk z5$cOBwnOPf6GsMsxy>h5SA2Di`xC;pEp z)H}Vq=Pop7kor{Wwj6x(8ef~WL2P;b`ajkL4ol;Kx%xU3+ms!($_NtU5XSOaeq7d3U7VDg=YS4S};sfSy-F22WUJ@cL+lRd9LLLD5RdZsM!Q`UmwZC2H?fS6ib0RRq$F-9hG6s{2`s(FLi+)5F$` zyAejAi^s>bTO__zd8FzCd$c~z^pnLyrVToIGGN8mO_?1gVPnuU_T%1T+Z1*yJRTE0 zfvV&yVX8bj7Mf>t?W+*3`2f)59kE9^@$3G4B{d?2_>Ad|kirI^_2}sXZKS>jefL-M zvFo`xtvh!MgL`Lx66Jl6;yxcewiJv0G#a^675&hgq)svLGY z5Pfs*IQtfZ_v*0gh=V#IXX^>1JI6O@e?#Uf$A4J=S$v|b*#B~_o#lgojG zu>8s@t2h?tRYUDH1sfoRc*RN|$04~_T|Sd3H9kU7>lasryXV`J%biJ7kVghI5kv92 z*e^xYkpavt_2ybXkVbGG0M=%9DX)?9ipx1PRE_(alnhR2u~Y)xsXhvf5oH;hggnoG z3b+w@yfiV7s)nx0k8Ki3Xc%a1Mm}re8JS+zd*{yW6Ri2T;vL(SSxhlm4tGHk^V6uL zBkxjP#|NZpzffpX1Nw{i?GjsmSkN5tRnfL%4z*ppy=34gU=b%ablW;t%5A}lT(mJ@ zb60Zj?UF4%QUMJru~oy1!49`8GvDiz3jK3?}0}>m|rZVx(qJEj`SlmN?;QTZvbESyOxZC34u2=;XwN1&q8Bl zkAIHX#It`eRdIcRo&QfL6cvLMM&L2><(UTOv$&s%DA24;AX?>X?Kgj3N$Jx46E3jx zD*E7^JjSqNR1D&yey7k&lrHiNr7Dc%;I`f*rE%MnG2!&Ga!Mfjg5x=JZ|}p-%Q03$ z7<+ck_R>U;&zl+Bs2^g@^t#hmQ)zK989y9SHAHahAhPMk%96L#t7TdjZDX{w1)zne z|A3P)vu|n|BgvcdZ9nP*!evT15pA1tJ_wogs?W}3V~|FhkUcJXe0 zVy(U-p2@bNff&$5_1$vX??A@0gRKLC?vv=v2wR&HCc=KM(x~+9Y)axx?ed5Vn{h zRu=j+>)84Qv+J&wOId+jlZ9vSn{3Cvs2CN^+x{Jqxvj3~%T9I|ub>Q)p8(1bXCOW- zp_*Bp29}(Ug6{U{VoD6ssieshBx8nDVRNB}gOhUI<_u4+$*<#FC*OFZD<_g?)fgjW zi&nd&a;{cg2Kk(hJ69AG~=6 zaX2j4(w#FUDObtnT?rAE$evmm7F5LOhsF7Cp9%t2R`m`*k$y5_Fx@bEFQE3zX?>dk z27dbjmP-w?;egF?KkRIN!b%pBbv$ z+ZfFFe)iAU?=&2wu9WBwZ zJ~4B-!|HbIZ==&iYEOnr$ZF5<*F?;X`X}HDM)Ly;u=`+S4u{UX{SaHsj&0z=9K6}A z?6V8+I{DBPq(wiO+BZ~(p1}jxS=iW z%JEfimf$z|IUoXhr-|V-g>8*!$2y*~lshA5!U!zcDYw+5uOv&o?7^S?M^MISBd#wm zKbq$DSzWbGH$#Y;c!PPGGBh73x2X)itr z62crHwPX}J0dYo-eSd25Sg)V|@IN++hZX-4U-w^&GsF~xC{oo86M!;pQ>s5|-O1|N z_NW`af66q|epIs8UsY2-D4FN`&F*TAOMU12sCFq~S5=r7F?_b^=UEP#dE*#MP?6># zGfAHyM&ri+%xi%QS17@D&NIF6nI&cLjcr4ln%*!iwdc;=!&iob0i9)b_@_s&w8M?F zQvrk#u&cz9N)Mmo#?9LmhtAWwi`)3IpHHrnlumVi=yjoOSf+f)3jJc@AHEwQzE)_4 zyb)Q=QskbFyKfj%?cadD7#BQ6XICp=l0{W^c!C^OxU?K^uIKXab!c8LI?nw+qobpsnU zvz*I|IswSVEtKT`V2_w1zdkDa3#o5xYJ(V++hcujm6RN%i_HpD-$K?~pYCJS8_W+={@a5 zx`UzV2$kH>+qg`GXC0O)lE+s0qWHmkQ~Xf*B{O%W0p6)FQGz}s9<$2$&2G(8hsd8z z-qGB`L?ABTdGt`4=^;6+7c!HKiS3BF^_1;W z10PlQOA4|jZ2UeQ^BA>%A#aLxEW1}m>NqX<4glz-PkoopWkWdN8GU6d^eavCbbGc! zMl(%f$+W`xEz=j&@5~gtUvq?FD0pp{)@kP?^rgZ^lZtF5(=%+@#|W;I)^yzg?s+6<|dt>?6X9_xSFK9_X>hLszAxtkf;TP0kC z+Ji*_+h1B9n3LvMsKB{@rncTyMzJn=oqJ=Y=RrP5zO0QZ-_X(|vn%La#9^f5clvrOvRMZW*H~jh8`_!^zA}4Sc=8hn?Ce#^Gb6~i}4!1Hw!v+goDzse;wnlL2 zZsuvTPWTJG$X{LvWgF8a`2!!L;(`U*FCZ_KvPI3JAF`mNT~9*OsBvFP^uJG_HE>N4 zmGD#YfAbcu#dvP2$cza^-`VC=rH*6R1|<&jnays?RcmY9qSZ^!Au&6W8&Av7{q!Sm zER>fnvsAUvHLubF+!@g2cfWXZLo}^Qc`U^N-8#WMy6VbGKFk-8Pqv63y@089ob;VY z21n;IMJMFxsh9=5BWo);s$R0a<%0!4>-fubJ5#fLa{K%HefH)5bUc4;E!B2hKo2*b zX};;;|LHaRQxV>?R3BjMAFR{cjxSxOsXWxAwRxo*vVcdTIk4E#{ezefe=`QLy?6C;8`}%!r=iTRKZ94<1R7cMOQb&JM{W&l#DZpThw>Uh7#&%NF;L zEk**hv_U$cV`x3Cu(Pc(9U9KK{}=d}B-+cFb^NR&XO(jIyl;f~==dp>7W;R9$%l?I z+#?W?8K;9OPi84hlRBh6;c43; zzz6cIIq|WCd@58zn78Y3)9$g#gXY`qANZ@d`@fTJO}67-o8`mAef7iF+a1wr8?AW{ zWez*Xwew!}aiG%BociMmEsYxv-PYMP8~L8YO4?_F-insbo9kBw`Z?YG3$)2j=E z#7}x=e4SluqyHL_S`ObdvE7^ojv7PXnVyxsvnZ#LYs8e$pdhm;@lcL#Ci(=<9lbE& zEt3}Z5RVQLNGM%YSq;CE?O52E(h1(&nVSG%gxETl{?7|=1c!OQUsEozFK;M^-%|i= zj6n{5em`?tFMH`oF)>5^lVyG9@>83wJDa+Yey@U0MtI)|;;*ERN>FS1*miqE>|h@i z)e?X2j^A+q{(pdU1hHt#d#>}z>w68RvI4uv!*(3A zZyTf+K)-Oi)H!6ltRdhx{(W>!dZZXqIaE2lGlvDr(!KQj0oGbudce`2Qsqtg90-a-v*?!8`*RrAp zmd^Y=^sQ1{lqmDQS8>)u8JW#yJ&^1Ieb|2I=}(<{kvx-F*-I=Do2-VL=wJf-OIwtC zD>pZxm-9h}(7BEUv6$#L!LN#6r~P9AoD%kxUR$*dnk$SKAGkw4I6;Vnan^DWHG{_b zhbnqmRvpf{CIvbMI^(+&uOA9%$D!BImcn{tr}YbJl4vrSzalI5zqKx7i{urUyEag)L4*_vNd00ko zCJ$|=`BfV|@BezTwz6$Ys&Gd(&leDQs$UgHkLWaa_Cop(I<$}6l17|hwiLi~%G09$ z!0Ekr#Cnn$a2W?f(nS6`QCkiTe6u=r!vFFH<1G~t{S{ZOXw9x$46sq$@=sYWV&j8OmTDH- zFg?1q#&vzj>s9ptr!f3hyr~MLr*V{N5y=DO-@RCN!JaK4#sABH=nu=>hl8Fc6Js`n ztSUfoG>WdAvK6~gy;3D#FU)hmNd;F5J_83BE$APWs(#Xz<~VEfK5j;L{6@yiVEp^H z8vP@ULp#||K+pDG$2Y!N9F~{}Bwn94VO<;U+SWA9%#b@$ z1TAtJa*)15Dkvt|Gsh7uzEOnys0xJNKKX4Q9J;sFcWmhLZQ0gC!;B&?X~a4@BaA(I zm#3yTgMQ5ZZ!H@=0#i*4RRWiaW3r~CXBzhwJTIHKKm1=|=zLl+{%c)06~i$T>fKgE zgA}B_M!BFJRtyp1mG!Gc6fiC5eAp@T zy{g8&#$9G^oHoJjV>l3i)qsFBYX5ZUT4D{H2+CrqknW*hKb6KF|3h- z){JeNOxU`ShS^<)1P>Jhji_dm-2~qRCVVZ6{08YXB(og(xoOQ!ZHDJi6lP=bi7`IL zTx)W)*xdZ0bmqmrJSDf7jU8RTt0Q7=XanpP6*twC$nzZ7r-qZ=b4@#cgio}zn?7RY zOg&RgpWh|Y8T*g?!{>H8?E+A(xJviLKSu3!;f7nHa-Nf<%Z) zPKut~8v6CoixQUnqDNN-fo^tEvK7b!hmoM&D{gQDzS5C$P~boqV)$4lbd|hE@c=?Y zu*g$#-~J`5X)sNvN@8QLHjz6dqmO%rQ!Qxp42YA-VRk%Ej0N0|VqGO*=}6+By9zO_ zY#RJQ_)9*3E-pIYz0xE&LnP>qnEm$u`9v=#q72$`{tME=z){V6D{G3XL z8)Zu* zc+7s{vYZa-Ms8!SPRaYuao~aU5##U3hcV*d5D(D4y)>orKxz=UrrC4qW34Vk_Q6tS*hnk4 z!Y7c^(eTD-)##j}W1MGkyh@6K$n1o-Lx#Cb1g^#o#zm@9yg1DuFY^hm=`bBIajme5 z9wlWY3e0+?WnRmq!BrjSwzleYeA|LWpS#kJ&8@kb?nS?X-9&uw6uM{nP{+=HwJ>B2 z;)Ir2R4;^>>eQPX&yNkIvoAIA<%dy6uMgW!W_+oSCd~hAioxO{-mk$J25XAPJNlox zL3!4=cSrKYdPveyr)lrl=6)|LB{uGkA>TNfrN=g>UB_iI68=zrt95TJpU04^T$Uuwgd^ z12hlJbdg@(qh6;dyp1Bo>2!A~1!A1z z9VXtJnuH$pX@hgB6nP#L&ccOdG9{xQkoqzxZ0l`;iLO9GRay%0uXh23YYJMsGTh(> z``v*HA*e6hjaeT!VfmoGEOO+04BW;1gb`1m%4fh>t-`|TvH!RTaWPVV_BKz&|74EU zUJ)l*G&F0jR9&^d-xh`V%Ij>FC9s~;OCy?YviLk57Aq{u#vbnA% zKA>8Z7e6h&%~2BUy8;bj{&!Y-LyIq$t#E2hw|q6tmx^kSNO;`^8lrCxHfjH-702j^ zv=sA0)PHKJUAZ3BV!CBwZ}*V(_6fi0Ux=&2ZK^o*j!E6FQ|Q`j04IePQ;-_@X^M-f z&GD!nh#h!)n};F3W-<>u8lky9vvDaZ$@As!zJV$^76J|5PZ&07_9c?epZL~i^kbca zf?U$RGv%1|p~MPZq=Wcxzl$q5yrqNVg%^6x=UX&~J$1@0tOxN@O2zuU&L)Hh+5s~r|Rc2K6ow(2=K0&mG8dq4vYDcOjSJr272I(c$<7akc6I){pTgddJc}e zY!`K2kxm!R_FGrVaU<;T{e2;Lx;y$2JF(SITg7gE0z3xk$Nys3B!m2CC#4UO0-=Yh zJ}NmX(Z9dSexy}uwTnuVj;j76zXGJ1F>_7U>n$zyGBDsae#`n4bVh@*IpI~M2*)3L zKnMe^xVjsOkk!L#o*}xv3ia=8mqIPjRBn`Sy%0X)G;^Xf>OOO>9Puy61p!CQQ1Xi1 z_ycQ&^Zax-Edpy6K^*urrXYG;$1?2W%ZGu8OnC;4IExB>G2L(}*Vxs``6;fs<=VqB zf5P_g>bE+8vr<`3-F%kx7{Q2l@k1H}P(zf`ri}Fj&$O#k!+OJaN&Xt7=BkY=_5zl4 z@u*k^c`#qWe2ukz31P6^?$a#*>h|?+q;qZn3Mwqt^|lNn^7O_+90hu*nyV%1mk#tM zL>v_Ir#P2hUj&kc__>66t9ZtXV8Dgfnb@) zm)-Ogv7$znlCOo8z(CD~*GYwB1ud);eyiJtdG1{Op{rB;6YQK!TT`GmQ}LpN>zx!( z_c4OK&T&dPi~GoCkw2^1fN0zZC`dTC-zJ?rBBl<{kR8;Q*ODHz#97BEL)&U+QlB@^ z4W7Pfg{Zw^?^X7`YJhn0?VggCy*+E^sZO7rO(`x_drj**Gu>btK}wqGn;+dWL0UGR z@Zi*=+Ogssk%hR|*)&2ZslhXEOemk%ND^sfblUIY#I`2f4S#8DYd8?BWUj9RioSzK zyuu>1ZsPv{7KK$UG&XH~bwvCweZNra6@zG6&ka8}icJF?Z`d{3NPQI`Vk56w7c3eT z9)dAoHt$~hoNA1?kLO$d56An%LK>%xR1lDheUs(7RqU@MC2kPtepSZZ`}^p1G{he< zOV9=Dr=)Q9a;wK_^V>h`@JZRr*`y^uzd|s#m&(=aIH<{-Z*?EcwQ8*Oz$e#kjJ_7m%MZ(p7?jYs_mg2Yay4)TbWq#lM3y6v4$c1^}h47b- zO=eF-4%5`#xXiiq;*UEKU4RY>Gqyrm-!ugVZlB_JvHa%p=5JcFau%F@X%sueDzl@S zU_?oB?x}D7tW*ERn&38Iw@dZ(?c3Bf9YdJgjj3iR8na5Qc76-!psz z*k!1ZisAKFjwr>n*8B0)pXOw5tkT1VPU{fsB{EpeDr#DGV>SQS#(#O~R%(I=j(Hy3 z8nMwZmCZ+N>KO@7XFyYcOcYHcky0X`Z&F8JbSq1TDb4kAF0+J~QQhD6fJt9PEoI)# zjRUe(qVEFV=mIF){(XjFc(2C?#kMLl#aUb(cO}1+CsA+OrYv3kou_?h&k(P+7y)0Z z`BO~tS>lyxwI*`q?f1Iz#}~Dk+UM0?s~hvnwDz*e9Nsfu+kK>FHAmj)c&(Bqpo%`* z+Y{E`XY#Ggv)T&RY!J2>tkMXat&dp}*AV8CiC~G0`WIDatIp}Eyz!m7(%==b_xE}8 z6PnU*KHBp;X&fc`pIB#6HO64~=^wep)f}5tMn&DiR`#3k_I?7Yx4dlQr@xgo6(5x@ z4hOs$3vOD?mF>H)uLt&KMbR(UD|Jlbmgx5O(ExBfea{43LF>&{2u;w7GlTT01(r%k zaZW>c`v`$=DV$JPAW$;$)C^Dld+&tQgiQ(14Tjk8shG6p{T*Arg@iJKAE>|cnaU># z$zK92#E;`)q^X|9nBZTVlck*f^ff2HAbL`lU543zD1HXiZFkbxhidZb9XAdL6Ti}<$Jq0>CGgD52@Z$nRF&BU>}Zn682!1UY3=y_9f zZVa!>$S_NwlK0ttlIdIi>$!$26e|Hv%q=7g?y|R{a*tr7g(KZiHi}9dSJ;PlQCd3} zE{SYIJQX44jAPec^hOkl_UoQo8ut`l2468)|2}!?s(N7Sx@ci(#bM4x zjz4UZ5uaSC{8$SZ?HqOt^5&X_;lcFzbwZtVV~h=hhdlo`cs8}B+YR7RaqH9zRPC?8 z@>x~T!^}r}D5+Mfey_wb|g6s zVVK{{6N$o(_SDS;JMWCIp;UW5uM0C=T4gHSW?aq=Tbr9|I#|aX`q}BI`N5>QcCo{B zz9@8Rzs~lwit`(f18!X*x^vRw;w1=v@tgNN{-<3&8Ts`S{X|KI8dRFQ5jJUmz(tzt z>LX_TI~Ns`x?Vg8UOl#-N#7xGueRA{I8>ZeGF^8LIJV5Kbi1zs|J8VMv(-%U*V+FR z^4&h&9z=>E%D>GebS=>(r21arP3K{o`dN~Do}_~#jdUw;_+HGf3+o%cdcUM>zBekW z?T1MsX>xYJwJdjD#uTj>+G1e(@^e)f{o3o@{?)9tG5>v2Pr=GDSTA}8`%O z@3@NQ1CovwUR$RArJ|48N;58Cr>+!?Z4cGO7~!=_3?}FTDUc;lYk2AHmN61FD+3ioYa;7WNZ&k|2O_=`pJeh$y?keyV z_?N0k>eOshM)cB;j=Ahkpk`P9HEL}|KL59q6_`%dNWtpB9Q^rDWrRebBGg$6nVbW= zwY|`_u}wwYCBweP|Kg0{Rd}&)PkQ6<2g1=-ebirw^58$RmMdLUYKl#;o1HYR4Uyh- zaM>AkI0jr?2>OPIe90GbF%c8d^R^?9Wl zj$AeAYCOs@Fy~(PzEs;P#)^HQ~N;w|+;PX(PrNcl1_O?XAGF7>|rn^zF2c|BR zbis>uh+00FsLrJ|YqdXnP1UpJoHjw}p17YJJ>&gICZ-L_h3hT9yB`O3GGPhA4%m_* zsxz^ff$u@hn+tzohf9*QCqrjFd><??ufseaVxk!1ZnnxcFoJoxB*pzS|}lQrcfeHRNm^>1Us=6kgVgiR5lipPyvHk6&S8o*f4Rn11{ z`}1BAvcWKfwZ$Ynnd+#yrl<^|SN1r=e1fdGy{*JV^5JFI%J)$g1@^&sU>W!V`hrB^ z(Jk|e2(~XY^tLXw5w;7XM}PbZ<0nuD!0MZt#MLs*0V#pxfNQHl(Xm zQqKcupyrLnm3kcCKQ4h%>50+8njzy-H=J7dac{RjZW;kotyMW!J=y%udkEu4&ENSx-JfiC#<*~+lCH~VMN*|G7oIQI(jW>LA(zIHB z&5ImL6Lz7&GP^frBUX9twaF?)`vD{qZLn%~Lw@q<`sJo1Q5}3P9om-eq`E;(8r)O= z2Fdb5P~#R~FP^aS&hktih^rfr;vmI#bTgi?^6Ny0AesM6c|rM>e`Tj^JgPe;JAX2i z5)n?+o@*!D27umo^=f?st&QP19P7LlkNjAYwLn=?;*x=+)%<SwJfyi1MDHKmELEwf`9&ji>uhAxKs5#SyM&7#c+$m++2P>ON3)3|@q zp*NvwYqI5`dwQL@)15X4+XEs{^}(X4wQ}Ukx#w3yU68%#EHCSY6d`0%Ff>0JGMTW+F3nT_*>Et!S;mJh%?-_q=ZH^2v{Q2%Mc z9xvh*5$^PCu6UOc|*djru^R{zQIyURoOEfEU-yZvUh`W;gWUO^EJkW;bQj)SP6gR zzYH~Be1sQh0|AW_YBX2N6@KEYG?AC3uv88&{)==-L~(y>Rddxn8~ zy)ct(x%Ep2HR1S$nhf(v?H$7FFX^M1I#a`m65lX$@8^6K9oKCr?Y60=s_)5^|5V{@ z5Mq@NN4qtSUM$%Uef@u`fL=enbo*!@J&(5>zFE4{sk5uS)zo}<)MIQs-{q>AV>qrh zSwFPNKsBJ_b=#&FiH3^Zc1zSM9m;BvjUNzUP%=#&geIB@^VeL3?RBc**d*CJv( z^YZ#cdkf+G77wy_Eh(H45et8PCF#eYN;474kt3q-Et=^^|J%E05yyBc?}CYl`XdS@ z{_^QK+n@I=>M?{E;$(G9E$?rVS^$72*R=m{Q^dD(?ZcWQuAIH*tx;K%c3 zg?ywAJmGVsK1FWFk( zo#xt_>@5L+R@(0+HNe6?p$1n>-!%xt-K-mOaefOWnlwXu`K{5n6=<(de?+B&pF)?xH2 z;rm_0`MZOGDSrvEPW8ygDe@eYHm%Ft@5FQkX~5c}M^YCl`#*lTX$H_@TTy>R1uf5f z6a`Z9Mt*qw^jN1ZGj;G-|A5zMou$M6yKix!sA$LeD0bV+>w`5Zrw9Ak zcPYlO+{n)vhGFlbf_*)h%d-g;P~^h-ep5@j|0B;U%c;h)`@bO%APKcnk$}&29JsH9 z){pcEP+$i;UUT}8G72M2k*@D$GLojSo->8sMBwIGNnBjhZ1C@B`pG^2nuE?i@7ANS z2Yxqp`N`n?KF=vMct4tQ6!t84Et0tlcm1_Q^kJ);%q7>&9&BEkLc5|4_nAJjb%%_a z@cKYDNH#JyZ6g2O@1SB7792VX5pul|(N`QQT`S#f3ehB^|0HMZ$>!?dO#pyV<(1q& zs2Vf`!*z{${~%a(qL5oc%N~Ck#TwVVCppBP`F+dse*%WlF7rgYd4miMbQBF2mI?Qp z=G4FCmHUIHu;FnVk28zk?Q!(*>QvwGefYPX1nU;x1B~vlO=oliPD7FJkjt4GBbZWe z5l|c34P>&R(r8WsL$_d4=;--{UK)55qIVp6a_|3-cLq1TpA8@yQAR&=_PQ&&Vz zx%{6OAYq_+W3;Iu3ad8u?kpVWXwy)^{lP&60>;E88-?w&56kN~H(YWf;`#Baou3cw zrj?OtK(1#bTrjH^y?!6yoAUwq|55cO{!sn#_qd%1?e|+cem1UA-H%U^q3CV6OWeZ~;>)2;7%nV~Tv;Dk3pU3z2eSH6c`*@u5Jonzmectmr z$A1MM+kSz3q7YD)hZT$)iF=IBb?G<^OVgXU+< zX|5yNLAZ1S^&!0chA6{si+6A*4%9nLqJ29WUW+s!0dxMmx0{dP;b@_W^>k~&j6N62 z>kYm%)9#FbUSGB&;{>*G{uqA90ep!D35Z{fP^(3RS@`eV0?4G6t9in2jaQn6jq5od zK*67C&v(r|L^r1`IadZs%yHYZ97Yjs8opKSLT4E#e;NUGBRKI`hvWiaka*1%S>=ni zhTg!oc6{y{h+$ccQV(ReYwUL$lef5$c`Veod}F0ao?HbJJbej*kn?E=b?waF&l*Ar zzpJNs@-IQ)KF69c=ba&s-cl5l_>dlXDc4aRBBw(HRLhfgtt{3&AiQkM$A`YAP>G?G zRvozK3nWz5re3Y^G9c}wH9xA2lQ`)MQC_^lyvccr0u z1oC-h&!(i0Qkyg~87uj_kfN+8|D6BjdVS!HFjg=0&d}qcrCXA;{`#||ypXTf;vIRM zX1$-}t0C{Vwb(CpY#EkQLFgv7a+tbfbuayE$2Y?6QE-6RoK5fxS8RsOd;AP-Ki*$= zIh%PRJS$8nOmGg|$JpNvUY+b77u-WbdAZJ@^>~Ht%fk^Mny8uW4bg2W>TjOhyjSO| z&Z#TE4lM41jNJdklNb%ebQF=>3gIHT?VM(_*VewaF^rG=cy7G@0cBv56e0Ak=hM$t zZh(PfJwzM^a~a)(e$4xOuTZm%k61S_+>Om)eaRzk99@JgLK&6rJv@GiOYnb|%N$rspVoi;M z|8i#VzQ|)JJc>dX1Y_G(Awx2v z;fhdMfG6hAI3g!{0CuY`N&~CIm`9k7+rln3gNSnbbYM>>ip;#KZqRXFgL^yRUh=$VG3a=V1CW)vsC-J{?b9 z=$^nt9{0_c{hh27?${3( zO7OwOcyq6YZR$1rYZ3SAX#ns1jZD$-`9iJ{gC8g?8h*0&v%mU89GzKv@RKGy7@9!-}9nSRs$-dA|FG;Zw zcyq&tdoaI|({<0=*;TZacyGjubpz$N9%3~zYx|e)l&VIZ?=yi{-<(~)LyB-UIc>Xo zb3bG_ZqL*eh|tuvCu)$9?H3`tnx2g1=Pijtzv1VP`ycx8x4v3L6-n3yiQ>y9pc;h3 z72W1z>2q(I7}-?*A1YPT8vh4J<9Usg7NYwCXZZs~v%;M{VvHD~6=#^KF3-5euxKuh zydaX`^K#Z3db~%z_6@Mx%ndb0dQ}+PC@@ayIT$ILF8@nELq3`GEO(`VqK>xMeiR@; zCQa{TL=(^WdNFE51xCR$$^^SIj3>B`!}OU70a#PQPXU4Yn{Kq&Lf0>7?rfP~esyQI)w2yoPTR(3r~=wtAkj_< zw`S{1p>(#DKT%&afzO3|o({r`k=i)}MfIMpi^eQ|!9BkwwF%M3N8a1anxzerp=O4s zVXS<45r{a68oOaa^O@1$2)*E|N{&me?T5K6K7B};VHijgrJIF6vW{{dDEgFWnciV4 zatUVfEAexDb+vrTB4Kl1+~pljxDv?@Zd4ZpczZ_?f`gm}qa^%;(9pQckg@P4T&@^< z-`bHYs8>yU&_LTFwtT~&a$)&%BXAj46^<`;N9$fbbm4-g&c?Fx!f5OrPBlT5F9z3F z@*QrDJsaA{X@9#wMWCqV9U%ign!ty4LK#7s2Dlm^4bb=C{7S5+Xp%K^Ja=On6SbiZ zl1yrd)2fYp28!7RPdyBwsBLIM3@`{(8;Elh*TO{Fi<@~N8UqPA=g_7sFDATcd9Tse znPBypKDK~d4#jBW-)aqTV-yxmV0i9(Y&neGa_4cGd5iGjk7;G?|8r+t>;T{Qe*9=N zV}l1az6_3LkMEPzNdUP7|0c4!@NhwbdIT6czqR}?!bAMI>Y$;4ztBLo%4E00;cR6% z@w|^wZVr32#)&>6N_x@oDMI-7S0;XCq%2x8>du({bFd?{$<;kv%E5OC)suzZ`dm+F zA`#>8UnH-}D)WMfZJmC%E2TJKqb(|2&0qV*Mk42$q+qVy4&2}JJA zTrrjbT|QNB^{VnlPcLkfiX1kyR@e>#w!H~d>qVxk98NjPj^V`_g-#+r_*FOMF}Jtv zUPDD3_y1&Ws{n;9k=R7^06(UX{J_oUPb&KAItIsYDQDDO=Ovz>bhE?dEExr@SJ|Qw z3{AUixh80$gZ@g7@@(Krd@!b>C!8|~AL+swTpkMP42Lp|`9WJNa|P|d$WNKH+C#ux z(d*XhnRrPX73~)nYLX*1SR18Tf$tiY|a zkD5n3))&0p%x0y(>uUzl!+JV8E)UH56GW0?QKhAa_4e_jOhs1o50#~X=d8y0me4=rCFS#iA=JCyQMReJQU>78>Fk-K- zOh&L*uFcdtu)(6)XYj2<$5FAxj?hQ0iKEfHA_UlY6oS;Zefqm4cQ|Jf%3WVRi(t*A z3UUpnS+@ER?=lVVNL--YXAn-MaMGbaJuV#Xem*g-$H3QsevdTNX7d6g*lHW}iy(5=b7aT(-m z`u?uJQVuCqNOTlCQtR_*_L%7-e|&&h%*?{M zVIT^a9`7r6k)YNJed{zwo6SvI)IJ?Q2$ES${3)?nVj(#75N)UyJ9Lj`G~`jvEtEJISejIMz>hOST=}hplxbswn=i#twdTd=`4y?yzDZ*bPiS5q# zIKD>Y^q2d%vd4+C0*2~16gQfJnH9zp*`}j!=>DbKhKwm%l3aEg#kD@zm<3M94r8ia zF(vxd!516nxJ^G$==$0z+KQj5sVwiv{#INH@o)54^z(#LPR+IP(P(5dpQ!!_ zlWSZ}Q=Xv787#RQkk$MC&^}UB%E`gwscpn#oTGhcYY#vIjZhL;dz3VjlFuw?Z*kYR zBS1fxoO8uF@5xBzyvS>0wYl?Htc|vbXUkdlTqQh>i^+8Pi9o7ootHnawp3>d`Ceb`mNb&C6*KL8I^ntYHH~e~Ng+^tIkz zt!Mve=~UhH)ZJkVUTk((dS$h1)iaD8a^_J9LsJUtC<#=}x<3FX67R267rJ|CFF!D( z><3yhii0r?oo&z;jz;n%P|?Huf=KJy^TD(zys(ReVMdri<1wyTsccwi#j#P?Mc~cV zTUT;aAkm0IiC69(W~~`IcI>9Tq(1%=iesGoOaVKR@(SxlPAa+b_|c&JK0x=j9KNto z0{usMBQ(15NbsYkq=qY=_O{v{6s&cJG`eH(YzaPc*yjf@TJMJ}I8NDl|rI~ z{rGuwOxF4B|IdX>TS5ba45W5d1>h@n(tQEjA-ZGXJ%$m?KeVw0c>COD>H;#ZqZus( zE^j(q#(dH6T=rrfQ^J~J95E2T#|QIlgx9n#u5GFO!?%dn7j3eWGu2oTx4k#}F=TX4!om=kmOIZ%6;p z^G{^X{8@7*n0Bfzn>G{1-2a;3{=Y&kLOv@|yqvZtWvWQ^s-Nx~ej&-#Kj90&M zFM8)28HP<0KiJQPoO5b47+vUMxf;hez3k&Ip9}H%i7QxQ0#IPB_|KuoSFYvm&q4y) zyqaFK&-)xdE9b49Ng*GG%2!;|rsn(b1ZaV;!!n3}s5c z(d?n-X&R*`o@k_tAGnT%I)_n`(@tO`p7h>AGtq!KmmR~UW&HbeS)|z*lBtNZadqRt zW0|U4^tK6CLP;blvUUxd`GCWgk2pYx zC*pm4;ZLUqtbWQd?5>#Dx|$pAKQFs{d7l=?M@^6TB{T@1$CVwoiPRTj=AW~$+qftZ zMQGL!Sl|0oTZu!xJ_W239X((sf__WiyDal)_nNFfpntQn16R{|v>%U2uYTtGryuID zWAXv)b%_4f4A)Ax+z{)t@&IiC0(N##Y^VtT$-Z`gR!D&r(XPTpbT7 zYMIXI`pw~Os47vszA+JIzwsd2;I&*{Pi8&@gRXV;R5z}1ec=DYLNYD6+~@iUGch|* z9YW{XkKFE^YRI^m!2+8=4CV4f-BeRXzqd1$=$4VF;ZvmXu%=s`tSU1%2_hTpM7uWgKa z%19#D_XXO&|+^0dAqoBWscRDs2UXA2r{H)%udX08{kZu#~hPMb8dmti-{fiT8?}xRa z;v_QNv1cEMRog?i9oq>G5m8`uiV@)+}BDjM8Bf@CSgw7u1@w5#tQG@Hm^lx5wP37)R2jqUTrJ#Jx_ zmLrTS#9wB+PtDPYef`iI#^(t>n<6!ckdL{Q64{$R%==~8ndBo(=bU7;-9;z++_18s z6Qb!mMHb13`-!PJH$115YGZDwjU?OPm{9q0c>|5CTA;(;181xK$YU_%343D-^07Z$j_ z?cdR}opaz>M@XSDxr%;{%=^v+?U*25hh_~W%*nwF4U4?7O z!_jw>sd|6I26=GCSbta{lxI^L zHl^;aVTsHnwwCJJY($XwrSsa6ljCzx%5adhG~v+gNwghl8n7L6vdX1PH=I z_pXOXkUfvpH}%cHea>O~_-jJrM}@bCa?ATYh3q2mqTbhRFEW+KIJ@y;5h4-pa}*r( zHcE5m=bu{z_AN^W+@ph^L%{Kp4>5JP=*SeDMtOUNgijh3AoirNy{eoGiSc2I)OC)<*J|clnE_2e-=$jI$ z6`4Z$@_&>A`8*JmUW2h99|q0;$4Tr}Jzz8Y?dblk>?&|Lr`m;f@5Yp|NX0CJl8SA> zv3_xnZ|kvwa<%k?yNVn@Jd-JDXf--9?qO-Sb>CcImvdcl17NtbR&w-XwphjS1}t?{ z#z)TNWP_IcO*5UAHE zug#F^DMRDPwf{u2!^Y^VPJ~;p6hLX^;wEIE<72}i$9(IKrWE1RsCHS?2s+=wq$Jzy zVOCF)j~ai}z@+dDDXHB{#pVfx75Y9RJkD-nEDl)TeOWJP_e>ORdcT%y#<`G3Yim5b zVrAu8m(llk38ByCyxKSL^%7jh-f`}Fp;$qAcuekempm z7a|v8B>i$8IN+Tpd5bDjhzEHccYi`PG>v8@s=^r4leFysmXS7kXx8SYyYD6-0Pp0x zt9=U_Rf`gx%ybPY0&s`m5f3RTARmx=V;Tcv@Hzu*w$*C%fe|?jyo%jB zuoj$6{km4$(-0Y!ujTekT}{S}910cknraEy5;|5W|2$=UW0|^=VQs4vXubN0;o+c0 zhXml5ASR(rpN1}1bv2fWR6eW3Et|uZr?6DO|=-L;JYVjsW6D$`bF)ez| zBdX&3m^Byk=`?51*5W9}CcjY!8cU4Y{ilGj_TkN=GoIGdcGaM!$qs&e)&kMUP$83(S@d{ zANM$g61$Ur7dF-f3kSOT)B95t>O!CX!uf?VHg=eZMEf|>>8?o9UdP;P>y z>8uAXBYNDGj=6&h{*)b()n@WJGk~$>o>MApfd;BIRZ{L%Yj&vnh_YsA#g2xV;@Avb zde^HfK8>Rc$tm%vd!A}XYt|( z;I0TCBX%n$l(gO|82uo+rSfTOD!6Z!5ljb%_f`EXu0PO^G8&Iw&cf8rAm zz$!2kS^QXwyGbkzFQ@pDZYhFeBGX?S-EQfNF zyzjd@*1k5Kiw|xQEn72&>V!3tXssKB7jl%yXM+PnXrm8}wmFlSKvq|AvqcFauDXSl zZEPGE*cb%2VIjT+m4FXt)q8Lx0a} zW<>BzWIXl`)o|Y63o;5*NU9{#`$N~)-#AD1JoD(Q!U5EZ2@3@Lg;pU>DGoB5QD$9; zH-?SJf<2=aOmM|8Sn^f6O)q+mvxt4FqE5|sVVE&dA(ddA@2 z?y1`)xNu=wJy3VO#6nWwI-(@J_|K_6g59mccTF@%t=?11$kFJ$@dM?C+d{pX3>}<& zWTxDHh*P=RnOIUfLxrc(jx1SZ_>h`DOcwf=WYL849b()4us2$koL7Wv-}#m2b^u1h zteR$ahL{ulRqtq>WC8oznjmB;><{P<;+lXpmh#daJ;hR>9Pp$?Cx3rzOjK*s=Ra=j zF!LWdxiWGYf^Yq@m{J^(Xg8@?;Fu=cu6!^z2Dm=iM>IskXATC2B#H_u{l58{qV*2t z+p8On>==`)L*!n*;);-lTl$Af3e+{@%mO8sD>5{~PAUt+OrB4RG!nEyaY?U?P4r=# zl%(1{;1*3OSyMWKG;YJRyByj6+weoW7NKDgDoN2rxxqG<*ESR!TDZ<5nY?1h>gMpz z@`tnDhXoNXLq?2~mf$zd77M&h@-1KuAEShWFPR;thXsfZZ#@vrjc)rXc}Y1mXzL zC?oX_@;5RZce3Th;?hovq-J5ni|{eUr8rV$>;0|Pe|&Ey)(?V`$JA~vWUst@{;zUN z?EiQHG+l(0LI;b|R?9fJ#`7|ph&u?YXfiP-vB zdy}2=?wx!*Rm(3^zF?SDb$Vkz!}f|Os&Pe;Bl4kJ%FA|E#kJQZ|FWhq{+Q1Z=z5OE zNhCNU5d@xbtVE(O8SnkI2c{N$;Rt=LC-DGwmUC2n5OCn}`4FTe>Y>?1Xbb}7=ZjrC zQj@(ES)$J=ps98G27s+YMT}>BNI-&OpP9ny&>qmq>7BZEFuAduDE*xBJZ77*JZ6mH z?A|@1^sj2EI3f9+tIK9=esw#hggGmJf9O&v`!sQ>G~0xjV$~p@B_oA#{*L_`>yv+B)B>R*ULCj0@Dcp7zXq!68H+ae_I^ebt+F6ZowIwY9L= zUr25?jUjjeEIH(ftrUzLYDYAF^4&H0e7yczjdi$4>o6e;;-RuHVRLc@5&9hEDAGa?VEc9S~NM?mdtyGw|4){f0T5jk;j;KE>)Q|`8@}W+&0ZcRo9TOaDwC=)uU+fp+v0^lSO){{(HSP@{Q5ys*N92M9A;8NwRa}>Td8{RXa&J;2B{*hIUItvm@k3 zMs<6ht@h^*#OTJt6kujf5LBkYT!ZZK1-AB;1-mBru|PSr&W83n^}1aEhqbrimxAWj z4XH6^e^?5jD9*{6J`BXi)JZ+U+sxftGRa#HSc~2Yeniui{O0$}E|4E-zq&Pa6*qq__+7TXfiSJWwq%Fk zi0+Tx&?m*hk)AWb0ksiboUR?j5JNmWyqlIKPdx))T+`|o4YzrnMdBWJjp{QAD9y*h zy^3=JgGpu*vthWvu7_zSgzzG3HiVrVXowz)l>?ivT9leiAwqh!X07BA!um^pg)cRl zRUKFnybexBKt8&>NfITCuU&7<+NjYk<3$2qaUMKVHdSa&~Gqtu>3fJch3sbej4jZ2CVetdBKL#~N*vrRgrL zX*sM9KiD2z59V!Vm58SSF%FQmSC0ZLFH9;Hr2ikxQSGN3GGG1qV&G$R(gxrX#zo!4# zpT0IOf7WUnQ%}J&XS%d6bqF&>g1+G!+w%j@;E=(6`7qEmOX_8VsOtRR-|}J>lz`#V zb%;^1p1zv?Zi8<=>K0dhgmU2^zDl?RK$elOPxZYsl|rZ~58X2IzAM|ZXWhDkKhh+cRxMx8u+N-wHW7ka%fYcHgw=#BN`>d*@v6>SBxaZZs@`FuS{qthrL{ zYX(m!&4?R1=kSqp*o_XM0Q5MKX^pjnhLf3+Tk^q1`?5*tIcu6fJwNPzRW_iPd)oU{ z4`wYw8ss`1-O7KRMHgS_&vp)EIfq&G?suMWK_>ACFlSGzjki-NX5> zGmMwlyb;Z#mgW*-$j(2yqR*u76m; zukS==C=J>%?ccMt&1=m1K?Mz9Pi`BLR(=wGJtP{$29`3o|9Yw~r08rkUoB z(y(*Gb}eibmPrv$mev?If&W&rLXzBUagz!(|WGnlDee%j|z&%#dCXp z>XE~~OY2dh#5WRJ?|(mP_d)&IR(z8D#W5#Pk=j--n@ zt6N&p4dA)mOpRd5&t^<((StVCylA}PbKGs54{Rioo{KGuKLOFEm)*e_xj%f?-9Ubu z>pL7x6bz`}gwN=S&cMf+B-7kyrPZK$Rx=KP&!)L@_`oA}ALmrMZduq@H5#v|$8;(s ztm@X92PX%MXw8{i{!x~!w$^j+$>a7Wu58?P;!6ZVA?LLH(IK(YOAgxrDVPJj*Upe+ z7a>L31`>%6fE3j~Wjyu#y`DnAnCcdi2-D(Q{&||gHel>ur0o|FK>hyPbJ|tA?kWB{SOIR&OwEs32n+$`g0~_VW)OuVJ$XdmB@CwpXAt7xr!o*es@ED=B=*F zD)IvFp?B<*5s`mKr4#&LHu`?i-+243OXPgnLK`%dVplb3F#e|N+OPVlYe74;@czw3 zarx5V?UKVabxGIgdH%~drGHS|&m)ID`oHhdI_S~=NLOwBnPOrY&K-m802rISj z;QyWKJ+LizepXL_`FhIX#o*Ul%fg3V*9>7(TzyP$09nnq1(L=dPi05{Z8<($8Qi+vFJ`OokMp#u z2eC|!d6w&>tVL?}1K{z~Uulu3(rY;SZMx8-!dJT;zsf{;a=l&UgC!|W*Lw&;G3+17 zS)w0Kh};lYm1E`5b(yVAH(e&i(!#||g&nmTgn`|i9dQ)M0R#!~8fuSAUt~sBZ|gsa zYd*=~3&YKXQG6_>Ol>2ok90FNhXnrT1vY_9|7YW&)ZSlF} z@37F%R*#FHf6PL=9UCB|fpV3p-t3MU38TgRHm5}UtFA6#3jl6M@Fu(l8Yy;(YG+a$ z@kIDaTtm&xk$XfVs>J)Nu3J_ zruF)0-E&>p3uTrCwvsTH#AB~w&*+Dhg?#;KJ@{&hh&{RTXJ{s{<-=&Fw%ONi($_Ul*UCZ zn0vPn|H4(L;{4tHVX|K^LU=L5gB6GFh&D^7?3%;BoA+oq)OUcj;O=Vx10280YW8_f zr-))x&#zkpw@i54@K>2d*E~>8up3x4zsI`bc=F@)$(4J@nI*wr zE}F^=Q)&Z|c-4N`k({O73Q!Y!V% zsm*YI6}Tt+65}gvFIDV)xq`9?N7+6RG9}CxBkg%95s2~P3*VM(*`=4bWP zz=!b9O7!jhlhzSC2?n*Ib{_J%d-pr0eYi(cHIca?xNl>j_fT3Oz`6`m-O*k> z?dcCzuS-sbAGB>W_m_2sP4Tjg#I&;JABE@s@PjfITN}CzZV{P)=u#zaAgMtzNgmyt zBgj=brjaLoqMI&Q9`H0<2Vwbbp~xY7AOAVJg09ej`tqD==)KVa{$$6EMu;(+ zUSNUE-!J*pRarCarLN4VQGr%E#hM7TrAW)&BUsjY4$6+JGd=!ZyElZ!d8mx}w$RGp8@yHfWc0G7e{I97H3+$bXLH z1gs_u_$pLwQggFZZhpe>7B5$$od22L+ywh*y9{^R9E1$c-C38tZN;J-h-&kcMg|<0Wd1P}B;c0*9`<3PG zUtw0pf+&5BHbhz4@jfyZ_Wbc;+qZi295QC7*finS0OG@Kr#n@2aYq$%1kcUI)w>5O)NRCpt!*;Cq@yiII>70k)!pzgbnpL}#8L|&) zeS1Qh{#|vOSqH}*f`my@0{yI}9Eca+>{n{CY7Bxtpk)LF|8!+~K1RlJ#qKM!L?1%} z@B*(FuLyUu9T{_O7c;Y@awAXi+2w^0jRCd3#CU1_kSJnFh(pc?$1_zAH|JVzd2pgA z5dvawf&1myiSODbd5K@EeOIHUb0UB-Qcw%c$Ux8Arjc@Y9wGvs^t&XtMt)MiC%T+A zz+onllOEWNa2t>cfxwv5l`}%z#gZ&ecS_gcrj9-l?xAF*=I}3ZJ6YdN3idcm)@Z7Tnx0i;Ip=U`9`hBfJZ%C#Z!`OK*(@I+`yVFs;R+lR7VSD_6_~`X3 zM69z8iI92PUwbRVJZsh{v3!wN`HWosgZ8WenPi0WU*FiP6!sub0!Yn1NP%WA{=CDv zdlv7NnrVg*Ol~K#v6(iS2EyMHSN)3@f(Nsj>>R9gF=~e{zR^(#5E(nYQM-vs*nx-2 zQL53pt+=N0rpzb6^W=|H-9KoV`upfB+srWafCG`Kwfvm_AQs>QW+_KgEa;rhni=Wn z&fRWi18wy)Vn*V{uLWJ1p`H|6b?$LL^Qp#i%+}H2_JQR#;Sv+eYBYEY9s@RR&}RIj za8`3;W~9%8%XWtgXWV(veOd>6%Zca%+4bqNmaO$$17gEr3wT~HKUXk!3!seY4&5`}TmmpLo9JpM^wy z-468;R96ZuYAQ&&ai={$J%RLzlx1fK_h^Q(W-}b&pY=P>yrKhoKNuY*?|hlG6Fj8) zE0awYjQCV>W&X)V?UEDB0%s}1z5c4DoVb4Ry{vtC4bz|{BzKS{9if_o_rHhB&`C~=vs@_#G~pL*Bfgb9$Q7U zhjNSb(9P_FdFQ^zbrgZ4Q~dUo<(<9(p9;J(;?}Y!B;BPRhe&C$9)`2Gup8Rf|9eJS z-*&yHCplLP9;O69ip#=Hrq6y5&tnm0pdP?$R2#{*<~E%r z8ot;>C)<2`#@KnosddM&?r{D zwf}vI#8rumAWy5Bsa5NwD0`6$VvBXBI}A1zr@U`Eh7gqPOhb_#%v*&QF!@~20lCqA zUJ`fm?RYBi$OrExs(c&hu*B-4uL8fm=7&8;e+&>tEYs2$LOT$%V6VKlBS!g-3Eg_I zT?nz_w7T>_VCG}yac9JD{4u5(bD;hyMhCRnHhfPpMtKGT<4>t+EUHdE{~#r=i=uKMakdsaD=J z5%p<|Uo*o^01?7uWfpneiw6#u?GmS2E{p!TeN#r=<4jW%z$ylpth{YaulX4#Zgwi1 zKM1(rG4rz%)=Ce?O~YJkd^Gq{_Q1e%KU>(wJ?u3tPq_5w28R3?}7AmaP&fuA0ncQ|P<%~JCDYr1}MbARm5~s63 zg;?AZG~0;W>sO6f!I*&j?%oYYna(@qyxp35VLwyalUAR%YW_u2tF0z!Bk^){TE-zQ zz3nno5og87gnx)1ST50Txwe?(Z*U`faGV zg1&DB6KVaHnYf@zpBp$w^x4TW9KOQa+Y^M!!Xg;W$7cgbA1VvOR^a>3VoS_UO%X*K zT#dma-a1H9c@>(YNgOxVMzXHKwsf_} z{BU(S)}=2-X6>m9DhW@&%!51k&6Y7GTN--Pa@{xgKa{;`(5!SXuoO{RX)0O+$kw-z zmm0k{9+5F8Wgkm?h~WWnZW7~?xF$ZMin*Q=38oD0iAKGAScxChV(4|5(GbOn!7DNr zrJ3AI_eFi4t$Z^|)Al`kghjt4)o zqj7Hvgx?Zare%sKtsdK4aHW`>0fw{E@}#6V1$Avjj;qBkk$ zOP{6``k+(OjWg1E)p+m3SGmwW0k!+7{RH-XZL~6`yf#O?by@(vyekDosgKl30Sv#GparniS>1+sOq?m?39!07e71Dv+4!oZ#Ose%KWK2 zaH`28#IU75j|}^7b=z1VD?qTHDs7D^&ULz379*1x+s+nAyM{?+D?_&+jv|E>|5PGZ zXCWC)`xYSGbVS&mlI}45_|_hm1dDqC;bIN#BmRjk5fXG$x6AgA5jmh7@wE%8d%PCA zepiAcZ6zO_ub2@diJCE*ZokM4tTH~5eP~M96xn!W>(xhvCHjt&8(1BSa}ASk5cX2c z7XJRrN(UTn{=^2aPE;N@Xnvk(uaLXKH+&H7;of}92x*=mpKWz2S`SI9ZSlKZvfT#^ z3Fyg?a;neo@!Mpy7<6CS)MMpG`|kD>K)JR zXx#oonYDVLxAm_Kjy6e-7j2Zp3wbMk6uvU?MUNX1nsqi5k?rj<6ZyoOv6|^wXJR}0 z8RqjQzXC1P9@ilD*q7jkc)5J$NF#=JR$aBy^GU8}Kaqc%w>Nx0Se-XcuXI^5#15Rb zMw>;nSJ}FZ&lnFoP1Bb&A1e4R?7TNb|9N|4{J_LD7B$HjDI_*v8FFxIw=Yn?j z0PwN~=f+R7_Kr0z9KmND$y7F&anHT1h^ng4e2ncJusu~%DHbNkaiuP& z>nn1Mt?g^@4|_!4H0rm8>FyL8V4>pRfZ+8$0i)e7vN5N;18m@kuIJ|zZ0c#kKN%YDCq;SLE^ji=fk z2#=ok;u?Jlc=(4eWp+kY<=ns4l^m7k2#vU-RY2z*%bJK-Als8tQ4KmnRy>Yw@!P)? zsAom3bkDBdaWWXhRGx-e0)c( zw!v?@r?0;T4C8;;*S{-%pd*@Be2Yz2(;4cfSJvhBNnQK@h&uBG26uPJPaIZ(`a3B_10U66~lI1y~io zOONv@!y*=B6e0NiP&dn%c1BQAl0dO|od&9Rygs#o!4Tv@@|k7Cyj0~^Pw;|8^nfL) zWw)eC(5p+*qCU0#bBWL=PK#9^&IarM2&90O?udsF!rb_LofIoaRDwschBr;+{}$qA zjXW59Aqma8#b{(M1vK?`%pW+OIM4@OzEt-}5-~2!NnS z*VacvsmTu?t$S#b-cod(`@XoFXHrJcY*-^fiJuv@bDo~g8-&kt^n?iH&_2XH6R=g} zgK8GDDdS~;f+!Bm=|?ck@AaRUy3k{v{a11mVD7eujBoLBGGn2_xi!WcpD}zqFp21i zKk>(5^T2iUQ93yf{58%A`(m9ligPT+oK$9Qm#vo zz9OL6TSHWt3Dy%VQ|_Y}=?lM+Q!%ID)!gmk_LB)1D8ryR10~`2ZjLfzL< z{u<2RN-RPvmCac@D%5N?a`WeK8c8Pbqpu+-d3L>s=pPQN?Ois&Tl|?aEyzij)MBfb zAKvcS^^?z6<0`jJxh3V4{4GYsQU3_kB42Vp1H-;sx?x5#GyGAnKB#5c0VzTjV5?3S z3m*vU!a?bwMEA4DnJVmiRoJ_9H2JdXD^d6K9h<1>OORXBvDuf-$g`rYNZpdFytVOn zF@xOBOc5QIKIPGC<1B{4+|G$f0$`F&?vqCiBnD)#l*VAQU5t{Th>B?Pk(>c$NpLT6 z5$%AvV7kFBsq;0>eA|V*F6c! zraqffyLyJtMtZ3>5XNrVdM8|I8*T)Z)xbl$*Y?AL$&LvoV_K%T{>vWuuD}IQ&T|p{ znn&VKu1OWi&Z?IM1m>ByoWmUKBTi2==Kt7l#-xwjvbwT>Mnl8iN%&5Rny1=hOI#uF zFTX-pc`wI~HH*dx#7D9?(`Z@{NU~3vZo9of-}C<<|3}2h`C&2%T3(%Lj8@PwZ{1fr zQ3OZ}q*u6=c3QBACPtGc8(~Tc+8_s~J4DL86%cVR%JPe#Yjcp)$-KA^af1sC=TPxd z?r&gN8goME9~M*rN`8$lOW{s%8ZY^4FZ>B3c}pnOExu7cWK|i`fgn9zKX}r06R1^`>`lzpI&5m zGN$3;{+$SD*?MKr9=Ke;cKfJiwyo6q*iqn64?>+Iw)bC6uoOJV{g|mMMXIay%I@4w z3gsrKEyDJ%*tmL$Hpc8ztM2j%=!$w*u9YCDwoR~@DtZsgOA;?)XQHl9?}siwcs^fF zvHkqhDHz@T3&{ANs+AamR_*QbE-~tJ0>rQyy>b3j9mO=;r6?MZ=tDWo)9Ak(j6;3) z{U2GSRo-IeK?U!%_S-P@_oxAs`6TYAV~U$?@UfU=<;$CZ(x(>hj<`DJ?C)PN`~DP3 zCSD5cbRtC$lJZWi$WtI?YNwT{n-q_(ApaIbMs>=L)t@qt5KNdCTSm*+AMO?=hrvG~ zvo1Gyqbsfvz%A{k1da|!=#{%!^(V`uYZv)*m!E6OKXoNftCAcR)^&e)W9>3J+kPYt zso9r8JcL_cu3Xk@@Qg!d2-`FEIXYkSVl<6c*Vk1I0jsz;4b9XV zPiAO~a!t056p2%J#Y}g^Bh8`)ah<7?LKS#=U=Wj{c*;~fJQ+@vdtK9qnZAJC0)6WU z+b~?QAMNd>T*s=(?(KIVR$Uv74MXk&mEJobx1mek2K4~@+IO8IClYrhd>)*tsFTSO zUhAAOp!f=Ys$(Z|S+=z*|7*g9H0MoQ z8n;lrR^I|+^Fot?m#O(eU8F`y;rAi6eLh_Rim6^p*=8&)93FU^Za^Bx=0B?1(Je}F z!aW1?*A+W^|2F?)PJhX6V)q!W7sP7lix;X7etQ-EiXJ6_&x4{>*l|((ohRGhrT&H` zpDpE;OUaYNz9dk2Kb_pB_lyX+Xa#JnWns%l8&c}Z-0PPY=e4=6>u!fo?K4#YwSLpjoVL(;5Xxf zC~o;ZH;*sBN~3>O@aDCe7~E0BJw>a8)pKak@Lu*#ucQ8N8trPVXl6~u8huFFi2D_KN><#IP>+Z;MnOk6(qpZ2Qz!f=#c;EoN#iJL}DIVarsm!^`Fut?harzqN zj6J`&b$d@l>*b=+jm1zWaknFZrI(U?a#3v^73K`-NjaQ+o!`mpJ>-KcrpZm1R3^AY zK+YMuc}S}4e!smpil#dkZ8bR%GNV7iLL(Te*-%_d^zPIE1m%Yc{5!D;vAJd(yXY2? zZ@Q%?loPS@$i6lpbmw0+R$l`uWeZz6F?(!Tj=Ap5~xQ%38M{lG*XX6^dGG{O=Bg(YUK{6i?`7nE*a6D z3rdEHIYBO`n!UozvWCJ$XRWJ-mM^Z~qGIF-2N^5@Dm0#xJjobeTHq?=W?2@pnA|J5K3=nd;W2ye4O=ML`4UsGbd+3vEF@eECY=D{vMvyao`9#i1>B8#cHGeG$Ub;ha zc-MTdEx@ExBZPXF;pvTpFTwW`$E>MjG^_ZLYe9ns-L2Ifm59_vj&bdRiKps+z>Js` z0L-^WEqOlTV)n$;JY!Iddbxm;S`T8+r8c^o#z903re$^c57CjR-Q|B}?wYjbBGczP zdoQ52;VH_nMKeJnWL|EIURK_^q5!CG=M^KExD*S&Gxz64xnH1N#fIUeO}PKzk~Np# z07Pv9BxTO9r+7Av=&7Nh)79yHdQx=Ou{>JdN#is?I** zA1~euUpbHRaOOEx$|BL42IVbGf5gk!^<=)b_DGq|V{T=oST7+oBt)rrM;AK9-QE`{sU?DNm@}ejgJ3hIhe1*m6(3TjKY&{f*7;?kL%U=teXxZ+$vU<-JHESO=lKb-bYx`0BdmI@Id#ZD!bn*x>4j9ah8VDN*wOKRz^r98lgha1^-kYU#?dwyd3YN>zLK1+H3=jo-UDP8Tf#`wM(Tm=B@l_t@v;zZ}Mb zYll>2CO6ORk%}ddNARo@^ZPS)JQ;Yt3`oahMSN$Gt#Uc@f{EcLIdhcyg!SAWa~3wz zFJfhY;#}!YiZJLO*QaNS=7AVr0$vlk6rI^hA!OJ=RT{&0mh-}vuWI3trM-?hVScbL z(*xYP%G`G8XI_7!YYNw*p_V)*EI>30~If$pSq zU^lL#{3C$WJ|g=NAmsXvFwd3FO^$6$A`L4h9!_|;33JbL_u-79Q_m!wD~j++%;wuL zMn*=Z@2%qeyul{mKY>@*?xH)prvA%>&xFAaMBZ|3PKZ-UwJrju45@9x%qcoeTb4LV zxfS_9i+rR?vDlnVmA@rlF9enUs)_8Zh&6~!oRJ$#-0e-JJp?`$G{6)C3dC2;)>|j! ze`!Lq4ICxAKQ-{N!SCNF)e`13^K1@S_3?tp9xN`~17QNb=RBvLw|>OPjZK4y>!=mV zV&`#KNqTQv3}q4+|GHEfgRFAyve% z=&dNCuz}`P3cn`vd?ht4d+aihdAB@#UGD;EQ8(|fcz1l{)ky)IScYIpAb+lfI)`I~ zUeiC@|DR(U?jr7{9xG?X0ey7ElaS`OZp1H;r)J#K-70_rroTT+?Vyc|oa>SMI?Id- z9f=AgMVOT;1bmas!#Rb=p*yB!x{?FTC4=dc*b!Aa{d#*2IQ(sbnggnn{rIYK8=o=# z?_@bSX%D|SOkdH1cL9t@`yqG~07RGkq3ANtj)R>7+^lW->?N3bIl|jEF^pLKxSRyb z3C6wY2GE!EOvLBc`cTd}Xz2OcJp_3bXcjr%wr>!NJTOUb?kPkpH(ov7DuSylC5L*} z#$9tSrBoh1=_%`<3-P^WeXF_WLK?kBVdlrI+ERR8HN$k4jX`EzkR8y?_G%$YJW6)f z*2t#I4Xl#$29d#)9@50fjKuIC4xCpZ;Ib>m1C}GD4n2jVqkG6GyLSLsHy{y$WOi8n ze2|i8Je33*}JUCNZA8))^WY8DAweVUqpG5a#njjy`UH&$n*Tr{+S>$#wuQUV%v9;Y5o9GJo zdFi2HEVuIuYHDL;M8oGg5$L-=VW3Qskewa&p3yS8kGjwEcs+=#(Q_@)TlE%RPcfg% zh{@bTnLY27kcRC&V?;(5rnNN^RU7tNz08~0AysT#?430&4}4|T&|?NSzTFF-IGpWX zMG*cpkO_S2klIxkV~U8qy)5Ve?G!#!&~prS5z0~+10!WLls6E&)1=Pe#tYZ~2Ri5_ zp1yX-QN*H|jBTs0o7S5;8aw(=M$T2^#4wFk-@>psQYCi!?|xmZT?589i-mr$GH>aY znNfIC>n`^4?Swx(T++W7<$Mg+$iNkS&3AoCbB?uu!NhKrd+)TK?CH8u;-^Ji**`Yr zXn9Z}_g5_L%#uJ!0)y$au)n-)xiH2IS43RK-toP=AoNbJe%)BF`mod-JteTSmK= zGfT5H8!t}(kM~WHt{=E@q~MT#@(c?xDc(+<4#IK+#Ftl?%shS7=la~8e?^w%{j#L) zw+i5Eydt(}4Nf4ODRh6LR2T+WQK^M@Y4jf7`+ORLD`0Uli{sX-H zoLY}x5KZka&|l5Zsp(2??rjZBw&{Ckg2sPypo0^Vc-Q`=w+n<^%RT6yN5w*_`1 z%eTv8GPx4^M-F->pT{n1?k~>&i4MHi+0@ z`H|3s@0zv*481yf5U!?9Dho%>#>{@B(wuv{-vONVo}g!hez$GAX6k&@Q`C@KQNBqW zwzlxxBW;Sb4a04GeMy#{^OxS8yjWaNW(-PQHe6{9hoj`JVgVcB$lbK30fJ8#5h4ic zfU&J8$EV(+Rl?VWh8bi>NrqiktQE5ju&#aha&Ne4Xx=fh=tsdl55B7<$mzAEeEvo# z)DpSQg~r5qU8S{#90d)l;#njsiREE)pa1G{c$^~y90(%LMuT>%=qe;_Z-lgNFf_i$!Mh>M8t*`m_ABK-e-FJ?4cQ5K4^=gh1~7bU)Gj^E|d_+aO+Qyf4OK`d@xw8 z+Mc8zwNWy_bfe*40%;=9juI-R{i^W4nDgQJ2=C zfb1j;hw(hiUI=hNR_0ZcWR3xg5#Js%&y^%6Wq^>m6R$%WI*>I~0xf8_Cn}BB`$H?R z{>lY7&a30A4>H_c&$=l25kzLTEn7n+)5A;^lNGZKiJ>(qxzGd(u2*WGs4YjhMX^Oy zKL$LkMliEeZ5^5QXY5aNQyh@RT|iP*`KiQ4M5S{(>uyB_Mn2tK`rP(+_J!um@p(wi zk}8M~v4{cdl!6<05q6&WJe@CztKr^Ug*z{&nzPV-`jXGGk(d@+Zf2+`^inCvC;XUy z1{n+6$K2r92<+wP_1p=h@Gw9e*yo`KX7&ve>~D>D*>!uWs(w?7b)pH6Rw|>49_l_4 zohzT>hNhe-gzHs&%!h-P6aYzK5todQim8aTk9kL>ZQHMjE~da09|A81WM07~|LKNa zko{lYS&GWIqcS4`GsJhD#ICvv13YS-Oj&Z`sYzQ zr*DNie>?Qf{Dz}ZwgHlXoHI$$-%|~*0SKj42gJIR>z?q@jp9ecU+Z8q%UdTAd4s&6 zmqprXfaBl4%g-z8|P(Y#HfO`D2g#OpUBcglN z#c-uo=Zps{KjnziV9nPX!&rYf#*6z*n(G*$gCVQXRsq5AXvT6-h-VB9 zt9C~oT}}24B46WIrZs&dj+U1U8QP8xP~B*C4Rg+7#7i!bm641O2V@Hm{(m~f(AOiR zM`T||{qT8}nqmAk)Y}{9w&fT&aO3p=qSVOl_(CQB>&#@oa!tgD^TXI35Ome1ZOb-YG@i72UIbskDGKBeLEo3P@^$fTQD9m?pcs z5LTtjAurUCSND&3x4!iJKI&Y#t?Rs84@0q!?~GZe42+@Gt8-_9lYlD(O}}n_`DB(> zZg@6I?p}Vu`F)JdQAr;ySZ}o{Sr;wS(A!cy*s>dYzEwYbpSMP5TPRJVwz}T$V6&=Q zS#Y4smIn|K#muyF!kY(a;>W>HRKib!|CSWZEpFCGO(Dj-J>(ccOkY%()uEm>0T|5+ zSA`hkJi+i;7wFRRa9r+9ZUYrLU3qQ(?)P2e2`ZH5JFMf2%Rg}WS9>y^+=1eJ+@NR; zdVz@T<;7ZJcBw7F;TYqd87p_j^gi@BVK-Z~g=kzkrq5AAEENvw0lK!Q3THO!SM*v{ z6<})8^A`>cn!V_OgEJ4z^+>>Q<*{8F^=LM?9vLO>dNT_=zwmuKWzy$bKJ2H*PVS@g z{qt;YnOACfs)*HrOK^C#5mXgVcp->Z_OrivwrnNIXGOwZLFsaOa&f#Y%3vH{N)1j| zuGl3c{;(=@^A}pAtK&@=-W^yZSC0rIF(2!&zfW8DFw8Ikb`jPTEdOa|@VQC|TX&hi zWz^^2eNu~Y`4kkVjLRi6D!ZhZ$p)51wrrCcEklan^bTs=k#=Vva#X6_zBij5LQlB=YZyiPoi)-F?ya42hXPh{ ze!dBy`v6?Bmd78e{`Lq>e<~9n~baK{SBV-&x`uaWD?Xu^!{scc{jP~;R&Vy zT{iaOyICa%z&EN*zz+Yt^G!sl@~=kz0GWl1f{B~m;IobLaEOD>UEwh8!fAjbijCW zglS(O$+JY~sS?q1IGmUiW}TIHCs1&{vT}s|?6xh|GzrA#dld&NN@A2r+Wo!Hcs$PC zhyjlXE&OXRwG5FaOxh~1lf)pQ6mL8SgE;McdX#PL`(|TO z-lW^5Uq69Pd}uYp3Zrw9;kGQMz_RzC6mg1Mafs_|Cw!4+XVaBj0@cR74oan^X+Lr1Lh3fBv4C?0? zIjN%3zP3+e`SF{xAPD}lV-{wahx@Vg(O4iDpr(A9KGfDhGNqXB2DE@ooFw_=D!=_P zd`|svCk#FAt`Rvz_I+PYHR@`5JR17-KQhHD&25?m)=9$F<+mxzd_a$hX%!1?_R2#M zPe(P8wXDA<=L2x>w-mpW?Uid&?`<8_ivKMNMw&yiO?#z_5*p5gJ~RZ40l1Y9jX zN%gxMU!ctDcrGn=@$857SA&WiMZ{%b>d7R_nO2no4c5hSWWb-m$1-C01W-u=^z)tn1Kvv>80&XXj$FP17x`Y;7i{ou&PJr>c! zljZ(M;R-2qh>SInEHURD&p%t*`vBy7csoH_q1TVLe+2E6@FZtHTBYmD~?6<6) z{X8{7H&=B=sd8*DPGKLvi%xGn=eGl>Q~Ri<@BF)EtCgu+kowQ{G56wLjbC{cbz|+U zmvvFvKNB5^M?E>o}U( zb;<8IRJZ*Mb0zqp6Oh!Q*`x)~2$Ax${S5}^M~;6fVA+xyZC589om-wd4pr;zNFAHBI4Ekig?18t7cIEMUstjT+di?*qNBZX>=fX?7g1< z^Rlc+_%{aEyIu{C3^x{qo$A8}3603Z*5Ns6;oV?(1JTgm#T%I!+6OcW1p~i5{j??z zN**=;O;v(kA9y^fgt@R&{R42!g1KRefgICQ8mh`oNPWl$hAH-~Ql@)LmK{vYO_hVD zH6l%}7o%#cpFpK;1E0vNxpn^KmU_0fkNxKl+NM?(n0ZjcRYZR~W4186NQmz*Igu`P zDGZ27H`FX`4OF#C#j8hU8|ncb>m~vDiboV*-EK(89yLx>cgU4!`OQ!CPNaaJsyOGj zbNmocb0=qN1USIDT4!atRg+~&9MwmY?|M9PVhIH8DxuHnlY1P<`~{})OBb=o@Lu{l zL|M1U7xJX0BW>E$g@(YdwQ9Q9%57VMb66MxUtt&+5)Wq?j%=0m7RiPbbW#x82k_b4 zBXu)NTL-R#YXfh4?ZQ*X%AEJ>L5}VfsLg!uK9z6{*?*dqiMPGso_mj$HiJZ3eXk*M z_}7omvfVt9`z4YEL!^ej!gY~{A-3!uCLh6(Z$IYX(Y#LkY zL@oa$MO-}_C=$`tN^Fu-snBI!~IMNCnBbafdaoZOi0M^ zEqiVpaA|5Y$gSS#4kK`upPyl1wSDvbY zP=Rj!QWaCimD|S#j_Pgh{NiSNS0FxM0cb6wJ+m#v+qEP|)RH1yV0viDfurlq88mz)3tFWWA1Rm| z5-PjUHCYja)%vQ|`R+&A)<-?mD&|r4oXhb@z=aav)G(OX>sx5Vx~iGo_tfano66X3 zX0~)`h3MPwGBylyo$&2K+<$M=HAoey+ze7x9+Y#cxyK_`Yd81y<)UDN!HU;*1Tx8z z>Ko;e-1e%P<&k6=V?vsOq341G1Kc~6cjxLj*YVqH)6w)@B!Rtu9hKL$ah1Ph6l8+u zuaO0>d)vF%^^G-4dtE4B9;_}gCLFagwPSz)^`6USAX&=~R)IZ%mS5P|@DAw~x025u z`(rXkE<-~mPd>0vJndA!!k6)vuI4F==j;YP^_{=F2KgvOv2N}D1T42*J;m z{}iS}J1sn@WY4NmMlEzk-?$I)5ycP9dmKg}|I$lqKWJau1p9S;hQQZcUB4-E5V=zM?uSp+I|!| zIV9YnJSaB_v|Uv#dhPl_f%bfIAM_%?$?JG>n#R{uo$d_afD2t4_eK`#dzIL3ld`eF z4?!DYXiO2ytAS)T?aIdHv;{W?A5t^nN8d8(7jh^#IjT)*)m%l+M=!3sx?ewmrm-1c z)=phOAZ%jIOF`j*qWdl_Fy2-Wx8FZ+MKb*OU`l$Cl z716yuH#Bd;8p;Qxua(K9(~q+6D_>AG-P3yB|7r3pP(pbyxPPBT+STkFqg3XR;;K4O z?U^ga92>&rXjRFsFE<*j3fq_b+tZB613v8_p^A(4Vy3Ml^i=uCiAF=$kjP;5@7}3~ ze_Ddb>KU z`qrMfdR=tP!|MU`hi9bhjqBBNem)3lh+<);AQD>@{itc4c|E%kblvNa75GV6^9)Hrs|5y)y!Ck7*Pfo9Wemxr4(&@387ypE{mv&?~b1y14+-snr8VrS;iIpft0XH)vjvCX6DI z&TZXAqC_TDE;k*~yfQR9x}_)uCw?^M13UiWP8qiw&h&cCw%Z_kyX5o3spGVJj-A&; zPb2Ml`LB!j!w-f%oPW{I!H7tuOa@e}?$gys8!UEaF(!`dFH8lR z=S@8+WXCP%zSE~FIAV;sr4a3Xaj$b0Kn<3r;|yke}im%^1KP;@O$d+x3=?k`IbSLpWelTGsG2Efbv zWCE$d*SMpXzWO~RZanqGj}ia?`pf6bv5V} zs0cmg)(-!ZeEi4sU*701$Z&7&-R--91Z;4P*IQ0@(`ssLB{j*afKOlwDUB1E^`+Ml zB-SAgZav$PQu%(tx^V28>F71#o;iKXomWy*VBt8;9sv$(zKqqgk2J3vQU_1btl{hp2+j^>p~kTH?<~ zOt*Xlx;G`U=>4^MVAaxgg|O6Qc~anl>8W8+(0~3KLes>m-jn9D+E72SS&V%_Rac;J z&EF~8P+?kvCtf2>bW|-m=R*pva2Y9PJR)q;ZHU{pB2RS)l43vYdB-nK-n_qNBzg`U z{+>tP_U4}zXX*(}T#u@d9S!I023nnNey?BMnFB5<`Pa>Em_h!V??|eI&abXj^KQOz zHGY?J6bI~m^{PR}!Cf_3<2C=wCen72;0%dplY*{h_JEw?xIbL_Pot7anyFfH&3gri z`R`%mTOu=on>Tam?wiw|$L>z*!8l=_y<8XI1sBPq`Q1eS5ACd&J5IYwV0R1zMd0=5B)!JNqO3psvRA)tOf(HfnQ^dVmh_!~ceJJ@KgrOE& z=Gsmn$Wl@hn`ne-LwOH={nwF`$1TreJ%+V#C?h0&>kbvMl5sJ)g^n?qt-Q!Pu+f+h zOT)6`ExHDjNZvB-Dx`!(@d50#@3Y@DkC&6K4G$Pz<&0EJyc^4;qodJg$TI*^I}1im z7I~tS%j<1=xkZ)~bWw-|JK2L{(3(Jtc`jYKsj<@7@4v-J(A|tI+GfDs~sog>DCC|=(+jbNRfAXz>tbSJmIw4+F z;f*zm^hudJA=L$!2X8mED$AC&>L*nlCK0)|>ax?LYf=)iOe#0A-J+-TDQcy*5kyr* zLJZY4*qx0Rd4>PR85Ajeo<@|dYW+u9bwrx3@2SwAsh?P>*;GMc<1NYdx8>AhKD^{+ zo=mGo;mxC}nH1So5JKFI)PLA>ZoI^vX}X@iC+u> zHBLFuA4gUKPx)urPU|-Vad|0X6ii)+259uozDK?L>h~k*SN{jg>|mLk+}iL5uFod+ z$IsC8@`CZ%bpEK=HpsZDZkX^rr%iT&N^OEnrByaRjMQbAYnG0@ruH|n(Z&?QUpCEm zqu5RJyso~fqPb;xzS^U&8T(w$;IB5Q{2If3C0r~DRo?ye1X}pd@3a0!b zD*J?}tdmS_86{IbtnDK7&xsx^@k+ibNrEJfn!c71wgNkq)oGf%%(r0Y?df;b z0C;=Vi%CfQfmK#`8&P1q9O?&0$+bm@WaWbwKU{q|DE0C?{?HzxU^@t;)BVO2_Sm!k zB$)Z-5dYet`scSIs&)#+M(>s;4* zqj>7xtcLNLrYNecdhm{~s4BZs4sfq#wP-h*-uQXa>r77fVoruX{>{!(rWfP*m(L?iyqnwXizxh7 z;nJTiGI;&e;UOZ+kT+GiTINxCbNfNOG5H`!Yji)@#)X6lRxh1wV^FI^DFk}+2Ismk zWBojSx~D33`)L0O{JrtFXxz^LQm;p#^}D@F$Ic71s5(X|tZTDHOmrLlQUi^FwWX_4+ zq2$KZY%%YyP6)s7GP!F*o}qXDCD(lBAs*lw_K7X~#+UaOaWW6rQC?S<#7S1n-q#fyOoz)~Jppc5l>9+nKYYxIN0ohYXf zh5ZLS&=hADFjl}#?X-Vhr0%l2xdqb`pgX6_acaw9mKMBp#tdxJxtcEW41XBZTe(Yn zd@aL7+_!$Mu$mIpx5$U-zs(0PapR!?q{6fJtCDX?YEx=3Uzd>K z4sJ_01wkb*7&yOtX!Dr*ga~Q6m;i2R+S|~N7RitEhCNtj|6~0S`0F4LPv&2ex$O_6 z(sPIiD2oblGL3O7`HdAjqw%Bs>{}|W-g>y0fmfeW?qvAozT|a}_hdEX41iy&9k9GK zST(9=v@{kqs=|)pv9G?eTw`{mqYafdpA$rU2-=X*_9$P8{>56Ps)};o_V0VnR|ouz zScBzf866KpYlSofM)XoxyFw}PQO}&iI(CC!v5pz0hzG_3?@KPODkJv<_}qWG*+*Kp zxbGZWd`-@3zdY}n7l@C4lBqnttvPtCV}oVK{0K7K4s|;yX91|sTN5-CG7SglACMGL zzLSj>Tq~T7T0wPe(YN>}Y(L5+t)O#7v_=J`V3;bNyh~s1lgpscmmH1?iwsgN+g2C@#+{bq(_P?vXW<&jnBSaR=y@W)HkqDdiRY z3I_h{U+%!i6phHgb2!2tf6h{~Nd}8}$)>sMjguxjEx))61c^g%f(u?FoHizI6(cX>|P8zvN-h^2ukJ ze8|kzL{9i69xdx8o(%x-N5HL^_E9ovYoQnS*)<0sO`TTsS*-i5p`;bZri<G|g8Q z)O{$Qnig{u7(aLxta1=5QT{5pf0GvV7j#U<@E>dJPBxLXxj{1!c$}AMv{Xa+?r9ge zlIq&PU+i)NPB)83xJOahU;7(AcAii5K|K%4I~qOvVkzqNJAn37{@SqiQ}Bz&(C0^# zaFw^ZpOP4)l}{h(&yHC~dT!{wy6>Yfi`x_qVV*yB;z5ffm?HGQnZTX+HH&+#Y#j>8QwfliuzM~f#QHZnJWfMt0qOh9DO=auM z<^0Ar-y0*8NWnuKb?~e_I&bmcZ9NQ6MA+Z=1($V{{D#Ft?cEgqyrrUwRUf3+{w-+m zkl`)aPfWPtSj5FaN(1WJ1@j?z_1UkxBf*kF;=svr((L#8b2(3hZ$0&8{#ergrt;$Y zx{(po3`+{s|4f+XN;OVP;K7Y7Ml&=xxyH4(I=oUT?Ki$4`F*z^44k|Lb8e(K;_0}~ z`il9?d7qM-MMYd+$=F{Qw(yWJBA!l6W=00s?co1A9Y5@oe%kZ#cCByRgu6*G;=~ri zS`i=RB-G_GQVtNL8mvd9JILOp2~IoeCr3Dzh>4DboR2jnmMfdRYzEJ^ZLIqlzEGIy zXk1+7g{w<>l3)L}5BA`jZ_DRW0w`bnl-JW|v1pgh7u zxv@Of=QG5$F@Ace%t`Hp4LV8NMw*|DF1TKHmkKEQ1zHc!dI3mU2#WuFR|lC<{=iew zW@r`(HcQ{H;brc}@>ZH=*S$)&S8`mJ2l2Nyyb0x9S6RFic5+B(-3hA#X2FsSnF$Rg zc$dVY9xwF**geiWcFoub9L&0MXK?*{U2ilphcc=${=Lq~jcgj;`8Ey&IbBNq$DO4n zdioE)tmE9a;r6g0soDnl#cfgM8Xv=;47HV|pXe3F(WK-Lj(x*QLJiB-M?qz_ZJ7g` zwT&lL{tYUt0Ni=dr*1F*Zzv0g=vb`$J}p zy+U%bub!T{J9=f^mSr&p6$HQLA9Wd?jDsFMA{YKYFF-D?$!@rw!D7ew#bTK2)X0Hy z^Uq+vbZq|Sp~O(A`oWDX_t1s2&-THuE6l%A2)V+!vaifKW^pDyTerj-K5G(!7IqbD zwCXo6U%&AB$V2&Mq#&A<-CwA4GYRFaeQ=||TwHq1(J1{xx+FDZd=DDrZ{k`kq!x~; zq1+dndioI+bfF`S-oNjwfvV^ptCoFrC6Ifdc^xFqI!P}5o6v#HQPE|3L6$Ilf-cg| z)X+fL6N**b6S1+%y>WrY!Ru)DCRj2I{tRUFqH z*1}?pCay>IRi@1Jz9*=;6^(XoObYt&0q9DG^85BPSlwxNN%<-bAF@I)SasV@I-I-y z_v4u#R14qWAl09C_))`Da#7pGtQ|jKZec6_Vl;tz``A~2hVuJ=xR&?(n*H={jQdk^ z{uZO8Vmf_1tGfm8a|y1Pl80d>j4vB`e0 z#WgiRb@SEaN;de#PHm_fh+E11X5YYZ9{*|PAdX>xcUeC&o7!>quHfmF1gBl~?iAPT( z_um!=wGiAFNT_V)+oBlgrYyJnP-wX$WI#g|_uaNb%$B9Q)iKT`;ilL*@sF(L5kS=q z({iD2J^)$bVp~894wS@z;@bFk;umcZ%(?}&D^*LDFfw%S=elKKT|~ps^9!NQv6Jh| zq5N2C0g|u;q2xHfbwKt3iq3H3&B_a811tY3aM>QeyW`#-L}4*abJh$m0Sx4mCknzE zYs3FPn$EH<%KwY@bcd95iG-k}bc+Il5=u9cGIVzcNQ0Dg4&6w1N(nq+p;U&S`CAqZ>m{zJKK91Of`zp1Kh+JH>y2|E@4Sizmn?ql>xa)4vhmmKbFhjX zwFe;GZY`CHyLo9cEPSQfx;A2@81V;6H`Jd)to2vA&8?mIn8aCd(fpb4omT&B0Z9oK zmDIIA4LLcTnhCN^i9%QAV|3Z;Lj#lvX01m1J3BNvFjBpev7eqaaGY(&_ACc7;`z2L zmt=jnrJUlKJM~8+L0Faa0>&QxEp~55f{pnEtf#PH65a()Jmd2^whZG7AnC+1bA%ZG zP)&y@S%io%2mS*WOUZR|>=TCFcYRCQa{8=tC3)r|GwkwLx8VD^L_*aMfiGUoJ|@38 z<&@_oYVA3nk^9g2h<)do z=vr?0k?t$^o0<(s>m6LR^Jf4-|9o~RMuk92jm-}EZmnobfkA*Z!7p6Bi_AqZ%Q%b* zNE9SSX>s#rvQU`vOnafxHpfP%?-~wufcRwWsU9QD82_Wy%86SU5%l7FYtFXiY4OVZ zIZ(^)mu?m2I*&Q$A-vD^sGpYE&QUktoJ3+??mteuGZy8Pvttch86|9(Z#NCO z-Yd$Nx%IG$GgW-_WdW;VXU})4)_O$O)}HBeiMI^$XC5q0ph*S>!e0Kr&?B zLcSfi5G{laGMVj6TaDN(?@*GUy125El$;vYJXV0enQHXTQPSy?`j^l`b@}H4*NAy8 z%WCU4#i|mv|352I-L`XWaCn}9(<5Ux@L(!I)N|S7R-?`RW#e>s?)$LW$6Jx?fLR|i zh<~Kv!&MLjlzoSC;|vIo>a{Ze+dj27$s`;%R8b|m;?lg%l5-q&#u=oi^M@HZlZj|m zh(~#Nge~CNXWmS?2LJX0ZQDH>-f+2nO!Gh8YE$~RA@0>TSfv|en_Hf{?ceo$3q3vt zjEYyed;ONUW=VpLUH%X1UM96`2wDWbJO`UK1dXShjMxGiH0=Vjy zU0eBGl@y35d-^;vFJ^G;WtYeTa#zKqvXxv|AL(;w8WM zoC;(4{@f#*GtSHQUZ2$Z+pc&>(8yEBerj0T=pPo{U(@|PlkFqENR^Lz0c`Phvg3r0 zoT=v#YP}z0eFFnKXS=;GPbu-kmF-C5k9}niHsOL9KLERrLx}rz5k2+*UTGs_$v#26 zCwVRkTdiYkc$i>|$1dL9P{NXZmGnV?b8iDK4zDU8e#T^w7r(*8ou-EGFgD9ZX3l`m zdH=Ja;WBv2sj|g%Z7bi5VL#{1%TGaQxA-i=YP^J$kO|q>rBbh)v=+=IhlCBB%u3<8 zHHQ`5DJRI%sZ|6CHIcUxeUkJ^*hXI0+Gs@eUR|j9X3(n_1jJH$Cfrz!mz+7za$H-} ze~*4i$JhTvl$#8Rd9u#Mui`NoO*hnkzDwZSxVvFvtQS=1Cp$0NZ$j}(>a1e?HpCsH z+SsQlx1WUMnm@QhC0sfDhJ}$Gs#XqJNqXfT*SV3h;p1f3pt9pDS30!(4>RZo!U&z& zFih+~#=VTXyKsM`IfS%2(zMk|XW%iLpL_$C$rsmDMwxfby9}*=DMNT#t+!bRBI_Kb?*m&^4xwF}{H&T2PFK2+!47Em3u+5OwoeDYGY z+uj@=So^9V#A6Zg=B)tSD(47G)V|-lZUJ$=wcbq1pjV}Baet0r==}CT(p@=1IeU4B z=(`kKJ`H-#d#fOIPxww$D-d zN$q9Cj5F!ppNgul6Urs%-x8yS@+?XcR(C0iMC)Eo8i|b``_$cKr82h zI4EZP6-x^$M3dk1ulQ(^ayQW@*sVdemtZCy14}9N%`G1zMeUDa9k+f1r7V}OeZLhc z8@F(V6ucA&jtP2Y+F4G0cipWwQ;@7Tlal1q!O-3{RZW4`gd(%?OspX;uNFcXrI)g{ z#!x~Z!$=_$t152-Uf}%4$uG;&c#>e8f{h4K_x5)a%7o7yLZ&0Xw--T+x{!S|!=?y`qpF|Q;QLrDo1mfLoqBV_rH%Q?xE8_?n zo!f|e=A=?zc_}ya9QDdKk*28XT61Loi$GQM{hNp;z-essuM-DqtV_&y|6&>Dp`Y)0 zg)ynDbQ@d%tv$hv+gpyf8@jq7m{Gc=JdJEcbU?2+IUf0w2xcSI?%btCi4-DS>6<~m zaHb+N`c1sd6?wxipdp^OjFw7oY3?oeQPHBc0cn|J4Lmm6PuxPB_jGH?;I?e)jIW!k zGK(3)96aCz?flnKaeSDwLV+%(RpysQ7X{uy^&hshy$`Mr%?s5J&KOo#Zbg@IV~E?1FS*S1>Mkq2EDUpbehg;gd@LMmN5Z(lE3pPZ<yE4K2C~K-Qe0-8TDNMi zwYh<`a{<}q@Ga=7TiUtyK(*4P9dfW!5G%wlYU>7#sJTyois9bKOUAP?TH56W3Y&LtXcW*ka8CWP0eV!h@OxM|^=z4Ey1|Tje2UjMmF+8A-c$Tjn&f z15DEc&*G4s`-fyBaL$HcUs;%f6jqg$X;ysN<@NcKhz;f8ZA$yxM>f+Lwb1(0$Fy3c z7Oo`!C$@ju!;|rDAiXRu_borLkB1ugLpXSgm5D2j1l(?Ss^***JJdfZMkhDw-c+ja z1M&EAiG-U&ye~UMF;qn|+L3#Wp_1ZsJ@!kBNyy7rijzOG1>DgWa7L&EG?7k+VrKXn zZ^V*AKH)j{oC%I$AD`7d=cg`W?#nn_)u*LRTf0YK5XY5vdN9l`k0l=nhXG1Tc| zQo_%w2Hu<|GGULMyK(Gqi)ORpi7to-fc?@;dg&rsQOH*Za7=)>I0it-pV_OW`g|wA zFP}^;?h4NHx-;l#*=D}Je7R{Y-t!=LrNMvY8k7S$KvF;JK3Vtsbv>{<H`-iZ;_nhOmN8Y47kn4<80UYaBR3b8Q$Kf!~UfWG1wOUja0KgFsS~uS7HbDlw8&h66Kw_iSjbJqncqn zMJ2K~!V6=Ax@$U~Q2$xS9Nl@q=C4~T_|}ZknaZk?^%8$D2NWTZ@{tmqoTB%Taehi zU_$Fx6ELP^{H3XZQK;GVHO5<>bH}?DMUS|VV`%^sgCaNzQ)DDwhU>FD>0K8)TM5olwltXsduJJDN z5I1w!neT7YQ||fKM(X$aXxlc;_ITIM?g{uuVr9~thJyQp5@<(+>Imso^y6_ufNWNJQ+?adg!UY zBl_RhKANxUyUv&pRx^#=9RQ>ic^PB-uRrnQ#V!7>Kx|g+h?mc=nQJ1%C)G*d;{>+F zo$ffUa+Eo=p;0bLjEg3=qKrEc9)vkHy4xsTw0GIeQNr!;##ij2ZR8J>TiEEK5-ahs zc>B5%q!1J?uA$(;OE@?yras=Ji!B8<%-APvf9HDy19uJEY7Y2vGOiYjQ(alAX^=eW>=>?RyS?X@`IEsKu4OQ4MvNX?LM5h zV_$j@U(~nn3fC|iKpqC=oIeW-JXF33B;|~lWn@nLOAUDmd8{|Rnu^IN7cRUspw8>_ zjm}Mu;grL7**Y58p_*10Fm8>Lk5yL&KT82 z3XT-b#r9a_x0NNjaE0Y>QrE4MeLQB2;I;6r@{UQl zw~OlpUz9HORb$+!d}HEy#BuL(up+Fcy>J(2{)dQso)Dle)9@^FAtw&N4}8JiqSWw% zik9@8WSmJT1d!{dQSMnAG8rqb5~2VJ5!xtWz978`%^upNa$>$2hj433e;O)m_ZnZp&{$;_+Go-3)a-~ULt<+Ua zBd?eJCAE?w>q8XAN?_x}$LElTnddE~-D7t#?G;oz{mW`;rq^1Cn**o8zZ80LGUt!t zp-Sz#5{@^(%6(Ppv#3D??pX0G>>Iy$q=?W{mBcTR-d4lNM!ziIJXt5K=r(X^?i+K9`BG z&dDnh+IDMQ=VYR+wz*{d7QFgZs6);=fXSaP??WF|zD$TJ9&bD%T$UDa18Sx?{m0ON z8Mb_V^K}0uWY`<80$<&J$y#OX-)YvjwaFSxk)OxvindkEuhMuoZXlvf@P-?|c$J4ODLL+8X*-Bn2zTDXnyJ5X17)d; z_#O4qL~fj}iA><<)#=GZGYqJ;0M9vMfWL3Yd|WB6x` zrmct9D`Sw8T@&t%Y(0$bc#m8MqO;^G4;tE^U9#C@zdiZ_!W!7_f86L*q01D?<`2=B zSb3vE?GddmOcBqxuWvTCZI0U)s0a~>rfO?~fVP$u%_?e?TNajH51%{XpAQy~sHya7 zCC0bQrEw0*#p-PGb*byrz!qB^_?xYO2k4cbK*g4*68X6rl&TAKy2H{US2LS>y`wHi z6;ELKCP0tCZo@~*BsnnPfx=tdd$B{Uz2J@wfYV6Q2hmaS|89&|+t6Yx5$a>KFgTMd zwn2X4cPx<+HP@G16g(6jrsVs{J5Jk(G>3UG>P}5q=qA~gv5;Wt2D!R~#dmx%(tUJN zr}VBe3L$0(BTbhe7`k0=j=L0_!meBo9GaZ-P;D}`kljoB+A?l{3iPIgu%Ebcv!Ol8 z96q-M#9g!P%`g^Qwm}TeGHjnQt_GVsHPuSyDcx$9{|2f2r{r9(s zfsWV|KXqy0;NNK7TWq7Q1a=~)IY8%(-Svya_(pM=^(0&_%kPcEm$Rcpmj!O|9%i`c zT~s?|o7WSyrZuIaAY-pI1JX;SY3j-BxY=jap3+mH+0q0z$CV`$*~weVPiPPq86M`5 zg770rounVayei&B!(mFQV6nh%D~kmI;p6SUo8(o(N1y(AiE;kHCy|h}+n8AD(`(3d zXU?D=S#J5+x8rAH=*%=rIHi|B`gStJuu4(Z$SsF&0GOSDtO3cMV~w~o25n_-Qh}U; zc;O|qmB`UH_jZDv8_c`+Kamoz9UZy1mTyvye|A$qo7eEQDsqG))nzryx+OS&o$og{ z&tWyNE4A<3@}5h3D=xVCXFzJe2Y0c?+5RKuxj$4dA{~Hr$M;lTUkg+dd=x}$6ID)e zy9NPu^AdBiK{DI1IPAD6{S=ZuDEkz+3ut9Tk^+#}4D*UhXP z)$Ojv5|7)6AKOc4ydUm3%a~`pZ5;L6##|?(R41=Z?HbcY%H8WpCJApVrm8Pe)7hl! z3+eFfc%K0XuwLddtIpTNY`MH6&l)cTMEw1pf`&(Wf3OJna-co&xErBPZ{C$Ie$>c#XKu~I6 zNY+Z~nf~X%l{w;W3USIZ_dKX?OZExqNw;tt-jZ?>{>4bwP(`V(!+0F~1jm+9hpl7K zi{01fxpgYaeo31DK%!%k=KdnKtATZpTHu>F!43lY-K#SJR_!x<{;b^xepGxD`pHj< z%ks>FGkgO5+`hJ_HTa82u_WjF9~M!J<|s?md1ix^YQU6d90iD|T}cpfvlQ9DB8r*t z*^YLkbu-)2;`h~aXB6)2WwF47N#4ea$P#xmqhd+g&FH_C6WHjDYL8GPd90_%J_gLv zgxSC!DUqAdoA#uidHi1k)Ic4CEbbuuwML4f%~H9m9z$R2ojo2Mj_f7N_jg`kkqIc! zNI6k#YBwll%a_n4F&7s)Ycw@0-|kSA0*2VgQyrdDWO`ezu4JiW6eN>QzKNO=_l(tx z?|0D?5Pt-)uoVYUwOpEyH2 zyR8!}GzYCMarlPAGE<&Pf%G&4s~E1I83lCvL@4*>IIC53qd`k8CI4Rwu>Ju-8k=Ga zZ82~aF7eGbYBxv^Fd|c0OQH~?7`?c_v~-o8EKnYaKi|C#oidqginF^W0}d#UAN=9V zeo!;dm*8bw**YkG{hi z9tN4O*xMMt9(*`fO0aX@Ui%b`q8$MnO)a^l8s+Wj1v7D(i@ zcLVVU@#~K>rz3V9Wew}S%1e7pyM`6sq2;K*L~1C+#00uge9P0+XLNzVpK1=oDe;#C zavuWU;S!FVJ(D>IYT8z zZ1eHU$Dh^ZvHVxeSw@LsG$OuroE(1+`uxmRehvXPlbT~?;1wrGF7ew>WkU`A<>4&5yz8|RHF#wL$PIH@2O9V(?G zmv+xCzA!nb<-97(4cVqI?Wc|UCDPMstDT?1BD@f>k- zRZmvt^l065U5FA4I*52dQ-GX6Y;||2J?`qKRqPZ8H^uQW%F0Qhbb1XO6M;-fxQ+o0 zMFPO!PBMvZvXkk8mrXQj;1uj8u>#xl6${!&zgVZS$S_C;kxa26z7Kkw3}1M}+CUw6 zE*TZmU86fh<#tmim%Gm9z4cnEBsk_RkCQg(C3lO7kz#h|ROQ~bXD-u~Nb$Qz)EiTw zS;xI-pF{AoOw5pxNgAOs3RLdJcMPl2tiLo|qcC1uAd0oH>hAHt{<4h(#lFfR+wd{iRMxo05LWNpWsf> zA-$64Lq~}Qm7UC66s;uIc?h=CE#GXvm2t1ve7z6PUX`}`VNMA{wdZ%W?|Cm4*cf}X zK9}%D@wGdTpz@ApV@PkHJMk9XbS*o|xc_98d2^;-1)%-A_TEC2i2+HNbw8)Ba{Ig@ zcmA=W&zll`>BkWBN&cCbzk=@G#uweQPjoNXWNzwF9t-zSqJ#zo?c2Zce5sE!Ilzs{ zKr*Qo^9`uu8PPrmkoBI;!fg+QEGoi|ne+*#J0hzuG{0#t8v(jz7V{}#o>F?ohzDo} z4;<_FjTDZc1$pJEcv$0g^Zen?)n&EuupfcAH0KRrHvN_FC?S81?%283{?`u&(DHW417~B3YX=uLdRYaX!HrPHE#dyv2tm3eS(SjmD8{Az z)N$OJxeZ;a_1ZVJ<}R3L68)n{76>{?6j7%*hXE-RMcb^nMPQ}JkwC-{Hb=Ks@3PjiL7z-JL$vVsDAC&UkQptn*MlF?-gCn-_vo-KspIrx@au(9 zi=WiRbT8~^poA&fdh-j*+<@;7AB%FC4SqJR_w!I-f;Kll^1jV|KE_Fx=#aNfp@wS~ zZv=bu$3bc+R)X9Q2CoMv7c8#9IO`sl5<>wPU|D;EZu;8TXjU`p%R3{5D{YSF}S{*j0X8iP9l>xAhSC!g)k(ThA+mA4j3{oe}7KmrPZW91X-FMD|okF0Qx2O^H zOZ$LE5!+ep~?2|1OiqF&E*~QbcdEqRDe9b%#bN%pWW|)X1s zdXWgTF0}Ez2kY5V>RY8f>hM;cvv)<@_MKh{J>e(L&NS!WQP3U0o>Ua{F1?A!5PI&= zW!WkoUYg?oaBerqxJ1k9SO^BqOi6x~ zgG?V0(0%3Aw`%W}T`MgPHlN?dKitfu5xeN$hm>zb>%h66C&9lGrg4 z0K^HA#`-WNmv1>&BzfWvj*{k0;%BJFZP^so#PKH1YRHb*^ zMBf!fw6hhm^JlwyNfdmEE2|GQ{aXB`-zfBgSTbS#`ny)-bnViudZU7^jojLtESpUC8ejZ?67J)Ve-`F^dnl|^boryLU&%n+xX@3G?7rm>YRlbz~`wdO{@IG^wl64|^|3*!LChc5o zOFL<1xY`Ftw%aACX1!bt2&7eHA^g3e`_H{mQO2py=O)Bkcx}`G;k!8?K zB+OB=o%%qGLpac!34GuJRON9x0lG{2gON#7 zlznE$i8w%*XRESpo!BcOsFx_JV(k#^@Cw8wSa^oUM<=X1ckjpC{p4N?^mVp^tMUkq zV5NI0{V1fNe|G(4c~&9hyzJP8r>6q2Q2tNuXfw0p0kYtKNHVeyWD0WiFXnB%&09#C zB|6+fTNsk9vs67W(Js=qF;KSN8A*?QiRgt6w^$ryCpY*NbIhH8Z ztk;CybG5l!i&Z$cFxwvP{o=PPp{M8i@`Nt*vci-35N+-#NAoH&8dvPCoz~ouKiZED zuJgxVfbCz$A!CgR=0y+D5`{u&BV=aQRV!!S!J6e!$%eI=9>;)gVEMd# zQeo>kHIXV(_B~SHaR4U0%j~C*tH{tlh^_b}){vN9p&6j*N_%yx(zO4))g<5MvVKdZ zL%h{^!26!Q3eY7rb>FyOHU_LieJ>eH!vJji3gsm+xzs4;_It8p#hdw)$C&ws8}Rd1 z!kJ;RKdi-E*i+zV)NQ+On)tS<0v5;f;^;H@bj43zzVO9ZE`)+LPmpRVJdaa-tEpo+<-V6PY*Na5;kBkn@#yf?%Fp? z*1I{+k0XmiGJVwWU`W*XMGHXTJj8A=@F#Fw`g-gz#&r02T&_c$#82lcTQ{aj+^e}B z&H=fa!N1M_%&>b`eGUqJi>rqI@yn!f3(#Pn*{T!g_uGETk_H@x4Iu;PttyAfU@oyvYW#@`&(I0jS-mS!wLJUW18LHU)4DW1!!e<4 z=kVv<5%)@rZOY3{JqalD@OR46-56IEJCjzmQ8zGxqZqxc^`%2!8c(JkGv=XrPw0Kg za50m3yUD&Gq(|X@iE19Sa-F0e%f0h#a1TOXvb`ZoKtt6pG~D?&S`=Pl%2_Hw4FZY! zoXu$%=g6%hddCy@u}w8#v@-uc#`W`!X~>4Pg4jxki&BW3L5O%^eRG;?zd>x2aoRCj z>N^mhZe%>OXMdB^Ev_Duz_CwUnDy5SWdZ$qv$h^5*!BJ!nMSEQirknkU>A2BQ$8onm1y&jALf%l=3b z&`}-cwR1T)7KJgy?lM&Y~KcW#>t4SL$8jHCCBg|6I(9( z**H;Pmd#>JWi*YsYYZhS8(s(EtX`U^{8LZ4N~c^L#-FRWMJ$V^2_`0Ve%`DgDMEWo zxkGV9FC&3rc*Z_dbPMZz@fG@cc$hX^%4(8b<_h3XTwiLRu7aqxfI*_~;+nGFS;hdLO74p{Az?A*K(f!kFomv>9w-F&6Rk2X)9 z0_QjHpK8ab^MmpM0~IT?h_3T{l-y(@^+G3Vwf$1^Bev6NtEVn@e0Rm1Vz8F4ha!Ja zJc@AMumZM?`NuUk7t0%~eWj0ZO8pl&_|Gtxm1u;^1ad{mMs38{o!DrJ#P+(cXs%Kf z8v2Fc9RiX?+lL9;RhU0y!`$ZSoLiJRFjz-MRcniS^#q6Ct_jz7VK{w2-FXq4sVXa_ zz+d=%&;z`X#rq%T5YnsLiPsXjexF&;^#3p?A`&HADVeHBTs&`^A1B0#FCSmoe|t?O z<9qf_H?vk&(xGNKgSXl}(8=`n=JDNl2D{Q)?m7(G_k>c3iB)2@X@ie=gs+*<+3N>h z_o}`9L74i0_$Em}dPHoV{J#cF@Cp62C2Gu9r0E z+x_nSuWsozTs3(#p5#aV8+lS>9Jl;yf^1TRN$p}re0$d5VKI9>3z^U3He<^9@bXz1 z*JQr*!!*yk+EnJ`>~A>Aoxmh?&Y&!B^G0gz#R$u;4~j4T@6sAd z=6CQmcK#qc&^h6Hxg`PgjjyD)+Di-tLxl#jj%vC)O5tZPd=^tdI?IR>ve_^wJ?j^e%kop?xh4TL7 zIG*;tTtlked%2xe`nc&VO_q%XfKx>dp z=(`Rw5%V>gT}=BV--&+5?7i~m+Z2s=RkwTm4{(onWvE9kz>ton^|ct?9Osq9csIW6 z^3W%B>VE~LnRdj{E&>Fa> z@*A6kZjb;@*$Xp4|Cas*o!Wl~Fwm6>!^oBVud7yxU!wRCb!1UmE< zKN=QTjOHn(b}s_d$&Db6)lLp&$Tlv8*ewXH@`+@oMl6t-#v8_Z{hrCAq%o-WG}PRZ~pRz_A(wciTw_?7P@cj-oM z;MMYDADr>Q$szc-W=RLp~EiXVLRft3!w=w*d{Nvx_@^AQ%^CF zX!N1HJ?V(4fsP?{J{d8d>T_sl0fZT$--GmZDKQfgf>~Sd0@~(l?Sq9Ef*_n~;B$R_ z8AUgJYv1wDu@UW(>q|Ew8M(Z_Z!oflR4;A7TX8+rV8`+2j4+|Bp2W)#5(em)$455H zDSJB-lAQ_Mk>X2jLYM5EX{{bI&V?)W>IC{@J~<~@7IqDm0-td^LT>x>BgJlZuMo! zRDjXhjy%dhJ%%ZyjyfZKa;*cnuDU@Ri;G~&)CL7TA9ER+5q3VBKJu4CK`Of6Wmu^X zNna)-fCn~Jdu?10*>A`r*Rq=z8WEh-y$}aWIC5`wj>Z>?;dqNl8Y+m^X;PFpxhlIz zmqaTyaA;i^qaY!Dcx`ioy@vx6YE!DBk{f=}92JJQkIo08QI(MK7RHAOaq4(Hn9)~F ze~BC+L|ZuOJXg-5SeL8)JRvH%?zHrfvB$~S`b63JH4STR*^fCB(`G^%b?8xXJ!!M% z5wKQIL3C}@G21b)dQ|gMan=+lQ8VYw2=fhZ-HcHYR6{&z6j}~Iy(isPyTpTC0@pIu z&g))(X?6>oLm&?Zu!)5Ck=g$pAZi-V`ipq%~R zu`=d*oy?xn51vc^?*6 zKC{-8P$Z$o3v`i8@-W!ru+|6A?HX01ur}(!`)?tk+vWWDeO1k4Y2GoNSi5e?e*WhakHWcf7(V9@sL7QIq6sFB{N+YlM3pd1(^15 z!=Nc17fvGEaMDJw&w0~=#JrIw!Lm3BK&nf(Xx9uh$eb>A~Ay}}Dn{X+Yi+-eak+PC%I8M|8HaPW)J^_Fe;g=r^5zO>5X&vi! z?&r_uY`bik+0uC7=lC|TD4fb#Q)EayZrK9cNz>yl^SFPbUk6N?%gEs0`$ZU8 z$8kW6w|21zxslM~0pY>@UtMlb;Q7f`H(}hNQx}|29arbtO_Xi!-c!O88{Ft=EVjNV z6)0Z~OOyS}fa$DQyVAiU6@;W|@x@-4EXh+B`B3%m0~>^w(1z;+#-!*C364@F2PzBD zj}pj1GO()5`QfLGHPXlB?QL_wTcEJ+zA7TIZ)ia`2x_61lY8WHr9;|B+f6<5x z!2WpG0|p5ve*QQ)VE4dXfi2qMt;^_-SMMaV#0im z>E>68v>Wl+9p^0FW9%@IzWbNcITas&tc(!p<;e~zlqssBLVHJx+2)P!GREvm+WUAl zK8rNSarcYn5Uooshqtq?t_|VLHiMFI_Rc2S;J?K zkr~bV`RcNMbfssmj6Y56P{r8F?CPGuN7<*=vE57#a_V^8ET8}v1Jy<8A&qHn@VYm`{Q%^M{bxs!d4NmI;L5Bs)R!itS#ZB)w?T-H&_$hyi%IK4K0$=?KI7K ze~YZ(_`X^)j^Aj7&onIOg6fslwkJwZ>jB`|Am=NHL;t< z_V3Pp{f*Kmfn?tvd#RLlOp}fAFle>V8v~T6u^@?Mdbl&oZ?hZJ-cn6lJzA_`Q3O4d z0Jbl0l{$+0%ZBMm)_2Qwa4zD)8uIlyw+MUgA?PPse8H$8tup+jp=Q7pC3p#sGQ~Q{ zo}J}6O%BNwg8~~>Dk^LK|7!v8L}p0aVy+V|H;h7QiSjn2(EP(>-9Tglx-K`2Kk0%_ zZ_^xVJsB9B1rduhwAtS0YY}`43P@iupdm&UZ;oLEN7$pe#Mxys;dHtb(@Ty>o4V&8 zoKW#q%fo0Lt~#XxUnEJZCc~ro4iShWzUj1Y@$1m)j2#9h3_+o6qVuA)vZIW;`5m*f z33gkC8gSh!wQ=BU$L;mz3bPlnuZ_L@qsHIP8_1V|!s(G=d1tReY0C*i1A4_}Khl%9 z;`p7XzV-7(mqH!&xT0xlB?ECQ(J-)!f$< zrycarzWXioD&ncC{I^IN@Fe3OSp*|>C(EI@hFtHc*k`%gEyf?z8?Yxm(gjmI&RI4L zlE_sF?@|Rff?0Ff9#__EU}=-BF>VFn9_bm$x9Y$uC~`CNsnxVt;P*mAeK&NVGd&yi zWZT69+f5Q$Z~}h7R5NIcM9;D)(jwaU)+qdG)-xF*5*{+i)pv{rJZe$a3{yt0`GPOT zvOm>Iuw9!z%z^yBE-b%qe^;eem4?Yw+by($6Q3xuy7Z&p$)9~9*8~l9t5wP%M>${2 zAgvdUI?=zupxK+Ra0PPY0SS_3m3@LJpDzc!0Oir`Am|S3yg$^j7=fIc?pxK0ms9m} zMw@@(@KHVO%h>d2QEavkvv)gS&wGu>Pk5r6hgN(B^Y zt+~Fc(BGN5@T~xX`mH<0Ea&G`i*lz3>7ZpV709IU-T~f&2~3D=aCWx3DUSz7>|HmG zSXqRC$*j*yzop^s3`$3lHneaInQuR6WTz|PTa6|(7qscMXWnORZ?{{3X>}iOxf(Ag zFvm$nF8x?_j_^)`Yxm}1nb7kste(*9J}3C`Tfb`zZMBGuIqQ$&QGh|dcUsunQczvLMRe0a#1Bh17YxU@U7wzU6L9(=gI9Iu17#cFu zNtp2c+`u;PR+Fs=C4c-Y^}C%to?}HVaykW|@g8(5$cbuW9 zJ65ik;`Wx)AN${Y(B)!mIR0u2*XUo54cW(O8nBY;(5+~N%dFXS31pndDriIe*eI8 z&gYr?oSC`rnd{PO&&pG28`hU?6nN(S!C;SN1uGCMDoJ4AYGPimL!$h>8}D6mfXdG% zn!u+!4!-4X-ePPeYc17hHn(FvKdj2kL?@A8csW;bv%1*HC5d^Xj+NBOHxlU zxW<=$8}qx;NCH+J=g*$y2mie(JVOZ;atn;(e2sR{z3k9UU|j{qS~Xi`o$Z{31JP4R zn(vxCZp4{Lawi)DjM1Av&Lx$_9jCT5C~N}CUX^m0W0|7s!N;j{tOa6hVU8O!+;R9T zSTi^La--2QD}+l^BjXa^h$?YGY?D(XwBP;wPvawM4`L^zv|tyGKfwI%cd6b&Io5p8 zr~0wxPgI<4;oXc!0lUUU(}gnDI~Xsyut;O+-|$!h!v)DE;OJrOezhp$9xE@93^J0w z`cy$$2<)3s#hDQv>VVx5XA@=8i}1cNJRLvj1x zd$W&ro52{CVVC=1WNl<6-Vo*LXF4+jBFeoLU;R&^YdmiFQuf4BY*tkFcnt-qnO-z* zBHbIA&yQ@(ql4)E%iS9QS92{n>R`t~+b8kqURFGkF?goccUS_SHb1tU$|H>Xo!n(F za%0o9^>COBVArKEw7b{1RN|LTW=4tADHjr-ur@PRRCjE|slu}{(E#o?&L5Vc4taMX zj^2YxZ7vT4hoR$`yj%VxsD^E?KO}xp)VLSj@ubPR`cP!9)76f?=Bm{FCQ4? zaQ+n)SF*QQltzB!ORHU@{HEe-^}(DmzxT>DeU|!iq^M|r0vv|R~Bv^m-gXl(6YX`kc^#dFbdl38_0fx$cXeB?@S%0h;9d-qh%aMcCepG z2~!+|=*M(kwlfoDI?&$XjPbw0@2MEj)9(^~zk_=QqFy^9nAFEe!Dh40Z;d9}49w0} zd7`(x1#4tUi0rDh%57$-Lzak(Hc~8LvY=YfNvaaemN;*C_cD#kO~3~?Dra*$MI<$) znesrK|F1~)@p2_TB;fb_&+ufHX1yKZ#zvNkS7PDGry^W&ytr`GhkTMx$zRX2+)?b*D}9(+3_7QtCwJTPdSV4X z?|I1d6{|9;Ty5Q z=MzE6MyP`13%BirP5N?D90?UXy-uq?Ak)gqnkXzXSz+5I>bXw(o6+<}F?!g!ZW-I2 z+V19nN$9t@RYk7Dc4}6dM(kAUpUMygX{IlIfnUZqM?>Cz+>+*peDioVh`*L@*t3&f z$D(B-HoY-&ZaP{p&C1dS=nOMG*z;xjz=x5`Hkfd&As8L3S;H*Cmyf95NOg0x!0 zk2Ck876VMGOICEc=-CsEfE}EDEPdsbolQ6A3FuqlnU?QiEHa_Igir$bbxT_9d|62U zoBHz#2%j?M@_P-X8KR81eT<8wc<6PI?U6lmu260QD`1;R1xn3?HJ}}uzn1vE>>Z?c z+p|bii2I1%%>qeC_b%qM8n3!#)*9s%hT#qP=EOgi<+n{t?`}@OJB}znUO)QfzR7!{ zv4M@T<>?SZmjM;%>WhKlEeI(S!cfv@XW^FFuH5s_dn*TccF8ux=;NXYuy%1Ti(uX) z{N_=SnQQD7f3v3qLv*4JRSdLl{Yh{PfKM9DnB z1B0pURECP#TTyKUsj_llcP=lXa;dfwc$rQ#hVs*jDj~j`a2knypF$btEO& zj@MWgFbck8>4P$2%#Lr0YrX?;+NK>QUg9>^_PZlIjf8LEf8*=6;!o8xkoA$^r(DAZqo8@jJoyr>It`Foa`*rnf*W3_3&~P|IKO+ zV3o+vj~5*&@cW#zUI;RlBhVYpCUui9+wx4(w9vsv`r)7ZR3UT8$FZbQUM95RhO&n! zdPe_<;wEl$@6_mmB$f)teo%$vI118a zf(H2@^`yS0wuh=vjBK0=sOOV>jtN9krDI2Ve}~rxgPYu^{NuK-b+t43K=i0_s3_Yepprj5Jc%|Kt)av+rG0bsfiARo@W3C)&0lVK zM^rhJB%#Ct30hT*cM5z`XNNNlarO12MXrn^Tpg9K|Mu4#>908no~@H-bm@=rh}*ko zs0tq>w7@+Dbz(2ijr_~wg>(ERn{QMi+s!ljiYFt=hgc$Zm8NFp@$qcQ9A;qHnX#96 zr|*+WF-C-dKSe`Q)?+(mhl50Xp<3l5i7J1llEcRpOa?*DfLYK))G4_P1}l5R9??lR zbD;#-+BKv(b2<26bKJLEsjzmmH9Mr*`g5ViavrZYx;Ex`KFdt%ng5ob8-Dga%XKHT zPM)*xn>*%Y#iX;Bm_1$$!ViXewMlC7TY}t^-R}BoIC$r0XB9w3??b?T)R#^(l9QL)A1umw+uGm< zTSy-s;IW3|mz8}kd5txeh^cS+rQxKHkSDt=-`@vO)mp*6xCLwkRM5L(aODjeY5J(# z61oxX3Oe{b=RBm%RPuN#J1= z>f;`KlXD3Zu1lnD4-g&g!IGqvd+n~G^@ayN7pOS0hb6$CXP>c=G4=i%eLq@Wi1$r6g6ltKQamymlfSiC z(v}sykB#WgOkek<_qUzd+^vTtcPr0)Y7RP?I67K_0E6z#cavVk)t2t~OW*v#_RTSo zV6P6{>w@d(nQl|_7KR1b-8jpz7A-osHjj0|U(%JCk#ltFb`e*Nz4s^{)cUl>UgRLs z2h*JjOFSjc6MPuG+X^O1YPEH3y-ae)J(3;*wG}1ggTLr+sp`(%+LFkMWj9yV?6CR; zS-935bPn+gxRLRh6lP&73RR}f5!4Dbg37FF+ohK_M4QOwSedBXlf@l|`QD6RMfC}L zfYYo98U{2v=>)%>!uZDCc@7Ut{X8ewssEFJ9?6#y1&OJ=Ts9SY9>hDd>0LYRuD)pV zdVNMe6R7;RgMU<``^qk(IQ`WBLJ9u}UH-x^@&1B6o83iq{JOTiz0FZB866%s#WFq{ zVVte9!g?xQA^w=^A*CMZc%HXc9&ja6K#GDq!~{EVl7dEWm&p$?_zI ztBqzn#}oLu^WoP^5@e6~!$#4*WZE9-KjLSkBZOovuu%b=rA>~iCB@pN;JNyHDsf`C zUkFRCUpaEq-Su}iW6L)-YUIqLNn=;I`(Ax^TSm$GvaJ=5<%_zjetx_9Nil6<*!h0x zH3EI{RJ_R;Eik>k18oI#b#GT7d3&#h^iT5RBgLkLDZGChYacm83}-ewJo2`EtsgS* z&L{GMdbgrXwaB|vC|SL|^plPrDdrtjps<^$)+xFWykQx}Vtv*2tbeiOD#3~!hMo0y z$93hE2kTG+Hb+nIZv1c?E|__TX9wG9^!igdPrs5qX*zoy*VY>+@dr~ZPYLX+$g=f~ zE@609Ba>oP&=!s_2w`i^b*OC*5W9Gq`rd|)>0wqxy3s=vo9)e~W&5(#cYwGdQWQtP z;^|O!<9mQsxzn&Zy&Wx{n>0|n@!)d+2o4@A(AI4|y{uD05+tO91$p})4XiUfRJ@gq z%bF(c{BWID!#OiY|2nN2MMCvVk0|Rv-VzS#FMUrD5O)OcOE zuoUKmLBV{?n3Gtgyr#P8dh@ZnAjv3l^wATTYiTPNq&w(ky@TMlwK5jhIq^+`3)%X( z(NV-H-%xnhz}IQ?)r0x5cbS^pdT3dPF(03fqiN6!#TSswKvu}r4htV0T7{%pMUeRWi zMy_u3D2B&<4N|>A36&ctEZW8Jrl4AH(g+s(@GCFibodi)8h&zNB)|}S6z+T`tn%v|%O|#+?)!!w59vA$_LrhZZ5fGh;L!QX{9tqApW2|_m3)PSAB0qj99tnulYC=oA>_q2j*gskEP`ZF+3;Ic|kwL@!n| zTjf4v-*~==Q3qitabia~m=Gwp9{iCM{wiU|(QQSFJ}xN8?pBD6)x`!Jn{$7+4BOxK z6)F8L9Q1?s0^7jQy@$A~s?6$lj{(#7)7vi3o!t1~3i0^q0e1?;^$RhF>C?k20(WT@ zN&cCEukbxp@H#we0o|G6FymfTX$WW-D7BSMo+#xQw3AxB`9PJ->Eom<>uEAe}W&1Y7k_S zmjbW^(S&$ok|tz`c)&-+0WZrt%og7tvC;R3%(<>k8(ktsmq{epwB+EC3(*!2^-R`?l%RGsp!ea4{f{{Gbd3z7 zAdF5vmt9FEUWVw{V|%3@uqXK+Ff2*8kWVagkZ>?I5Fj+w)^py;?5^&xtFDuHkFl(F z_ggEfSrZteaUf~93^wUGoj-|)R(uA|z9+vRdy60D8Y0}~o-uPYT^eBcy;JTP8y9}87XbE7Qvb1xp-;J!$iyL#b1!({rL7??Plip|fAW~*-)ZpwiV#1QB2~@? z6PkyMSPGLCvhjNNsJ(su{Pnl$@y*gnZaQ?FLr(`;ElA~}1+>a--{k?{K3$Orox^y$ znq*3@4U|1}o824R`>ZZ!vqk*y$1e&ID!J&1-?GGGyxM%H>ep5D8%<3#N4E^_z0v;m zj0BVE`^hboRpCC=&nC;Nt}eb&>f5o&bAe8I9n|zLlj^aSo_k_>h>TnyzC=ofX&tp$ z@|Ip;lgal0aWrw@%ENI3*<|hsDE@*_`?oYmv(ZV8KQeKXo&h9v&_~S)=Ps;I9$w1$ov&NzNlI!+)R^(m!%nNRF;-^Zto!`sHYO1?#vGp z-JMScgQe3s1`Z!#ny)gfs{)joo_9`dAsBmlo=Vq;eX=*n(7<@eQC*#(-bkKcuRF9p zSh~iUqd6>?mWbMYr!_}$nTw*_BmJ{X%rbVJp_3LdusyI;hHC&R^WT<$+vo3XHIqTX zB9wd6$qC-#0l&3RGb_Q|81}?PK4IJPgE@1@|JFxxLz>FQ35$pE3XY|GKn1kjI)m1( zd?Dnl^q8lPo=Re`KlMMve(}Yg+I#OKU=|gYk(L;Fz%g?vl?|l=60;A!8K(7D_+!ms z_{5aB&o{NUqM6CHM&z?xUai;VE*HI3=! zemIu-oYYdwPXU-ugW+mb6V*+`stHG-_csy04W{eUS4lF`S9YnBZs8xH?k;ORxk)d; zvhZsQKXQ+}xqma1qL2+sF-`iADc^Q3Xr>u~wq>fcDLmpb<1v4`jXsWeXV*jIW}E*P zxgUFFpZ#yHBhr=8HN3-&_3^5q z{+ZRUML)~WkU_)}cj(1hhci7^d%JKqtu5^!JLbv3j5Thx5xU@5d!IRIIIqu8HXO={hT zs=*N<3$`I}3v!Hju&*FU#WDGQ`IKL308>BjPR?or6*f;Tcz%w#%n|@uDgYigb!jlA zV?w!5KMk=j`kB;i17UYm(vOqt4S`a_Yh!;rb(+;oIdx4Xok4qW6fUB}4NA7(V z7WbPBFcF_8Rf<7ug>Z6Nf=4^&>CTS2@)#r7?Y?n)$_u}%YzbxMj=35Dm8Zx>x@dom zT3TYA&Zu*1kmwS}E>xLK)!*in91I-65tE0n<_rH2kIOR`y;og{?2!^~H=nORrxAFT zx*RwDbw@W#K|B{WVNpi=95ropk+BMIX;&6E2L$!Dh%1l?C{vd?ukF>755T~QQV$y> zypGO?GC0zsahJcgm*q_Jg79QvxQVw#hnwLN=A&FVuG<04pJnh0qg*eyS48Yh$7LAL zwT|Q+ev77F`4*9?p3`TFy`^j0mO2}Oi&kM3k(DkN-)w}bh$qzi%e6Dr7+`6{b8V6V zmdaH>=Bv=<%oKv0cDKJvxKEv2ys*mN=@yP6+H$P2^iWnE61|vBs;z^3rM7adNqZ`+qH~K?tnl|8UM$?St9J)qI}*8-|a&uK)n zNNcDvhYp$AMY%ZEjP?^Ce&288N7Nm#&JW85Hm}5f%uh76>yi{OVWC3n^F;ojt#a> zW~@{%=J0@}VZ*Fsk||fvAjeYO*zb`*{?EnO|CZKKfZE5 zThM#OoMkz4HeQMhhK(0xfL%3(1o1~?4D_dZ1Cv&zH)xAiVZeSifVvU4v8@F1np+(a|q^xIsJFn41#nKS+}- zfK#q+wq+k1qp&5}JZaZ?CK7GbJ6qC)Dx5sKTI)KVOrA46s8&5sU1WM(*e?2;QY~R( zdlAwcCQ*8NG@i9Qw>1K-ihB=N9wn55?t<^)AXLFOWkS_)1_4z*?rYasq;lKlsNySY1Ol}HgAHwz*v3(v#Fp>wP^i_PPGyuKV&* zrnI{-0AU}4_a8JpLQ0Eorun}2M%if7a3q3m*O(3XB0J22BlYySS3XrJdO3%{;G^9I z%ppFz+*ontfgtg-?%<0GHQ7*F#;flL~( zHK93zUvC0B+D zUpX;}l0WM({?Tbpc1x{18*FMf$E8ux^#4Pwd?vS$Py%$LdouTlcd#d1!}7LsZRnwM z(?IkOm(`mbXVdc2#z^gf+@3PP9k&SlPcEJS}_f$hTFS6lE=`Zs#mT7G2%ZF-G_} zUE>JJaM4d1^-wPnw4OLVN*gcYLfhiJ+ETrFIVjK3dMIsA;+A?w;H7;-TN%52e zI*-SyIu8ke(}!L3*uI1^`aW_K%dI;V&+&s6ZwNErNpKnb<9zUg#H=NC-W=Y4A9e8b zvY4Y=Z8P`rPyCC^hrQJA=Sw0KRI@Tot>6>0ISq0i8OiY+l;~{T`W?=ECe$Q-gSDpA z(9J9=Dg42j$Od$rCy2qT^j841q=#npg2bUi>7v^VJ+0JZP!J@}S=#T6FSVS7(<)*a zvHNM|9i8j&K5*xjAc9^nxsm>h>9V9a_lzBGQzlYE8q-)BTK0*U?2M=5>-LVYP`Q9;>5K27ZM~&BO ze#g$Df$4pz4HG7DaV2{wRTA(r9 z!9&_9gRve?@|(~(>}wI)5X!d4R4@B1+^?w^anBx5oR?cM9wOvTrS6A*x|zMu(&@37 z&#NqHP*LH6jrsTd3`j8^Vs-!FCw{DBLSnu?$sd4)9fI zT~R@R55r#D`q%0?lYDXf08($!rS1U5%BW`XPiJe?Zr+{Z+pbz|uSels5@7nDMxXBm z<{UE`j|zZ!I$pBzp9+-PpGt*#lA;<6QKt$oo?Oya0zL`leX#uVaduJM?qoIl?41wP zy%KS+x1egu;Ba!MgROLx1zKW#f|j5TqMGHW^F1qe5Rz!3ds~;yI-2r;ZzKYE+Is~m z3o(561vtUo%wdtgn(V;}eVhfs2YY4O(eA?6;H`8_OuMGdSpfuWjjX{{B;NpCrXhUT zX1HbcuAqOwT<%ipECkd_UEj;QSqU*lS>^rJ^$s<>qtIF1Xfd)BP$TMHSy+W48bH zB?QcpS##JC`#>xC495?IEkqk9)-go%3r6{1;jQQ&%sIb9qmw(HFxgethB7q;tDJ*` zi2h=OxFEzM;Ys=*ZYJ7#o-l2T`$y^9mlZdsEQU%1+N#>!D=J~aeq50;A~1UtD&;H< zFJHuU2bkz@2aY?w$xG0P5PrUo1T4sQ__EvT#Uq&WI7A1d-eI(hVD}o$-mBZcsa+!_ z`F3C_8Ti9b_|+aw*+j12*X{WSDI;np|FsK~Z4T@tyP0<8PEnjM7|P zbI(*RSPk$4$<&{#hA`}03fyFAQQp1t``jNQL2BN`*&mybtXjzZVEnwEy-Zh#+Jt!) zSX<(vM3%+6n%EZuVIP(*5P@;vfbNH z{TcYx9hOA97fha%3Di3PCjpNOf-YjUJ@v|*gJMu(UTRVl%fySpX4z>O7mX87!)}P~ zh`FMxr(#!@yt`G(VilVwO$qgITO$gG?y(Uehh1Mk6E=N$Wiq>WraH1OC1}-&Y*dDN zgNb~9nMl;!x+czi=w8(SMdYKTSs!qPNAtx8ELSp2d2WVck28B)Rk~cB^_CCI2NyO0 z!b?@o)v+Ic?jL`6$^>_F&9ZnpKC-G>?7S-Rky%;pfXb~iM5^+QbqSKVh?k^_!H%^1Tc>H4cxOY7mRo`N_g(RJu(owRRH~~<+yOB@ zVKvUn6%`-YR@TJ|=SsRI6KfR{TnIcFl%&jNdOO=v{F}9fruN0gm$C&8gnZLH8=$|v zOjwLl5F5mTi8B=)$S1i9k1w!V^K0d$`-BbI(1!`Rn}@QrNF= zGP?D~K;ExIVk4m;<%+=8N6gU)WXuSY@(H3{eMncgyqdH1k!dYieqsT6U+k-&Gg0Q_ zvA9ckNFo8tPFBS~p~PCDBK)eZNQrTed@dgJ=qxQp(v#nv{)MP`(Ut!z~Je3!ny&;|0a@#HYjD@R~?{;ykxh&Mss%pN1&)rDW^qUkab(mW_eK}-JKwZiN6opT7 z&_EEohd&9ggm5(&fRM8SpmJ9h9dZKYMs|t-x}rTeH3-D0(U6egDZ zP#oz2h1ufh!Z7Jdy(_Gj^YT3==ndqITagM5K}@X~K&n(@!M1AaqS~?p?{}}8VyQP4Pgm87?oHODojL?pn{+~SvYMRM`Bgphc0YO zr_p5sM={kk6tK(>Hr7|&Cku+q88X>ytm=2rPA8q#$xH2Nl?SP8eT_?hwA>ffzCvg5 z+qa%ZQ#e0#NY~Crp4^2cQ$h z=Yc~c-CmD^f-n=X#P956Y6AWM*n0Jk$X@K~ykM8o`%ENrx=55Y!ax`JaHQUBT04Fr zUFZgKZ8}6WRGvLwleW|t9T)*QvrZ1G6%Ic(v|3BKaH;IQy3ol^S+F)H^K!c$HsvGd zubm~>E4y!*xib=E_ zA2M$ZtLReg=U7&7h(&7H$Umc;hz~+i{OBm$Rxux7)5SU1E-Eu`{fTS^X$E?*VAKOD z27hHh%FqJm9k%V`bhsy1TjC3s8M;x~++T%RN(OFh&5Z-7Vn-sEK+1!0A(d{GgaY!P zKXzMr#mjey`0*lB>9@>XG^EFyni#*>$;jl#2BAp#qyTtA-ojoB$lsxe& zwn#*7dK&T^-W3cHqU2Z7hyQ+^TrB2#P)wfaN>ye6JZ$%3PYHIlt@j zkKFpzBC|?QD8cb4NeHL-3Lz~-_CiD9=1klCiCJjCWpg&MOE2N~P2jld>r%iy?UH(_ zX0Z4cBc5y0toOIWOal#N^R3L}aFO_=a}#(RF(UIKHrzpUHb88)%L9!DG03Xj_@bhk zeaRFdb!alHkL(@1@MnL%n4}|1z38zlIZzqqJo)xJyT!^{!a1tTfh1RQf@Rj8>vo&n zV(W(2>u$WLaUd(|_Vh@q;x0V3Uhm_G*=$p?zqliYl-m8X`E=N1Ru%H?`_E?Y-W(N` ziX?bvUrP_;uZo*|SB??x3hK$o(U{;+1E|fw5;6obDZfNNl6SbDtA1O$7NNo}_bZva za_#Kvpje2aCTlG5BJK%=>MJsc6?AC_HAO149Sv#6%RU&PmH*J z|CGL@f^Qo?NE(m}P8iV5oqk^p?0~bjH)7bRfb&&sCLzg+rDKBmkAv-lN?8I7lW3a)(0xA;0tc#d;Oo zc5oDcb|85O9u#e}BzxLJGM%qsEbQljKDkRr381a(oL6PuIn1;xij*Mn+2ROd{5!N1 zpE1@mW(b352Zs#)(*!Oz_H@Zf-SJYrKg{pWwR3p}KwP7C7sV8(mdYs`HgD!$wh~Lt zT5FyvBpsS)UlUyO_O;(83)H4#I7{989ZN+yJgixRfes7F8d{)bN4dPsTcxV{ER6%g zyx;X_bJvUuZIWJ?FWwji9bt$vBx{^8hAwvQUU ze)K{EYdCH{?v+{S8KLK^N$k+sh~cfww%(7!J;0a0H}RLod5qCrKGs-#99f$ zv#%pCZwR?!Q|SK7O&jI=+o%1M$P`odl%Xi&pRnXYQthEr(BTZGxzfv3*u$t<5e0En zV#=;ssnAA);`*9HjZk=!>Gp1h07Fas2VJv1uij|AW}={8wS!Ze0mUnLL5v+R@Vrt2 zahaEe93`wwC|qiPoTk>)%KRg4z@3+Y@MiP;NPzB@J>vKb0A=)%Q(tAkti*>==_CkV z`A+alN^m%rkQj@k%2;^Jr`CsCJB_$HlP*)$sqDPCG9H;abw_*aDX_6^=EPSp zNH17g6oj&C7HO0P2SLkU{Lb)ZI@#(EmF!2zu5G8DFgari8#q=(j-ZwOE6O@AGT+h4 zDb4PAQD-g>5j1(yDvIG$z?DFE88%OPlPv;0PUI#-h4fuwmL`;u6B6d^B;Tb!+8PR8})4tFhnkYzAknuwggZB=sW zsm{6Iugn=yH!@^OHS+G$hp;;CQT*i|kaO(nfTEXY>%60NRA`D#kS@`AsQnAG=E={= z(=z6aY5V=mr7zmHTMUhJ7`W3NH&6cEoOnT;B7aaUL&ZK7Lh4VLx5cT=YVI{T$~0zm z^JjJSAsri{RbHfEf}07CQ6*EFpd*d{n(WAD2Y(dH&gIY=2$BO%;29~ z9iO;vrFB2Wk!CWH#uc@XB9e?YpwyNJr^J=VUbJXU%#nR%A=dmyQ$nupZx5?zStQ|m zhMRNOA$&)Uk^`2T$41&XFTY4Ci5lrgy=5IZi;{z@a`&m?zzE8&CaGj68#j{Z~02y zq>RQ4lQl%OpAYfvXQbm9{F!Yp7j<*I^=))X&}Ei}W3^w9PZ8vb0d{pv(Cis1xYQTy zCSdEh*WC7{8&U5mBo*5>LD6*4!BQM3D*PM)_Nw8+j7M;CJ%mS*<6yYOLABxQw zUahJkF2#GgSE?w=Awbfgdn3wBKbU%WMQbD1vjCO47R=kY3+!zi!bhjD!LM&G{@N~IZ+6V2-$3k_P3yl3WG znu!(~k?C)6m$#JTT7s7kS?sUTLR=#!hB_IT2hwE`(x}<@*mF4GQ@|WFQwM{uQ_+n4 zNOY0R^Tl)i(bD(~f_MQlHdau;dofmp7{a+Qh(*!UiPFw@O)d`w4V%?3j?1T!+u za_8&Elj;l@4n1osItSCJz&@7Un!ymna3xsz9OAm%YSP*I0XRI#=yv%Y?MBdNwd6IJyTk!BGe>xFCyS zOR?_Lr(^u`Bv)Y^e`>L>6-$Q$Rv$JDhhXnl(jKxwK6l@rw^rP2C|d*iaUbcQQ|bFq zvQEq?7#pYxlgwkOVdg6lQoUOE;Vk{~TODqPc@59r!^3VHYJXLRqlPo@M0X+1FtgU9 zgo}-BV}&tEw;r_+z-k5nVt{_`kuM-zj~PfwLCUsK%$38J8PT?bTrWP1G(p%}0nWzD z%`MuQ2QVk8qfB_y8IjX*p7&-+9inG5G^VZjLaeYvnt!ShaB#Ka5apj)X+x}@t-+g_ zaVVqcMWe}sSKH{;WozCcZllWbBy($mqUb`_8r*fZ%>|msJpMuW7KY6^c;ELVe}J3Q z;q3D2H`u|ObED*BKnlym`Q*`A6=bjsqTl_5g&a~cOC9PjV(b2~OXpV5CpQ8 zamz5@X3ZLUoh~Ukqn;S3{>kY)=1NG4rSW&YGs(}FG8`7ZN7^%iF6Hl75_;`*6PD#l zcJYdw^%B~f!p36$YtEK>P4RCQ`$ z=KJdVW-f0fE8ph%aBQd9W!9$5grjhjV1RO`2tnfDk3n5Q`*ed*gwCHL%SBwjdX_+T4;skEX9Qiwm6 z^w|~FI)%4RUUsp9RPp*sy{N&Hr+*S&u`gw()lraI$ht4F$A0! z%>2MdGMorbY9G1RP*E9Z;tlHXMV8K~I%A4g@ZRW*;NELIF zuAs8W(ycz%wcFElvH^FQaFdpU{Y>upKlce?xxj=L=GQ9UrAw6-b7sjT0#?Bl?(Voc zNeAkKOreq=;aW?u7@!--+zu6AB58F52V z+LyEY@-y@<-wkW=h^X~UA0jQr?n0rRbQM4NgHvSPlkrD0UgdB+4?Io%oD~Ztu2QV& znq6>Viii613gXkZ9(p;{Sy19W~b{i zh5wj!Q~v%#hVRAg{NO#DrSK4m3R!HeteeK~rB1X+kj$OseN;=m6|OiD6Hwr#E}w}9 zk53y2(Ddm1518ZCS-lI^>=zn9Enhe~)cx~#+1kmJesL{Q5ZfwxcIu@2z%3cL|9k?* zMJi2xH*;my`LhqO*bd2Z)pePoG9oqA1F(J#|4>|r>&CqHE@?1w`Jth@wWlI!KReB_ zr#iCl>elZLox7Qqh0{_Ww=kiaCnQ8J%h%8+`)*mB$z7DFSsf~wzSv`u-;cD5YwG2+Sun&K@!`v2Kz+Ko^uJSO*T#u<0_VO7Ypb132sr$RW!ek zYc&@qeaRGgEOYgk3Hw7= zullw`JgS-u5Doqcy0?znzQ(ux+5TPZEDV2wEkT$X7+cW_NoF-=*H6xmu5tA)uyb7c z>#;22kKOXOWKn{SCGb)3Zqpa;JHw?3k#IyDPXy=94IZyHo1R*1a71k_31@vCHPXm;tUG9~YC?%N@7iRcZBPs~P~v`u ze?#1vwh5-5#{`k_cqdne1c?wo^nt)#?Yo1f;rbQN81Qevx>5LCVYGWj^Cb-?=lg%Y zb||vR`-jZI28MtU{uXO~riv0QBHN;`uil6i*6tq@I(2*$9mvi`DeHd7iCT?UH3~v} zX!16}_t&FYdHO3Z%JnCRJuDC7&^8zcrReP(Qegj?uI{K;69QHXoj9}Q=$rVGmUX2goDQEU48OIC&dbhAg23NCv z%H_58^M!QkKRb(T>6wX&l{hEm7@#_eWj!qARrdP7()LO^2^3p}mSQnaHrT}+v2G7f z6YWgp=KXz+Luz4qUzUd()nA8DV9diaDTcjk#UTDX7&l>ke{;q8Rfrxvmz($lum~=t zND|W1ca>FmXPmy(=pCO8j9l?k9hAuP8XW5Wpldi2SyWP*kV#8XA60eTuev|PxW_6x z*}Q`*ySOAqa3Av%3Km#lL_cL`#lBUwa`Aat2IkiCGuVVXvwXIKvfFn_=V{p}opc){ zf?Gy;QN4NTekBNRz*;XP^ccFybIAUwirtTGQD%+HbDkA*-dtB~6d`#%^BI-sW4dPe zdnf3uk9;$}c+DwPzq6{{?^-fn8InRd@$s>-q^<@$=gq7*y^pAn>U(-9RK%BJxn#cp zjnzK>SU3ius@=%V_7q9wQ;@H_u6y%|Lk7CbV-*tLLClz)1xrRc&P(bEcwUJ$vwpB) zq#%2su;35^OjA6qltjL$WLq*kE!OFh-rse=^mRz@%&B3gKVmuUpR)gBexf=HM82pm z(_A0FR0R3S*H*f-1r)ttqM3#d4JjTjd(x+R`oMdmt=I#rW6cp5KesyqSV&y(iMqy+ zu`*L%$&=dEA5^Woj%u$MPg>+I^vQkc1h;edosWI%d9&9f%qK`2ISNxn6Rj59)Pc)iV8*73r}oV=&gdPr5w1o;&WZBGP+5@J*IIP z40D_zJbHhLF;C7ma3A@+7JaY8lksxud2X9ivA6YV*uwy$9n*k!u04qQ=rH&!${t#S zz`k3!u+zdpsc9aVXC@{pMBy;|VWtC5cvQ&C{dWq=*5@IkXEdVwMGv)B&p?4GB}Fw4 zFQsj&lpUMU#Z%Oy!pv`2TJD!G!J$Wx4IX4x&=U8SY^|7nAWD}s3^kKymV@C?k@iKh zouX66@}*h_EIzphjxrH?SM=I5?mEw<)1e8dY8b(Jix|5(dYG3U2;t zuF$mGZXYh)gz73!T-_Q6}@(2ihF=s*uC*dd_Hz~tO>v5l@pF{V9qi*8wuxfvPsFrXYbIa9NW zj?pz+W2B$yzB>8F;MiyNa+>R9(hWOBfQjWVmqch)uXI*MKSUg~6*~_}KWTQC%REF; zLk7J7b-(-NTa946JYMYkNx3HX<%38Ir4%_(R8${;s-@~Rku;z_uB9I8q0NV`$c}xh zoS4;CJr3AOt<7Hh<>lT=%Q)yddTJA#mZ7nZ8-0kRm4U=B@N9{Ob>SO00kfF)I=>-v z#2rw?>JC_pI4i8g6zV_5Z~cv8((h$rZgvgsvdogbWT$>iN=_u4H&Loog|Jl`NGDgi-#ZZe!k7ay;v1oA?JO0=g++|swFdG{aM)NaBjh;vFo zEjJAL*j8V!k-rOtxWs)5DEPbG(Ig_SI{A;C#^Jr8*5mZz$yIquKcpb7R*X4X{PK~r zqj=fv*}w8KA$yjnzv;cL5ypi-=0**|pzU4%UV36*mTqxo{3C&;#z>y}L!r!*gC$Lk z-dxnZ3@EJ5ef#KLj3!xb#CmPm#R0*wu_pi|kmy$K_4zdshXyuX_4(rQnr?xzgVM4b zs0oqh_(w&j0){o(KdYDDlD&>=!Q{lX)+wjK23=wkVs5;c``X}xXbyRs1scK^JxrI}-)G&f3{o`IaG7BlhTBkr6_TnuUK z#E;;`2FaLVDVQhgOq6=Z9Mg|>hCyV+9a+Ixt^kHz#X(6Z8%YB)0xgG$h#I_UZ)>tM z!FI;4Rl)QZ%-^o$g|?D*UYbY@guP%=fMtr$oQ#?+iG$SxS&1lVAYmEAP}?#0rKQ{N zgNZl6hB7M*63-1&z2~GSZOdfy+3yC)a+rb>6ZOe0lb>V3Rwjj0%thMGedZ1(IW^S9 zeR-+Pzx2(W>{=FD@(izg%Vxs95O;uLvARZ1cAHhTHKmtq9-iWEC=ZPMO|Z@KdDHoA z4Jq$wy=9kZb;#m?!-g2yW{WVEi-m3>4$KD{yhEl@gL&fWkDJd+M?Y0%nAGWhxm%+4 z`uTI3xui#@aJYWfIW|u5<@uKCe^zOd{iJv%lY`_}$-a75F)p8k4VedBuqlAv5tyENM$uwyP4_G}E~f-d-mQ&t9#FWS^1gwxqg~X{Xi3FouQ4@;6g&{G;qxC zkwRgGAGpX^piJm!w^ne$r=1Qb_NlwOv)eM6TdOh#iX56Y27(ryTsEDVx{D&ZQmx3hhEua8D-t4fzfpzWox>aX zzPX2M(^xPZ#@tm_ito*7+x9$Fo~Hp}ll5cog9SQ{vyD>vH2Yb*F|Qv-YDA$ne{i58 zp0tUG9EXnDe&qQSfm5zH2(q57NyXJXsJr52a!A*B)Wf->lJ!JfKgfw%tKu8#!X&m2 z+q6n$y?X=#%^N&ieq&SU4Y&JPVPbxip5NlHoo7A>6XFkP3s$6c#}u>C=L-tz*D~T- z=2Q1(c&JR(zA9|i$}oAk0<2{SHuWl?g{8c%oNQFU_gS9TY^3}Dg)aTXpx2l$md4<{ z`CJmv^KnCpui(YO&E>o6Yfk5u64d^q{&IXCkWteH9RKynQJD)9H8H0 z`a(`DP$QxD(#Tu|S$p_Jo8lo>f&D;h)WlPlxcS0=$-lKu{V25%%3F)_a+_rX$&+*x zB0LimubZ139d11}E3d|%(cqQ2h~SlWt2%Kdx*GqwXnSQ z`a|r&_Sfsd=5fjQSD7yA-qA7cOC#JJQPUxTzVd%?h3)g(*t74BonGDBV6G1IdFUe{ zvvBt#3dU&3kIP%(QT-60X53=$z@|Ac!8KMW}MiYD|I?n4QIV$d-!2C)HSEEr{ zMX?_PDLJzW14w0c$_zfziZQzx6p^Kn>|WBOO?@k?>cf{zi@Zr7)?OzLKcrbp*BOT% z_P$rqzFYf=91$&?rIn!?)h zhZMVo$8gxjX`QrSh@Wdja?cNo@pg-o-n)6A(61ZnBg&q)h{|jDR#h<@$h+$$%u-Oc zk=*O8=K&r&pRBuPXJ>}8Z=8jD%fyA88cN*R=q52&3O>yGE0VkWY-h24dpW>Ge{4o= zz{Y|%@o;E8XCpkS1-N>{R-^iL4QI^KRolRxe~gy_HNCI?MG!lrLriJZBJT~dZuM9e zxF}6N)w{ZtQ7GJi=G3R6>zPbl?^P@$dkppj3u@Ed@XB+J7B{^#-pS(U#!PpswRlFc zVTxgS0nNmRKCq{-FQ7zYu1locM+aq$@^Tz)ze(b(>TcC~9 zKDEB$*MwSESVweG`%g++%~thLVsRh*t_1R`_@A%@Zb3~hBJKi&wfI*bLIGtFkWN7k z&sPmu-Hul}+cjC1V$c{o6?Sq~meKO;6m^?|s?k*Sc3^!ps+Sw>Pw%f83f(ufZno^) zya2rX`=LMwK=n-UBt1hog)?fe}uA%RS0R|7;CcVIrLU zexm7uCy6a}1v{LXx@)V%A6t+qkd^9ZclU779_kN~Xh6L$OD%U?S6y!AO`1RA{?it> zJFut0vvhY7Q?Rab-&PxZ^>ZlToJgR?V1is2Bupq|X}vA)iTOpNd;E+I4B!VJDn|Nn zftZ}m>{cw)yv1 zr4}~i8E(5<907Y{COQ##v$qeAj~MdF7wdiPvt~9D>>X@0s?TqF*v;vn?+#?8o34cc zfK}V-)5=fQRN!jD+rS(+)4?PB~l916);qXX814NhQlRHlo5i#3)V|hzmS(t1BFysW&A+0-{_O zRnNFRSltjjvj!RFeF~5dj&71wtCySg`lXg#eQ0+P_Fz6D0!&XxN8TlR|4g{eqkZzo zk^WXV7W8^DNHw}Y?>>~J4&xJX_kqb{>86Jz|9&F!>XQ8%Yqr(=q@mm2q4%CjQ}1PL=MR?oWH%|RMWLOGvUgq za_Vf--M^sfE!#%z=i-jkWps8{sWq#1(myJ89jdJvX!x;EIetejahsX*Tdtvh=)_>| z-C7TH+71t=yc+1J!loK_vfzv^if+Wg=`-Bx$?<6w3W}EAe>RaPqO&npH_eB&2;J0} z|InEkr4O!@*N4vih}Hjdw9Ho7GF@Od#RgbcnflcjK+7nX7JR=fWbTnO$i(%i2+Tg2 znY-4ZzPvnbdRsSKi6`@A0>YX`ED2|ag~NgCq#{{-qc>kAO$@{gHtrsaz}-wc3qJEp zQ7V|7V%l%IFmzk^%47X)WH&UW-bDh={k8_bL#6O-l5j{VwUCvJ+ zr2qZ|%YBgYP~8v{&1ridOgN6%?HNlrY1>OJJUM60X(K2MXV$v&6S%?iAO4pu!+@AG z|Nj9{Cq4`7QX=jLv|7y)IM*H?mN4H8zijYDaBu}+o*S4mmu?f}#OnPF;^&w~-QH`# zm<`lA&lLQX=!mw{B3ju~e$dU>s)rlp!4p1K-aLCK*FmRBWHZ5D*=SLyo_1DkHB*_m zAiev>`q>|}n?*pGNLbzHy`L@{pBACeG%kpr=huqe{;qcyba=b?1F$lT*r7W1*dLkL z%Toc8jV1wSH7T@|YI-~2W!H*?Z#7l6{2O}a<+c6x^#F2Eabm2Jkb}0EO@*}C`%hxf z!$+M%*Yi=(zZxNcE@+(I&k`OKgb)NZ>B#8`sCuVOwA;wlM5%_lTm7ED7@FARWhhjC zQf(x7bWitS{3iVZ1@$~)jy`B<&1>1RyHRy>KNqWcyY;`fF%{dx9YTyWW$yB~H18O! zw~Pw58jubi&<Q=2vjX20)Z~3U7v8T%U1i z9mlo~G$<3<(gJrF%PW0EBB3_3N%?TdN67o&KL{sIYn|Fda7y~k=^)Q5Es`$*s5+3> zW3ZaTN=ym#sY%~V^m)*k_-F{j&d*@!|41*71+*~34QPB|qw$1q@Jo1}!$0LMw~4=k z*h@_Y?qyh#Ww)?W^_<|@VyC>v4rv_f&rH?15g_M{jUH`raGBKUAUWjq{U+vI&Uq0b zpYrFWS?cd<(iKFhlTB1h`jfBa`draV^|!4NSBs>GL`zQjEyu0Wj6j!x7@ha;g9O!e z@#9<$?o9{VzOsd0iT~`%^!*^^McQ1OTQ?rZEd|!G zmt^vy6n9uR$cs*~8(q7wcW;&fil-wxnLjuZB6YLiut3mMmsslDqrYaDmRihv(8tuq z@*219*Ngf5M=wzNKl%XVwL^XRhMrnSP}qs~W)AYpKKC!9#!DsNk9@#2ksIr^{zukY zuS@qh(+8pZw`3|Y$M&VIwZ7w3j!gu6`wZ2DY&%c_~g! zG1`vzyn&r5-n~t$kQy{Vy`toaWwiw4J%L-WJIw#{>h}5*5TSRHS40HUn(~-REqkuSzNWW!n^zqr+?; z(Fn_MNinwdH!i7rS2V#cPK4zYv9|)Ziw5o8RHDGEqd73rEuMoZt85*8;w`)8pR0}5 z>7(h{Wr?jEuBkz6=dSI4|+b={jEcOEf=~-f@NY zYwL4+B<(EF5fxAq^3>F5*FCf0&-4OFhiEpG2j1Wb!xYZH*Hv5Ndv2dB@jeZ)rz6O2 z320aw5zI8KCDD-%cf4J=K^5)NUq5 z3v{#&`Vo)DnCTWsd(Q)qdPCHzI@Do`pFDgd(Mzob)qI8xVa=u)hCCYmr~NzU5<<@+ zcrr(5jID~zUWlp|2i+4pa%-tq^uL1h$D?dGB9#t&Om+_T!%>Ss_z=X zJVJAWImuH>3HX-fbH#{uf00jX8*T;gfa0U)Rz&}a4 zT)$bWA95;2rgPvCpiu&3*FopJY7#opo~Ue>X`~Fx4WZV5ZLWn<4AF`IM+?v#6!K3p ziz>8Yi}G6|A8X~*-%ieHP^JZ8^o~G{c60$TWXC|EPUUdHuTF9waIBuj6v$l3&ma6f z6#9$DvpI7p%=^l4k|)n%x~G5CAMPT1i&fEB?1RR|rVpb|m4x|)sa1S~aNw!h&UQ{j zU1nj{b3@e{S(3_8H?q7MxoLUa^m}o~#8YZ|J2*)0a`P$QH{j-y_-6DTroS5`lUyd- zbi6P;y<6)9b3y)@)Rw7F9RGmLDhy(x1t;RzU$GGsxG3!T%PdT}vk`jWfnwzAjf&yW zidV5*T#$d2TI76dRBz+of4_lOZy^@ISK-TF2Sr`2%j7HqNvCU7!Aeg!c{orWxtg*~ z#FgM5x}l|L$mBQIeRC6U+vDb)1Q=Q+HP_w>!*=n3_4+x2H90Yd6;$1Wi5>6ZxM1<+y~~t zn{kL~rh-FsEK3Eg02HnB3w)&J58>P%V z#|^cd{84Z(!N>EA#1ZlhG*OTxld#sd2B?X1B{p?zs)T<sP^RRki+tF$* zC@%okzTr$m=icyH5N{e@;99s|EXD|nDzo3Av{NOEB^c%JTm)m&rliH=2Q&pBHG4sV z#Ho8Wwd-~1O5MfWbC;Q*fs^Jo(wGU)##f&vTMtct1DV+6yldw76N+ecmU5Y!Rpaq{ zD<;mER1fgvs{H;*YNKcC0e5k0_I4OUIlO$|9T}4A^wamk%NX4nWAUAeFEGhLhrQ;> z&lQ@dId7)769S!>XK=%5ngSCiaR${jgX$nhF&*SdeYhvJCH7Mwp)07PEed*G##(qiWg9d(E5BqXK)t4J*yM2vzfqGxfBwPPb zH$Nfh!-P2pgi4pi`dUFHn*of6P-FIU#6;1{$L9Bmy)xjFGW9-BqaUvp-HvCuE&pd$ z3eLJuaU`iWJu=Gm6AvzQ|uf0b4CFKchRbbjE;?b2F5|`_SUbk{oaF?4*++&~Q zi)9aNa8^}2`d!JJaf1QS<|l8z#RK78O`^)G*S`m;zun0-u;WGpVue*8Zl4 z^AmbuwlkqeNmIwB%cGiD+oOQPgEDBJy6q7WIq%VzH$%^xRGw#@>@%-(siJ5GJw~&G{u>+AsgH72vkZDcCG!X(n)aN}7Ou_uT%l6?DVWuu ze%9t{ci4#WqCQa233q0`dTTq3c2@&!+oNySlwpNxj_33Ea4Z-%GJmENAjVKO)G_wF zNhQ?7ICg05Y*`nSvHN#h6)&;unC%ZI>}KoZAz$<9nmYpGckBuGy9&0q{EnD@#m{Q3 zUSNCIG5XyH&1`aH170e!>5JyE9saD_Y;WiSrx)*zT&7EzU5l5<##+&9_2X3mGQ{3v z|Kd-$jh9biKs)ZOOvcRCaP>i2(@IAxG#w(Q1+W#OV;)|RJz+)eP)YyB<`crR!j7|x z0LE9F;zEICr*ucSAneG+r$Z(~ch+}{P}*iDAf8GNwa9=sI|7?M=6);zfri7du+HN& zi!;*{Mh_MrhuA>z1*ZjH9f4q-FZ3Y6A~-(=&|C0=#&{W%CG7>=8R)_E5@gP~cZD#E zMP~JS+_g<;p6xalA=>weZBPkp>Gd_z8IGdV>}5{$fvS4D6uh(CME2yNa91fGa5&Zo94g9smB+o8k#Nyx9G6rMNM;IueZR6 z=t_<)$(zj=<;D~DxU`sd0A&XACPZP_OMWH`rpe4lrh{IfU~#3{t99%{20*b<=C&g# zIDeB$Z^8A`w#%)TY{FDjN^TH2L&AZq>n3ObJ=kkT&B+#NZcGTe0FR^O*Pq&Kep_=K zY73mb2FPlx4w)brY`+Q|w0PU0znuJb6?5dXu|yi6t_R5iIn{&EliimeWrcwW9le&) zNt4#S%K_JuT%Cstyy5Tbf9EsC+wb>gSCF7M*_nGbm}=WhdyB-Zv!}zT{AGz(^X(^W zI*%L&6W@lxbJi!f8;8=b;R77khKkfRS|#nhmH!z(RT4V>J&Sv>yZvp=7V%clc%p!% zMQt*geY7`tWwVKT0osdeUI-1bonNp}D0uFpP$#j>^(yvsf^qhbV{SAf>5n7w8RnPT zZWA;pvmL4m01WBajttCVXu+S>T*UO6SvIg{%B*GS#_CpCVPcu*w0y4j9wMs!C}l6J z3e?1R3L9-vn4z- zb*O79k_xg-%%n?V`TvU+-Vks!H-_OkiK8*KEYUy6fr0X*$z5Da?x`4^%q`&)CF%rO z+3F)0i70)>%k!r@>lck1a8-uKDatm7tWM$!cVc|u=0Ni6XZ0@?+3D>VVNNzL953ub4}FkLoQyp=_|pkbHbXKxE&(v0*Jfd#@ zl-%|XJ%#$N_;EKat=W&gd*Aw+ zKAcd5rL=U*u&x*ohzQpR=F7ly5}RLdD7))dfm{yOQ?~`P1+wr0=6NAdJIHw4u0Wdm z+Flj1S6(_5M(@dU<*!oLBkx#TK)RuyAnnN4=d&#oKvnb2sm49DXzWn?tR3gL{1?kV zq{IhQmjBKvGgl<()B4JlW`kS|@St5eybO>@s@wY;bPi; z;HaNgwYzX3Es_;EW?5QpG*PiW)w=H)`&x_7DG*_5<$NSeH0begkg+C467QO0ba+7@ zmtd*Ad*%mC^Tf$APh0Z50OqUp-PmOC5=H-VtHX^F_bT;O|FKGB4FBBaLRE!_1I8W; zB|Sh^k60f`hNo5pBu@UmJx~1O?N$o@tt@o1lF;?iXXCFTU4F=8e{1iG4}sBnROVOG zoi!C&bqi$BryuzzqfH0N1o7^kon4a8<}dTX%?vbZQUWH-#C8!--VE8cV4fx_WcgOG z+W^nF>JmC9)7;^Tx%O4`Z@rJk@VU5pCOnW*{3P^^iQ!{8q($)K!Gugy3fD zh9*LFOdo9a8tnhY*dIuj99Yj?vZLi#Ea6rlN*KGlTThg+fU@cuiEi zV)ecPa@*$%0BwHg7mK1^Ia{k-oi`sQ!>}gI->jwc3>KFW+Qe85ySn?jfBA}axg-|w z^mMi5HfIF|NWQ2*{u#a8DB?8Mut{nWD3)M?vr&yF;ymMin=mIZqW%oE2Y>h(Q!e1B z4G1~oED~G_h<_{hzl_M{3qDWd1Z1@={lJUu;0}qvCiP9J`vZ+d5?Y~$W5Oo&9-^=l z(RW+z{{!lrsoY1qusm91B4W){y)B^!Y^EZQd%g;|ivtG5{NK&?#Dira-RiF&D!Aq9 z-R{ZgqXp(D1J>wHi!|ntoss~jS!wM%THFd(LOsiGPBR@w6r$smg(JN(AFt{96`2jm zbZ@k4Quo;uOuU7rdCIaU^W=vU6{|^T0q3j!Ek;>yGVg6)-Jo#-goI+ZjtgBQe|`!p zsG#Mo8`dEw3c|atAl{`Tp;vUfsWN{>xwhm1OhVDykQe$f;4a+$PKg_2sQE&gm`l@g zr247X$!$@eugUWr*vF!wqxagS)+gJCkdLTF&;G0GL|&<1k{H^)&QVSj$n@{VBLiW^ zd?lW1un6FKZ?uot)fxY{T|wKH#v#&=wBO07`nZ1^n$z;xlUj8iFBq)LI2ZM;3N!3= zhIxsdJ;t#n%+qDTZS9uaAzLp~ShU6Z#J>yB(h3d8ur6C*Mt|u2ZKMA|-3uqz?#49i z#O$iKB!syArFaeu926okLmQAB=WG3AkEX?aydCwev5_YB?ws6i{jWm^%V1AEPUP&G zI5%rtXGrU^<3soo!5Tb^#(IVfN+@tvlmC9jVs4nZpX*9K z@(@bS$ORRf)hb`#_QF?V4oPf~Baa>pPSCKQVVu@K6WnRru zdkVW1-F3^%t72z@n?Ad>6l{1c4E?3K9nsQ2k~A4DENWb-=LfTN&UC(^2{5fB2<5pV z%)k@y2yc0L061prggFWqh#YDkt*Wt+O@2ZuBM*&Kb(+=<&b{b+DLSjQ|4l$0m!X;% zPutsKX2%ArriHw|gG|uFT(%YTBkcV~F@Yb%W34BdA8q@&3e~#&y~sMO`(g;Fkr`B{ zJKrUZU=-xCd*e-;6Gk{INtDVSa|+;k3UPn6hAc6kE9(6dcbIpKhYHXTI}dEAw_IL$ zImq^eUF1yD-4!SFSVeqfK@$Lbkb}Oh#3nH)sduLS0{${d)I9phk5bndTt4_X_@{2d zkfooOOX?0nuEb%W#^sRt09A5)_!ASJsJ|=Yq152?j(fdP7ylDq4`uuxxoyA#=#ay? zaw9+kiP}3dXI~*3ceZrLm{MyTM@RJLDTPGQqs^Z^t#`+`2!1x^_5(8&I>){5vJJTc zu)49EnJH*vl7x`z((v0q65Dq>8?VT9H*-&9WlO5LGkqY!GLid>pZhqAR0x5=YrsyvfBvWc$C=iav6?`-1ZcUb;$h zKNQ0NY0SJT{pvePZS%cgxc z&2!@pBf#98-Pxj^_d}6+U5aIC#*!iIJEHQ@@Hw4G9D2+RhQLiNGkkBV>yTGb+Cb~g zYmqhmF5oYfV5W?)0yJ@}uvo2-llH29kg>Oj<`d@u^@BH}E9u#WGB$>HDR#R|*25VG z3P#sk92Z`{Rk?g20=N-prb-76qsosbdc_Vj%NEPuNrUYS)eTlPU(p5GoPJyMK${HS z5IQp_j0fzzJhS`sSn$YqS$E~2a-oMT{6jbeD!;lKJJ^p_NO(;%#PJ3k&b#q!T&*|Z zZi8>qc%LZio>w2fDU8E0nZ2|1VOe+$8QQayz97o|dWk&;P!*cy8q)Mj_^Jpvah#ig*XKKzdE?*WnZDsuJk&bqeq2tVN&qyPZUIf2iq3Pmgz9 ze3njEznZQOcy@_)0NvLDZ`gr7g^uoS&adwY)H{~uO#&5L<)D`fO~#~ZNtoo zi7kLQR_mu=fsGzg17V`7mciqrr#4iyZ9gIS{=?e$Pgu%WGdYO-8C-(jmY+Oo#J==k z^ku*+PePjpLRkLLgJ@M9C;Ng^lS01jIzdIS*i+syssNW+vsp|rh~@j{4o9kCl@x3 z0>UzG<9PlW2g=z~uhB^@A>t|07RzXnu*n4)_%+TYu!X^nuuWy<{2991|V_$U5wsh>CMzY{28Z12iIi-jXnlhrnGauH#&9$xmPbw(m zqt3+=P3uRZyC`cbuk(0if@3$ay+YuaT}T8IIAFgPwr%U zL2psYe$EJfN<)0pGjY`JnxF_^-RZ6d>HBA?bNRC6hZ^}1X3Jbm#@Kp-iGAilS{v^E z?p2xMy+=Jg-$8tY*-lJSEKfWmC^wk4y@=B2b}jG_-9=#i*_u^O78>XeV8hUewffmi#@hoas{HbbwW68& zcn#!Fs7@j>LZCzFv$v%8V@)wQ#X!wgy5ZF8?!A0WM^$L3i6I6usqoQkDOa~TZ?OHC zt3d)SjDK+yy28=LJY*`^I~VOIlP2#MSSL($C_IiVCZc4RG~h+4Jb|oPPoauwee@_d zK-WvdR@}xqE)QIGIW;uM4ytf{I&^S5nLk79ZLXT}Ehq2^Kk+x*QwOg@xVA;87$a(F@W^ex=U{0O@++#lj9I|@(FIWb6dKe<9ET=TPVYQY95v|=E zn#4!oX0RpU=C#|3k!x{)9tOLn0oa+EO^kEDUZ9Bm$ii9uf-kiFnyop>$4sb;^fBz2 zlczo~3f@oUEjcx!?vV-7)_d2Y^9o2x`E)IEupK<0I?~K&@^a1bDPxyukeJHNyo5Z} zvo|_Di>a4Yb?c-tr>UpwGVj^C#DR}t$;T`z=N|iHu2#G0MIQ)eoZG$_8Bl03AC?!} z{>xr1U+TtCW(ZZZ|M>|qee;HMSUJbw>r@*8U8nz{*Lb&mi7%@ei27vBxR0V>%LHwS znZ<*QTMarUS1Kd(o5bV^4xx|deNlm3L&-G}aci$UF)u>!WBR`bL*u@yggKQ!k3?m3 zh=eu|9eF3i&BZ;J=)))I>dorgYhF3<*ovNzZ<>5VzYmR5ZYBH(iWz$ovTzh>i}5*M zn9@FNnU2_>S)$5AMclu&KA?Tn#OqSXi>dt63F7u|f`8@q4B^RYf7qZQCog^jCy>A! zGOGBPKTG4*J-XsnXg{mqB2HW^v?l?4aP3r7RxPD}%65%Rzby$mD z`HMvMR*U4}G|FZ3gi=4&M)%&J6x)gKl)zbHwrKzq1lEsBrVmzKOIi{0U}$@)r*KR^ zq;gZ$$Vu2c{+0KU3J=neZgXJWJY&Y=&XU0BxBDMncnuR8;$mW0cX^+6*hE2|{OpOW zj{^9~KT76aby7%g;K#e+dY-+7gEkP}C5{Tm+o;Plq-A8lG~x?!8YK_!0gA7rPKVm8 zJDXn!jIVZc=0cLR*uPXy@x;yCFu&zl^k=EK{u|V=CUDX%cb;QX(C_{xW|U{j_=;?e zV(I}JYfaY%J(*$N9HE|IkG|ajbWs$LJxv*{Wf`~e)kjmJrw^qU`hzl~k6%94?85Ed zDHuG#=bK{vT9NPLy0Y9IWS2V4b{mUdI<+dk8t{S)?*4HHEPCLj6nGMBEe|Bl@w^(S zFA6Q)GFlV8h+x%9p#Oe8YL5O7)^l#d=o8PvGoA;Y_03npQ37;(5u$yjaTJT#nH?jY ztIlj`BteoeDOaNO&bDM&00908{x#6C#Zto^+8Bu48WcB8^d&SnaXN3-b z6=E%<@OXgVY%VFdpkgq9uU`Q#Tz@pmVIC8=YdzJPfg{)Zj+2}gcS32j;GXO?1i#Dv zf_jbWO0S6}r!V(j0eK6=OcPIT2%7kw+*HqzsddnqUM7T~sPel$a)*vpANifHeWtwI zoNwnn*(F3N9{CugpoUTIz|UtD)bUjUlxr*UP)wO!Xt|NZiW>rB{l~usb(Msh_#?Y+ zX;R!2b@Aj51g0N={(kOLPd!5eV6UT1{!^ABEb-)7Y$M@9TcbSuT`v4<>2&slzpu)Q zvJS!{aq>2?FJHDI&86L<541jKGp3@?x*KdO%a?Yfne?m{`BN?P?JM~Z@-qE7T{OAL zk;Sz*-&WO&GEVhV8;tCIq}PBeOQ?%9G>Lc|gn46QJfIes`cLr)qh4g|Tvl&I5fwV; zC3t)v$}okUJm~WoR4oAP8l75dB=v|(`QVQVA0ZdgX5wKEgy6hy%ggXsve4y#B6%rX z@j-55b_)n7@OI0z-mG9nlazFPV8Qz&Yj$bgU*eyB-_mh^!(3w4>*ZN!M$QKKs5sE- zulf&kT(w&eJhXTCsnc$7(5a22n{hMUj@Nf{Va~GePqdAetAd0@*m(XTUz+zwPdTFD z`1k6lTb6yvc#2iK$1dsqBSH~2ef^*q6pV}@G$vef{gf}(5|N>|Cb$5+smXe%eDAKi z?j0OCZqRHGGFCm_ETG9J4-@@2IkS;&}x1sO*8?H9dhLS@*>gOqQ#I z1;224(wp$rkKYdxYO+pP*3`Oj3OKFD)`%ojBqR#rH&Y*gKU=4st;@OKySDQ#ZqD8m zb=Hk_p7(?euk36^)^%|9F0JXRm1AisQq`q;Ox85}+rEc$Y8FM?n%c}C+mqS@4tK^? zMv5W=tcu<)y*3dgMAPnW!DViv^7m4t1v1Z3iqkz%{dvMZ*RTpIe5|c=&n|Qo?DTh- z<#mPQ-;zhFvaX@^edesFr^8>8bsC;y1^B6U33}kk!UE&gg(jVep9h#llWZhNc`MDA zt)w<|BUYzt%MakwMj2^Mv#-c%hes*0m$4HcBpQlkooPOY3gQX!$1} zwt$yG>>;NPQso2oT`>q43SyL%psjK>guiWLaBfT}Su7o}_#EAJoA`9aX}IPP+C98% z>6W0EC%1feRs5dB%1n)+?fb_k2L4%7T4Ek;Wee$%^K($rFH?ben{lOdovqYTIazN9 z#s)Q;!*OQ4udi)=4^RVn7bKU2l&f(%CY!x4DarA|^xM+nWPMabH!Jl2XaQbJ)?SHa zSF4U{S{{+b+Zlt9TA{(m;mYmJEO)aENE8Xm94>7sqDy)a zPOMTsgA>sao0D{2-uv`u^X-CbSl^+8uOU5BF>hN^FC5L*#GTlpWgPB?-0|sy_<_*c zsqFQPCI{+-^eZwEM*BjETpxGaXFlVj9OQnH1m9U9b$f>ot2cufMk52y_0C=9wLevB z{wWjF)3PVwI*Q4GuasTjRL^^5l>%U5b4^Qed&XX~lLkF5ZV5JEhIgg*hK_v;xNK{C zEqM^jJQ0>NZuXg;)ogmgVGO93)88IrBPfG@4CV}RwZ30t%HpN`X!g^pD;W_|aSLH;$|$P@7=_wmK46UyU2sMr8G$W=tn4))aL) zVEx@0{+%!c%2h}I(#Wq&vX=yl@OQn*@Hr;FPj`vYl&NI;9+OjjOT-ievyJH1uy%Gs zR*+OMD-^M#m+0EZUF*d5LoKfgaC_EdJ!+>X@pl5DmGIJv)Qgez8Y&@%{b=)a z&e9yD@579dG7@d&YH{1a1F1Aic?D8O)l>4HAg;nj&MXxAjwkTot*r`E|G)ak(dnvz z;G-E^6CRaQ9hcqCd`*`uR3Kwp9{xIB0P0qd1QhLUiNm$eSi-JaKW4jb{q)GfI-B0s z6?D|u_mAU_fFT!9AIVxG7gA45rKwE46_cQ1;K?A7C)R+ge)7`=^_&S>TUMdRFb&n>VqwhX-X46g zl)xq(zBsH)(a5@%`~=IaUH$X-P%xw^DQFi@fq;WmAd(QuNi?j z1|O;V$N&eq?8YIKejBUrWBuq5qLU`|7go>Dp-C;!X?oH#<9=aU~95;Y!C zBagY?-tJ(1nf1>gSSkK^UKksdueW&=!h`vay19w-d^EV6oWL9xk#NJrz-Op!IjBw` z^QxWRou0G9BnxR64V3o;6Lhgx;~qGIrf=|m&te7Y;Qi;w4RHL3JG1Y42oJJX$b0fr zW`J4sOsU1LyX%Z~*Cb-F&9O+`qs&iOnxoT#Qi2WnX027OJ5{v4Y2$$if|4#|TpgbI zpYjP(ZeaG2)s9UY3*3vd2j`=$=pvg?aZKu;mc-T7mb;VCl-UkCQ=^mr1-q6evR`5xL>m6)c zg%Gx`2Oho}^w5NJH7uaBJ}wpmeyPM`ewYlvDcY?%T1a}hskhP>TMuiM-M!$Lg6=%9^~~ng1&yz&-R6}Z zjh?QVIf{jTd|C=xR4$J5_VVUzA7L$U|wdMVQGG6*YX5M)bHZn5)kAGH-@ zwPfJwc35H6j{&2bIT=@tWvPyfy9?-5+iv%gwYsM!hQ**s{l9@qwxgC|!nV>*1RRJ6 zHlRF*{Uwuvng?tz6DeYs*NRgGf`(qrv*_lRM6Wv~d@_lx7t(Y0ew=^gMtF8;N*lpY zCJ?8jzJtDl4ap`(=vKE|b^uFVs&0fT21DcCQ^t!Py8n7*b9CrLa5z-FH5oPLr5B#H zj9@xo^)U4q0W_`3w7w!01{~Wn$esx?g)Nv}!DJm+CE^o}^j6=rW+E~!xVO=03nKlW z+7qvXn_C8SKQGRa5>J!-_(B#KDsGaOoEe(e-uh+k%+M7emHw4HZ>{CO2CA0WjX1vmQ8OX82Z)&mR2}oZzhTIR&U8K5baSZA8wf-B2PA#l5YFbW|dOx_$IKEr-G^S zO$RQ8sd*}mCCNohj3>mXctLNufhYxtU*>3;zcW)3eWnTxgI#ee=O0`-vg*gpN4mju z+W6ir;Ud3y>?c1J^n=Cqz*A4Qq%{d!viGGBz4B6|u8`Fi#n)t+~4QUh+v_0X^CvR)h5rF4dLG|ztNpFH=trZ0#w&?zeWuQ zhL!;;r=t>ouiXZD8{QU=uQ+Rxqzm6}v2>WS5b*Y2sk-`1PzC%=rq8O>-!H=aCzLD> zqR!RtoW<+Z%g@l0Z!*QZGn3P^k`h-uDlcw-2$sm&+81G-v~AoLv3${7Q4fUKd3JO( zd1x{LcV|wE8kx%ZK@Fw4s%#`*MJDQ5QUGBzlUxE7Z@ekgC%nbLqca8sj}N!yfSuy! z)>ZenL_Oya?rkbsfv5>U`i66)mcGL5@u&NK?*l#NWQt#Kxr62o#oZ`74~Ou6p0#U> ze1S`V^|uAkG)9s3aHYjK8OjwczJRkHJ&V-y-sHHy_CA{NF$%=+eQ*5EFe$npSJjhQ zS5Hl@yiB)l%c}dcZ>Zv&`o?VSS0DN>ftbj0^Tig>d!@*fh+~u9BB*5&8?BAzat{%t z5z$Z)HXtX(X3Oidh(+BS#iK|YV&dga_+>xog}4J2ab}oXz1HuA6#>0+sfq3}6=n#Z z^LyN`^b}_sTQK%{*&JJ-Th6mu1y^YpTv10kbFak?iZNGDbf%T##qF3g^2w5vGl zrErKBjHx{_51?)QhwSKqc<^!K4W+qa%gskF(E8Z><8#XnuG8`KSWqx+3iPFG+bes~ z#Tc!wcU2|53f!bwu&It5Fota`8Ge&5D?lE9HKu*_$w$N9lQ(jp&cA*+RDZB94#LAz zdUXP|&d?#n1AkTy#kE$zS5lE~!(^4s=kIKrUWgw!dC%YoBVv?i2C+ zS9~}Q^K*}OpiJQ{DTDCT`T_O)dG)^Zv?PH3-Zg{1@qlSC)n^DT`cuS@aMG_zElXRe zIh{OKeea;w2D1pM=>{mnRPSB{6+4D_8f7myc~wHGNXSzlI=aS%J!Y zp6N0b@)hwJ2G|-?gIY19*JKnJPe<)!kx$Vl9hhE2Y$4j*jq`x4mn$$Cb6KYIy3bp* z=&R##FhbThInVO{Osse0gR(*Wc+2ge4dJ328vh21t!V9&@&aGvyu2~*o`xmuHdjn0 z{&7iFZgJQIFA2Lhp-;;Ag(cv`3Q5qM0z3|m=yBTH8Dxnep;P`1_p4poL1^A$W5~S1 zPlsoryVa^U58&%=nxBQPjnzszy^2@=@AqUgZ`Hv=UXEcZc@Z1OUR4Y=wCn^~^^Rig zm`whBYV1!84+EdEsGV`?x84o?W$Tht_vkt>w<=hxNv&FR5Gx%L1ovFEHtuzZg3K!z znw%TnNu=f7-^=&W3yGY&=FxlLR}LqX#T=_0;Jbl$D>b8dOhXLg)#~OrEMisL)@X7p zsMmZl4-4H=@?$}Qvu(--J#g?3u?(ygyfK9n35Wk6-=RTG$=axLD&booTM< zf($rOt+k4DfLvsY)@Zqf92!Nf0GQs*K9z`V-PA=p*C*Bbb(Cd_b!)TIz9xgdEA5!r z903X@sPQqoApQJ~PD~T~(#|y6zt?%80)-P`FF|-|ybTN!i(vSW*JSyQ`n3oaGK9M> zWy+l*k6?Hn*!m$8<(V}k-R=db05BLx5QDVwFf&LqxWsc71bTkW`DZV@eQ z3%(CrPt>y2RcLagk+KqJL^t;W#-fs(^Izm@K752t<)99r_* zQJX}}(B(|H12&#OvL)CO!MRsmySm>;E6Kq01CZW@V7l=Pd8<$s8DkQTiby60VF`%r zO=S4UIv9%Oa=@m&1;dM$Qn5L3`trvf2&TNfA-u8}~1UN#XvvhK=<7{{ZLS-({DJ-^JY` zSR<{@>W{tW$ls&=v4J%|v}hjVY(}4qQu5k+E2fOyW^ELac~@Eic1$=VMsQX?i%>~X zP4TceL$2{T@QtH~(IrbqAgbF#x+^v`?mr6k5AOLge>{G@l7gVrMqD8qp@4Kef@8?z z@TdWBmO9p*gxG*uOsc1}Zq}(I{UZM_=1@@E@`*X}_Ew1dbWna#4o_=6c$)xbYoTJd z*#oWl`GvT6KMp6)gjI?_5z<}<{V*(Ob7e{Y@bOsm*7*Tq-fZm329T*XvO4dOvZ0~h zL7ruOD>lpEoiCIY5||myvL4$88)Bbxc#|W4Ve5UM)DW@>%RB1iNh#Xvp%FjGlNG0;EbfkZ|E6Wrkwx#k?9(xV zo-v-1ZTxpjtfQs<_GZDpbKL`&Do=M1QO}(LQBr1&K0S{3^9acx>0Yy;vC4a}$xQD` zV-~vV4-X!77f8Q zst-#?;RkVX=UTQmiW?HGwh6engbC>B&?rxb2lz6uDiAX~`frQatJHFyBD^TEV0ASx zFuR1j>W{sGc`0zcT`c1cQ|L>FUu8QbeJ2+}%z{1Ov`nr=Qz!6iV#f28uoJ!B;NOl8 zG<6f?6*(jND@O05O_UL7*(b0w?HNCx0;EIIIPSIyEB2wBg-RoeHj~i5-RyC&|bUw+$|tg zWp@7vw90&6RMOA)0|!d|8`My_JQl_I<$uZR5>V>B)_CY2d8l|^MT>xu56YQIx1zO} z%T%jR#aDe{3(OEZ2W@bG5mO_;7OSz1>&{b)J}DQ2&h$GE8BNH41WoCv2$Qt?DYz^o z@|-s;*}zqGPNE?swO zSOiSjYdh)9pVFYfVixv+4_*xllJ=C!JWgb?C%Fe(|8LOaZ1?z}FK)*eF=*P|YHOGMwm6h@3 zMFT6heNdL9u=l%pZ;{lGF9?iA=(b`u z#dF(}l&qd!u>e@mB~1!t9+nQ#GzX94am=T+v;P1$9)Y&(X=135E-D}pBi0^p)kaCr zvbM+)xij@598T%!1ziOkutHL1n(L35jdCtBba$U_ty=IxIQ*GBdguKhwiwepI3D{ASQ^Lsx>qIkNnFbkptrmSmznOMza{(Dc@ulT zF8Jua)Y7<-Z$qoB*G*e(4Fe52{hGO6J5@mod)kaJ-)t?j4t{+Xv-Jt#F-#=SM>U25 z!h2Y)nZJV`nW(#0H0NXeXB8ala+4Aimd9$}SJ~%Uv7m>=sIG+cYaI+rZ5jTIDj_gODl=d+!Ek=$55waxiU)FDBY4WrQSjk zcsnTnH|12mY@nOvw)WW)%YY~A<|cq0M0$2d`_gg+hlrCU)4G8lVurW|{I=doM5yoGXSDl)@>#DP0&H}A&e z^we*zs{Qzob;=CTB-lcn1q?WVSItHN*$@{qMhxjuvQ?7^5Cc|5f0O86jZaJ_n+7gq z$36ynn$2r`LN;d<5@k&i{^2!b3n;S^ZF7sY-J!RLkg{JHsHOE@j(qsQ)BgVbTbqw< z0Tq@P0K72q6tBSjlCWRRn_kCB1jh-vio|)+*UVU?-)JFAAgAj<#DngbUAVx~d(&6B zq`8xVeSCw)YAt=ZX|BkRhTlFE4tMtqG&Jy!h^2=<{*XzV1&Hj_hUGj2^g_A58JmWM zfpu+DIoq-$K??%zND_&1(LN&A%;ys9em@4{oF%d^DjKi3UU{@`*+-o5qtL2$D+hGrSKkglAF15E&yb|-UF?nB8)0*Lv?!R|p?cDE+ zUs^TSquIQ7pMDr3Yv`S=EB8%u<>K?nxSD4uCci1HkQ}-BO1Z8FJS^Z%cOV^{gqnN8g5Qn zsY@gKm$2C%y;6@rdc6G-t)3FhOYafQoqt4Wi0Te~c&Q9M4Xdn#Z=%oOZIxq4!E?)@ z50~7UO(zBQY4^q3Y4M?-zf2Hq+~QVs4FhFoGAPp#_a-_{-7f%5g-Mi8b=fz^WZPFN zYu7N>Ibo1W1}oTXOWL#PEl?*4T$KKaSPdIc?>Bok|GR!2+zjbUjI9B6r4|}Z(rQQ5 zE5G?KNMwJEFqd-2NTD|Yac;=iQmiZwb;Jg)Bjz-De*Oj3{a4W8}@x-WM0)QL8-tqck>h)+r9Oc{P!M+-^W`G6KMj zwGb-h>?A-!w2%#axV3z^?Y8_j7o^8*x5(J$3T(s#xZ}W&w-{2O3Mn`zeh|O?X7h0m zj4jew2qwmx0l>Xv*-1mW9P*PU7loLsYw+3SD`~o{^19}%=08LqxUqItVhH-<@d}{Ba3!(XT z2SfZjB}n6GY~YT`Z$je^p@x1g#5I2&0u%oE-rb*|U7+@S<@a(BfE7yp2ohyS@jdgY zN>6MU;!ZPX&wG zTc1Xv6H+{q{*Z%FLS==cV%wJODqsDL_yRWJDi_jZgv)vOLIBq zN!p`An$u&UvStd%FEBZ`4Ql)zGw%;^D0P`E2i^70tPJ(2m?)+(kmu4u-WV9{O4$TI zEXisL;eGmo3BsM;2IQ85-xsdg1vIa>D5F}6D$*JZ8#g?ud5eXK02O$pekLzaCS=sd z>(EyRz&4%zK;Qa`tLK#ST3YV*ik*>AN+CS1qUZEcz1+aveuTDGV{z?P0kd~7%vwAm zGmB{x0$@eP`g!e8OnKhM00!%3$(OKXTSx_*Yq~`0oxQWQSCnlL!x@+8+@avW4XE-@U43+mUc9l>NCA`MEbhIETcqZ%tqZrk2 z|7c7~dX8&YHbMy(8Q;lym4#m3-ue%V;S+960>#Mto7+_j&IO3+{lg%sxS1P@`dRs&KM##72HE_=Vsn(n-!u6c zG5>ub-V#bUVBU22 zuySu~P9%p8)RZ5;48~+J+?J=4; zAtcuY&}E7Vm|gwDXus@^(fzWT(Z99%jx%n3l`OuddQyVPC)APO7C<0C(D}lS{_`3o z!Bq}nt=@KK3@r_!KHTBhw8A<6;{`Z?v+`vpZU|}L$ww?I{c0k^)-43e|7E`jlAlH~ zJUJOUM>2kuVi7~|AO3A)A5hj{1l(8@(OM1NeEES@;qS|Er(Bn(DSY|@trhCU5c?{S z>zjWSS?i}`W^Olrlj?+nEkI)l6m|=ejXse&72|az0vas(c~RSKzoH;ruKi%(v$)e*cH=bu)TO-5Mbc~`RJ#TsVPFf?;8ps3u-jz>{plnNo zXRyNI5LNi@%aaX<&-Z3w=7VL~zrUO?*cI+Qu95CI%uc+Omwo590G|CpkH@UHZ@}n* zx8zK$p>mlC(_-IG)%g(~ts+OzOcqKHM16c^e{xHRu@Jty{~vp;ct+)BnYYFYzh*+l z?@yk%DUNl3F5x?W#LK&X&?OVL_NLx6bPdSVHVUlT+Hk)WMKNefRDlf*OypN0juYFe z+8BSpTeMqJ@pdF5{#o8WGvWLD+9wO=iAV!K*BbTaW@hO41cithNJK(FP0!q-WODZg z_F$GpyXyPbD7~IZ4&zoJF!8>r8`ij%l3+DbCu!?FYZTL~)I6B6Q?C@uq0_xXwp@Rz zPkE5dR$>y%4`jwp)q$+jZdz-b83~+RBMFbZXH6DXSUQEyY(r`!8Bbt{t&O(Qr6y~z zC2hg}#7C8cpgSOa#qoH09CuPUF|RwWs38CW?y`^l(xS-u%D_5X9JSVt7EFQy^^eew zU9~-3#-Mqgh?2RWY1xA)tvJbRcZ={^N3!faU8wmxccocuOKL4F@6NNMB&L` zB?})Z(u2z^XQ^g*4EvjLl=eg#wK7CyPH-1~D8h3+xt$)}CitBU zWl&)u;7a^S<~nP}ZbYSIM@RvC_wv>;QXRaQkNK~w(0$<|2BN1PYjPAZRUG-WZaNv~ z0Y8L3pVQpuUh2s|8;O^@w;zXe>s(A2KCDT)VL9Cqje0%)#LRAy zQ&;O>x_93z@huTEB(VJ<+e+v0G}BX$j>FF4rsfN)1))$WQicJ$+HJ-UD<13f(IguC zZdT~(owbpXZNH7pma2dc=G?zNmQ6A4e^+&>OGtj(@if`{b{siF)*y<>kyHdEc~Ygl z0AZ77Lf6rd+YIhl`(mNBC0{LK1i0n%T1M>li3SUqLA(!7Z>wW?U$~E%7uk_j?K0AC zmc(<7(px%~(H_T%q0$v;z$r865LX#e`f&NhpNh7hu3rpEkxI>IG=No25yV42v>+^w zK=&BBwekDJ1o4DViHYS zZx_q09k0^e_T!zFNKyU~)tik7{I)a)!^9P=FIk68>?aF#+G7?N@|b(k-l}ZYfJ$yA z1kt$6DSwrwU39x19>+WBJG1Dsut}+?=e3v>iu^JbtcC$+1#AmIfJ{(?+&9s$N^$G) z_kS8_pScyMV>Tx48Tmk?JFd@9b@*|2q(9-utwwIKaV(5qsQ3_t%b};@c`=vaMl@<< z2mo6;6#!RDGV_^ee3xV#NXNgnf>4ekDErh6XQCOvjZnsheIfC>9`Q?*{?h82X%Xkn z+f7hV-*kMA3SvY2x6^C{NUl%{k&lu!40X;)4%u3xSIuO8TCWTDU}1&KfhYBJh7Y1A z=ZvebUf@oxRB6b%PbEr&25>bTc=bwj`|YHdKQ;b;aDBLtb5ib2@{=>SnVv2z-7zkV zFFP`0PKu(UiNPw`T>{5(p&4M(kEEy9#MKD_;}wTJZ9`X6l37g`iL50>ogE=!7vw5y zB;J0}33)FEDK+vg$`l4FQ@ff&@>7<@3GAbD73zT}>Yv3m6nMu@mpG2@dnz{$7!~kL zF|p>UBtw~rDLspd?%7)ALO%t1J2Kj#-?_PDx~6O{^8m>bu0WpnL78e$3JEM49INd< zvXIHww*WcVLfjPD^E)Sfm<$;Nu4l7(gLvjhmGU=SQGzC+Lc<})#2|FFc@{EGLq~}; z=a8b=0)c?VE*>dod$?P(3+I><)xebcq$WK#K{VXKhV*@o3rC}(n($~QdzC~Jag+XBh%z-9|lT^gQfj-GV+qSdZ1I+lmlB-87x2>AvwnF^* zziC<}5}Wn1-NBh~YRX5H@_VmwERedWM`tMb^9r^Z*ey#lbslf4#v<%t;)KN&^^o`# zPIPBVP|P;nMzXoFxpP=G7XxuVJG2N($&yv&Sj{T5MYb&dgL(Wh=(eHH!TS$;g^t2S z`5iW#d5ef08>Y&$=O%6Aye1c9jej*q!aQv~OR4z)eal#~xym)JYjG2~7#Cs7o3yTv!2CX_Uuc?-qJ&F<+-aYzgjHaDe;k2I=dcpNjl<)9N-A-G*Dk$~|D|qvXWL=RT|o^YU!uur9jomRa4#h}Ht{2C$0s0* zqbc}<*=<0jRsrWFMv43)Exg-#j9)?F<5g4?nml8mJa_w|40n#9ILHD z+}B@o;|u00emR{dl(Ik(7T`b$P+*k-yHLBILdmEW2wt&}** z%`>PPfqJP?J9pCK2V&h$q*b!!SVGl%`{-l*h<~1d7m>QAv|Hm|;Aa^RpzpW9euPiN zW~#!LuJgtH2*u+umnWhza#Q*$Bn2r_upfOlhntew)%;?B*-)rt&N)_g{%}*vzFF%) zzO`a&@j^~CkgR@6UUnKT+;~sUW25~~1c~6*dr8x@c#`*b!@SH#aBX(i+wmv-HZibY zd=>M6V#~ zow~1&kOX@4+diKwLYblz1985La!Vm)HM&RV`MHe8?>qT16R#-}YTXtQ7v2j}7WK0B zBS44juLX+_*Lve(SLqnOL>-}VJc`fZE>PgdMszEFYcbU2e}jhPK4i=mUrcK%ybR6z zTX2kLabts6_Y`ePGre)-46klebVXZq#bQ$PSqn^dwzwz>goc?(RryEd^75+pY~}Qw zi@D!WFL=0)FDZm?i7J$0`9rnw=--TtwKs}gp50bPf3d4rK8Yj!ShomYX+_0-n@cM^ zQZ_G3z!xwJ-%Nh)L@q`5jSwrIqF2I2Tl=%EV=>JmumzdlI!0tfSZ!?RUi!|u(Zjmr zr{}hzhivlhYegZS8tN$BJ9d&E^v;fiLJ9mSf*s{VOWXt$1_JOM%ce0`P_B6IoR**& z*xE=U6pJeMTIk3}Lf}K6kao5E6Pe0a7H0JS@Xg1_8@?-ZQ4KtqeDociLmkEX=S|Xp zsnxF<6Ed#hRiBS$oT?5LumPP%!2IvbYpHwz8i8J+e{Wtr!P?9e(k>Z9NTIYhcOh8n z4L>-=X02Ak+#tDWW4r{hiN$%B1Gr-rb>^E3rXS%W%WTVBxpTB$5Qb!rBuW920r@*t z5@ILr43L6{t7MA#+k6(o8@0;m_nzTbjgMIJ#rtyzO*; zxL9lDmm+$HA~yIlCF~$f&e3NiwTgT9R4rkxOnjkak8h%>ayUPSvsx-e{{{(1D>ZNX zF&pSHhB!nWYI?@3we`P)OY&{>8{?M%4?4myU1Bh(x?60ui9;@JbU!cSQNMtr8labA zT`KXyOgfDTF)_UclWXi<;IY2G82zydt>XK)JRi*`kET)3u7vmXugqzrNGX!iaV8@e zfUj7jOm9w@@h0Fek((0WJ1nfzbFy=Fccq>$M&sQ^TpndB{PE{u;qqJ8-B~&Ob>@)# zH~Vzr?-y^hUk{#s>v2zYyry(9P3G!bnNiJa$WKWM;(7bfFhw_Oh$V}4Coq#$=ieTg zv1W~)HnMZmV6f&Q90|1t$U(EmN<#qn-eIT;k-HWMU{&(Cp%$)~ zN}f?+?_b5R7h^6O>NWvCL;nRlfUhFcH1f1n^6o}B4z1NuevLLSTs@R@O#|qmG&=cG zOiJ~g%+geP>G>fJOSg|^EjJ^fmuC@cuV(E&0^xU{_ntS~!2ohP{x&@Ne;?+|`ITHO~mZz>BHX~R!9t_4gy`{I3*QE zDP;d4zHXrUS`U783YQ>0%`1RcpqUhxGek)9ktCVtc?!s!3iU@`rLh^w>jB$mRP7E3 zCe3>CEVHTHA1t;a}>{uti-nm<;zDziE^za$UszTZ%`u5gl#Kv`#Ef-#k zE}a)L0~l_D8*!oUXhuFcvwe&Bapk=ce@j8n0w7pO^>vJc8;r%DL77*c=fBEZuwIN% zk#7k+D^xARLx+n1l0?+vBp2PT896d?6(9Znp7i(T{Pa#HI%)d-f?mYE5ASx*j9JVB zeEIE4%px_EndLl^0-IOQ7p6R+N<36&bhe&d@B%&mugOl46Rm7ii=AxB*j6vvVZH66 z0Y3DhboRt87e1EJxznIDBz`(_7YCLkbjmB{+*EVswS&(eC|2L#$9qugJ@x*6ypt2* zRQ_Ah`FnPhCRoh^d40Cv@j?SP-jm8Bw+WOca{}3jW0as?vl+Dm1@L=+o&0(s%Tej} z3vyx+$ZEl@P}OUd;nrVm$27$vX1T)4fqwd>o6d%LxRH-CMhthYhoVhjH8EXfX^zBe z_y|h(m!vg%J;~j=XtXu!Xn)}AV4YW{jwXkPYkL+SFO<+k?Q&jyM0Tt}CG@bmDJ?t> z!^qT~XJ*@BYUHo=f&+G=v<~wgXiX`xi72C4R(z?6{+u~Dm$;KAOJ$liuN)$czOnx% zNFRHBzh{@~gNh@hWSWf=^hYc=^(SXZ4CZ;l9W269b%8dCP5Ra5&sQ8et0c{d9ssjK zKFc&d>R8l(<)S=?7HoQQt~uFIZ6!p^6^LySOibO36X9O^pLX4dZh`Fofk^XIO5}k* zbnQ;W+?Z?$*1~O@7<~jrDE6FBvqDQ2!o2?GX%Iinr|8V!X&0K8DS@}4Vi9&;!qm{A zWqBuo*Wc?dH2Yl>u+{+Yd$e>c@b6P}%fSm@Xu9y^$yWvnC|1j}+_S1;GN7}(oUK-_ zM8a7JCo!XD0MzFD_#?m|de5#)`fm%}lMY1di0nT(w5ug)W#ZYOhmNLQAi(D?+4CC< z+}h1iz)ta6=fC})(ta0SncWrABxOqmxSp>*J=duA@Y_yt-~5}b z9*9TQMSE>Re}|chC6tf8G6?!~Km+tq<{J2XMYH?qQ+|YdrpnLiW-?be{Oy9xEM=7m zPHE*O_IST&bvs6JH%=!ec20x~&Gb1>i7&W;HA?%O~{OGkWfFYD!?;)|?yn567om*=Rxg&x)m-{iCM4SjFMk z&It7W%iX9$BIe=0fxz2uKh|vT zB6t3+=eYaaM2(0f^zp_`o&b#scG8jM|@lj!29fvdNQce}y<1K|L ze%~Aa)Ry~~d{M?cPtuPrLkz9f-LFyg7~kYPm~DWiRRi9FMrc@XyI>dlUW9!)#4P?M z9dEn9T6lcAXFS6ce)z*V`h)K}BRV13;LlQ0@8T7b)|u`G7i^yQKJ%P?>~u)uS`)Wz zfpscW`}yC8;Y%5nwI_nbnN|EXodoDDZgP7GGAb{JUC?gvWJ;>^2(Y)SesH$dmA|r_*VSuI$`P&;Ze6*9v3jbXKa7AlG53mfnL|^{{+G62GgIHx>ursBfdHyR5w#+x zukL_LpTg}Qw-Xw@WPa{CU7WZ;^|<6N_ohV@1+5l=t}WA?2V+T~(KR2g6BmjYU570T24>YD#9O8*E7Za(;c z+Dqv;`^(WT-28^a89(}BPIFM-DsA`6L78cVda&Lsk$(vF{@AOXZC(B;)JVhx0j^XF z=hwtBNj0~3HWchOK`1bP$3vIOY#m&#iJ@%P1MPwV8`bg69ku&~XzfD34}eoDi~&0v znp09}0MWcSoD`hBl$~(9X}9PMkx+4H!NoieSN%pEF@pkr-d7ZTKthOe;I%Zb8GPq% z#J$Vc1-=TYYu1uP+n(2H8l2xawG&t6z88zB({mx5vfy+cq_=hj1C}TG(|!8@omPK) z=WrlB)F{>}hKr@^sLb%T$Kwi9l2OV+YY!Vv{F>xuo@i>6DLcvgz<(%QFl+Z(w|slJ z-O|UP`u{-%!u4THPE*FjV98D$X_(Vk$_-$s_R~0$x$U912={CkqmPP)hxxC9TYkH{ zB@h9<<<)R~9n``3A*Ul(dRIKWZLC&f2>kjSb?|?IomODft3=B;PvNHkQtJ%JOlw3E z4<7=`nFX|=w)5T=VwGIBeo~yjK9=SqEAF2W5B#MZbDABNosdF|%?|o%dfKigN?m#f zL958lhn9cnE966iMuV?Q4mC+-W zMTD}P;2*2**tciPE?u;4_k3<1_hRJ!<*`W`(E?u!)3Y7o=_o=4z_Wn&V+>eEv`Z^O zsn+5UkeX@{F*FFq_7?KbvX@s9`LzO$HLj$Bp{z&Sbw#SWAi)PNxNQd>>pD~W4_KXA z6UN$@%el5prGj$raJH$P=4}4KrZE2jpGxqh`i7`8ZuvH`nej*7TUKN10r?)T&CsWU zuUgOKMl86kgB{;p9gr~+*_FUe2TpQZWZOgf{(~@iG~Cvs=rCX8%Gv0JwvDF`P@&0A zs5V~uLVWm9IjC2+9exxy1JLTSRtkY#z>9xpx4euhAjfMZJiM4wcpk~em8it~vVxZT zyNRTN&eyrvRdRAv;GB^U^b*xA!3p`?w+$ugTlF@8ZUJ=EJ!FW$d7!I%cbL+FN~7aK zFB7ZU=%CU|?T>{ZR=W~{A|hE>`<(cedok5cgdNF=JqLx?Eu}~r6t-tKOhb}4n6dqU zjd)=Zk$89As*U~lBgagN^eyK1HKo{r?c2GWv&=MZAbbXD6a5AAhFsiFc&!yEgyCYb#+4No_uQIjuZd9ayLn3BnNUa3Jzzq` z4mh>$>Y&VH3C%riyE+I&)ZY*tE}hs=R{!CQgN;(BfZ5zfL{hzW!4zU&wM8;dyB|ck zdK})Kfhw;?VFjGuBaP;nzbCAP&6OBVikO1l@<$;v=LUc`UTL?7?(%Zp1h~r{)X;Vv z)yD*|KDum=yefKz&*u5@YhN>VrNW=nsof$1op+C)ObI~ z#ha&XE<@)WXLB40!^n%wUo9rFzY|#}dBe-yJT8*UcHm7VU5>S)@)i}i8^+I&*sUR5 zybh}XRTu=gk6p~N{-nYPjk|iWJpYXObm`4k0VmQnOg74vB1eSYY%IXBEM}PVHeKSp zLF40&2H!J85is<4o5FTj@>Tg23lh+MKQn&M*^J%ir|^^WOC)llxPqDk8K`5v@_clU zhU$+0GWPT4)c*yF93>#t!b>06?|cwTWit>eN`SGTpYyMa@CPxrkHUWT6rWKpvag}v zdc%j|QbZ1avyt_a$bi92%cB?)XA)9fHp;X5>RMXCuXGiX)^t*T=87#B4qCjkxK-L-bN7hzx!1pRxTdJ{p*fL)+U_052$-k5TEk~ABk z(bRG{SOSOQ`TP>dy;$hy%Dee=gG+%YjyO!r-^k-es@ndY_Pg$CjlOA)NqcKeGsS?% z%V(0SAIXHQzA<#s%L}MYgvfa+o#0+r_lrLvS||_`YpNuLvHYxRvU)Y2WZ;R=P?huU z3^Z+AHzMs}?s{>Bp}4+a7x2O3{Iu`KX1*R$k6-Toe=>7K32<{W$TSoR=z}i|^^=jd zTW`n7_n;US{fd7k8FG&Ko7s=Uy$CPfr2r|4K)LFl3H!*)5`&cr!*;*5TnO*xcQSix zbZ=*`UPk(6_4U)YpEwtE=oLM9e)P~6X~O&W|KkOaOga~KHSm$=9m4yM`>?;1ngx!p z)6m@*GK-*`Shi_~CGiGz*oWBw)|PCsuF=OkKhENw$QlD~_H=v+!8i65+n|WoibI&S zN7I&0!Pu6Vql?yuf9|!lEPDUjG+A?XdN-BQ=2 zGHN196h{&vOJXtH`(hj9CzFGa!;-H(X(83qYq@uY;T*=6&yeYyqo`_Ah@JVNiL5< z^5`Aet_;HylNtv7eG`$GmXiaE!!h*E`~zhm%bcu~y8_#NL3LL7kkYYmisv^u+F~ok zEOtni&hFnG@w-Uwvu{yj{H^HLmxHH0+}Vz=Yy6W_MB@p@Pk|%-Z=sot@C%5BnLuh5 zm*dTNX2X!1HexUr$A2A;lFM!vxN6{V>SM!vf~^aay*eXFk0b@$tXrIs|LaF)Ku7Ap zd{D>M%Z(NZ?vPqamvgLTd-S_b0^JtPudz}dLH=bU#Ra%82{(q=)od3JsY1|RR%)QJktF7uZ z)8`qMF@;vd0B-q*Qtc4AV>`SMnuYndL!+UEcf1HK-d;Xk>yvC692&f+$Ka4IwVQ$heX4BvM}`>=0ZO9g}3<;zwWudPOXpH@dwvBq|CEl?7TS*EntdW)kx)wqMvWM zeYZOa+K6D^d23{vA&=s8DqIqGxH29Obi}@;l6<0BJpeAYU!=IR_;@Rbl&U>|_enRYc#M~T#xS{mrN82ti|30}o=i)9Gt33b zAj~ZCa6Zum*Na{z%A2ujK?FaQo_i)oB`zjCZ`k+SG55M^K{KuRHcZARH4_-rNcn&e zrvNj$Z6fdNXFVDCbyJo`0u1ZUMK4U$kptfb{P54QVU2bHzvn#pN7M&GSZ^#bEb;ld zcUyVW!%x0ucb<%iJrB*})0F!Yc5^pr&~O4nQTxXJcF^{w@?11k*olRRIOBG7zt+uN z*Ujjre-6>J&WTtm`9C+f=m4DDRV7o*hh+ItYUA?Emnm6A0oP^q{5Xr)yRM(^Om8?I zJK-D>2$FJFwnryU!lI?D8P5pw_1{rVW|qquKOAsR>g)Z<5+oMrU0P215<|qTL<^DS zwIaE^5&p=JRhX@7RrV@ygg+w$<{lb`zS*h2jV9OHbQ9(^Kg3Ot#L&iR=7n?aJhA zj>XwX#MqpOhJgE#brlA}*m>i>I}Y4WcpCp&KLH=md#CE79-vc%k1a9E!gqFyqt<{7 zAEoF=MIjU*s^gMr?iAcm9PUbhg*UhLz}29-^y~Yn3s2G2coL`8<)+x$!J{=+2Ns{4 zi{3DQ4!u~0xi`hyS2yJfZ2Ofmll1H!_|-J)V8UsMUHgPSG?i^VU&psyUnQ}|aRN&G zH>&Q9O(6Mlc3nDib7HwZ5mX;uKKv^csnSY#3YEqE43$K_Kj;?oD4IiWu3|w^HfIoqVZeR8bgtgKh z5}cZdZ)JjQMg~)6l%@5f9rqBTf z)yc5GD3PNixHr6bkpttyV#QPH-@Z6@V2@~lSK^tJ3mYwV#6yTD!%&#eIl~jZ>e-iW z>L+1?{4G~B)Aru|U>7LZaj|GPKvVg4@;hCx%vu~rsrhwQaKM)dj!`TuBDxq#Y|4p_ zNR1{RQ^~aI5-1wJl5WnLdoVE?JSEb5PQMzrt?_r?vee;r~fWv z^qFkXk*${7*;&;}S^B`H^F5fbyyTF#x_-vY_%`Dx z)q6uMJ5^nTTUZ@BM<-JE&WJwNxl9wBkd++l(mgOd`}<0|C+qs4IOYz7^{RU>b?*Y- z_3QZ4kVi>RdDs{|^qrDeM^yh%;UFG}bN)j>4gFmFCV$lAFa6s1#%*I`9^Xj2 zjS1O}DxhGJV0v^3v~WQl^h95z7|-)RM1)%8X)kXimk2-+5kgOlk6u#zT%sBQc^3EB z>Q<6kUrTDfe5l>`zs>)^oY326ClGN#J7#BKX4>(9L$gC(A}|9x(8NI4UuL=fAIjdu zAIdlE`=2qG5Q=1{vK2*=eHm$?DA^*)D2XiDce5a*Vw9w0O|l!Ziy2F{tYw*`3?{}t zwlQPY-+aIKeZQXH^W69I`n`UC!S#L}=XqV{c^${+_#86rwyqtATbU+PF>TJs=tb2T zmaq15$ga->b?A(;KD%?_c5sryv78$v`eK_3&Y^c9zhh~@qvq31Lf5WBA^ee?!O^0$ z&+7OVDGM!u04r=NzaC?8Uy;t$#Do>zD z?e|y`u_nZyh5vV{s$V+>aQkDeb)e{@v$@UB8X*L&v-W;b1`KB7)G9Hk7&rO8rFjsS zt9+N|T)4*5&jP|G2>%;HKB=!0;MSF$%sD<7ru!0BzE<#gstmUsuFLYeOa)4%=5UtJ zS%ocqKh&FHa3-^E75`DKAxF|Wbna;HaI+N4dOC-%2?ah-VURhEKv=cCajb^7Rx-Mv z@n9!c96eZcdZfYJcqKAu^JA-uK)yY<0J^Db|Gr@ZL`NXV{;`7-vzXyS~}`zK`QMpehz*YspIEo@~N-W22p{)-m7WQ)ws**Aj>f*sc#75NzM_rp%yo?-p=$jJK)Dq5`ZD=()VQUwwb0B{ zSTA%%SzwlUsrtd*DKX)N=$Fq;L^p1B5jq@m^9moeCF(-%kO_M!|HcLK5)J)$@PKhU z>IX3?9&i`nnfmYqHU6gV&xR&Zw<|G=KSZpK9BGgb)U1HOxkFeLm}n*jDmyR{5PI2P zdDd0VREnDF%bwOGXF1-p)@Y;jPBm@;P(AED-{^7iQlb`^1YsN@?^r+JigVMNMsF?H zNm>_2l`fPra*ZI#lwTrm3O(%_8u=;aD!U$F&}(2RSb`GwpCp}|x+{r?L}7UqS3gU5 z@k#OUnCDes83#&ta4Tv%{(fu16;~RCW)BD>c`?OcX64(cq4MhD%o#diZ8`#JPC!J* zjlRbOO_U-|fb%c3ZHbj;d$W^=MiS^WyB%5@nVvNOl~1kmc?DwzYidYC zt{cyM`B;P1p5ADwx*NFVI($!!y?NNEJq(NN-4%R`h#T#HSNz2_=DhVcAb{K=iaB`^ zYcFOnOtl)a(}6zR%`~ms1SP(fl@$H~Tsk<+!TnRlRL`%wLzsk<89bKig#+N~+yMAKFx9GYd<}u+oy&Fp*Px*b-!Q@J7OZB z57HTVHkS6fPs)#Ss)F+p@HJP?&7yHQYRJ=Pjr1Oc%?xgG6lxEYo87CxQeZbMVsgEv zdQq`K09(P4%Gl#Wwx9P8-}) zM*kZZl6GGCe~$}=uSdzc>VDtmdj!?{)f5Di1>sz8TvlD&qEC2?`gyNQB5XWz9&?K- zMeoVQc$q=HUTL+Rot!)I#oF?44%nr@-uStA2yof9L~T5Zqw&@}ug)tX5a{6b>7Dl` zx##VOjihk29@4|g*fA4I5SbCE-5A=NUV%{MM%cT>5au>Y9G>73@lpq}xgDvGL9p#R z`qM!dzxkV-a6Cts%|oFdCbA=Hwn?RP5b*ro0P59N-zF&7^Ezi@#I?p9bl4^RLkBzJ zI_2Mw5-EHi#l2-;N!tV!pr05B!{=T=R(-!-`B`D3^ixmm_0?xF%!0qH0L=&fiSlJ- zvBSLZTecdfQ#!JmK<>ie>eQErJ91d$KO#sN9 zKi>M6zeu_(({6ADQ!(KGhRF@o$4Omn28V`=FU@gIaXT!= z$Y6$XOksHWY5q?B!?gf&Pn*9F-ZmX^I<9nT5$D8iob1k@If!_Fn|tuJJ?I?xP0t;V z!;->883!0D#=M7VMT0K?9Ai=$jzU(V6pm?j`d@a)8Q*Zx9bR zaKB;axl${x9=Bq`?T2J3h^IFa{)K@KI@ekj#f~2ck*w2t;umn`5(fr)PU!y4Yvt#W zz%2(El2Q;){k4@XPsCxEp~u0rZ*Oa%k{1W&p1o+3;j{+B&V#FQ(+G5SoUuf-K8X~8 zZzszoH|~jfsnP%T*G~lRGcu+|GVHt>ZyH)Fs&QLlkp(7rE>CRk)#HOwF}H?BY>qps zBkOoMn?>{nZtbR2{*{}V7fL1L`~qaE3UgK(sK6gJ$9O@!4@Pg-#5HqBGH>ukryU+0 zhWlALr`~l%G9$>}W!hc+*=<4md;hgQxM;=afr%IppmH4GPo>-gE+_CoYXSx+`@4$IQ%Y{n1ZPoKjCP*(a zQ{KiOUkGe+JOgjZ6GX99T_HM2ERz&-oJsJ;&2fP(OZ?-fKhD;PY_$JQp31myeeUkG z!l7L=U@k1ujj#6LC z99;9qg`N+M=uBs=s%*6Pjtm_PovaDU)9E=Eczl;f*ONsef@TbZ{WVxvabEm36+K6G z4_+dTMTD%2-pdo2*7-xpdSDp4$8b2aU)3Xe=pxayQQ_Rg>cy8kZBsipqiNrdYv2h< zon+SN6Ab#7h{yWbh^#P)uXCHB!}G7FbF>wpz!ve95>Y|Zl0#*U?C}8ZYxj;kw{dI_ zb949bJDqt};^jroMy;U9F@ZQ@n=20Mc+?F|ag%1tyG$3c4!GP-8GJ-{x}14Jgt{#v z%Upi#Ypx_S5&Z*~vi(P&%Y#R%Mf-s_db%MoKuf^wcMl?dLJTDo*$P&QBkXdndd;>S zcyjZ&Q2aL@YQyW5fKk`cb$YG|t}3zWzUkKHJM2XV5RyN(R&hl5v_Ho%=1?_Pd`}Oh zG9_nu{tzFhT#9s$*q>nn{pTb%GMaG%hQ0*0yU&*phMZuJ#@$~DC!SpAf=R}htO6094*wIR`FcCe*N{Yg4|g90|ogQVfZ%E%%Bkh*aVp|uet$StAFnN+MJV;a z-}#XkqYaz5Knj4<)WN7d)zbHDY(I@LA5vo-zs>S{47;?`uQN`Z_3mA7I-) z{k`;i`YY%+kSLAIZh(Vz!8TSt@b|ed3KqIA)j>t#H;YHs&p(`=e_E}g%9ncv<))_? z%(qJ{TIN87C8i%hv;!+*)Lh~CJMHd2_vJ#VE?aC?WQ8muC9fp-m%**dSKwQr{w=E8 z1Qj!?Ox;xxIb(XseU;BjC}_sxI_hm;CaV2#?H2zxuqn{ry!gsLZY!d+`)}s-kllSB z<3w@}+6d>rHw|@*-XXs>{P0-(&mowL{)x5ZYbPc|1W{)(Ooe7{OxCwkCtp&qI$<|% zbTWWA8B=-r0D=DjsvdEF_|dA9eSb$;{43f)O_ZK!jLvvG&McKtQddAAExKrEv!0TKdJGO#KUbB|j_AaoySk&mWX~KdNir z&?Wb6Ia4?PEA$EiI@UdV>YpiW(`ByC#_S(d6`z;paa`n~8{a?2GrAc6a9tZMJ=%8T8+DwZCO;~)(gK_&g*NNiMm2Co`@-TBZ5Adp^zTXwVdL^B7Ed9rF11EMQTS zSYyCKzr;48KurnLZy)0pch|ev%pIozEvHpfH999Af9+ zO)jsU3$-?O?3(e7P_(Eqd=aDyX|K`08gX(#FopBhljzPaDD}AQMZ^h(!+UX*{0I4V zz;9f)+D8tJV11ZLx=sQSPjs$owsFa0*k5&O?n53fwl_KZxD!XkT4BiJ3p?W$69-1qV{#@MjeV*5?Dd1FF)t2ZJ zGvjSwzwjn^wCc(xxNL-Tk=K|KYB}&p7jjO-I-{*58SJnHz-Tmc{Z$QkXz4%_ktO49?f%}}Kd;<^WChv$C(f{7y-Yl> zoaoJM;;<|2jQnNkZ*e}G)U9=PMp5EbNV!J7(Ue3e?VF?(jq5y$lNKyG`e8x* z1sHj`WOYpS@VB&Y2@fv0uF#){03D={4d$so6IFZuX_nBN{nxJIrk=`pSD@dTd+6=A zy7>Y-agW#x&QI9q1a{{6#Y~y@H{q;vcvkMnzQI05it!_B4Ncb=abITO0vIL?Y&Wp( zE_uz{8Xwv9CQ&;9Uc|GRbbQd(XMe*Wvlt)B#`CNwsR3eAHD*6*uIvWz?#&F6bwgf^ zxuTL3cRf~sFOtw*j>TH1x&8r-@rS(TQ|Po=Cyw)2NFxn9U9JBh<-GV!-UOIu*O}?5 zm^?-;aQc{*I$NWINsBYO-G8QM_6K68hy2 z3(JQ7nUz~=OODO}biec)abdTm35|g5U2{L?`t#$rKXbJcmjxsam#5eiCuvnvUe$^3 z1G@;Kv~y%YPnTpOX{7%|wTY-woUN$yl_!M;lWfy-b3WaSus8B%{x|nyv+n3^tiI^# z7_lAZBM01(ruU7!EcuxbNm-m3YV&{grLk=%bAJyt2MimZ6`y>7_=9*PH$X%jA&`cy z*BK#yIgDtQ(1xWOWU%uu%mv(*cCFaIOuJG$#>NoWj3Kvy$s-E_rXG2rQFkad+6cm{ zoEvm=<^PObe9fWi1I~FrR1aHRe|z?XL0R6r5a18q+0;$kcfqtYr*wf+&1KVbqspok zDHC}qQ%eNE-v5cUH$F=wHexrh=TQqgkY`(zMP(_lTZD~;@%NDYt;0~M*8S(cU(a zzf3Oz_p18OadhbWc=pc$%hQp7$xZh5?_2tSivwmW@0K*qvnu0P2bVY#GnhZp8#7bG zgFlqN$#Z3X$YMV&xmvcvd;y7%xzO1c9#Bj0;^Z6iOiaG}ReK4C*;m87_tw3BP}1cA zp!>p%BOgVnw{3{HgZuH9X$7)5_7@*!Pd_hwIqc@Q_C--AXXNK?|Ba!x_q`dtbvwA; z)=K=Jqrw3$f^ftQ=pSnhjhebt7i|`k=o4}HV``V&`N!1lbpc7{?e2z^hV8vRYU7#D zZ%~d<2XFM0TIsM4jWCiNlklW}xp&C*ua^d=qOcP_=2vau;&09~T{s2l4gE!C{sp%q zk4&&^E~LFl3xy9I$}#;UpIUotA|QKx?W_>esE@KHZ)^4wuOiIZ0*L*shVHW%@6cWv##YMSNa;gv6nB1&2fP!X-OeUE_Rd za4(MhDQOJv5jEEY3p!t*5bEr(KK?T^qH_J@5{gPyzE7z-ocCW^fW0K|%~`)` z>rZPrQh#Ojj8^vr6*k{K!7N(k{wTV6Exx|%Zdwc5O2$I)@?h>vjIWDhjbi#sA-;$w zeY>?3)GEn^@YKux2+yPMoleXd{bYyMFZQ~wWj2ku>}DpJ3Ty~ik-Kq!bt<@mywhre z@_2ktmMwh?x^uEFxP-LY%kI@f`oG7&IjU(H=zr4IE4?htd+ohRZ2nE$EGJWW?4kLG z>w+d3o7bjx)=$4|FC!@k6&s{RvkLfNk;>Wc(8;gBV`?^1e-O!HW*2Shir0oHw;`E& zAj9_$&Mh^$X^B$e7Td>-_I~v~4C|nY4;*unHY^MZxN$!R^cF3xfh%bYVn^vA&t$hG zr8i}OoaUt(h6!G-?Cr3zoop8(C*=(nYA>g+XcM1Ky=3{QZkV6W)u%xo@|uRWu-^{G zs`qLDl{;~$u46u%ozn%cg-OUl$1$?>woa<)MBr~u1M-p~PAgeU;OK?^_z0zs*V>0n zKjpQks2<-EpCj)VwJrT{8HgV*~!Gl!0Gy$U-F}5-qlDz zZ75+uihOGWDh{rWwW9=xGzI~l*RxV~^s;c+)<3&O#K~q(8X5@-u!=5=z#R%yURW<}rhYTJ2@mQMm|M})9)wGN$%wm}HT$lZxABLs~IqpX&qACGWna`nfL zPueKWK0G!y;%Sy-MqccSHBG@gD!)6ZDcY6xTObSMlKw#J?H?*xI%ndS(;hek)_Fy) z{m!3=<|}O(bX+g6f-r8J{k2l2J*X1FG)i40YxwILk2HsFe5aC#0M&DH?PW!kpOYTv z8MUpXK_(Pik9vX=arndn`!#5p2xj@x&2#3}>%#eHD4U-Trlc8DsOolfzjp|>SMZ{w znQ>9B@{>wX-Ot;DR{B7U>1*~#QEuDt%K59dv!gHRx~xaelFtdb+BgrPeCsiI3L^8| zeiUrUMK4tSIpR6ksdF0_0pqhn&oLs0x}rYak8X8B8@GWpaLr&gJ|C3Ug8%+`?pD#R z`BiBTL$Sc#v2W`t@`tkhtTztIxW_XE=U%-k<~EzoWACvJVY_$1vp(kz3*T50eb^XY zl777QEF*V0&h|>(HLlb|736T@$D=<7`}q3Q4_s64tGz|JY{-3;KY$ND7)b7+RHf|K zSh!>_3pQ~wXt+U&+qhhIlrd%qRI$uU^Iq|Zh>8^4+r8ad6h7NF8RiN`wy^!V(sHjZ zH(Fj@+UpvABoE^Ah z1Cjoc?5J|_;g*bJh_(17$(PLxXNaR>pJ-Z+V1~1s)<8CL?e(F4p6t*t=xJ@)!|EN9 zul|!VP|Gjy9cXE+jzT9!!W3D#nQifo+kMLVdIm9pGfYVtnXdc*CLb-DVxbbttX5yK-^BAT;8Z- z`{weHHLPu9`^*@RR%P{QSw)%jUp|Q?UkmTpp%>XmTSFzi;Evmt19=!^qUEOhuN7ue z-ek{w)5kOF!2np+9-JM67KTY@`s4bEscjYIq&ca{&0S~VP8Rvgf5b2mL^V)bD^~VH zJ&S=EIq<|#H>LfVr8J(bU$Dw%T@#pj$*{2fuGP`@n~gSpEKV_R>9|zAX{j;wlbUTU zm02M9XmY~QO-|t9(02*DTc&)%7v^a?`di~`#juK$0*6iCb~Ogr71L8VJHdppCU?0T zg8@4`Z$}nf#wO6qi%Tp)w2RozxN zp%f~_V`LIzz@NrrQ7L=5C8b7ph1PI}0myUu3|JCI;@f8^n@=#bW686@ISJdGLn&>T zCr3%^{v^wFg8DA>ldMtn9|Gt$FycTvxnC-7%knDRR8|<*bK~8XTX5?lpnbpxv(*M; zy&-eEylv$aWAl1r)bUwW@awt=?7=P!VVwYsBL12ls5TKaf3@WK(?K8Lsk)80Ymsvi zh!W0A<$3_L^)Y|>*nKUf1*70b1r~UI20WvIjxcx$bh+G7V${!4}xqyCd>>qs2G4Lc|Xw95Vm{`}GuHTi_XWFe_6w@acRMj+db$O`qqoKu#*j4#6~gYLf;oFlqtcbw^` zu0YYHXdm%KVhq-V*U|@wJyoJtkScRiMG#q z6P3fjj2<|({P6duN?SXiN^KrIZhNNqxvYorM6mhjKO&M!8v(DQYnl$=A9Lw32S8@) zvXdZTfM<>*3$i33lO&d&6`Pu{d2Z?44f0zbcYMLO0FN$hjwPweV;nwnb=uDA%N+p{ zDZ25l9Tbwcua8B@$HUp}Qo_~7Be36z^bzwH&kFNC8kzrHKs&e;Pd@e19^Ol%PxC76-47DUJW4vnN`1&{1bF0PrPnK8y)##=r^! zp%n=fO51c*DaR|Ek&VZqE?^OEDd45Pb3eQNBsLDV%BRA=yq0ji{#vd+v}}5>e9=OC zVl{u{S%=^IM;Ww~U#%3p9pu7Y8MPaZ#a}9N%TcEGbh+1~j_2yr6wSg*r-6~RH*|`+_pjM)GA)MkQxiNsue9d5SEbCsH@_wd9fZrU)pz(Tr6@&| zz5fZU|J=`D*LvrfutBv4)B4{&nxOIffghvjtDy1nR*n-hHS8TxW!JEuKR+vF_*l+P za{EA+2+i!}p$J%h@P$WT_|F@nD=zNcGMbo(dZb1Bsd(!`xzmU}_d-)%aw8;^H`_tR zlKa~ar{M7^44_SW!M&axYBjx@ly`rs5)%Qd-}S(748f_w94G6md2!9eGp+3`SFRl+ zjtpi3BbQ=7Q0qQ(xgqB~GpKcX?22h)sxt)K!b3JFKPGNG?Xia~z;BUt)R5j`%Il{P z`EXyktWn+j0n^_a9#6%GXg|#e;JsJ@N=`@|*y0bkGT4)Pzv;K*h4Q|44=?5iLYCL% zO^Sw(ja=)MfJU(>l2eJu!yzUdh~lro(nyj&#wPs-}-s| z>w(#b#$wd$I>h4w>5L7!hQDbk@LM`j_X8Bs*3aMPtz!WCv0?EIVtlq>M2zpHZ^XA@ zp1{j;-pZy&6}t`6ob+z|aUAd%dnwuO%T(mc2;vkqlXbnRF|&P3=1C4m(;Xb3 z2B$p3PFn$(^H2}Qglgn-9M53wbbf$I{eB$$a$kg(Dp99r>xO2Rx#F&1GtpAXY+{`# zwIFw+Rqt%f<6tiDxZ?+6AAo{*ZcLmxjCc)Crw>Ycy*DT?su@$ zvavDaAR>JN3`hAq+U4J@=&)^0cr9*hz)3I%^5pMiigsuNt{FcNE;$mQha^vD14Itq zl{3z<&9M2z@`Obawg$#Jn2K;|FN^(#L0AnOlLW7&5$q zas>_x_t`+lzn};SFE=jm!8kqB4+)+jtjjl^i~=sL6v$@$GL{u^SK?Z2)CazE)63;K z&0B8X!u6PM`bsI^Fi$?*BI#m@!er0==$tMqj$$T^-G7H6$`6w(DxI37zE=mS0-=Y|&8+g4xyc&Z|$d(VJ1CIt>~ zS&xRQ=X%V`Q@TjKKPY`$E;y}Sip|<8E?f~jCnRHfYc$E(<%R~GTP}O0Tr8e5D7xVD zx^T!oO({fCweib2pv#SdJ))XY`Omf0e{N^ART~?HJ{)v)tJ3Nd%#efWB&(V=L%^2T34$wuaifA0Y6Za+NwdYegLU7F?;OYwKX zfbQ3|JU&aAuj}fALd9+ebTaf-1kyqgrxxV1Mk(S;w4D+IPz-agu5wCXkedN8zfdr1 z^&|v9<)1y^c8bw=?PfLc)I;`h&mzU{zkF~f*#QRu|6Z=iRzbG^BN~y$mi-U7u-T`M zoCM7znRh@g*%;1Z!bB;70Q=G9RH6_fa;gg}=dj?6)<`Y{Nv5w`cgnUfOa~!}YOasN z7q*!Pi)Y1r$;1H+pnij`rnp_7Mp2vY(pKGuz!fb9@T;vE> zFWajY;c-jx)UDjvP`|-uo^9DAC860X3~a%2-YPr%$QSvpEtg-h3a-q7U>BV9>1f40 z>OO^X{dX_$0Z-fcP|wII*_XMaR68`-T;<%Y1_)pHC# zX49iW%j0r>8FG69cj7={miGZS$j(Gvxz=mVCv~x3Z8~D_OoyLHh8Dr1v*KO zVbfxGIAs;|Cx+8q`iPnnlXE1Z-aAEWfX`;SH%(}1)Uk0spSyX!{$4!0r?WvSC;4vy zjA5c0#KtP6fb*>8hclAup^CEntSyDPrCVj8<~id(*{U179G&Wyz|z9U;aBF&bZ6;` z#faaOMw+k3WPS{7Kf<1qh)XCS`@=*&@(LNK^|A=LnAgf40Wr+NR4#L^^6CKr1MWkgXB6`#-ZzxR)4xcYYPBc(81#AGdLWs z8QIK&XNWuXGMQwiwp@O(|9w((k6jc+{2b{{`D2qE5q{R;X82Q~u#l?ao{gu$m+Gj1 z_CL$EnJs_nX%1IO8xhkg`pgFZeJ;4N&si9abAc2f$JMbat>eZ`rxoBpeEJ1Y(LvfO zfwJpz$#C}Im2|P$+Wf*;4y(-{LH~+x0=~RClD(X}P?5$lmczzMFsagK#C=6h?jIRQ zrn}ys$4Ur9hQQlZl4E3S=x;m}59R#G(3JOb%R>Mh4MIqzD)Z{Keb0}fC6j`o4^#et zOm0ko-Gs}QE*3tfNYT#*_6|g|`BK|a+(EbYAhH6SmpHttG}c)-h7-^$QAj$^>%yCE zH~Goov@_QXO{4BT0-#p6@Rf~nVBVwIQA9p1t->|^%3F3?kF1L5w z*r?rAC|{#DpyiJ<3oZ;kJ0eg)V6kW{DdEvE-5ScBB2d6uG7GV?sgXP-c>PmWoAU1h z9HNZmXYeOer~XDL#aR+vALW%$)++A}%f%|7t}Q*UjXBkSV7xZ+TOr}`>i8%YLR$w;B{DnZqM(jfLsD#MwE{B;f`uTa@0geRy91f zt`oazh&5YAym|A>`Y+l>Rn;Oib>-##_0#{iS>}C)UNT0 z9Qb@iBPk9wa4+^%+zs%H45xbR+mJIiZ{*(!_FKE8a)qQHAur^H`qXB=gE&7zvUt;> z^w_n04!r}Y8Pe{VStXO+N8~Bm5+>BSmZ)q~>p5gZrfn!j0Nus) zzpIpneghyq+V!pB5GfG*xx%iMKXSY8iOIWsP4x#~pK-K(4QGyWDET8Ij1waDGKC$7TxlA=$+6V*|4y zy6A~bTqN@6qLe#{Ors37k@VVfsKS-$fMBIZdSJ*Qc}Cgh+U__wV4Hxu50{|DDP- z>Q^tGuy)u@{?2iNMWufXEy2dTS-WhKkFx2ehqWTq($?TvivX{_zo#r+wGWG5lHdj@=5CZBqKYL}dePBi6u7r39 zfYQMdi-&rT(RXQh%2}PBi6eq8{kHho6uc;Z&RtQ_{trZRcU?4xJYq2f@38&l0-JDXkOUsS@ zC%N?=+)MgIm-l=b1z*p(@iauY&l&sBgXEc5@uqFh##7fTVaaM%i+0bz1*LQUa+X#N z&Z)j$v*qlShK`{u_L=MSBAvEI@QiB?;|O6dTJjB13yUJ}lR6ldn5V3Lf3(MY&!&1- zaIckY`%}pB;hU}V8{Y7uNykQga>QKpqrD8d03keleabu&NaOv5VZ=S6+d?^={Pqp~ zM?QMaUgT&6%BSC@6sFGEji94Uat=-W$?xZ*z8iizIO=F={>E}H;Rv^Z=+_sntG-vA zsGG1@RG(((SqZ3%wBcC7cQLWXK)`A&DWYCBCN}mHp0U36oZnC;{v6M;B$XrG zxhc?>ama*?s~A(6gqz?tctfQ6+EIUmGH-LJQrBd$@YIT=@Cd*-`^w;r`!>S$s`dA-qF}Uv9~F1oE0}i&NF-nhkx!# zX)u1Ix~47KZE7dzpT4Z}DB>FrAllGdSrDbpJ%kQ<`3*BW!4?ytWtrEi-#o~4!qOBv){8B&e#?Yn2i=dTs3Nt~=WU`qh~Fe4$<|^*(%vxC=-$->QyRfNW23{GwJU z<`3mga*AmFua>9J8wCNEm_&z1$H&&p@(U4j)<_2M0k4Ts0XmAd{`iy4v7cYCXY7W! zIbSUR6oS4EDGEIQO5nD`tpYE00}P|AlIUM96DNY_=o)Sxhx7yrUEgE!m%39 zNfC0aqn@Kr;}DwjqUEH81OTvd6qyd&OQ z;XloJs3W7;kq%ksjY5z26;8v8K5NW#9KAU;rF}X5_a83BomlK>6bZH&?{9Ym3z=eA zv|p$Mzy3{y<}?QnF@8xd!d}#n>>-T2zAR%+fyt@EWz)C}|Nqe4oS$*IKChPin{c>K zTWjZ9{;y9`Gm2x-k8_vRk%y`YzQ^ra4*mVklqmR|1m4W!bk!yC&Zj7v{XW3rSQEU9 zI4~m)Mxyg@oXIVD*=CrdQEa@q;bL%$%zVAuojcbL-$-&gWestXri0XuRIlU&v5A}O zGA67%#P7`Ra3f*FbFHQ2q1@Fu@A>bxLr4C<~GiUdL6$>8wLPD2_EMELfpApwU&lhT4W|L#J;) zDagHCDt}`9$mOSRX#InHa#@Ee`OeQtDx@XTj_JZIIwqR$6@3n{79F6M5gvgg!E>IN6det^5^%yqYhpD} z`=E2ikKf4;z9HAmvtmBeZBEubOR_5+PO#EDJ9*I=ZlL*4x5rjY!qQzO6=LE^`itN88rIYU7PhzrJ41P`QB*oZiED_O(3(4k3tcx)y`2U8-nV&-uTG~3h8!fILExJKcYihV&E(<`JT-M~)4{~T)O%y3(>H+vkncb{teGZoRn~LBF=d*#Q!EfasULey#v`a3U4Zo;; z-m7wcA2h{0c|@xFqW9U?#%aTe$6p<(6;=4d85vcrb7g-_@n+t`|0!|=z(zdX|GT;s z5&vGZnuzCw?PFD2Shk_A!`|1S%v{!qUVTXHjx`NRu(C#(7MMdnEZO&2Z_}P&RO;Dt zHhi#7s*wO<_pkHW)^)UFLf1_J-m6Ab8(ZtZvPay_Fb7rpZnHlfrEu%{&YM{d>k@W| z4o>@K)MsW@U>JGTKak6ZMfPJr7L>}WW}RISuxxjk_OQE%t6u{89c2cNHZ3Gq8N)La z-sP#%soc8I2%1f`UFeN$yunxo0cDQ#>l61C+dfleZBj6P+xRr6yTN4S*b+f2;ePvV zp;I!WH@=#qCpXrkcaJEFqzNLw0m)tBm0Zib&UAaz{FC$0dplqUDQ`u?g;=Bl!{s*5vq;l6fIji~ce^#yrW~4?y`r zrp#l09RmM=+%!#Va?iHLsyDX`+mnp=nR)|#*g;s1sb zO{i#!_oUTU{X7{iS)RpsbK3%M`Y0_}75ARO zw&*L|W^t-J#G@qQ?Xz9aCh}G!%6PhFPnf$Ci+8%y#cKFO@TY6~`qH6ze1k?lsklgCbUciT%|lbQb3d-oFKP!E zZ4rL@t7#;xlD5UB|4R#CB)V;4txY~jls)cpUv{vQ*rU7Ie8Llwb{1kz4x!tsk%X<6 z-p|5@%_t{dx*e;8l!2gH?BgBwrnUPAYnU zezrrE9mBPM-+wNXvmy|>_be+Z0$u2hjg2FQP|=Pf9u|7S3WQ&zCPzy@10Uxa9l&m14BsxJpwq8%$+7M*Vuamy^bhA0|*bDPUtwOZ| zE#;G^vd&+8c*E9ASw&*Rjr8cw5leR+aLhsIMlaCUeG(SYBn%=EfDL*``Zj?5YYS@( z>P9&^USodXHikhzoVy!Lj@L9rAcWuy(UtIO?KWyj$XHuyS@?Sn3WCAv9zFYQe~n1t ztWMstms95qollniy8ZxT!}rN4xsSG+R)Ek;C+{20isll`n5D|1A3l~mN*ui70YE_X zfy84TKQ7mte;C}i7Do>ROur44m)q!Sr$->q2+d-Q+Oc7r&~!a3xJ{AXCt7jVh@;w} zl^h|SsPA_RcZ?s zxahs~-!PkRiu&sx@c5_sTLp*goas^||*?kgl5yramuLz8iS&w3zUW!fdKc`})st z*?&W{aP&V=cZQ{6;AE~pMoVYkIvD|1 z?O1@kd|He{jqa~FPU*E7ZW3_*XWQq)*91+I&j$GX*bu{UYe#wP)IUxfcRsilTta`z z^}!wkU>#2v!nn#0s2?!t<@DQmZ z8}c8p1=%L&b8{KG@2!|mu3f!aSL`0<0v$VeAWuAov2x$d{p2x@zpB71#LXW-h(^jj z#hHnN{b$4&a4NPj6(Inv$q0_H&go+6BkQ#dDnOe?%~$TCTp*v<*1purM7xDWU(fK0 z*{|kAX<=r(XvQ_K1Q&>jXP1r?-q)CVH~XCr)^#)R{7+dP?oy!bi8?;+P;^JmgA~`P z7!&0gj=&g|r_O7l%=1;Z0Yc^45^iz-ti{j=l>r zGj_xPgpiwG%HvVsLBX9tm?>Bl`d1QguRTJHm8$aB zPkk9RI-i)&+?R-eMH=I-`{cA1ofsIl7CwZ=s;E>ylw>p$ezsBRVQcsi;GKD96r(vi zkW774U9)~Ljw(ruw9?g@7rO=}4> zG@=y=#+(n*3s9_9elW+iuazw$7RHsqrOg`rD^0mjc0#S=G{fn>%J!JG%GZ%9?q@Jv z-)DCuecVf{stGawJe{)te&E{|<64BACwgvLr*?r1T9gW`X)yMcR?pXC#Oc0U6CiqM$Rzlk=Id5YXxsd*0lv1!s{4w zfE)b?mr7aO&dG9nHk~H57|b;u3e3Osmv`*Y~wPCv+3ypjD@J(U0J=aK#9~N zWhmP2YV%|>)7jF@wUjSBSI1La;%3mUV2B1_Wq*97x8bEN`bnGppl1T(bxgcJ>E!;M zMufc?^eQ-R*o_mp8926IKC3WS^|>jc`{z{g9iO;clw6^4(6 zMWz^iuNpgp3Sm=W_R;NFi=;2cA0tM>;frIzW#9G#{g2sKo5+GqJBn@9mXG-xzA11j zTfv%{<()q~EaN2Ys&wS1oDD<~!!8Ij<(wgK#8g5+jQ`}?lxxlry{Pwb?Y@8RA1mt0 zXLhw5Ty@_^A4YgSUb>8US46>3vBCozBYX@GZGS|0101@BPnt%_?nv~;hP9Qr$St#! zjxZEHTagfYzY$lqW?FZYv_N+Hkk;6nW3}j1Q2+l!*juaN3W!au{px4F!pJ|>vyu1`-E1yT#ug%cS~jvenhcroCR@8^l6gK&RS>Y(~2 zP?5{yPIzyuPxMCpQA&Y3Sn$f?SBDl|OVjl8(-GN?A3R-qumL|BWyYBb4l+U#6|GEl zU+!b2X(v2Yul`Xbad0Y-{^kkgzrPV8?kxq7m6hSKGYfb%bx5=bwdN<`Xwg!#tPOSu zpHM;(^*3hV*M^`B(+2$VL+ogIa`8w2d)!&A;z~Gsc3Ee4fb7Nw)MMsE<6PLac;z^E zhv0->!cxmF+1CO2Q)kKY% z52J!Z|C6LY4QCgKf=Zv3EC*}C)~x8ykeNMv4s?1IQ%vZ7PBpu|l~%$B{IfG=bm!T5 zuQ)*d3e3iaUv{`Dgk3D)#AnKTv8h08XGGC)3`WG|S`O#@CG#3X;*j;+VB%-%`Q?wC zP1^L-wjHUlz5L!$e_uErndKK>^4#h0_o`oDdLwFmLJNk!&*nG2{z`Et4YWT*xT|0Uw`Pk>D6rH z0dv*(SCb8FtK6dL`5n$}9Kak#x@fc2EO0N56Cj>^j6a~{YcUA8(q!X74UCWhWyYMB zRy&nhGHp|$UVW2tFZtxRNXy28Vn0@idoT7TplFMJ zYr;z;8Bf>6ofjn{VFX`b1|!djYzhtJ0jgVgo3X_@*oE8u={b)d2T+FVfqSL?XW0jl znSpEZhS01s=-RbzdCezNS)n9t7lVo~sKaBGi+J|#1!gm9;7!gXg>wuS{y#nb9^}o^&`sPp<={Z!A(Rf;;_^aHA4DXxJmh=})&)O+8v?|KL zElusQJpEgIa{eYr=f$4F@AB0)BL-$HiQkB!jVS+DfIP+-eZ~W(Q0i*qY!+ZbFj!aXTRCJPc z0P7_hf-`k1csTVoZ%zexQ$1sq0l)Wqc0F}M;o&<8n7d{f{Hx@Oxz97!!@h^M5qY@n zP_yiZR+GlB?-ec`ZMqHIg;yUPEu}-je>m&I`N#Z2(=SyPoDFVkhlWKtn zOm^04x~ikl1e&^@RRI}yfXNkI9_s5llAC-+ z@PIzSw&Y8Z0poTe68$nv4F;71qtO#UefSP>&{Xr{=7&*IzZJ;zQ4XjUO= zX@Dyhus>5=mMr|EC}!VN9PcM+D4Efq-fjhqYu04QnxquzkgY@W=>dgE`LE81>1A3G zO&SA!n^D?ov!>7t2fVYr110xG))goAOB)n0R>AY3B(mh|zeyOqIrgJ$o-*@a{wWfe z9fkkZJn#FAA}hCH@&e^Smbu#bwJ}aeB5P?)^eJ_Yma=UVbM#_)jJ3|!QKz3oY3n_H zQ`rS`J|@37K{#|)J{Dji6S}A1cZy^G1RNkLwSIWMafw85nF5QZf?4`IbmIbPOJvU& zf0LCY{@JNtDEC$#F<(njZdt$SgL`QQx#H|zSzKKxLCv9(kD(8D@dGix&Ow^R?+=N2 zNwbBo>fXY=|UD`XzTar%# zK3sVFS3mw$XU=T{GroOsKLhp=1+_kcn4Vl+l>A;5_ajK?K#qkdC=L~TlznqAo;k45 za>;~`O;s{z6lfHkMoSsNRRxdCewV5${HQ3*`IWL`INzecz{H2FL2U*Fr8UI!WI)Z_?c6Ku7;xq{lfCyoHP@J|F zC*;+Q8CUB-hWzKF4MZX%{GRjI|j=PvdQ1nfukRHXM4TkdsBHX%V~rC z;4Mi*S3Cr9`(9|Wzmj(7EYYjwbJa@)*|3~*`99H2*JU;&O%c5g56)8<|okKN{-otI0RMmx(H5*$=So6mGE_$-TW1PzSXyw z9-yN2j~`fVSeHZ$Q`-vD-c`lUk2L(NN&%jZ#(#zUB3f@tPk8Wz^OSA4nNy28%w>ii z42UE;V@m(W8-exnVy0#&#OrC{-tC>qg|uw-)#8Hxk2>et`Qx`xGO{s4vg1J|d}HzU z?E8R4Kj$Zs&VZux)CH(QsmzhBIO5{RitjnV_Pgt{)M*WLY85%>ls(<^d9>B|W9A$N z|K(FKVC!G#A9%e_1TnlZ%d3l%G?mLL9PCwC)nmQr+;gQb6B9C>WG*o6DgqCUIL{3d zXr5kpP=ProSL$FGATGe^lR4~k#|^W6aqB>??QRwXf|S7z+uBVPM5NPsK%wZNFTO<> zm)-(?h4GJ#8&qB;WB_0E>MY@}Mf+9zrF{_GAV6WfIOFnLSnuhJnGK|+*CG3WF~lFGKLQ z$wwo4%Pi1kJWQ9}{|VD#8Jp3HVZGuF=)miV3XWleL|USp;MBQN=Bb4FmpESg%rv>%#R)7DEru$K@qkpaeb~ zHPMk+kb22b#Q(J+ahd*#MrDC1aR00v$K-Zj|D_m9fhLbXPxl>7;Kx@kXG@eBiey_ zm9@_Nl4x$G7>0j)!FK#Pz(NRcd3o!RcHxd>odgo^-L)mF^^PKv34|7Ru=!3+7GM{Z zTRD@zOl()vmD@=l23g^L8#@+C1`rHvBH)`5{5);YNNr2DH<$RR2vwF!NEH(RPLjfJkHEMjTCXJ+i8(+?taY?SaPKwV;JX)o??55Jt*yNI?nQM zDGgDnVZY>l;#HO+8@5v-hGMr*b?&lx6&Sz>X_Lr44Cgy!As_!CLA_|5@{qLBr zSDJ=R@EXg)=w1&E_O0;cq=7m{EcQTvyEEhhk%$7(wsHOP@c8igiyBr)emX8ikRtS{0>6u z;=9Eq5x!mHN!)?`46Jc9`x9DZ3sE-eFbnjw3Saxsacal*Na9_Z0Q$zC>!A z8y3*2eIm>P5WMHs`n>|k_RpDgDy|}x?_i-*QeWqw&X-zB}~$v?Wt7*U3=it%;>S<8bBC9 z@Y|@aEO>O|>L86Dhi-m zx;WFm<8tFMvRVUu4{=28q*k>Zwk8h zI33p1M$XaEM2+_cj|EOs^M-F_i<#S8;uVs#nCVKS@xH@=_u&2ZEG7cmR82Kycm$88 z;McG5BA=u`G)wI~PVD8FU+%cG#TZKR@;L%$PL`$E2 z8JA7*0Cl~J>^M*!lOV0Ws3=^~XXJMZ+?PpqVf%M9r^7H`MzG#@W@_iGyZ>xG*^JH= z@{c<~pTE^4b($NkAc$PY6=^65%8-Nq8Bs0k1D1v2WStA*S*unRIy&621A80ZAs0tB zH^KVIYPr=vNQ3kJ00kbMGuPv`l^TBhCPb^$eei>^l;E>g+4H(3)&DvG#3m;o&rpa zgRM&!Q$?Knc{F{3S}=r1zewhqJndU(&^xW|1iQJho=fysg=rA;{I5$_NcVZ~t> zlEU;rN83ME7vnz=Ram^fN%h98KrBnHlZPJNwjR4^&Gq*=!S_SYApZMGxv{n?n=#2h zBvdUvd8_=?Lu^IRvQ~f6G@8-4@5CL+W@X)NOW`zvn23rNZ&UT$T7m4A+kevM}c9qtz zxv|cddrEjevvuZByBU*#x^~Eyt)u;+Rf=6Zy%k{T5_;2YsdE1F!8=l)`*e?9a1?QT zhv|ts#NQZnO9l3PO=A!KnzmT`YJ?~n2*t-oXzz&xE(?@cVaa6FZ%g8<`dEWDi~|Kn zRz|tl0~~!QQ$~*??pkWE;8Gm_MT%_$4)0;4pLys^73Gf>i+%IBU!gYY_QlD=PyS>* zSZDbqE;*rGy}zru1Ic^2w*q>9;l2qJ%b|I+B5|-~!1p-V_deZu#b3pge@}+*OF~{JlMPBR|wFKAVPTFH=q6KZXaY@(Z^b3rH2We zXFlKxWgqbd<7vV}`H@!BuqGEks77hL*NQ@_``(6QssWTiI0b164tSznoSu`H z9yVT_F1G!GXpXtpD(826jjQo##bKYD-!E6`nO%Y&{iaMJsd5&hjs@fx?cp@N-pZOS zHTVls1bovAZUB-ww~%_6Bd(xZk84rsTLl)b>SYOj)-55=;DcUMmzb~O=54C28gZ=? zM17=fNGAyB1c(Bg?%pWVSY$uz7%UAmki(zHTW2^U+(iikbCYS?6}y;p(W;z*tYC+@ zXN>TE)^zqxZ5__&I?Z)}KuucB*?G{@wIS`Q$gI-(CkCqK=lXv5WUZJjEARhfWD!opEpm{7*y=B(5MgKw)>! z({p6ZHE&F%=|_^k>kW7b`n0RcV=L7^5D&}^&pPnHGaS9-v=EW^EvY(%NBQ;MHLKI} z){(lV6>cX;&#cAMnm0D(A3N#;Y4uuX@=8*3Bz7&G-DTuXifj)cUWX}o$S(A%kpT*0bJc!kay~NDN`M=VgbBMRUc5z zmguG>Td46&Axl@-TYkI5xJg1G8ebW4wrF(Cj30GwK+9!~I)^n_2t9BC&Fyr*VGG-~ ze4SMVVDwg{HW=kCEjA@*o|~lL1k9Q2MNw~WPom3uC_|M)ni>_E6*5m`=pK4^IdfX* zuCMR(UYX)E6?XC?e{<+CAoAu@-N!^KBOl#{1ajT?AbRnjrcTI+m3CkJLyNY=Z`G}4 z`4cP30zNnZ`O*@bL@^SLa^GE;OTTr6m1}!TgPCy??8Ql$n-AP6yoL?3Errb=ySyIM zhWhuvhj8F18-Cthy?*)*yP>^%ZZ>=D{VvUfNt_?wLM6ie%^68W95$L28$isS$Lzr_^{XUf$n|sa?$lLSQV>K7rDc9 zS|8ev2}l*Bm=0J=!+G_Q*z}m1Db4nbXtp7D2x5JA>#{VYvAw5fI$?^-IP;ZNi6Ky& zn=y#*zJm-lbOLw5-u}#`-A{gp|Ono?f+J-HwZvtDiLmhqVQG2j;WmHoScVpJyL|MVy@3K0$k>9|KF8 zT0hOsTMr7q+%Sa3e*=ulwBXJZ>X>@e^o_3;FP)Q{X4wTPozvHt{FM_ONA2-<0newx zJ3cQ=?)_nnWtyhcJX>UjlAs%?HuASb@q`WLJtA1v%e-Ye;;O#nd-Zb3$w$v|yo#0d z#YC6O%hmy?(yZ0ajp6C6WYxNLMZ+}$fT_8>3qc|X?D5rNy`LU$ixL0!Zsr1yzDLWC zTGJ@P^}SKYwZ|}eFZt?c*O$M9Uvm9=T`?rLe}1*MNMUtT+z-P&@7_yXl2^dUB(SX{ zt?fVz1`qj{v2Olf@v}2YfluT@_q%*a`F>#vE=BI~TFsxOnb1QU63n?Bi?P{lTMzMd zTbY;Y8#H>3-%K8gaz7Awh~X}cL|9!|bTen*Pr<287wIM)WxXf+Z=Kp7_hPN@Jzo_d zb3SmJCsM5FH~`lL;Ij70RZ{qFc2jfXY>?}C<-UjS%{e@@N|pXi(lX6!CpYBnWis~% z1x-&ok5yoITe*edz!{47CnQ-StL!1JfJ5aBEXd`ysXwMgi_g*<8!kDLFngFTPyWXo z=dnN&&S$O)ru#9|#qu7%Fj1%4BI!d8-kw)|$PbU!ewdSow0u(c{0aBVTaoFYHwHcD z73&xxSzjXTWD9!e@!E`)_eEjdYKoP%{n2bI4nNo$KB(U%$TnQNfG)OzwU;ggHHd(X z#w)@f)6)xNFoBTPmM3;4Lq|-nA)7~P5Qs{`9Q6fSGXIR^gu;~EevX<+YYWg7di8k6 z)#ubfi~ueV`)gA)`!zM2EXSB;+-}ai>!XUsePjA-c&uYg{0j+XV({w~3wPN(6ZRk1 zppvK>_@D_}zu)Sj1f{AveFN1yR{LvNO8FLo<7pemTXmeBB`Pf>b?kn|ZqQ52@fN_* zqPJ$L6ZIdaixV`;v|qNE4~HcfnG@F@%|c32u(`jn7w0dZ|C$_I((PwgICl?OQ&uzZ z2j+POF3+qGYcn6(WsgWggDmWjszth|?5 z?|nNrVOOL2T$^;9%9!vEurKOGosg$&!b-62$lcWEo*!?t9t)brRH^e$FnZd}9P3&f z4d2;?7(!{VyH%;^qvZ~QCG^rCQbY?~?HL8a>iW6f>7KYvYJuXkr4RX+CdHti2(ykI z>_xav$%Hz4*ZDRyna7nke6((Ql=$>xEJWc)5l3Y<$8|A9)v*StETPAj*C!P74i#PV zPYPyK-i+!XMpL@~vKq8X@7$3Fojz5P+xs#b$^Z{M z=5ovQCZhBt-k-}@W!kMZWa#M3Fy>Mkfnc;x{7D~ZJGz9N{;__Wa|zoe$9a!?obICeomm+a5S=HN^%9zMO(9iPzrU9j!9VX|~Bz9CY ze1TB0`pMw6)(~h~uiH1f^zc;g*@VzUXTn)$8@`MCY>q9G%p!)9dR2aZ5V=iz1P?y$ zUUa+Z;E@iL_l;;Uzh#07RnrE?L_y0sfczbrLvp)*)8kLSV~g6iPoYkuVl(rc{pe2q zHU}@nb9~G`$biw$QX(b}1`RJNB#<)?i}E=suub4!W$Le}-qTKA%k;L`W$B?1;%lN* z9Ua@7M@Xn3ZSO+TEadX9 zd!Ov=drsb+tMZo^AewqP-5Orh$0xf1K%8LO83nZ4;_`hesU9dGE-741^%ifS&4xwD zOZ^F{LL3D8+a$|7LxacTBZWU9wjg@$qg0S@6r-^1AbIrFd*D+Y>JHIU`th!(Rxm`x z7Vbmb8erwQ#*?@pk!!-ku`TWGxkZr^1@^WDbZP7|uaJvFtD3gZNNrh%A5CKyd@UU~ zZSMOP9|9y#kaZX09s+>KwSz?!aR>J9B(>a1 znws6bC8a(iH^--TQ?QNLse7!2<*MU1x_j%*hi}btxmUSP7o6hyGCUp+Y@XnotL(ps zWduf{+@q`)AM%`-R@*Cm_GZz!!_>2o7b48jCU19%oTVGGTE*M-{oGM-cE4+q6})`L z1aeW;vJ%n4t_D9!<+{Fnt7XqCV$@8rX3Sfy4S)QlIkk=Ly{pU|M7<2tyHSLa`MZ21 z+IK4MM#P(fD7cRQ@rT(RUVc4F9pO!2hnJqpGc^^~qQE|W_Xl%F&TaN@!1PEd8)a{v zgVCQ48S`Q{Dc9*MF|v! z%|yrs?NK+;7pqkTxmLXmryUf&*XN>Y7R_)3Cvg@cQ}lwy?`IYl$R%Me<887i3@(Y{ zony+~K~;b48_;N!NDiSBU1CXai`iizW&^QP;xy~t)XUv#=t|ULV_76m2=9M))jbnm z*~q@oswU=w4a_!2v+SEjkdNFzdv@@JWK(@>V@Edr-;>39j;Hnd*8tb5<$!~{4~ZtP z15F;m3|NAyz8W{oRD7>{_|&SOWbWPN7Qy+|OkKcPOU;hoO#Ai8m46HvoYF>1y^5Z* z54erIB*fz4y|!Wwki`GskT*UGW=Abu@msAM2z2_$<&PJnoB%#k2p$J4G^oLwMXThRR(m7VCF+}G_MlkI!-46oQcj;Q6M|}VZM{?#q=wL1jzqQLt zI4|0I10d0AzfvF%*i1Nl{u}xO0qY^@wQ_l6(2ZIaZf@K%ft~eRTwh(+hdeH~l;z5% zi4$?VWs?5YO(EC>Lvm4XzY^?$<-vO=tocguL-7BAUv3wXUKA90lRi8v(d=-39R`+x*Nz*a9qUe@sB|NDh4NHh>--o3c*qPrB4mMAx5t^D@6vr) zDct>)r1XuzKIbobKGz6nbAE@Hwr9#$ipZBSh<&~JglMxYwuMF+!bxywb>sW>y^`H7 ztb}5Hf*JfQld(aYZ#6|5MDtpqn8h1X+WwexRbm;J0s#;EjZN-kYx7rnQs-UFZ}nz< z@8Fj#{ik(HCn%j~cl~aGEsvYx^X6fabQK49FZ>Q|;=Bz08?*BjJ5dzBOgxVc% zK_Xps9uX(t1(XR2Nzq{u)RzPpG1eP5w9Ytg2w8%SCXGJNV`6l&~_{)dYlAq4MuSW_O>oGO-uns4Oa*#RxhQ1i+X3&;XI1Ci1lhO+0K<%Rg^`v@M>LvYdMar-tfa$r15i7S_}s!x_|Xa-*W( z)CqwWgXLVwpL1H%HkB!n-MQ>U+!Es9jqHc(o^wZRcFx4^)^UvT>eAZuyzZ|xvgyI+ zA0Rt=5aOpG;nl(wOAa9spFJ1_UTAu;A`aCOdK>?nz56> z?~6H;<%~NAnEeoZ`_Ta6OEOcd(#WqK3SE!no9Vog?a+D?^CDqL6sst2^Zx$Ex5)^W z`>kiWo1Hze%yk^kwO%%J`UN|<%xu4AZ_BJa_19{KP)HR^8ubonn4^&$xB#OTuVJT2 z^}J`pd!OfL3L6VH9}8=6pTTUnwLLfef;m*f!EY8It8{a}7q;^5jET;r2#37v2aT@K zJs1PqEoFvAyawygH1iH-mxs=aufFpl{)amJ4dqAQK;hwsZ{w$Xhe;jcz7WK78lWuu z)9ycr@VUq7q#W@=9iNEP&bdj59<5f8K%Rg1m#X54Jve--@Hm!nF2z!IrHB)}^wimm z{&MS7@+j0WtGB`FvEdHhY{7!Z+fzOna*`m7UOOOe;{OYMKTF1&ck1>+Q ze4DE6?%&6*p<9Rq+r_+G$ly^??PmK2FJXP!?2w?66#17KFRB^7-^7K`pfYRy2H?M5 zC>e0I5PtS^595Ebm$MnHdP{>xX;b;oAMjl@LAv8H!%Ie5?dS{I07aBTxpAp<9qop+ zzrIgwN!8HjIB{<;>cB>00SRTZ8kFr~AW@+yX15 z#p>{x7Lch6^`#7*!loB&AM-`~oASGW^V@mw@#D2yn!agg?eTQAbY0DN{Cs}tUEeoQ z`%FUWN&vShjoT$Et!XTaapT!&aArFl$7*IV_1<2l{w3Sd@n-$lI;MWTOjsY3|C(F#e`j;-FBU{0G~`R4SZHwDc_5#|4$80amH<)dWRC8np%{t1}RK zaF57=+ZL@dZ9Lo~NitrdfgkFdNp=}E$aVdb0Ta9R76Vb2!EFQ=z7E}c(HBcHY?|v) zk#rj*7`A}K@IbAamK4}{eE0&F73Z|R@1r~u#db-9zuuyI1wDD#IOpW37gC9MVcQRh zi1U?qiUh6FjKpKed#uQQdpUN^JapnwU&l055g3N1vaVzjMKoe1?ppMAshr-l_))Kj z96Lc%ao*ryhghr64iv9%+5KIE_7aFeM4`qZ~2?j@RN>k|0)f3-++-gFk%0=5DGNHPYyq zm^E)>E)xqyHRk8)%;VjjZ%3|jPCvwqRTI}Dtu|kpN}A^|zKPm6W!|Xz`7G3}|Kib# zl)p=9Ig|z}OE$Lg{kY^Cat$?j^EIp0Tg8v^=D3rf)a^m9JUur3Nwl1Kk1Ebf=Etmt zU>T|9*p{f-h3hiCwZ;HfYCF6A0(^{@yNHKvm>4N6WaLxuhsU*v8+BI=hz#W=MbB3-eIW^>5mI zdNn&ruvF}0BqOrdV=>^(!h^AB2m~JJ+_;qxaFdc5wpiTlrVW`e7X&;1hwHa~>`6E& z99&!u?hXi%<-Q(?<8NdK-4iJb!%Y9f9k_^un=_P#~NYCrlVciM?{zl zrDtjv$Mfm8z%sb-d-CvBn!(m^*?1G6-C}2m#p=Y59hdb$7-UsSZr#u^uvS)aYTRO6 zS@E|UBB-+R0_8@e98Z_(?~j`odLyZ|3+SV5Q;_~9mjG>x;$O)Xz`nElFRU)+EQ1$u zCP`$@0D0z`0=`y$nA86XQ|RCX7cQ&}dPo17bmO_l!Tih^zu>j4WBhPC*Awd3T8|ac zG(S%5(t~52me5op<2R(}cKxhES?ibiwjn?L5-@d^0s zI_w@}T8G-+e~`_;;$%co+>j1( z`5ff`XpIjUp+)5m);y^#OKi;JJ_Y=IzS{}2rA|3H)q(q4#I>kwu^gGz1>C&g3XeBC zji$f8g9_B|1eza(G^j2A+Fnr@pG~Zd`$Fx*{!Cg*yv+TK>!T3o`-`OMZ?U774HL{) zm+;YI)S`9Dpah+Q|1FSOib8A1^pU2v{EAcWBuNb#z458=^A9;aVeS)phvt$j{$WIsKn)BC2e;X2kLQ-Vi3Jlj@T)KV?!5DC^U6^7~$2;C+ zvLg_Dx28p|*Xo5R`V4VYKw_k@4aRL;93YHwCTNLE7xJ;WH?s}}(DR#XSm?UoP5N_5 z^O-Omal*u#QJu*v+t7nW!59&b{ruX#8e}$wYALSsS>){Ej=#qMb?DTMF2bTXByJ@5 zT*{K#nId(C0DO}S2A*EHJ?+vWhDSnvuz8u!N-PcCd27nx^+FghJ|JDrR#1P>htVS^ zmy(5S#kjD`I2s5J|McNg>DceSS+pm0Hc$k|>V$Q*fyn;|ZpaGK)dthhoZ5dT*xrV1 zT)==8aCp?ZO?LU>Yw#W_)f^_QwK;~$9}%`*)oLa*nosIc5n38UFN!p*d%mccz1!eU z%Di*`i?$a)zU{eZw}48-26y&iQD5gL@lL=e)-upmaRz`O^HLLQ)JHQNQ*~ z8Lg5$_A4klu;dYeU)7Q1isUI_^mWq!G5Pqq#it&na}?VZivJn?Q>##kmpSzHnMAuI zgOK)3oV&&U5jJov(b>&!-A2a-=82{s5uV?#onn`PmS&3aTPmALE?-tN9@TSv_Ak=i zVV2oeT;!;fUnY2wQveRc$L67ap^y$Qi)i-cRO5)Yf#)EatE4n*U}LyZ;s=Uzg1T&a;xF9VH5-_{TDtjTiJc{twwta z^4Xp~jnjh?EdH989(8b0*2*;$>6G11VvA?8ox7=KAiP0yo(F|Q@o?X>0^uTXLvUuBKZ=sOk`VD zV(kBuLJ>lU516N5z}!5KnYtJ(lOh5`U8zpEC>M?s9W`!*GD-6vGsmT~06IgnU%w=_ zQ6lPQSi8{naSQQWy|2;cWN?)Z*YoScn0+MNe7TIPxZpRKTmK3*<1E=C+py&9B)I7X zj#{1hU~qoUfWeG59h$FO0ZZXTa|MvJib>dnn@icTWxxkFp}!@Je4eEuW{P%1FDw=h zz`>4+7d8tEFODGd)7VBur)#PbIuy}QjmB37qj-+s% z`15$v;B&6RKY^1+yOdL(pVW}NZojr^y?v;M2OF>ZEZL@%8t`?V+PB_Ftc z>-}6N1Z#W1l)a}55Q$ISTBToEWnHE8_xr~<9`-SPW{?b(fkXQN6P#5Z-~n!`{P1RI zTUPA(LTJj*J6{tpVXCM=i>s2h;WwWtuL|50y} z+UpF!Z9#|rU(^p0s7eY`3Tm2P6YuK=d>2P1)wgu@ii-GHNFEbL8Bmzre6|%MJ!Eb@ zu5e52VoVoZ#b@>3*IYncNvuD-d0DfeMjaH8rLmFh#AkC|x_nzBeowGcH_^ZTO8l1+1Ey0_X>7M!Fciu+F~=s0(kVF8s+Khq zyPHen+MTyta`m@ywj~@i?1Y>|qlDQuL1O0!ZKcVwJM7EE_jHjoH=Ly1k3RNM-ijIU z8>5P+>9go)X7PPE&nF$p@D?$;-scv7voVKDHwSMQo5Tz$XRsh9LU4;LDz0o~mD7uk zk!oB8b+C#*5D4NihSX{6^>z)ViJT&A34H>Uw9>YDeLM)Vp5>tg9zZ+@7Zn6zq_!pY72{dq3f}$tbJntpr^Mm$oJ36w z8_9-Ytq7Ksmt*ciazE8nvOo(Ib>P3n3W0v;om|-r)`TG>gVrG}(~j|V-0v42T%DWD zf|s(%eX>KYUwv5C4SvOkNi zxpe}Wr+1q0@S}t^{=@t)H;Ax?={BFZ$GgoiTky|Rx!%0yx}>h9`6}%)cOBsBRr99j zE@>ER1>#$6BlgDvVpGDI(J?csmC%{on^KMfP$7r#Qn2!NY+_uv-rTFh`6wnRhl)O} z_3&*X=TRRb3~nv3U6;JqC}jf&-^>#w{*4o9)|ON>kN!54jmK}h{(kkp;NN}wqPE<# zoi0Rk-EcV)hP@20KSzm`PTdXqik05EUk6w!Y*%Pvy?b>_$HQ2qez>MmKP&_Al_A7*^&`ThEs**y2fZM^7e zysK_wz4UANvDHoUwnErF1hIYF@kxqXsX~;Eb;Qg{jGGlm-NN214jfLbb zJzOJ;#Yb(Jwy{E8!1(hSq%t{wOtNkzix78#BOqcjJ8SFooc{&PHcL39BRLvkl^vG~ zo9xvvTt|&+`Nw{6t!ktimhu3>3g9K*rco27!a2R)Hba@(WaGsePcfIQ4Y)FK8s97p zk;VJz<6EtLlgHtrk6V>P$q7^ot}ZE zoTWtzd(O(Yo5i6RR9PR*l`Qqfd@DQjZrxG$#;kW;U2mHx^{O#X<&e`-)-7jye3_*m zdV6M+Eig!9f7b$0tpZkTdN9v>dnvtz$X)te=G=R)*t@maGM$G{vdnRf(OW6?*q5-g znyeAT|XD@xG z8#yZ)ytb}t>ODj_A?-~q@}$&w@>zqdK^vEvfhKNr+ptN=I?xJ$GCG!1ZiqLY6>5>& zw>rvt4Vb}grV6j2rfBmZff}Z^Nd88D*tWQEltbxjLEWQ3^31XO{uAu-x=*a#@0Ixt zF5!B9q@Fhmw-B`w72If>9%&#H5u?FT!ldespANqV5PGYI^u>h9PlU{E68?P`ST4^{ zRNN=S53_8GeIi5hi^`D|}Ymyx?_(YBkrXeUGN2PzvZSwl-v} zoRv#n>YD<=%LZJ;odz|*#(!)(BgQ`xd`kRy3q6A6ADB&XB{Jw@I=%nL%7XwSv3`fF zvZ7AD-Xjhd@LI#!J}#)X!Xj=P7x4GCpWW5uO{-5S=mo_Xgy-aCYCia>dB@3iU8_I7 z8`$45R7n3PY#U{>oh9sH(HaHo_!5q2u)ES_m2@NmXswF9vCD;#KN5oJmW?0U6e5BYn@R#>ee97;#nIv}&<>IjY{JH<^Z&so= zScX|!I>7U8pT5#HG~2PJ{l_W*s)Ka0s25RxWO~*c z*3zNNP4&H?HR#kTROaglV+5D@eHG7*yt{szjUaW&kAk^Y-@9w0y}S=MOet5>>M$vn zD|B99K@sqbm8G^8M!Q#E>T7r1Oh6KaGdJm&@$AVTUU~bbxP*KvNVtOjsfEZL zR{GJXFP0@5KQASEItQX~v5K!5-N zl2DRB+Lw9XbIx_X?|j$!x&Ph!+0R~kueI*=JarYnT~t2LkE^o1-gJ=s_g;-RVXy_- z#rH-oxBmX$BmGpc*HC0PLsFg3C}T3(rr@58UgWi!Eq(On|09R>9bX|X{3CTSh_2)5>3JQn^AEbXL zxUL8eQtl~Rt{bmX@L4bizu zQ_s{6voHAobkgiqz4Jx0n?CZ#Y9#d4{Qn}J+`kSwBL533S*rcrn)c|m2FGaW?tO_J zNAJBC=)IG@#Si_Z}ETdAYEnjs&qjE0!+Mh z({*~(*UlGGS&vy7`-eRYVim-Hj!FfqQZP@p9-uIzIi?LKBDaI}{|JRZzb$svv!QMy zd1kz-nSIMT2cs*I&mY<+2iU{y^JRuL3cP+CrUgVAWSz5>pwB>Yta+uB0bCYo ztDOry3CKkO)^FzLXorLdH>s2Qr)^RIY&#CoHii5M9k)j9h9E1k2k-og8JxzzL~o>^ zFmaxckaXwmV0F8fHWieW(v2K`S*_0VfMK26S+KiO^gvy}t>{^)^%LKABoV6%f!`M{ z>o{ylHv;ipm}{jNF*5J)$P)45o}=Id4aid^7D#4L=5YG?d&tIgsF@N&$ zp&vlJlMdJ`Rl8iArxG7OHpW+0t?$(DX<72R2s(gDW8yoaxL1d&1kL=27Z1)#XKfY9 z?*TR?9=`gS29o@hD>W8L2c7$1oR)d?WV8@jT}$41m{ONHpaeAo#Bn0IF%TucMXYE)Z$^A8IJ{<%gCqA>%Hbki&h4@7B&!|8!BW%tG_eDexg~WSGz(8lsI}bg0 zTym%3<)Sm?{G}~sZ3PqgXlc<=dDIR=C(29z4tfOo?a<5zW4%i+mbVQh-klRB3iUg7 z9Isp=9!Bn+PaSsWjuqh#e#i(MGwuk2qhAF8!1;qcXYa3~=jv$j62t&?UL~8)Hk3db>N2kv8I^iv8%7-W{Fm19;{V6lNK152QwDlScBzh zRNB#29}e@=t)D?|UI zA4@X4E06L!ipA7vQUg%%s1}g-ml}> z0%efNvPUZEM%Hq&r6ooJlk-AZpxH=&aZtIZguyJ$IX|C9dJ~R)VQ(KJZ3=g@v_*&{T zYPa_S&oZHQwZjF~xTv5t1bcVP?6r6a1ru1ApN_s@`vEP_&hYM2Tw;~-inGnvu7?_c zu70aRt02T<^7KA=Wi;P%KK2Fc+_)2@<-FA0*xxX5uQ~gmc4+Y0y-1a-phqIa%w?DW{mOoz0;QSQG=ITGW`t=$G zB=_uZ;Er@m-yh<{?dx~ed?xqfLp0`**7OG|EW9pGVabBKXWGY1CPi`fc`sG>h^hbH z?r6P*rwIxsS{Py)ssos|{G{qhTHxk{@CWwIvVKLa?K~yyja=pXnT!Ye|se1ewzcC(pct zzBaj(Tw7 zw*mc2nBAR$rOT8pamtx{gj?4C;|8?gyph2ilMTv4>T%)(v*dQf7oGlS>2y$Lm^F!3 ze+@I`xzM0o^gT>`#Q);5N*o~VIc7_O{lS3GAYb$X{GuDpPpUTQma_M>sA}GzVzcMO zCn3^4&WxtsM$XpyDpkmDf4wVTmuQk2w9({CrChd5K!EMXcf_oK7KY+Nt`b5H?|WyXLm7{lYhy~ zjbBDiP`o#X@`L1rYJ)n^ zO)Ber)JJh-ZYi0tSOaLa5)n~2WDv;K5xo#NTb6_8M9msVSppA%WcvJoUG{b}?t zVkNAJ9eXby?)L{-;#c+7h%a#f=4QHDV&SofqK{Kk(ZhSV#h|>_cRqm)4d15=Bmlk! zu4|TFAMS-q2Cs=vu>7!mvCc-W*e$vV^_`ayfIB?sm>pb^7l zuF`bGwBV@meWV0^$YRsI!~N4L0oIp5bR^u!m;2?EH#7$)oVlpv7iP@wneQag1=w5M z$f`%SZv~Dl(SFYCMJ4L!lu_TLX>n!6q+QW2z1$TWK-^A;{2qtWj&kyFYMzP^uqb_F z)tYqG{eaFLKw@_HbGb0P-{+^LhbQ8LXKrTR(n)=0i#GJo6}Nr5YaF9InmZ|Owy*MY5)CO_b$ove1i~pxo1j$F#mc35hO*` zA&d31xwfvGp5mEk8^3mH3jk3e0x^yZx_6mB`Y+K{KB2S4a!hTTpceTszE+qg_5nFz*q1!2P3+@p*PqaXOWuhaZ?A5Ox)Z zlY6EJ1Vmo~;TCY+=E|EH&+)mfji;KeQ{LR{o(v3`2We;0{P&5=n4xDyMr)l zyx6jtoFR)lUix<@Jnyk#{ReDR`}eAZe#IiUYI9W=7;zpn)xWX*BwWk0@dFN5z%5xA zvmaVP%crb1UE`7U8-3`gi5I6Z%)RFw^|p3D8@Kl=k9~r;A}ZFWhQ->*MC^jwEsv>|=r)7F;)C-qNwU!C@JV zhIrN0|my$>QciWiw$uDAe@Ch`Hpq@uFkX7-R%D z^~N$ctVY(xg;hx1&KP;31$b+ci=5pfX8HMdF;LPsW!)}!`0V2TDVUn;>)~^wMNzw_ z0dW-~2Z}zpqAB@>oEA|}<>^$~2)V)VCu#c2Pj=xE(9CYtY2b0;A6o!)rzD#zp_47m=cXzef@um%NER;nIII4w$=3r4FOmp%Mxemdv<12-`a$*@#B~0ce5~k~0L}GZ?ylRF zZK;gP#g|F?oNo}tOw1k{JeTOS8~!M^(Xrq8%A~})Jupm@{1~4^ym1$AR3pzUfQ{#c#(-$^i-qmQwH8D|LFpFqG1PyH_$=4K(s^}$>fjx z+O^S{uSu=~+lIw9R4NQayq)Tx(gOQg0>a4}Oo)8Lrt8Nb-b*y3Gsxs?(@yK(Zy?!1 zf!=<6$VCR&Upx6V-#dFE9^v2qDmyx+;%m8!{ZE;r2k;e;qdFu{`rF$_Zr9fw+G%26 zP3-y&W}9wdgRNy*TPlf3Tf8~rS|VE{8@*6X4v@H7O&}f*Yw8N%B1&%f-wC1Zc;%A? z+q?y^DAtE+(n=G(oS9d1yG9R%V6sw_p;po&DC ztY-0@6U)l2W*fcoL=26L|_XJC;r}8E?lp} z9dP<)X@C3`IHAw?CM3pq5^&MOY``)idi`iH8t&nF^LcuviMS6Omn`ODKA` zUwFjy@s*bDVm~0m#CJtjsr(*tKK>WW z3s~q$eg*ej{h1HAl6o2mb@!r2`PN=3Ev6^Kq=&*4KFu zKsLZ&bVMJb;lV_r<5@Z7<~i9`lm^ERAKR{ys*{lLvu)oKvc3Q9c;3}8z|=x+N0%^q zWeRcC&D7rq^PDI*MYdg`$A>iEQRyD4&qd_0OGF6rwxUsZJx)5lV&}maY(_3hXR=#S3h^6Z zPyyG4GcXr*zeyzRPQH>|(4u{^9zu>Yaxh;-jQDx~?tRb}AXk&w6<<~>ct@AY3OvD+ z%$;chb$*Q8UeVuTx?SeE6U<17`nfyh35kvzS(Em1JSV|G=Wp7F(eF{DI^oCeW)MTT z_WlBXpD)kx(4vE1#Jq5TQTz&6<~#|mvtq7vrxy)53g5E6uoHDqiYFLgy+5cJ)`R^B zR55EXCov}d@PLthi{y{^#^OG=#@}m}f9S1PA(!^RziXjpca1z`1GYA^;y;vAFph}(UC1_QV)Xr@TD#!AzAFi| zJq7!YK5n_x2i}ricWqFBUCEw?62SgKW>J!fiIqxi%3aK#flx%FEQq^d?Pao9>lrq@d(_@pbAIjaJ-JE!{4%PEVw7> zGu;9w0;G16lwNzCgV_#7>0#kRnuKsRpLtnB*8HXTj zIaaT`@TaBaaI!W1Sw#p0cFEa~3|pI8cxU@X9B;^LZPA0_GZ&8+jwn>1z$J*?s`stt z&F+}&aS!6^d`rEmlU7?dESK40vs=n?`7FWkukaj_ov$jYX9@hZ1ni|+8Jia|6+=P8 z3{G@{7B~^8mE;{EIL)FZc)I&>pfQd+$3mII=DSuFG`S_@Z?vjcaKW&V=E;~RO%D-e=R_9;?>3YgRKk*NOt=b5FLxu3 zkO^0hU!m>c^QXP!OF5dYZe)+Sol7{s#U0t7^$}I&n}|E8@WZl|dC+{{NQ1vBRhvyX zta0$!uO);QHatYYuQl&t?l((mu|$^MDA=&5+f@9-5XpUz&5zY+WcJq6J%V?R(^O#nhimTxMpVfPhDv;RkyV^Tv~}3c|ySKLIydJzP{@wD));U#vxvV+8esaX{xtI zbb|273)gHF2`1JGZ+c8N9K2e`aCQ)nJWT*hIa~5BrKWfqHc}SXy2iZCVn8VGI_k#k8>Hpypw8HTsbDqI4Y zN!*dYINr}HU7l=PTdFP&NKegJ^IMh}GrPrEgNZI7Q=y4E*@i$pF(Pqtw3$rl#NM_?6*!#`Uz8-b_+gnrgPsYXj$nR z#qX}WO+fkT?}CQ{BmDL=v&2(o$%s)zBbp-2amd|4#lmsh@gzvI1{7RJ-r$NZm$!N= z6*${6esr7Qc6y`TTkvWDAA!1>x&Ml3F$owSJ2S(5m0`{8*ovrx$v)Eev$R9cd#7~% zJYyvb0ZmGlr)&P&b>fdA5;`JIwmaZS{W;sPqxmUq*Pl!sY=rx(UKhu;%nnrM>kn|& z$~fTehuZ64Pbug)H8S=EsqcRVVk#T{Uk{%Gqz;2XVaTZs@>=H@dUeZ22zEOjjtZN5 zq8;WqGcr7`s*8W?)!!7^UY_UhW8IoqosRlxW+Nz!#>0V?CYA35CM3Yj?55=5tb%R! zM(Rl9;(Xk_ol+9y=Qv#``>UR%MXhvLwCvx&F}IJZO(DFQ+P?QMj8*)1N+0+P<>AR*Za)ZrK9xthQiq_0RwS6c%y90*t0Y zr$nD_wB75IwEXhsRldMIA!=@CV5Vo{OVm~?^*VtR$y!_}0nyvRGqX$0H(I#sCCW#8 z^T$NrBVph{nahubs+0OpHcFP{p3_(iUf@B5uq%GPNi(_OH>6T~Dxe(y`P8>jCa0P` zb#D!YB|3V5IAMPWMra`YRwBy1Eo$t-xO<(^OEX6y?X_ntRr}lGnl)RmIyWOC5)nEa z$EaQXi;^oW=hykM4-~^)+^31x(GOM$lYD;bQ&tyfFd*L>Yz?=q*J(%Sa%U|T62jZ|Yj9Z4ML2X3SB(?`(dd_n7yi5=>U$;fqq z^4{czYt4zTrpx>F0t``LC?nPVw8YH00#pzu4gCQ7E+B?_Ar0Lc9j85Q^hqG>tzA^l zB9X_Ci5t6hGA%MBbbi*1YsiffBT&C)PiGpp0x1uc;vE|Rv?!U+#jRJ%@6W$Y>3Ev; zr+^JC=g-wWSC>N{CxYT|i=6ao5S+JY*ucyliQg#~Cqs~wftVPQFEOIpl-Pan31=!% zb_#p_+>dCb4RJzbkRTbFNh8jw!5Sg< zZB-xMQn=>C9E3_uyB+PipBk{ERZ;UH>>bg6>V$0gA48!K9X}9JpyqS`R1-j)79VN4 zGm^PO`#$AMI@T(@g6{t@NDa6xa?MOwil=4OOW|HQ+U?k|@4bTm8On9KfyA@18To zYf}X$DkDte3c1qv^#3ZvAvxwAcj-G)Bl9YKjUnDmAMez6u2M>`*LQ?KfH07(U6FFb zynDlb^_yd8LF2YQ5A`6`G*-of%XnvI^4Ka$@IxBl4(qiKvuaog+DeLDwIa9II##Rn zDot&Pm(*^+GpQP!77KhSO(gUFvk?a$%vriT~mFRiyzIWaZTACkW{ zJ;$0bq_xEjo~;y8uA&O*Ll9;_&bn3&CZ7!AiSXrh(E5M$X&Llsky`u52w)Htj%^&eQz1k{Pg@x-T}3oTBh8`#f=++or5 z-wK0<>Hoko-bR1z{o0(g~s^p4n8HIBvhC;Z2z{8GY6zk3Gm9 z+SmyYk?0{M;N51~x^E-JJ740hli#RFv}&7VJtBU^L_=y+UG6nH9e#j8ShXE(cX)j^ z@bhD|iXSK6L0yj(6U@@spI5Wf+RV5uYgusek1_Z;K$G5^)Lio6R`f@<$ zSW_f|HjfrP9HzyI8vAc8OV$i8r4rG233GWh^(DBFmAmOusq+51A2Il`!&=C|*#hBx zI!oih5Fk5Iuu0#Cx_QS*khBljYMT#!B%*NzP%X~*C?b6vZ^O>ckXT8V>Lvb)&*V_p zz?GSUy?MzP?*w6Ij_pAB^zUHdi`Nri33pvN{nRXE_e*eRt+^ZqodpY6q0uU4NQQl0 z^WDWBQo;w++Uu^Bm&6^5j{ALf+->vlGX{gbjxMkyrU(t<_+wn3d#kx98_}TL^sWjN zaVgJX0I+=Ke6WmC$U8)Mh+8H&4Pk3%P@jkx3v~lkN6$sZ&mB=Bs3v1MRVgLKjjMOS zFk1!A;}(c^_|0t7t}*rOQ8(C?0MK}oY$OLrxcR8)1QEb|USt3WZPqQSo6H*L?bk)M zW7vx8;LBlA};D{ zlMagQP-fpd_GBBq)s(z?zn%qNr@>Y6>Fn?utX_^(Grz+iyn}6IT30Ob`|M8#qQ66*x=l$>7 z`0x>_Axr5`F$q{6pJ3Nu5I_kS(Jnt3gH;@@Har`@N0e|jv@+YNO4IRXmc+DS@!LcR zbnB;GX=5?l(p?( zt1r|Js`oY)fC1uq=MRbDOSE1a|wx0DFil-z&f}WJR0mYnZ(mF~w{Lz&%!Hpww!c-@mztQV&ZSk00R~}v@h_lv9Q@gMtT+0j-=(?w z^%o%4{Hp+V&J4AKypLXA$lGB~p_9b6gLzO!d&4mc1>9h+1B%jcyIGQ?N zEYQ(LscK9&5GZ)h2ayqpEnE9~U>5UXC(0wOWC8tMO`Q1F3+rbjOc%(wsx^_&Fh>qfwP*F zWv!9tJNMs$CQ^n+-H`ca$FWIU+oy?w^=i8g`X%_UJV%`mcR)X`-_F~loF+}cR-;Ee z;ND@?+iVsioTB!4N5DnpXoUAN!Y+vzVo}HnD6DE^pruyIv6gG|ma*{A)#72wg-`-hqc2W?e0 zU%s_(75fzd-o@fNFy~VB{AEbt8ec*&d|a@!0q$Xiet2I3l4g}j8{uC3DS5Z5Vpw$! z{!{)BleUBOQx9pG=Pok*%KK;(=NhR;AMMv=zb0dOtj8vY zung#>taHSl*(>@~)j?TJwF|+jhd=gvCS@!eXz?HJ3HxSCPe|5U_`M$-Z0rFoDL-nK z^@Xz(;`ex6;RotIwsLgDfPbIp4Dh3sVK~IS@}s(D?!!hc=}qdiz`eyLn4&)Z)wO;+&BCo1Vg*|UTyt`@iybaI z<$_d4?u{|BLgHjUuK{bff)wJw0XYGS5qGtv!1!~B%KSOaAYl0Vz;3;YnR@83N}LYh za=E8ObAO8r@eEhFLz~H~j;})fY~GzE!+Ka4y(-lpQEQ+_l^%1)NseX@|Kbs}L9c!| zQ>fV*zXHQx?Djj!+rU@e+L|Rs?!<5Km|&5Kh%P##8;i|qeX~(Nt4WKJ96%>?Ob{(3 zXB+sv3FdrGFh@D;-H>a4zBQm`li67GS6;;D(0p2jQx*uD^tm}(3lXF+I?;8eeq-D9 z9o$mD#bLhHk9%4Z?Z;AP=ZX$K;R{=5D229wj~{QeR#b14DI=v=vV7rP-$i9l#T|I~ ziIY>N{ZGdp^(!AWml!m;4H-Ia&pYYcJhH!Pf3PMnQzEwu&)HrIsCv-aPOSJ_UCOc; zV?j_A@x-wgLM-SLCHmnD{Bp}Kt33Nn>N8FlM=kklJ4q+Db6bs&fUy?Ltz4IT;+b%m z@JDq%b?>ANvBI2af=w!1T>CSm<+KbA(>j5*Q*G`>n{avAs9d@lu>i(9Vn`s`yjPz7 zQ+f~xaC198P0gt<*g7s|e|Qdw%4+#wVaYN+ta1+5w(#0hwoUmPSI$mh)`aWLQb^2U zVFWa2NEMB#2z)G&+xh>+=ZH2$LR3B7X1|=}J>d-Mh=8>SqR4L4RX?VNrnXms6R!lI#5Ru z%%oDa^~dWjK%K0qTtuE$jPuv2wBM9tyNKtk!ZI`pim{&Dw;~sa#C%!X;u~!ZlSFvT z&snLW@zG&5)8h3zTTrIn0~C4$V8!3Ge z8P+B!%_hBu1;A4G7qTR}Yztl5yHXh@${n?Jo9EJyV(M0Otc^&-3`B2j2PsV(%>u;8 zjLGWybSa$-x0NM*C`~!%yQ=AGs1ivrRnEkCeKspe@b(8cb|Ssrwh6JgRHUKjO^>_Y z6z^;WB`zMZ$j1TJ|Nc$9RV;=4Zhb#jeH%`P;$&67&QUD5h^OsDDG3pwN)&sOit4#} z1wT2Kes(n84zeYdhb>H}2KL_Vbd^B2J(PRL?%I<512h8{M!0?&s$|XZoTMVk%Ri{z z-{Ng_0j593-n9n8K9L*)0AXr!rYj@_BfrI2XWApz-xW06-@~NeG+)O0T?>y39yoA8 zx2n`qG6n{E8kyJ-`rR4m~PZ*2RJ zO$4I%XP?k_TYwuCtJa{bxt#F*-|C%6;8_*5`Z)32A=WM?SnZ-)_-wHrx^2_`cG$EX z*Eg7Qy;uU(M%Jv#sy%aBlFI%M++ZSbX=6aM)vH57i5E#}4h&P5v)o@iI^;O(8nqm1 z%NsmL-?oaJ7|h8a7fK~!@@h7}d<1$cx%5F5jui}Zh!RY0c|Qu<64v`vqgzUo_6jfa zeaGTAIe**l#N_tt<0e4+64Vn4gd>ByY^6+%h?8Dq>|1jf;1BhQl7@x9>KxiBW;BF; zJ`#S*H+wC0F*l{QZUXa~u4|l6%-eXINDKhjItnzv!mYBk>4;DPM6du^u||a{O+U44 zJt?FtoL$*69`z;Z=iXn^^@S&_)s_TeP_BXIJe5g+iOWF#Ej4dm(y4?@b5f;Lv$4t`8U_Z9G zn`*~Ptoda|TbviL;=c|G_SkiKuCnt+d};-4>m|1=eH|uJa(vtcN;k&mlBRXi;+5wH9yi(=NaDKRkKUf;UI@`n5U zNs}l@l2<9NgV-bu?USQFx z|1RdNTk%>~HRpmYNJxsrR1AG79jkHiRC3dwff z{&0W!rJ}fW+D#%BztI%2W`|thv{SC|9%0%%y*T!!Djm-ZrtSD}9V~WUSie4xUYB5Z z0f6aJ;%dU?`1YsUmfHHV3rsym=nmi%1^YK4w=U z0PO%}*`y}vzEY^aJ1bieFTYUNi~3+KsW3H)i;$wo{3YEvuw(d3J~9g1`O!4 zHfkLO0VV80%LOE%1NBGN)oednwPOcxTBktwTdfaGZ~5rm-sv-NPiT)v3K7hXlLBtl zf!hy`st3HzP_xMrQO=N&Xc5_#*WU%GV~NUzlzaSJxF>Muj+=HjHh)q#CWt7PE_EWV02aMYaq(o3G8n&zn`0Nz4q8|CeI1Q5;Q&91z z$)_Sebn4?X{`=ZcaSa!cAYaP&R7Sd4Z>KzvC<@Dg5{M#tJ|ZvxFwPa-5QSL@D@Qc! z;w-qQta!FQs`+voXxgsWz?JEW1q{47e2r}FLa+vJup@4fprsgJB1y9oOX5kBV9tUc z2-&qpwslOq+eM=mNF6X*)0zg}ITp{mHJj{LUutSOmC95zHaB=ys}`aKy@kB#Zgz)* z3=KHd6XM$FE*_I%jq|)l@!~-(hhWn+Xhr18jmK@MN z^cW6Y`4Nry1dyY6eqj`@6;!-mFTm_k%J9Z2X5nSsueZt;&b zf(qt72T>$NFhcmqDURTnxy*ehJr!_5N~EWhFq&^1$;(1T zE;&7k5H$RYn>TxadvjtJ%~)Di^&fJ4?DwIwvG)IkUO@EUt5`xSRq-z|+SZaG`SeW&rJo9JC!k^*|A7waT)=En(! zenhT53Q_WBMEdAGQG60_1E$KGi9DK3`A@7R2X%UD_qyD#jTTB&Jz8_}({SO+t3xD5 z2A`3hm?hoSj;Z|++jdXM54>iJ4k53PKvy{d#!G9f?LFpG;Se$*OqeINo18mfIdO{6 zLbqD3Hl?@*e@8bAA?B4Csjj}v4d?OxG4Qf2HrHlrt!CSqt3_&x)6Y1rhn48Mqm_{$ zMS3$tiBpLdH}u5uR!V5o8B@M>mrQ3(p8KgdG4wFD4GR>nj1H}jr{2tl z)7kSw*~{`k){fW0CJEwB2V^bp!z0S(LS_#KeLrgltolsLYBw}#5U}(1yiG7!9I+Dq z(E_Wx`8bhjo*x~w{>4Y^pWS(qdL+1OuC{t*CeOT9)|*yJnf^-R!SD zRo`hEl}EY`9mY+mIm$y4J(?{g3Cq5KMQ%#!x%tB$+I*=TbsYqJ*UG!^j){)9{*(H6 zLK19@Y3wm0u|jMKd(fuwze1NBGr7C`+8n;FqtaZLcbf5B+jQ1>dD2alQfX!#6*qD< z8-kPFBh@pGPLMLSq$z!_R-G_r*wMo}aOy3#WA8OC`syO?PtQBv)sK>^h|j|(VV4}^ zmLjBcz)*2Pn}3pH1t^>H+;1ZZWvY}{WD=T!zP>FVr!Jj6d%Y@i?o`2@D_fGWwKG0U z4<$d$D~fM#(>$vFl`G`4eq0AV?9C7ufh0gsQv5UEnoX7_>cOq;VRT`aIP2_jr`YNJT zS?y8+OR}E`U_-ZEH+ucH=kaSBgYj&TX9#?tJiB0|O?5~25rdV8}I>4`v;Pr#1& zoVpm;txu-ue!MqnDEnO1!#Uq8US?Ug{kO_j$xAbfL|1CRz*9J66Y00D4QW;WZ^UO+ zTBXFqUS^5!QpsN~_>LuR>wDMo3b%?U2sP_7)rKQCCc)gMrBX{<#se>b<7fCv_e`-1 zFgF3A{>+UOcfa-$OwUr@?)Tx&({8Y3`4Sv|>aLl>BB=$Snq!;b< zURz<)g@(P{B|>AG)r6-5goD2W$kVDyAY5j`x*&**3Y<%3!ti;}{@H zaCQOJ4V{s{od+XzTd$tohCfv8eZbqi^i>Hk@*C7^Xf6F^7))JBi zKGZWj<3D4`WZ($+x<88x5;RABCwBJ!A->#Y8wiTXT6X&(P zd^>hE_6c5M$MEyWsm0k{^?EhCez!x-I69}lB8w$n!f6%LcB!D*{BiZ4 zoymyf6&*e3F+_Xbb%H7o7jSzk0KpxI>?rhSEbwpKKMKo)t3F#y==I)2w!an;E+iXioi~it*pJxY<>>Y zguz6i58RDE0sI&G8+JV^jJA-pA2W2LBtwH;-mu4nP&R4dix^-e%Y_k_h`j5oIO=4C z5`Bnuhb$Y_o5e;Y$i_WBH#gahmGf1B=lM!}$GE9t1aT`fZl%`SXRx0!=zP>Y#rJNl zxj(cXpr_%0zMg2+m-JLGd&(I|@G%2B>F#3g>5>S0se+Mpi=W<>Q`z|d?~Di_G{jC+ z5fW!C%QO%o0ug|}DljwqZ60A@N{MkDwiX9x)%S@wuiIV`X9sqK0@U+6C>|#!6sT;3 zZ)kBm4z^mE{+-!ykDo-$Kw|Dulb#lV7!I`?sPm(fJN#%%wZphA0 zM;hnX+(&#aQ%$iY$)7ZP5;e{<_l%73vt_HY!^G3bEdPn<30MWeYqEuEErfC#iGVc6 ziAeQBc2`;dJ@nfQ^m^8dCKVSOEi4ivz!TkY& ze6RI>U+FtL3e7_CJi3fH4R*way6#91xvU<;Mq%JOeOAN!nuVTk^@8RZ_VS-!126hY z<;pckl(&%>D@*&yA0DE*jy&9>y@;2!qCBokLj{##j?0FVDBvy(W>#bs+IExg%@T$@ z1`~O&>$!vt**cs3=n+oXWcJQDp}yJ-z{AI@7}>yFlo6d()4}3xU#RMh3#DkCgoPfW z*b2}F%D8H))YCU=qW}j$LK~d~tRWYVM)AJYZuM_vp2O$UMgo_0kZI9}eX~C%VSVBg zeBCzCS>Tt~UXoh%|6z^OP2m5ElhDrQDnzJc7+%y|Dow{qMDGF34&etEcwHXZV&uws z^>8JTIHUW^10Qk1pnQfoJB%fIVG(|TByyS{C0J;xwi1FN>ZH#P@w1~HoYO%g09x(>2l#u6#jWQ#h z`|QbUVZ-3GF#A426d!@L>H4v)ltOr-1WwMzy*-vAgAQpklw*MyMs`uIJ-hici( z#%jj8`8Vrb+Q+w*HbU?aEpe9m1H9}ch+;dWetII|W1Oh2OXM3M+ApFcNb+lNDMX>~ zhWH>dE&IOF)(s6X;%!*W%Ff|W`Bp67Y!fALTidBd1Yb@8T|n!1gY5nTb;-ycbCrMN zsI{ORtG{zw_rURnMeFUoFT{nJYPYgwkzp%xwYy3JEC&?03)$Uw!dHBv6g$%8(f7Yz z`V_ri*)FL;8bVodSU1}ndC>S&SzT4p;2C~;0DuEb+VI#qQh@@B;_ zIEY4?5#6~PP(i70iLI`17rMP+@-l3uf-XItlw0_uVrK5V2n=< zD>RbFRn;`$;5fwoA&ytc-}Tu+67RADW21JuH=a8dS4{OEx#1^xUkuoIS*KUKMcr7z zu1lQ^Lly1wgC-CC@EkCD0+HBKQg^vOE0x@}ofSVibrkqCAv3|bH>IIBZq0Li9|{2F z35&BNbcXO4P@sy4K^)~-Zs;;xseou-I#(2XMAme&sCK(=9Wb3oy zP47mCJA3QjNgicorZdL^J0BZZMk(xs14%of@k)t}HJQ{gPK1JXj#HlFlTZgJ1`ULz*@hh%ykfNB^Z`XRYGvv9v{1GPUHy&s?m9CNWav=7hJ}$cU4{CZ^aIW~Ck zM6p?Wyv9sBZ6=l7gv;3L3Lh!7Vw)e9vBmn%2pvwhnpC9bwTKy-Fr`DdVyHo|ygtxW z89Gva)iVc{hN1(QAniHn)iWV4GVZ4@ih0g5q(}J zoZZk5LID@4N^h;o=K`M9&>K(G)?Oki>c zx8Df58WR~g`{zLwV0y~{J{j>{$PuhQ;#yc^)}Zz)?UwKV{3>m_t>RBxlW-p|?<-NF zz8#&h6vSLl5vlIfW;)Xn${+x4Wvh=8_=XjhWHq3^gsWJ3Ax0;uyxZAws}K(pY(}lz zGiN53qyDR0&X==DG!U-2LW)w>N}(e7e+F*i*BCL~lJ|(LnW_C6s1Z?zHkf@#*aixWHD)@#fd;@8LzUrs!WYQOs0LwBpsIBn( z$>BaFpU7cUSrzP%avVcM1w@GGiJz*y`s~8}&B7f?KOwe^`E3(P1kv1j=_z7b_@?{t zu8~QvNcyhv6TrSNQ<1_0C&Kuzu~3dU2ZgRE_D{3ZB>mYu=@-dm!CUMho!R4B{49(c z33M8E5U{A~r~#dI4d3`w+QwDo}mzOb-O z+$}-{n}zODaD~TA*Q&nxIvPTMCOX^*`1Co#a~l7BBJqahw-+LM67LITO3;dH-}-*f ztaGZ;HL6!)#H);mTVMJE3Z}>=rrRuM92R%zEG5S-TR=tCR}?Rxc|Q1?H{ysKsml7&4k$R< z3*Sm(s;>Hd>3f{b6liQboWY6aA2d;E?ZTwU(=JH&(#I=XjhF53tnDGl#bG=c&wiGE zyc|vc=CZ!wAECuN--DrUO(k)g{8xa7);-KuH{HPe%4L#80{;={^O$WW0?pCh0dDID z2_@N1vkED%8I#Ips^o{|IQj;^PKBg-^F8oE{*Js(SVAYDkK&V5E}2C#B`AYThtSRvh}J*4YP4MzMRzwr?gwz@Ghk|yhO zHZScR9noRy!yqpI=d$(FRIrV9g3E z_^!VbErQ*53)b4L%VC|TM)PXZCshBierU^1)4rEF^t!@cpisj6IsmPc!$O;cR;F3U zWa)8+olduOa9;?u7irR^B%P9(S6thx%qLB5o}mj#z)+IwM)M*UX|C4T?Tvlmb{y$RPtEs)Q2O&qpqU%OxOb# zB>7RbW{6fDIBj+1+`oBl>xv!U$8&9ve9M2mXMfbOB(=FM`*mCW3vIfZEQ238p?-|$ zhot*d0W7>E!lWi&|Rw+XC^i?xKoXVvMwrFH;@B+C5=!c~a2j;CGQnH$hrvKcKxao+C{6~}J ziZ~rL{U?fbWNUI_7&VFPd)qqj#S8iKCsad)oVQSv5ClRbE(A7cJgVbEoy7m#&4=1>hAVifY;sW_c8cH?|-EO58t5d^8 z-kjdS#1GwT6)~ToQ9U1!cnm4NZ8Z(qnBuz4Sj?SpO;(K2PDSb)4%$+kf`&h{2-Sj6c-eNB4@?r;pm(I+pwipr8?$_{3lp`CpejH={lhYPlcGzqot1 zMBNzXv*5gR<-#y_8&0S<`ckXvVn7TgcN}i!D8IXNWttiF8bzvh8wUdL6aT?am#M~`Ia({G+Lr~p zp;-iq|1n|9%?55l6l=#D^4^FxpkZ5k_UTNJLCznt;*qH|0io zTndLEsaKIi0P5uTJ(n;Yeiy?5#V+zed%&HD$&o5Fy`}OWd(IVl;8tskggRjzQTlsv z+C1;7B1A~KZ+pC_mB8*{iA%490hoim+b|`w+;|Asep9?r1z~U!xC>t|uo5|28;apo zia#dtuC))MM;STL)>qN#N1Y>VyDt0P@X=X$TimDSM^{}aNGv1C_iNsbvr+b>g=BG$ z(o%?C7?_D7Z9P&T2HZ9x6PK`T?r?f{V>Ww5DwzaajX2101xV#aZNFygDi}ADexwJr zmdsUKfLq&_mQ|FEhGN%bxE($Q>e%&tF6XF~34zqv@dtu?1_q9RVs8Yv@C4etVD zi(aU&ipzR@i4)^>Oph+}SwT^BYyV_Xw7b}JJ1XNhhU)s!%{k`~O14YNZfu|0&_|W3 zKg?o&nW+NlbK6=uhRN(S`8)d3z&_VJe%(^YvFOc9js~>{l&DZ?vR!!Rs*kMGZ6!&p zjSS?{5IDv@7&+K=b==<&@SR+Z3CDF*1fm`p&Hmofy}5x%EJA|5Ogf@C@_nnCth~&yCjmeOv`S`~qKH&%^l8#JNy!Km zPN{wE#?!|wqjNRU63yR1B?Oa*`kFy$VY|kgr?|$<{>`UN(pQC|M~nP@&seb;G?ZCs zFbXcxc`(UX-`O6YU-WV8Dnk32$<;LNm0;P%ooU+rb?%=Gekj46LrINXbCee%#DBxL z_BSTszqkPZ8?32IY0QCGE6}#HsTlP%@HM!u+%##pZpU?C4D{-MtrtEJskMg?!XV`?pjA;HwjkS4H|cbX&xQ*L0HP*&o6Bx5!aVcH) zP_pN?D%u>3&mK^!W${9=o;_nQjwK5$fkpaWyIQm@WgH* zYStvVjA~KrTBH8G)H4&*3l)v=i1jN)YPhjD*-CwN!yi}|#5r;({d}fdl&r3TqrLTs z=%v6>Q-m!@H-=e#>1M)}q=DP&&vz4~Z~d$zHqrD6n-UJCp;y(a5I(wYJ&GsQo>X-F zI^%e(9!@xv1=$;{R8wnrE5a;av_;p^+ZdQ9`S2ySq&!|cP~Tdl)gpGizJ&DGuX@K9 zI?8c5bqgbtAmH2)yY)VnAUgqyFTAyyM+IA$5M)ylA4$l6C4R6{jhvcXQol0MkIJH& zP@d9{76m0Ot-kfU%h~)d{AS6vlOZ+{Tif~$=j};@eQQBz_U*m#avg(lo0+$&tMr$f zgEXWnY1X8ae3F(j27nY0&UmF+GNb7F`TA;0<6hF{*t{y3I9nHSJlS5k+y0lqJ#JS( z2Vh*es0=+5T-ku*Rx8h7QnT6w@R9$%L2@mqx6?p+p@XwtD)a{jaXnEuuU@6=c2y{HAuqPUP!d*YWrxtd-A@j z`47{x0o--LphH^60LJmeL~4i5t3#%h-TrCo8!lJMU-3HZ0TDu+D&33r>yRx^r60)b zPx)_$kdIa2e73z8Hzj?8*^kd6)ILa8FJN(T zl17)2%r6;7qn>@57Lgi@3}v-X z!~pEFB9<@+q{&E0LJPz@0y?;*WJjMR)}OYn=xfY&zoovgc21zOVlzkx8fxu901~p=IGEflT+ZsherWU12p~Z?CM9x6f)!+bU z6cj-sW5_0@vx(QoQy0a{zw4sfEMxBBFY%V4nN5qt)t3$nABF(P4Ca;V+EQ0aUz;U+ z*LY%}>us++6C1tl0n5Da2B*QQv4GD?@JerrgL+z~Y<>S^>u=O52tm#4C`y35;Q7!H z^&z>111SD7sD?IU`m0R(ewsIDu0Ej)n?3lTGZ`~ynl*$P3{_0SgVZY8%=n$M12M;d zpAMRh5%<*Lislf3!vJZcWv3F|ukG7Ds z*(P7?WIXGp3vkKpK*1t1BfYT9s*10}I5WRNhnubGzA}B^VwJzD`=GOAbpsP{8TToV zKBam=55U(3lZtSTGHyqyKG$@9!}&=}!#^BTltqVJ7^Jra0V zv>KwC7Luk}xdXU|AcGgRVYP81@E=0q`Xe&g20CYU<=`GWl|G%XjhbYyNe~h5=uv6q z5Xix;{7QT&F>hzQZMQTptm{jddvU+>H^*-vT&Kz!Qz0o@|MyL!z!xA*QekmY#hOFi z3qYI+TEhOcQ+sH|Hc3YTY6c0;Z7@O8YxNP3REvF7a=gq16;yTe?Z?@|CCm9$UN7AF zrm*}w3L75PRO;~ZmgG768DvjN`cz#jdr*92XG2QThO$L`!$k%(_(`F|`6@P}i!nlc zd%)&WY7V?lr=&8h&*W_<$X~7B^J`LixG_l%+^1K9@W#2XZ`_PG?M&}&3E$1BNyhOt z{Qd!RyPtD&G;TyhSEY5V@`qAiOe%n=gpV6z@MwRJlc%gEMj)sL? zm;UChF5b|teJ}pF>qJne$_u+4{SNL()m^Z257dg&JC0s67Za)Lst4y+x&QnxQ6wsU zRG7Ck>$UteXo)%)ngikuuoPfkVX_IDHSmF28eQ$X(qD#R7c@qUO%=C2t;0AQNwi6c zW*3_q_xA0$5w)QtN%F*+8pD_5r)3@Q0I8)`d@SGPeMCNv_R%_8u7m##UV{Md&I=5 zW|qc?p?OarfL0Al~OB=|I`s z?3Z(Sx~t-vvmH*yylk$V>NzIZcar<1cVC~kq3m~FY3YR54|juGhrHwF1VD$_C!eo2 z=P}RMs4mvhXt#9bnBFqOm4;Ei+(-yH)ACu!Jby6sujXjVtSy=$|5?$=RHpp3EgXGYSJ`amrgEMG#xf)lf1e7Fu?%F+Tl_CwI zc2x9v@>!Bv9(UU7;iq)kq;BS#D#9atmwB2e27`5^az_Z(c-pK^9^p-8Unv_G4sv0-F?q(;;-%IdAG@Anr;%6eK z`M&Q|&o&@le9^|H-lWH!Qqe#1F*)89&{y;N3QnYEk~u5c;v4y8`jP|s8QD&wt7~#! zBtqgBnotph1y~2QS<_A}VFSSiMAj*$ScB!|cEhw;`^^t_L6A60*;&+Z%VyE4O+`Dl zSh`z2jH8W&>%I&SU9q2%#EnXvR3tY1D4ozfTI8K-etjyAn2|YtcL$(Xe8_~at+ViJ z5NV6&l`&LDZPux$AGM%9*;w&HXyT+1kYd256jCRq*J9m{2_FSLEDvqir(lKSg}UZQf1 zZkAG&%ju4srlfDyRe}K8DD0CZVLs}wG?}?~>avAVB1+a{?ScuhSNrGVWCWG4*2rIc zD??euFRedAA46A+@^e`op6SXT&l&K`9{pG;6VaMi45*Ed_ zV01E>G#nDC(#g9DFnTpVvVqcAL>CIOTIj3Erz7Qm&HVGKHYd=>G=E!RWfvD@7(X0UB$ve1* zQq=BUWVgk)izZKjp6Me|C^ z1^sn(G``s+*nYkFN(*s$7>z-+Z~wAwGYLGbII2&rZnJnu3b{2;-qhUMOT`pqveItL z&hKuyt`-QgPLm#^*!-U%z-dwR4EA@^S%YAEN&iY_D!LXrS(RU_HM`atu%hCD-{qGef|*QO0?PXxt$bRiId7oR$#imh`AdQ`c9hq=V+m z38Wl}z51O$Ls~oQh6tyW_@}BHI>%dBI}DrzgFk^iXyN^9e;f%lZToZ>qSQHXlG6;V zC)Bu=Mlhr_$@|tk<%w#(78F~(=~ol&sELn}9<3hrf7cFbob2s*GLzac0%X+Xr`6J) zAve*w6Lgp+In?PPD!ZB;u0x5~#1BNz8P3!IZbobn21?cm0{*X+z#GjtJQ>Ha8LQqG z(%LLV%M4ZRqjgIm$!qdwzZQf@Q7hv~%tzI0*4960nd{^q6ixu*3sV=pxJaBb_$s7Q z2IE9avn%O87grxx4pmG|lda&VMh~5V8jSN+D9`H0X0Bx4@IH!4)2&V@i4^@o^&n~- zdI6gTU1&xoZTO)D2m;(%*UwdByd+fq`SnG|h#y=VdzZGh_+RirlQoP^gFMRinR-B7 zLGl@G=FzMe%zaF#)KO>MlE#BLKarVc_wl}ra(%>0u87y{L~F+%|xcLA?`y@a7F zUt$I!Magi!=WYJqN3`f|wk<*`eB-JS$)zzZbnVmPkqA4M;vF$9MYypv^+t(CDM$xo zi(XT`S=Rureuv+CC@g9Y{NGZaqWu+KvH~=9W;v{HFBcNiNNAnYYHJh1MosFSXqWl<_%OUNz)(;-2)H~t z|LJVn4&KQs{zsr2U86q1q+_#d=DTFQ{=*N3H03BRZMbqF`9Zwuzcus!J?ZIMrlv; zp6=$QI=&^oBtlYfxf`|gtAbe=vXhKn-7=e#ljKP|x?#Y_s}F866f$w}1NQL`i(pXr*2>YIrG$jr}g-}*e~m*@i=03>}_X|V56uHt|2v&%Ky&Sk_3?Rf}Uo= zyqkDi%A=DEf>AxP(u>&Tdiv)5p1|xq97F#icEm|DU>a7o|LPgzj4kT>gq@#HMZ$bjBfDK~GlehNq?iNlKfPHQorhD?*BvxD;%69sm0y44f)eNxD$n zQUP;={7%KezjkNJz8iiuA}-f~GX%vs)=GOW`44>EMvUjU>#fxogQOc@7MCT9Y0FNs z%e_XqGW__Ty`-*x;i^GYcLCF@OD5+u9G5l{)RT=!cP0*AqMJg}jVZX;&-oKuf1!uF zzLWXEnQX5yK@zvARX>-iZ+pf(3dqp57w^jaY@8fvg z<&8H;h;O4__3ANJ{tOJE)+@zjVN&H=#Qz`+CltrIc>Xudk z)${<>iS;jAkwu%pi>R&!rO)yFp0h*^FJreWKSLVN9J_Po&^LQwE^>?>)7@q|bF?hI zo*x$J(TgHQr7YY~dP3L=+0~fH4cHC^N>E6a^6-knYY)Q9fm z-%d&*4oRe{`P@2ZS>(63m84ZgnT8vlF&=zBKj#dY6#|%iqUP?V3920kbyj)_i40h z+@FlkjM~MpmeK3F>XTz4W#7yjQ>@&X&s8(}zS%WL!6j&MIkM;oRZhM9o?`ssSo=t) zPTr!Bm)i7w&ND(UNMW}0-P8F=LPaeh6TC^h23D;EOR z;3*orO*FqnomY#UY%3vD{J){wjm^-K3Tx-h$B$l#xk1J-xVQg3U%{~ay|1qodR6S9 zzbsHDDb^-Xv0BztGx)ygGHRk77B7|+y_yDH;^F1j);`8QfrYs0zLC1|&Z1>)ZLATL$oAzPa@H>i< zR@&RClJ}oe77k|$1@b!EbSqe^QfuSm&55W8P0E_&vQ7*9%BJzR$YAw>V0=hh`lAu< zI)}Et6v94LqkAdZ8i`o2sGR8I`y^X`|8VU z%PIk|Z0`s4dE8W^(B1h<(?6jZ3U2fIUI)?ztty};ceLKBq<#oyg4V06fY?rAEG^ITWgfI6#P@LY(xqmbpkL_f7_ZW z-y%hEdi4F$8uXY^aT1|zZXH{vD7UWYfr`P-XW6*Pplge%X9D7vF5y85j9|^vO34&^ zrCyA?R_&QZXV#4>7k_E1StL#p$GXCsTzur5MxQ=n1PQ+er7YLRsWigeDJy20zE*1S z!b_>v5Vs#kZmb-bZM=h%o+&0p#0U6(-x%4yrN;I`rD$xi;N$oZhqr4Sc1-nCZP%I&``=>*f8ONNT;jeKsEmjy~<{9G2pg( z)ag0yPu@L;z)UXHf7MmCqb%$sxSiKfp=QLD=<^=Vk31x(?-{Qhy%P6jAPjHPlJGwY zC%SoEHOHE+LX5hpfV|_a6{T16o++1$cN@#lRC->s*>ifl>XQ(~-wlzgvNw~A&<5wq z#iAtQs;W&$0RB0*ZffC)kMKJ_bom)ULx)xJ+9@y+g?29jNho$#m%y3qqT zqjcj2&ES6Wks{+4sgzs&7z*IoiUjVYuugxP@2Cs))Iq0YQ0S}riqj#rFJEKw$L?9Q zjzeqmSTb`YVucnUZ1bQn#LGxsocqa zQH<)x^H^2@YmgM?O&Ys@sr~Aa>!u3>vy{&Dl#G%G&kZyCPq(Ac4_^t#oP|)%CdjIM zAhk+*!~>x^uC@(#JU2U<8D7{aAb^zJyN^oOk2#dG&2k=zvSKTISPCVldihzznfTSW zlhBE-!Io+q{>w79`wS9HjQ=rhsRbKDGG`OF{fm-UyxS1bMfF6H4D_U+63#`o#<1$TUNTuB|{H8wcRrxDTWS(P7X*sMVwM6{OVG~k%PE@2zJ*j2)V5O%~s7tA0UpT;PT}CKU z!0swgl?E*Vd1cY|bcUC;OIuTDG&ErjDR>&fg&r>JjyC28U#L7B{&S;6@V`ktr_b$j zCaJd0uKaR`iz5gJ=iuX)fFakl?pfUip=rPVC#T4EmqQ=43_g!uwAaNS4Z$4vs<1(< zi-U<1(1!(b`uRoJ5^8Wq34 zUL_yb2|Yk2KjSOPmKD?;YDwL;h4t)2!iwHFz9OzWQ*&TlJPK(G`oxN~RH500PB1|&70{9@#jHH=y00DBh-0?6W|8vnNEZDX!U?s)9gna0 z&JKArcp%iO81_(%Zil2uO%Y-{AMweX?N4Q!iqVj)nO(f}?%N9ba63vgyr*T$>H2RQ zhkV*lTzFkE4w@lR%sXt!9NMP#K3*8DtXcRf!%$&OhY|O!vGs(~+KZ5Q;oI++C1cTO z@RMxC8LG?*Kbp{~^7|MdMYcR7d*{Dy+TE`=lT zKX$ch5S-R&-O9dMq{Xx8+gMVZoD%p2-=jp#PsuD`G`+S(6C7KPmMX^SH(j78b>We0 zur1p9(tzSF<{EzAqIEr$6$68LTwmQ$c=C`cF>4Ra&wfqfKOXcQ^q#lz+AiXi zautMo$2RlWd%;x2UkQ8Tfk~<4bTJAeD(+rzOnF79k}%9>z+xaz0rB2 z(87WLUJ}p$)xgRxpHuWt9_;WZ9VdpJS0Jyw9fu<3r7!tQ-z#C>@@Mf&e^@@GW<LQeM&!1~g znUB5icFFTK>oMwI@(uc9twJnKkn-gQWCPf{& zLGX&qo&j~yxgA2NhNql;U!{Cf0VTT#$+D{y!p3)rRIfs8kap3$(d{{oBypV5`?4-h z<~W)V^dx>MB^QMbyG&V3653C%?(!5!BZb?1-RO*7;fwW)^^1eu7`6`;V}c9vO9F0M#xjg-7h5Z&at82kMtS74|`A8ygrxjuvMT)xY@aHD#$HYEnXFBhP%=?{UZ5e1bBnht>18;aN!cX6Pv=WgAJ(C;|SGmS8vg9!8b&MPqXYPId}L=K8>H z%rI(trn=M3DK(}(T&sAbvf%FL1^rw6IS>FC9GL2IrdV;D>IOIHvp7iD>}@DX(mku- zvbW~nyCAb~R@m*7=-Y2mdvP!J5a%&BOuYY!(cZktKV~VZ-%406j=iZBRv`RY^}7SsiYq+?a&_tK>>Z;5b_bVo^*Ca5x zMzLUYn>WchL|l0cjdn^23tuRu;fW;O_u~GP zo`<#+y>(#@XT&U2AmH=3Ff$pGE_dXK-P4+$5UaCKR z3jHi(8ySE~f6%bq`}hy9asqK@;k zE~C)bm+)hm$o8t=tWD>CW>-$?*9priEWTCp2OO-c;+M6}MW8^&oj3$3{}j^X5ZG09 zUaK)UOlr9$DbOet?qh|bu`rk*INm-6Vx-aJlh1_1f-(}DN$LKo*EGb2KS7H-;-yJj zOQyBRrtzvf;+{wD-P!vke0RK7Z?)){^0OdD2P`1(P!&!06-xQFs_D7J?Ft4i75}u} zOp}=uROMv9s9JaB3~6wZZB5&VArqFm9WF&DTnU^{6h*m4+FCurs@f*Xg_Ul-EpwbYd4XE}H$S zjqO-yDCP#Fi2s0rXP~7c4mBqFRW5|}Srsv1cBO2mN-;Q1SZ{)bN{%(RzZEoQ6mhdn zfL)C!p7FidAvjTc+2=SA4K_u(AM~(&K&TB25ILB9X{X$l*43}aiDc2{avVm@h`)Jg zWi=qL*+}5;II(LsDad&(ayUJpt1C0rWetc#t%#<#owZkQz!n`%dg?Fibub8K?RrCP zw$uE+uOw@H=FvKDqKqPC-vYes zd70Dpq7nj(_`7D<^m8>UhvL@CUIO0@+OF~rlS7iEBK6aD>hWNw#dhY0 zcsxOMS!cOHAIKtbwjOUzr+TmR=9Mt7#!C+6w=diu$?<&|>bum-4l(s=J*fS-4Y5z zqp4;`W3H76a4(XKfr;O&W#Aq&*=m0P{w3JYPO&5Z>ySt8rCFyTXlZYwxxH4@tGd$q zjfNXK_{{#t-qJ4@`$~V^bwOd;bF8yoc==!)yzKjC+$uaE8tycF&ZNavFV}fBxfrdy z@{e=G>k_F}9ZzwwS9W8GB+)A3ZB{x+DaFVZCa*0_tCxJlHOx;8T*a*E2~!eSao2l! zpWEVqI2WS4Z^^^A&-QcfUF^6PD|wn%O}==2u7f~LQK?GhAXAb!w$ax$9D%tW%SrRn zYr#pYkGiSJCs8)*n!iP3{)HR4YQMhSyfZ%w5HBa`&F`Hu`$}S@9DY?7DSP$Z<~@~1 zB-C2Q@tV`Ly<1vJ_)*IDUo&06r@}XkPfpb>FQvZ0#Vh@}p|L4TNNguIdGanj?#Eau zm8ZCuSPV2x%L@htCnPPg;{N65A!aveUfg-&2cNmCMx{d0GGuns*9sh%I@JaxsY|GTu=S4_*2DXf|oVx z2qa@cQf%>hbtjm#H#ck0{hp}n_uX-yn$y(&_lS8{qMDKoQ)hDZO$xxTq`s7QWny_pAwGjzw`j6!pQ^Z*}cn;c;i~gv3WGe@uC3s5-dr+0&8gs?oRa zTfs5jbJ#fgW+J64nl&ao3FY|7?ja`@ zhu2o@*1k1yrgR5fQ&ZOVK^2evMcc-}bBpO*AE8MP)NUU8^x%}OB>A6>X+d}lrfa{Nc-svm`|fSpU_1NS3|Ygp_DO~P($nY2Fbx!tFUw`E{{Q-qf>(%IwpM< z5WiTEvRD{FwS_Oa=g81*HNPCfjh@0$Fcy73E`a*>H6h<$WK|`v6Bmd)yO(8@m03`K z%gcmjmcQM~echT{h_zP1e4EYZx>J+ApFY`Xb$#*$LMX#45=mtsHNJe`t*KT)9mfKD zC!tyFmfaVziTan{V8hqchlr^yV``P2u!od|(j@&?x_%0ihLBm%bp~yiX;BZHRK8hW z`z!bjJg}^C`lp14Xb@HuNn&+S<+vjzn*wYLDw+fNxBak|4H9!$OG|aHm!e3Tc5U(H z-RP*QhCEoSL$awI)zEVEvofDrtmgLGR>*9(hLIq?l~M4zbjlQL-h_mT?zwM9W=#(ZhY zf5W_>FU}sWBh*rtw~b~iDQ`-11;zTP2#chzEXYKpQHk;o!Z8a>J#enx1c60oRySc7^kj<7M~Y-@j6a0MbM{CkIjw zk;FV$AjdKEE1Fxn|M>)S6?LkKWa*QvQ5W(>_^DjAN^50~5o>#lkF{|aHuS^!Swd5z z4d8c6>6O;W68ZzW&8i_?&EQ z{IK|e?ce?xuYi5ZRgS#Z@%c&*0X3tn@(z8v;=H)ZDQK>AUT5p;vq;G9twV1vx--|j zddv8GCTPuD{!&r{f4dRRbPZa$uonJ#ST5`%UBma|_o$}^e6hZ#Lz!*Q#iq%qXOr4W zW64)uQaAqZkZ-mAz3q_G)IYf{OC1({CS@E?49pd^Y$25?{f2{F14ZQ(`6q&Brr)yi z#egr}D=KLinlXWUPP=5ZabAVF%?|ijwy9Ss?fu4me{ni7xKXT&fv(I+O+7y{`@C{Ca(N;mzjV+)o{R$ z2Mhi%M3x<~D3=Ej^{uDg$g-{$CkfU@#ch&a$*=L;1Pd)#E}|JLQX#3Q)x2+F#|y?i zp7c!uKq*#gh8m&qE3)!JYvgtH!@kx?fT2d@CUMf>cBND|KxA}&o4b`;Fe4mNIbtoP zVqb6hD&I;zsn?J$-2MqKh}4&BPQNMzgs3)| z!?nbm`$DYUMl-zKvsay(XK9t3>w9xxmbdN4cDuRF?>t}5|GMCM zT}3R|V)4!e$!j;v(0+a`WkfuHfK(-yydV3J|4}Gq~ws@=?)8g z!8_N3(dqf;@l=oH?J4B=knC3*OB!g1`|--9bOWau-oMBo;H#)y=}%kCAd5leh>A=u zjYtWYH6B}g(TgI?n{)JYq>tN9O;u-s6wb-2L+rK)m43S93}}6ItXkelN-;QS<1n0> zb+;_BE&_s0QaEA5{E}y!u3WStD;LAQBG#dxXe+DpAOCSa-Drl0i9_JQr zd46)zvT?4;4^ux}YP z^WgZA(eji;<5c4bOX)CWw;?w9pKLOW zqJ~`XX9PspLLEPOVC=3Y(YD!3mCtZ&m9pyKsKE2GT*f>0UVQ!xtM6 zNRrkEI#rC|ZBMcKjeXh%Gq~A6@+Z!ZGNjZ?IBv$gtiu!v$yUP0b;(Ou&d2)Vxms3{pHeC6fat2(>WO0ZP@& zE-GLtn2i@24<|Aw(kCZ)uh;Wk<8I04&3Hss_@q|N{}G`FUif(Kwe9(-i_e(hT*KP* zk4GQxVi5$M{W}e~O)e z?VILvJAb?datzIl{jGC!{leQdFmH{aeOqh0GIu+6k_Yhn``?zkV`BgL_{rXquXxir z9+f^lJbpC)JZCL!ywvHJj$cbmJG>^J{-U4e;=eb%_nh}1{o~P>{p&pE2H?>*_7OUO z<7Y=6gY-)cL*&`t<#{agPAvu4pxAAV*;B!(PLC_V$yO7vP^+}-bI{zkbfj&me zjs2~2v~h0Nz`PlQeOqhG{WtB#-^T!ce_y*xr!JCH@#cS@xLEr1@c7aEiyU}p z{{QyQWv7iGh@#WRY@$T6galrNMZ81s|DP9E)jhY{FbpwKlm#8B73`XR0&%MPK3L0E ztgk2Q39|+;+eU*kk0(7Cb8!6V0uYba_N8k*ueQ$LIWNxNlk?YT2IjrF;_-T|KVxJJ z&pvWlaR=b|N1kn+L3s16_7J}Yco|sV@1e)z^=khs=1-r(;kPgM@X);!@chHiAkX7r z&@o);AM1Y9y3sVC7J*KIH465-t=KK=`Ghy%Y+tQ4IP>zP2V)M7ziZ}KJYEmJbkF3~ z=={}P^eOM9tr>XEgS!skX|+FNeA5Rh^RYhS@j7#O=?ub~M=K!nYIzxSeZV`%6Q{7! z|El@pea+d-y}#>T3iABJ&j3$B>lm)}mu?}o5cvljICJ8vhit{}SkEWC0cZPa4bFVm zxfjMh3{l2|^z;(}^_vVW0Lhwz0#)uf6edMyL`0wHP#|!HW ziZ|cT3gB*D{CMZxioZw}_)Y(7=I?0d&b?1wg1i*u`G=oDormJ~@q5)@x`n+KqI2AF zUW!*eWGm+Njl1Mmw#e{tO3s1sm~ z1+8tz*W;MdX80&(kB3=8^lX zxihZY^#DuL3qXHy+~24ZfCfN6%ae5s853=Wk7CTT zpEZElwp#tCwRrW?-?N5aep17;m#&?${=(@G0N{Hr*Nov;&YNEg=T6RQJ$pT$`S7=W z_a*>`Z~wr;zMG3*_ux{r`IY%Ik0b+x-7_|5vQdKJl~7_O`*h2jiZ3`>{1+*N;74H>O=4 z0Zn}(e+B!VIrdSXPq`O z07gFY`XN_+#t1GXqL2m5Z#05I~E`)95S=bw4< zechFh+=1v*wFl`F#2;x6qO}hm08W7U3%*A$p8?ZAC&VNrfFN6>?Z2bh2`mG&v+;OU}nR zWe#OAGYqpM&+PE?`Tkzt-|M%3_Wbkwalfzox$gIUUDrFt?X=^@b=vEeEnBwnq?5hJ zvSllm9#<|~vwG=|xWhPd*|MF>PTC(k8~*N3wRaNx@XNgu%d`v*V8R~FF z2G5gw>F;JLZ0}Rry-t4Gcg}dU&U#M~C@V4nv?(k-uFdUtw`+>e!gQ>gZQok_!qz7)IrIxhUw>We@m(vOjk+f9WpFs0+qyiqvJqHVv&+pWdl9<>`qX)i z^rG{1I|9~os6MX) zDo*mqco(X72xXTPRRw7bQG96fOrlRXfk>tA&=Y)qA_|3?V&(>Zl0267j0-6qfF2qUk@Wm3T!|)RR>OH^aB^Z|y;zjJ>Wz zRc#+A7^9DR4-O?_GP(*qC|6_w(-CgW}LXT(jI-f`dd z6U2Nw=0VU7J!u)vm?4;8^d%||zd?hoXy;+KQ&?wzo zPLCzOv9*fmi+XC=1mVpn^NU8;tYXm zYvmD%bMGKijreUWe?V_MbgaDD{|eG^G~SPr2a0P<3wDP)j+p> zDHVMZ9@`i?jN!NTFoSO?9Y<5o1wW8kiR&hSnKNu;?_kh8Zqycv-vnR*yB6;f|0Dus zSU8~xm!)&nCV^jAxYH8Qh^*xEoRQsb5nL_bvc~q2=(`90TG6uqS;8y~gE^rcbvO3; zL7fn|h36gYGNWp__I8{d@To?gBr>V2fHzs;9^D8Sl1ug;Doif_}?u zsuZa_${-UnHXj$Zx-85+I-uk!Gm808wi$lmxxmk*p)Ip2J#U0JJDV_`>hFA2Y2k_@ ziN=H#uhG=y>p!{?@R$9-zuxG66CSZ_^0g+PoU(k@*&M54Xp@%=bq^e~(;*t^kES}d ziys9j0E3oR4@S}w7yMVfB$e0F^(~l<`0O+h@=URq-AU^xncDf}=)hOiQ|WgJrRAHC z*YfTXc8Sn|yu4r@p|p_!Q9AXQcbT8E@VqF&0+WpmTTFB=VDxxHHL0_vZBIeBApSFl5ev+}59?m-7{^GdULgDO1 zy=vvYWkZ1zMBXTiU6xJHB;Qp27U@&w1*$bNL*yVXjl)^Ag6yW1kE8e1monak`VzCR z^^jrM&T01s%jDcRU!&}OtQ(EZ36@^6RFR4B&qQWy<7jHf=5_VoHE+H_WLCKtZ6pTJ z(&#bAL-D!DImc3_?(^3mcl4vCj?~TcRw&U-xU0`*f*imL2xf55-oP?i0HP!p@lSJ7 zIKdDUvXM@RK8hCoj$#(`f-V#MsVf24107-ZIZ7W}Oz@)P;)JM@Un~9j{e_P?>q07h ztCZlfI6sOI2deQy`YvakOMey(E6ow!uBuH|zi}xFQkrXfB zJGU+tTDE9zA8+LLM1dfL7b?0tFXk=A@6lSn_1EpqcV&v9;6N&hJEQ~b-N$h~shtx( zkwlJe(Bjr2x)jaWxYs`KB#SN|Ump647(U~yZZh;X=Q`{I>F!6XQ)kCtPcYDi&JPvd$SQ%mOIr>@@jh0=Uk6m5Q)J@Y zXH-Tr8%QS*-H{5H?C&CPK!s)JCeq_D1Rph+Y4%X%c%;N@MrZ6Vz)*{L3~O0P2@L`{ zA-Giy1+Bm1ECWDqMz>;+S6!C6?bEvcZZl{ZB zU@GB>(N|N6o~!TWp6!ePrAS7LW1Bm0zk75n%<{(wPCh+c8R2_D!KxoPs{9$y9CfO+9yDM}S z*TYu#>ZD3{@QpzxD6g~yJxS)wqvQ6o>07*TJp!5q;cN$v+(0UGtTW;JKWQ!(9D=;T z2Wk}b6np?;XRS@Ox>Gq^XPTN}hMi#80GVsl&-|I8OKg}533nGXb z-ojpNnl{Sbkp}{uAUW@ ztNr>k?bQvnTT9d$`+Ym^$n`|cmhIqYe`=#GgwHki+7cTfmxwFX-*t!6S7$Zq@Fe>e z+GIg8r-*-Y@-M`!^_7{ck67A!r!|zjZ_Ff;)Eqonl!3@)vW@I|^UXViAO`XAO0Um43uT$)=$yof-;n(- zdh3RQ64iBsjcSYf8RJ(yhw1aqLnUL5V>~sVcr5mtZX$Uss;S{;CLx4y3#76>G)^EG zJyQ;zC@+8<9S(qi_YRjqOyFw?7R2IFoiDuj|5_6-sy$(U+(aS2u{L>BoR0r{gJ^|F zJcBTl+?ZM0HDjIe2dex%s@78b30loB?<1q|na!F&>1h79+)fjK-}JqgS13-+0j)p7 z`%Mn7Hb79Q3*BNzN95G}8dI(w8xxEy^d1W>kVo)!go}yNxfBj$2IE5TSV9DhZf#8D z6pHw)M#$ZcZN5*^1Rl!{RbRdM%fT=)-gC}$r`2iucFbS-XuKNH$MgBmQn%RV8u1+h zq2Mgd)iApPLSdNJbIYV))$ed0=a5T^b#5(+lg4OLnn_*%ZihHT@ z=tY?~t@#|=mA)~%U&~FGCL8pbaw7+`X)M*TN1|&#OTi2V zCVOf5ZS)BnY z$vQ!li9g*lHe2&E>RIz?Q=$QFv(x_%rWrUi?h0{Ea&#azx}8btr_6!khyg_VYb_ua z`8uf2YPNagYP36{0QG<{_VMaJciPCv*VnYIejt@e-ez(}cwnjrsrf|2sMVBZR(`f) zVwgJgJ&e%Fti%{R>mV1QjuKzW!m+(qaCQ8(qbhyt^C($_vM2z15mLg*bub$a*wlMnAI!=oezDE`(()qz^50%{#b8py+RTzzktT{X_eV%gg%0o&RF) zR%O|npE7R`Eh*Whsx+J&cw)l9R-@hmiOjv8!NLD56hhmc$q{>oFk4XfyrhqYqKq#9 zxG$?utt5ZD$w>9s2fk*MJ-ZiEjViE>mb6>V^=MfmTD;}S&!RKFC#=6}M3iL({uUo^ z-J*?2h-+oJ%#ma}{90FD*C84TG=O9Wdtd1GZ3a;q7bfFb(n0GlBthK+ zL`rp#02_|^@G=HP=U`x6{p2}JY2#^B!@}fSrX@cOvGH>~%smr&h@ievxT+;dt|Hvd zbseM_ASMykjU9xl5Zl|YC}RdUt<{GRX2|{MK3;%gpGwh%cCZ@?g}WiZu6d7W;V05c z@Kk{O&Yh!@~?YN2!jL%qlF=8v5R0)U^z2*P#U z`rtO66ZrxJ9HHP(nI)s&vvx2RdzV;bq&5n&M-9Ma_sCUD7-eqPS6}-OYin()M?BFU z!OR*H%{jG-Jz_p;89`eW1@jM#A54}a(g zU2MD(o+7NEUanQmc^PUl@kWpGc7O68s?jTQ{5gVvTA`{m@OuRY8=)!ph(si(edJok z_Eq`{^XtQpSHq7sD;v>|osGmZJ6?6i-w*1Nc(~a9z zJ=!->pQ#ZaD8Fy?tZdtc;P77}Xtp`@Y&fjq_C`bd`-fUyZ21eb?JjP1PqKUdl?od- zn^YGJj>C76U+v8ZS043CpXBqu65bbaZz6Ygr`I;Tt$HwqKIi`neB)|m{EWcqlWoqT z>KkaPc%*pi^Ix|C#gEf*_b|8{?9@Z`X#o|pGQTaszM(lr`fn&EO2L%{hqy$iCbW-e zA%1VyZAgI2 zKe_6iM(h(Sbwc@0&RdUX0YF49df})^-A7Ze4$kw;+38&l8Ge(~n(StwyHO7DhUDV_ z6I?zIr22i-^^FhH1udirshQ?e5!4PbBRnOejdYf`{O#3&=T;x;_vJWtppWPAOQ#H1 z@?RZ0$o{<*)(bgETxmwWmO+(e9!_aNKg+^*KG<;!RA03VW%M+~BVgF4Ws)EBg%b4T zatG%@renrTLCWz6lwtivOD~o2R@6Iq%UW(tRi=@o-Vg{*9w; zQxIJWUptN@yg$rc`;^eo*&-{818a0azD2>madQ%!Vp2?oPySt@X1sAX>NnzTwSoV$3I&iJ`O8ZC?zfj-Ak+& z6l+Cb$eNpX&yvoQ=dDZ2FR;|Bv&=KUc zjUn?D?>rp$#N&<36wT50|Acx9wi@n|*d9Xrud^2`JX)lluZxg@NLQ9z{w3H50+gw( zz0AN|>Yo(@uP?qWq^SP5bf7?<;vt777ZZ+vM10&JRX3ip*@C}=%p4m}IY>R+s1aq? zg6rH=y)#~mv)t_o{$Wzm?2^BX?Da{S0he7IZi#LakUJcOSd!n}Y zqE^s5klE3F*WIq%S*Upk93_|orV#rh4MwpaK3=_;g{y+6I!XmCT=(=S>90l&);HC; zKGfI{AqDisv3E*`{da&A`RMwt=y4wj*ooDeC}vPj`G}FEN_ps{9GWtYyX=5 zk``5Qz49N?X7SE+b0%*Maid%d2@;)474DcUxe0L87QgF5{$WtE?gcw+-NI0l_eaP~ zeTHKtdaAKD8WKag3r`NVL{H4OCCb8qV+FzcHz?GIH48VJqt*zvPs}?JN(IJ=?;*op zN}O|*9k%)eEdUxo8V0X}M@~Kl40wN>00PN0Po``T$ zqF|$JRonR~vz&-)6f3d@(^l>!mqM-;#W#HKN34oXyyg(gyJz`0lA`h5%YhNq#v++fTlmY1;`gMSZ~Uy3S`a6=jJK z!I^L6DH?mv4qk|gi2{x09@I;1Cyqe2DCH%nrSrO}k9)$>rWd~NcR2)6NE6Y=m^;y9jjbT5c++g8lBvYoboHiSp=}ud*C)pVL`BkT zh+%C+^mW+ypm7_yq}qSe6r%?su%uO`(Y@1Ufbq50pscES)idrqEpeTgLv|(BVn)u( zGh}vau2JbiN1(sroQT&1-e!w2w0WI4NVP%$G$ZNI{r5#*fn}^S- ziQC`WeRb~(@b(Q6w>PSnYa>ZtuRn@6O&i47m^_X4Ikjg;13HoZmw^sTt3B?!0Yuza ze(Lz1t=0Qmcf}QqrEWZsy+dywg&}&Brv6~m;*MC$`4X{-RGj|IC{@sBS_fY3rIBLY za2loUFqMZl7X?fCW0BGnZoH^n@;30Gyr5S1cFi#%bMvouL6iM^M1YoaAUcoiko%mP zEsM_Uu^db-1wF6E9Z^0Oiib5m?dFt^CLU25Qr9kO0dF;fo!7?0G}DmXwl8V16^Ey5 zTU6iBcHtctl0-piG6#vXtQII;Xk-nhtCSB$y`#6Pg2#1PspI5sFsTk5tI!kulLw&R zR4vSnW>%eUb*zqCgt`5|vBp$C2an;RYv|UMipS!5ci>6UuYa3-FP7J~P_|GjeJ#iUdcsMXPvUO+UZ{<)z9e%zBqh{s2ym%HW@ zFdhF0RKGfan(tAkmSm5-%Qz&H)NhahBU$GW*VZs=-w#8i+LgG$$ z#ql}bMJ<8X`CYY9IPYtPq|+X&g{|U56yVZZ$aTrQKCl}W{^u7$a&k$IF2!$BSVT0z z3%(CWQ|KR+-hGW&_V?eMt@4_T3mTIFAp0yynRqP!J#$bsHTsz-{!61KelQj>gJ~vR zC+St@RY8g@+spSWZpa=V=bZtRFQv3sMED+%HX;+~RdwicMA-y?St1!A_7aEpR|&(i z?FQFNDGhe-gI@$Y3QES#a<)nr-|-PyS(11M?4;#MM*QT*-Wll|pUSV7s)%ljIl_;>jr9nm24Xw86T*g`>ywrX=tcHH_>5ti2|iO9 zsIV%&&<>d+v<91@9Xcr~2+~BR;?zf;lWkpSFKHX1+R6`xj$0_1p5#?4IKE@SsM$tZ z{FpI^B07eDEIC*V;YILW>WS@$=zI9XRk3_Mv0KS(yhIA-epOaesheh8%33cykInBk zMQS)i8qh0vHgPOR(?8LP`Zt)TJ-JxC0j!OcNTu{i_lLj!UIi~NpX2!mj+3@y*DJv} z8VoE*?#&HLJA4AH(V!zASyR1m{hZH-gex6K;tsxZ!6ec))lObX<71382?d7q7%yyn z$e8L(SM3LIae2Q_`hFltidnBjdnuPz9?X2Lx>2}qW*~`Jt@@H;>)18|`H6tFjWSD= zSji_KHVY(XxAY{Ea}ag!wv_!>b>@)D*qYTtgDNZ7J(CPiG9zJgfde;8>wF`jN?e9< z?hegLFB;w6aN!nx`DZBHU&fG~Y&pYXdMVELx|T}wX(XHbXhLt9Z6*q@6!%2kWU z@fe_|C#t-Wo)~UOx4?Uf*HGFevoj&Rz*`UIMadI^99y6yEqIqWuAR8h3iY7gAUtQm z?i|5B3jMFzjY>W2V++C45DHi@W<99Fs%8{mO&{8JrdNv7)6)t6&@rL2X6N=b#79%5 zQ(<;-t07*@s}Zib>TEaH4cAa!8yW=ySEE21AMStU55aE~UTpc!D=3Fc%3P6%X83YF_eDl!jVE%CKj3YxXN(iwH@G1NH>= znAF+bbncmL^+F6jcd5u`6ZDtLLO!}S&5|2~)-~U7xTUeAylC<>yyys*aooMvs!zHj zC-re4Vp!@$4n9d2SIpSV%47K(=0!g-JC9W<{_r8}M}lcdTt(FzF0)0sbab?dyJ#@H zx>(CMVs@b5I>?GFLP&_;plzurg-G;B5rvh7^EcBgVHe+FR?34rDz-ZU|K#Db13gTv zoCkQPQjXCE!7I~{W3tPz6Ek3|wbR>YhOj7+_vjb{ZbZxnVK8LwGMN%(5;Z93N%VmiOpUTvx-xFAX;- zJaM+jlw_8$NX2k{(Jlnzz^iYTl%r0q&<0$cp|pXPs7$nV&?H&w}@S ztbgaleVZnGBu|s6ivhcjj$kcvRe0ZT%ic!KAb7+dZKVa?T#y9^U;Ga%8ODOqh%*A6 zVz!lt5bY4Q3T|q2%)5%S!D|C&S}i@mP)0#TBPj=w%y1&$!o|_0Kl9J!{%;l_ zEFNtH$;jW1yo3KZOjan*Dj|H!?Yz{@ZLl@rr_WKdc*`UCDl?wxSZqdH@1iDJSTRZ~ z=d>nbItv^@&1d>Ug-@GoK0Edj+zr{g*bUZE3>OH3AUg)n5~{4!)c&8Fe`{au{Vyz+ z0jA`Y#}s9weee7!{oS)%U5|_&xgEpul4Mn?!$<2s2VM}OT+%7j8PG?rv2pC6hjWkW zp@wQ6RLug9^E+lt#EEL$%Ae{bGG^NN}mAxU&))&E<7`KsFJ8L7sf~5a6tBT_%qqmaQJkO z3E$_8Gxv7;$5$5)Ij%WdM?vm-j;^#+ETG!=X5lkrT`6PULAteok;4yc_-BQ;xRLtm zKiQxUK4f1BYq7TO{7P$vx49O`o+Pkyfu5~H<-Fz7>&5zL*U?9UGnCc{6Ic7HZo4EsEFJ$vD0xv&d*I$-t~Qf)+Au2w-g`1r<;D7j?eOp~ zn$yxlUgP*w6iSY8eL4m~LRRj+}fvl#6T|06g#Ojaf#WDYAMg&j_?%aUhZX+hoQ$=aYtSU*qPc35Jor13) z(EL{R>p@}i`k^FkTDgUD2UZF6Dt0^CzfuB67-*Y4?E$oN1Ywm#zFNmQP#$8}-Abr9 zRm>$FuSQD}8-bt$Ii1bPAlbp%=QZ}dy~g`FH?TdWElD#GrsOtc_wb>9-!gtLQUAkl zP5V898ihD*4Y)B7oT^b1NS#E;6-eV=-(g!azpCTRRKZ^>2jJPGiX zJhS(-OF_hA{);18-gU6M@9^e55}$ofszE<4l3DNL)Xf~$nx}vOwSG4%i9HY z9QBCL_%XXeME0eN)P=bt7{!_)6*EXH@CRq&P})b#LlOvvS8_iieHNn=Pm_@MtjR(9 zNy1CqW9i5~tL)_ao4jU@_XS--HZ43CPvYJiZ9az|*Jt!MN`G=xzNoeoZ@yI)D%`L) z-9m@B=Y~KPr3X}^C_#i|f#;HjcBYVit?F%PPUWI%3nS>a<&d^83aFOyQkYqYlG*b0 z#1e6UQ0~!3p_(!U!gAZY9dhup?$^JHH<AA;P#c(;aG5Znhg^1rh2$I_falWPwQGfgid^c$a1W`bTUHSTC!U7 zKx?<-@L+gkz5}L)`GPtrk4Ts zjgtx_I|HUS_SwnrOIJjI2UIe?MyZIGjfb@=&55rBM}d#F38L4jQlA}Wm){WPFvf~e zoFR1l+;~sU@bU=oWKV)5L3Eh!k`H|W4?=E+GO=1Ary$>{eiW39KV_1vns^Is|G-u} zwHzcwj`r{46CF!#W)?%ai?)=2JzwGzm#{^hZ4;v6p% z!lt0RnW!#uxJeFUP<;i!PtP?6%<0es#0~L>OD-jdjIY%<1SPUsY`ZbsBwS1nYBRr4jZ=$ zqJ4c0z%w<;ug`j~Bon=XHE}VXix|CUmh0N`$5M%6@KyV{LYBwa+g{X?2O`OjKMJBP zPm%0o>oYyR4j0jLdo^`FmYNv_=h*qUW>;S!_jiD6(xaD!s%pJEjd(bTR>*SS&YKsB zyrZ?{|8RN#5AlyxCRjU62m!>(^YK|lw1W7g9NBO?%8V;N*`hvk%QNLVOk_~XxD8r$ zg4nHmzQ9gh40n-wtcZKto$4voRC}#;Zd!%eO#jMIdsZSSsZY8=y4L6$5rCzBz*UCh zu8=kw69f1y#TVj8Z>pUMd8IUGzV4Pt?hFOgaJXs866=&B?}f zqUMfDVQueo$?jxnCRSUwFL=T%i^2$ELI(MeF=Th<)nB%*Wm&ZCphbVLmuTeh#s;^q zh<8i<)H+4>)wWKA8zLb1%|z39HvLe!jF3qr@$8JDFo!66d(Y( z;T;-BGJu%`eay_aXJVmieTY#Dq4>Ps&o5?dOHs zgId463&HmyoaDX=JK`}+DP|d)U5^%_d*=%!d&TPJiy?g_lFx43z|We2(@6W?iQuio zJ@S-lADKP&UpNAz=oAf&spzMNi3^9_KShI;5RK(x*NYRH=+vc^<4M$pt>)(0ZoqRq{8%?KeepT#CRdKKH zJ-AnIL|QuP0|tWwsFw`4{k+N9VRzCKmrz!nf86yRE6wbI);Zi-b>GigB7mJ;WA(Ai zvi_p8y$k8LBmRc4iN?1ptlMyy9GU~JHKA#|II`=+@G5pi^Fs){l5!-kzW(Hf>z9qc zq#2Yprk!ug?^R_#0Il2IPy{U5=)vAU;G%m4XTzQLq2IwVEw{P3Zx z)M;q?gCC45biP9eom;O}iAI|a?^3>O4~aI%L8cH+t9kF!~d zFFHBuNvKQEBkvHu&hKfl$ig=-{0wSUVMYCkd@}!V1m+mNsY3O%@aL|8izz4S10D#B z{Fo!*B?jArRsLum2Ar@L<;OU|^E8DfOQLN?JD#iSyWzmliUgL*_MYrQy0mWLp+wy` zYpLY&-$m2d4W@<5eG20cX1B4rWAdcl#HDs%BO z{VwL1ebyj3c`aQZw4KP3+eLmnZDf&lYqtlwxK-xuS22_Lud7_R?X0qI)Uws9XBD~? z8+Q--^`jz5l5-i|LXA>kmfhK;!4*KW?$Tcc`R0y3&6RDte>tmw7JlngUs?LAkh^Y( zmNe8i925YVH%tiSzY*IOe+TqVfh1AOWG-({8x;y~hrEq8y!|yPpq?A$p)HM;z*PFl zd8HQmj+!@j#7dKFg~Aw7s%Wl%I^_IOuoXF(hFh+GOPd8%b3afjFdYB%AQ9V!5gyz$ zl?xo{soGyi{XX38mqxN)GN7%Ke&lZAlt*|@fzDqeEKP`4zGE?%oPr-!B@ zmOABq6pnbHV2Bl|4NT*{ebw<@H|uE^!925m9#>#{SFS=eurOhL?PX#=8whRszWhEA zh?Q&+#4lwk%iL`7!dsCgyLL-&8}IQnI$_#CZaK%keN4kFTAXYe&QS zG2+USzB=O*M8n|S+OyV=WQsloi5r1WAc@v~Gi9aYe!#3(Dyuk8pT;!u%NvNh=a3&b zYgV5Z#L5EkO^M+BE0rlSWfORF04N353!lFuH&G~0vV349_;w z2?r5?zn>nl&KN3=C2WAiQrGp8k{q53^^_Nn+eWtbJaHVDe-{IZpZ|Hers)5L+ zt3~Xm)`9bq#EK#Wd=ZJ8sc@t9YwEChSNl4LTP2>`m`G=`e<(eMW~Kz$@4Y_6LUYw` zUTwGxEZh5@Smt?ukXLbZyXmZYT~Z+CjLebv6Xwz1=b&|QEOo_|AIp2Z2teyj^t41+ zKBjz6tdVCYA0T=!xf+F>(5S1aT&#k~wQ3+fUKpyUH5#Z##_{pQ=Hki=CE)3SyK+8h z3U?6P0=)jVH$4Wh>ztp?msDS!3ZkxV+yAux4>1a#QG>R?7B4tT6&f=1xXLYf5dG6v z1>8gtmKNv;M=7pskC#5d0s|#X2AObkqBi`gC_)_hjhe;avJ%o3R!xOX3%>xbtCZ`+ zq1383eEc;~c`vbh*m-jPMYkz8b0Jk_0DJxzeD6hi0iu*D?pB6VyVCc_{C*nJKFQR_ zH1((}wP-3z2Vx^;)l7LTqy=o_IAs?IvX^USp)s&N5F9d^Zk(qSEi5dkbZO^(q0>B? zU(Z5#M%jV#n^(Q3XJ>CCsYAIN`gaGWb5in(X|Kk)OBHROH)7p%HM{=&KY{3R&Uf1W zpn`V?>Gm|m@zyrloAqsKZNc%Jca{eGwjTeOJSet_xV=_!hTXpQ2@ldtY$6VrS?+fs z81BhPp#BbTltC#R4DvEki+UY&7p_ZFN`}NeOZR_|dQmzR$l2~sAGLNi`UDRrBwKb5 z@!xKFRarSx@;V((MP%FO_T-PQDWg+-+ma7i2*B~Au`{=B_vo}lvg;Wis9nTPg3IJ& z$ygGUlA{Qbt5w?${{;yeLpDY4S9;=ZoV$CTmnt~mXHqm)n-K`2l__g6t=#NX+EU2Y z3YDqcY%LhLwz)@I)L&|~Zqc894rO*&lqbO1$!Lo|#Po6DQT~e#;T@NK`N7T5TR{hj z$u3EVaqj2tTCS`RKuAFihk((PO-)gdh5mHD)LX9X3o%i6FRl1im0)xcWp#V+6Tvd< z#dZ1oXOlmHF4Pa8hW10YM!=Kpm~9M?S71Pb`+!nMNF3M~D>Oqf7cBcCpDTv9Do3OT zz{?Sa!G)+@gRF8*gc~zm{_ObWs$~8;u1lNdswve%_zO{oe-rvBsP^YR+C(tJGd}mA zqGhpCsxi$Fa*+8-ZEWO1yd+u?#Rrkmcr@(!PMPE93dcGb0-x8Y@4iE zn5oyi1-B$bbIUlH4MdG1)lNts!pjz#&m?nPmRvQsJ^o+#f?|=k-p8K}U2A`KC@jFy zDQ0#SG9mc$?Z`!9;l=ZD?Z8to1j03lw?a^iW4E4+{gd`7Iip*>TgnYNf0(v215^Dh ztdf0{z`vxeE!o6AWuAqLmPBb$Hvw$DhBD~BmJ&gl$NcN`X}+hkyZB?X{~n4OUXK8z z<&K{|rP2eE)KtJh*EnbPNKPTOnH1K}P6y@|f;I z7|yD*FX>1Pz(@B&(!DV!2q+Z#9H3SxIi0cQrQ)f`g;+8H+GQ?{Hv1$!hW!=VO8&fX zF8Y})VN*NWfnR^*n(PJVGTiDPL~x0Hp)-nsl?=_<&QV%a`VSE`2Db*ZTm{Or&_Z-P zp%g?Sd{Z(mJ>#QV>;_X$*fc21$0NH&*pcpp8`t!v+lp5ez`JJg+(!}$pfYY_YoOgo z(Gw?1!g`p=vUwxm13^NFbcN9*o056nQzt~0rNnsjt!nS7)Eugf8we{bIQTdmlLZ$f zWCH)3Y|AEK8B9I?i^-l@##F9*+>u{o_Mr)4_-uW7CV;VzO;&A4wK|m}hqS9^$}B&n z?)M}nNaX?5O_J&MusWrKV$S<>l)!?F%=*jr_(Ls^HoIY}mCp-xvbWoi{e1g=-#BvA zuH6}5g0YeL9;PN5<4^J$k9uj{jVA)*r)^RN$Ko8K@>jRHMtMFrX{h63c~{eIUDKif ziD_>-{P={~Uk?R}d~=(g@r(-a2sqLf7g=#a8oexOjbx;YBqX+^uX8ofw8!1)=9{Lb z%QI*#p-Tt_X_>`BC?uQi+^dr4JfnpDQk%G<9LP`G!&+{Qy?cGe;j)gvw3` zxZ=dwQPp>qX$R}H_9=X3D?VHb9tbX1ty>;(a?$Fs=e*3jn>SN)w09{RD(_ZQQ^mvS zE46rcsO94-(Dc!YRI)i%GWxNs@v#Q86aI#~L(!?QQ2q-4GlnoAM2HhP&^NYOa(n{r zAJAxmJsOxM^j?x_FjW{e`Kj7}UOgGnR{Ew6;;ohB2#Iyn?Ap6+sdQ1GfW*ejz^uZXj(z(a=g6=_a)y<)*N&k5Vgy8 zuD-V|a45ATk=D6=$av5t5?HnPQ~U$YG*vE5P&BEtYshQP0nhD*GW8k)d~zP(Cnay~ zeEhNgiPN*Y%q=_`Djc|TIcnqI${15FFeJXG8=89#qf7Xrb zw$sKUauHVZqnd*TeU5+r`i?=jn~q#os4N1#xGVpI`$zniW3Ze$s1eDVTi?O_si?+9 zY26g55@HUvguO@j;+|6HEwt>?GudP8%ALeE#Ne}1$F{IO@HQ=`RaC-M=69GDY4oio+9NJUUJ3lmg|y2!Fi5zV za)FjqsT3X zx-G7+(K5Rltm=W$)6<>)Hk@xrt8Tr;i+7n4k3smWV){7lvbMAuUO1R* z*91-XCaVStV!qA@KZ(n(ZD-HyN@3@Bam3ZB^DOaFgw>kPsIJz2TBQBrIQjma553Y~ z52R~uLAtr(!SciRq}MX5B(!Zeq>^Vx^&9N)e*GM^HcBZnaEX`u4bGM5+=3aQ z3qi(RiuG|K&?b$3#_wYEB<0ec7W(rn#dpK;(Al@Gg7~kz*mzku{*OLBllrxrxnF9b z)ETguzr19)lD}|bx6_>0Ubn3Yf2z2vQGMN!f1-m^Z)1Y;R_sFfj)lgfPeM?^1C$4U zwh$|+|8^pm+#_0|q677i&`WV7a_GGcLCKElNHirLVJQlgJp+bcf;{4`+n!s*=>Th& z=0o9c_%GP{GX;Fj=r9y6Xc|32TCLbacP9$|#G_B+vjCmJC7_nxvQ>621uxVR1IfFl z@RQj%rWZ7W7O3zWx2c6JJe^(&u<415+#w(FFaNo7h3$v+*&+RkSD{&q*xc{~oE?3% z=P>n2zFQ&jDOK=+s<#Cl5EDv5loCIymf;w-2=+vSB?VqQ`Zk5~-^q^!mWjhkQM;vW z;>sfZKnSYZki!b^{~T)0OdJL25SOE_<0r)z(*wv`P&HAd(EFfe`JX3e&FlVr*y4~D z9N0e``So2vM4r>biXB(dKe?5MZ1jzJ`uY;+Y0l-`9ojkKJ{9)X%y;3|B zldsP4FtRS<2lds(G4a7bz11X8J}r4`8$@F`yZ(x&%p0`HmJv;Kf$ME3a-b&y1-hzf zCcAH#I$1$F{3iYPKx`e-j%EBsnBxPZ&WCRz^ja7<21$^S**cRl03H zg_U9&T6Yaf`$Bq^j-mYZYe06>SBolf9~V?x(6OAoh|Q$8Q757lYJbE3c1cIdMZ{BR z$4LkuTSr{rU1Z)UhI!C-^H8>W(t`>L+olTDihVh(CfC=0^R1!^)_>c&bP-1Uu1^kN zy`iz(DT^BvNPFIo;jZvnZgJHQ*s_INT59eWHMZ%!dO0C{Jx$HG@67F-RN4OcaiW>j z1Dl4fd$M!&3WlBQI@;yk+Vkxx+(4EG%4+ti)EuzHZgH~CK3Tv2KK^~HmdYvnS1C*P zYs%i>e8fgOeZO4seMbyix~o*nAeg>#quuYBt5=uu;y2RHHPh7qbNrA65F@q$e#*c( znsP?%nuxT^yMNyKCH)RgzX0CYc8>+>FaJI1!UagzK`HqATE-t3EHdw^wYr$!S^Lf< zLQTx44@K4w3RkdRYcP*sHY$(G17%GMVb_own`zI0+oL^?7Iv`~)f9O^#x*T@rZ4NV*`xZHZ9{(?F$nfUQKxdRr2oz8Jh$s25q$74|c5`Qz zKc*x8g7s4nh5#+!@g3|;C(|rF08oZ5D6y0<^Wl49)!F4mI=?UopW_}k%{D|&{-ov$ zuDIsng6!<~=2&EdReY|duQ8*2WM+Oy)+kvTmo{BE&zvr6(h$9fAE*hL=Ee#3>4)KW zv*r6sUP197)vPGLo$+54US)h;-p<6%CtBgR)Bn(6_WAD$Mmy6QY2c z`T+TKQ;D(mf@^M%w87&uiNAv0g|@(-T)ecI#T8}$9*xoUuW;Is?}rYc?K*XxdGi%| z1hnY=4+h4hg&ILE6fuit)Df|EwZ`gV>h|ldI~HP}9qTiVz~LV*Fo4)vgrugPh;6&4 zgD|CX-hudZQJt0zUHtU~M18iF6^D7^nn2(w5dH|KMg*t6;k0 z(%%El6b;A=R4CniX>vr~C5XCB*Dad=5qzR^-gU%cEH(aAwJQJCF|5>HNjZYc6(=<4 z4AgV^0m}yq;_EC6L)V*}RswEBDAZU&AxnzUgD(h9~Ny?;d1X zurb=#p9g@lH1^(me)zioJ%sRmC}}cDP!2E4*xa}5+=IC2Z>U%Qhq5;hhq?{_{_Ad0 z(LI%lqM4#dXb4G}nL;T`l1hjPNvNdFGFw8(GKo-@30X=^wp5t0&e+GkXUbqOwpqmWl5P@8 z^z+Gw%cVB+h8ItHD8_A1o?&8zJqA}aB{|5kfNe9Uxal{`2(Mg{hmEEC!tB5c<4s!* z)g8NFJCY}kPqe@~vcww(8WGcP_GID3nC+-D(A{ao6xJf%H zwNLCp7iBv%e;s&>-mXmbL`Psp-^ot`of%2K1ULUyKXJgTF^KA7iw)FQol zX@lc(h(khFc-=|iKVeDm1bORodv4ndU_N=x0fZGqnD0j@pdV#YMya7RFJ$&Xe+I5v zD0AQPKc{*G_W}RE+$B;}ctEw)#JXjJq0$Y|!vLt?Q_c9eOn6iCR9GG+|Irc14Gl{( zmvofA>Z)yw<40AduHhk;tKdamo9U7Ib(1jl1zX!n1^*>vNRk> z2mf_p6WI-E|O)PhxYskD2nz>e4rZ@UCaCQ7)U5J&H%41ZVvT98ht~ zaOl=t^4X1_7FPXGh&+qZ_ z5&|&QEEig#4dL|5(5k7NG@OYbotnxmLN$_}pP0ABE)u1bZ(u>y)q7TR) zY}tYn)c8OmsfQ3k&}3dq%)zLCmR-qqt@E651}FM4o|#m5115u}8ytbAGfwdiHkoJ2 zeY-CbtZI<*Rt7a-!&2`T99I2EiF<2h*!~&QzTsYR|HK9{Fm|oFxyiB4^3$+_)ptVT zv~r+BL5|+;u*6ompRNMw(yk4KKnDLj63&iqrde2VewPo#@|TpfvqDan-~x2WuIYz` zdGFxtiDbA^y`2B{@rW*K>zge@_w{D z$D%vAVdm%bEqQ~Jc`4^_u#nIFoR7oOp0kkU>{!U_xmu%5(ngASN}GlaYySdw{SR|Yw{R31wbe#YxVkr zkezHhwz(t87gJehF7GHzj7(SSG5&4; zvHsr0&m=XM!!3UPe854NhX0}t-EMw45xoYN;;&CSeUVyLioE%&ITZkC2;r(tf;Rtg zZc09>Yu6BbBAqPy(JoUWN|k%}y4?u1PW800N~w`(+eg^_+W{D5#&T+Xe(h?DDs8(@t&ba4$3&WUap2Jhr3L#}HuUVV$=S%veiAaPpncB4PC2O+bcl2s zMh^4CTMaZbGMzI#MIU$Q6dWMz?!P9%N;XT9{uvac`phq^-v^$K+c$gWf#AY|(vs~0 zj`sT>={0g%K2u>bT*?wN#`?2p&$jIDAK*J}ImZPLf!OlQ7q#|ilJ`x(BSNaUHRPE* z^)Hp8e?tfyRev3<>)ANIaV+wZl{@sdD2e{~c(;R232`&s$8Sw@7k#X0Uum=;-A8}e zY$70hUV-}Gz;2ZgfFpW#JcMU+X2DykqKXc9dyH0HZ-;VB$X3vor=sfaGf zj(B4JNp`Pl^KiXYW_95O_*mvuxC!ta5qh zg>gO*$KPd>Bf=9u)47Zt3rkKz8|0m-gx_sqotXxn)>4FIT%7d0xcYH7mu%Lpz(@A+ zt!^@oyeE!Ar_=P_;;DD)y0TZJE3Vo&6K67qVJE)f zQUaweyHuwtWcXiv+F~}l6_6C+d&r+Z7p z>d{aW&`oJL{Vic5G4 zf#pCdx)P@jy_>}CM>U|gn2n35w>&Ysrm+I+@i)8}LH8KuADSAy#}O4767~S2r%U*x zYA*_AH^_}z0ty1Ux&X(ctwSeV!OyvShn(vJ(^k|mt&N2-lfjT@7<|bE^%f@$*F)kxi(!P91Cux( zho&{D2UGiKd7t7RKV;tAkGg^N(Fk**`0nrVJ)nM6#i#BvD5r(tfggTFq>Nb_N0$1U zFl-kryQ4$YkbEz6KFUV4I#<0)Hn0Akoq`{{+hJN& zBsuX0gfA@qcq|{M-EPusOU%&{{iy*E#ue*V4*yz(z zv(p1L4SIJusFbNY-^9=t4JNuxfmyUA@<)MbA7(e@HSa_&k?p&{tiB4gH%HZ-luqyg|NV^BFL~goj_X-hg>aFM@?GlfZ@0K5tSDjrsFdd+of8L|E}$ZLmtK;4 z(KpAW7o!*9X4YYKav(#r=KOUAyd^u96H+upw1AJHx2VEqe#)g(;w$0>L_jv~wrs0D zL9W*Bp;jWJguF#+he8oCkGreax0D*Ce@V2uaNZ0=Zn~S5CrI3lQ60doQ~}4dm+{u0 znw=&$?%1lU)BA~Yc|0%y=lz*L&DzjCU&=u1_TGIA+5O>p)^qiSnoxyy zoeKz9c<&+VVW4}oY|!9z$p0aZU{@bs#prNDT1!`tpUf7 z&Dpk79gm=y9etFG&=B=ekVSvm^LtSWj-pL17vX$-Wwa*m$P)8t-F_KsbrqhKU}?VZ z@9ztu0QCkV*V7nVF^^OkU@m=s(jMa>?qS7}G1k~O+T9UrVLYSP6rCd)N2oS}v>mTR zpVhlSL?6H-vFn|u$m24Y1u@M*&rPb%{HqVCH$hLUtAgH4I@Ue8Lrh;|$$D>z|M5C3 zJGS8sm=tjwepDK?5fjMT!2A(<^XVL@H(~fd2?%W~8|FMqk?tf~i=$Iq#k<#%{mQCxZMXAK8f|2Q3c_nD>_{c#s9~s~`MKNPQJwYe{8k)BNC^ z_Lu~)#IBPN<0$EYy~NDywf}UFdIWEpH)k!+zYy}#XQh+lG804-zrJ=Cm#goA6+dO` zh&#kD=pK@=fI9g_2{cb;IKua1ShdBVJ*Y!<7qM&Nh_wvq$7xvs&~chNZMzyAuk9+8 zWlH7Is-2_E3(0bOLjA)n3`xw^OJywv@nP}S8?V>^;!{p>Hzhd;Re|CBmLDta3u zca5eWPzRd@v)-`!!cKLFT<+?^(GFK9tv16S4#10>-E{YTd=K5@t7cLz}t(Bz=glHy?FG@h(X^4=K#_x{?d{{LOw*o2Q> zDc94wu=Rgr4OAQOkDf~Gp{hm2B^AVvJn?mO6l^gtYb|8Xvpc_bfUmtwmM>QT$5r)W z_j)_9P%dUj-$Lrs*tXsPejxV!Lz)6|yI*GK5MP#zNrq*Hyy8XB*d0%5pv|I4 z=9k?T@w5^Ft$J}ibOUKGyPwX(Ov|6{lX!>U*%r4~l3$u(D8N69{XZ1WabdY65A)9D z(<{rE55(F+87+Hb2(j9CS5iU)Nsb&s4`)yO@C~2E-o$u81LlGk6jI0t5e6Azyk_^a z5eQBvo|fI*+mA7T#0{=2o$C>J(T$BL%5D!!^ytU{Vh43^WuYmbxR*$n4zr%xzVi3*%;4hsgHbKk zIffT(n#@-t2Dc>JSv}KlKDtWvzHeB<7)i{r^NSCCOUvOvlD#JkchnZ#a%i&KxfDLo z73naOL+1fq3VWnb=>mMq3;5(@yg6kUYku-!jAo+nk3t%%C-$lK9Pp0fdRJj zhOu9XSHqNcB@Q>fMBG0u&Vw2&4P3+=#qmB^m|ccw-T1n~U40-n;-q^FR7dZ$2&)4U zSVpI}K`ykh0nPCVrGe8Y>q-<({r?svpuvDgOUZOCnR*OJm8vf-ft))03J+BZC;D?P ziuU#D&Nm?ASi>BYG3MKSAGtzRBPgQCETvieq&A8}NbR6ZUs%OI$ct~pgQv6^*9>i(n-(O)0rE6mAppyDS74>^BvK|> zi=s;X6gEHZa%7%Wig-1D`UKAS*G|&;ZoH>gP+c$a>W{ZT-K3mMy-vbjCH|4-qgUej zRbicOEc>knFKhrof|Eab&$A3C4@h1^A42|50pdwzbeU^UJvSA-s!p%k^|uwY-_-`I zbNc1{H1R+~r7J??p47|prnQi}ycRZBkaE@|LCZ#_e-4?JC3EVx^`vPFgD5!%6sz!)8>617nnAs@VK~e+08Q4ZkaWvn)9Sm zp&~6n&#u-7tQqP`%NDN^G*!L99`~Z}!p45^f^~5w=r7a7n(5BEz%YTFn;8Swhx$Ec zFS?((z#5+8h7mxc%6_|vGhuv9$8i3$6xb*77Y9Ml(^LB`MN@*rW+$^((x6XL%TRyr zt9S6aQw1f%gPnk`G9yK@5W10Lr#4Oj^PMjvM{~T8K z#;(^Gdw0P5nxT@_z$snj)QZI3^YQm3M^187RsK_r+PSOL9rxqSSX9p!>YclZb%*wQ zUp|7d=D$mSvm?wd;|RQY=kFHeVs5IZaB<-~gHiKH=dLnIq!vYVfI0fP)Kel-MbJDMn54FObGt?zPUZ%J7 zE&CA4qqd$=Cj`ulws>n3b8AgRO%Tr>f;nQ2_wfXangr4MgfzjVu|pAPIWPyO4Y!9T zNdFz6*rVq8w$+8vyBzdUq1>0L)WbxN+BIHh-*hzM=|x%3+t!i3?CiCbHLE-AMwx55u)KwnmRU)32!Y0l($J`EzM@~USUbOQ*f zrAbT+W2uY!SQyRt!OSPopJ(ddKf%5~)yh_xI;C>&1s&J&^WO5(py5!F5f0S_ibpoVslp zaI;{Z_6*JQyCb>?-z{$psPQ7Dx$_R~$wBTcBdg{R1XGo!Mnbd!ygu&ipB*(K5qo zm&Xk0jdD!)Rui>KH-<*|(C6GpZjrYvce#7m$A$lo^8F|}D(3hpkvlTv<;G#LOXnVjeGUn13Fj{fI4kN#hbMc0J12$*hy z_FuM8=J%}KfAQy)Os!*VI}QV!LXRrCk2`pOv-4F~YAWbG_V5LbAMCWuc_}md>W6!y zP<$HWuNfW@9PFF`?~4#?&yP%ne>^QY={v#yqe;I7TO+ey!J?@?v(+&V8Xa_&>X6$7 z$MJaG<>;-WbG~7r@k^eVOT7!ZZG%Pd9N2&Yl@gFwXaCqda>1Yvnor=PQx)2Ecl*n? z{ZgzoUHhf{(CA=nojWI4RWydmc~#pXS(1FKndL;SG1H`Eo*^r(D!t>H%^XK_2{4n@ z05z9+Y}H@hZH$O{$3 z+mj}Ja24XTI76~pTS_Q>qC))y?IH9`8hU6z?op82NoQuk;0NM!0+ZT%%(G>3DSJL6 z@E*ZKZ7yPZMGno(2tsdp%c>7~E%k5Pz>Q$;m8<~gX4)zJ+Wjv%{=y`2POX}oUVbv5 z9l*9Nq}r9#dR5Y*ys)W~)$Fr*^3v|5KyjXOxi%)qpO&Bua3l;fs)`FAGSdV|zbR#5 zq3?<+$Qbc`5k|M0;XY#zK1+7f#azAu&JkCMj|?}3ZQ@3WKMT&10$a6RQLkBK{=|Uk z4$Lp^Zj2!!D)@s?KWs``fC`d~N>Atggr8 zG)Eqmy}R^U->9|v;ka9xd7ML|&FA(lKBx}K>guangr6hqxu2Lh|M0_{@o&e= z#bpq4^PbuV{&M~fm$CkMPs{iX4S(qQ*@LI(DDwU1|J+Cv=M(bIs}HuC`jmfUKKNLB zLyGZM8c+HUQ+1rf;a`;7$`gD>l_C_IYoe`x5eUoc&(QZPg`(RWb_l(sf;7JHkM`T^ zPns_llC@oLN9?|Qpub7;U1)*aylg{3X04?ezOFM4RB%`mNrnU12XB0T@hl9P+ab6` ze~bLu{1q8#VHI5X3P`~G^bj^@@3IeiP<8#g*@ByALGT%Cb2LryT;-45ml30r1h$$S z<<=sKw!uv_-}y^vd0gP<29DWC=JY+!N});NA1miAh0(PqABwMz#^H2y&R@%0ynfQw z1!n6O5yy{Ld=Qd{c)wQNx+r7w&h|Yp*OX}azBcTA{M!`rcKDK{SvB?~B&b2HP}zMW z`u=d6^zG$7oR@4be1YJmHszxewJqw{$}IXaM?=a4KYKixvg!Uy|&1OL8HTV0xTbLtb({TEDx2?bF(6Rh$VKMi9 z-?nXvc`YUzYAO$k^W|iReo6a}7PaGd1I)LC%V|y@@bbn)@n!z-k7M8?v&<$lHW|Kd zqg3eGfxQvP(8><_t0Ar)8=4h~qu^s+rx*-j*rcES`7SI{FHN`W3ZSGsz>v5|R0TwY zv~_@=x)2_BNu3){qRFbmki(@aVId(OJA6uc*PfV7HzDi#=B43#zZQQ->@drWxj%UwJ6_GvpLy&)a!|$Y)Nxi`B|Qlp%M%_hc!rHe)(r`-&90Sf-o*XAp@>7Id8)u9qMBn?V#OGwB@I}+w<^D>#cqwNK!$so@pqHy? zvg#wqi;Q=W;D0~J>JmO=WvKd|?g3c1V07LYw}&)64YEFw3xVBU+@kY^7u*SB`v;JJg&pmZzRP^)`<&}QeAvj`*2B{ zLE6Kid49-8Jw<&BTrB?G3lR1h{5c9ehf=$4p=eB+@p4nHIM-0%bt ze*^cJ@M@U1s5U%I3c_wIraZ|%#7Kt@VCf+1skoHFvFIDE8@N#%|20#T`vJi{VU^gK zZCVTO!)$blW1U0S5Grm!Pkp0@bAmG|6>yG90;Uc3Dk;FAWCyj9uPJEYVi(Oc1T8^; zra8~!CUQn#lC-b|R%xAEhC(3r7cp()p9%KS626lo{>WLe#`gm6QTJ+9CBu56IS6J+ zv1ukG%3Qj7t3yti@@2|1i=!`uJ*@MQUv6Fh-(CPqq7!JxDDy@?HtG^@L7_{U1XJuU z?Tuhs_u)OoYSOb%56Nrcf7gN6gW6d#QaNvNyckd`a>QIGk$~p7ei?T0eg8C|#p4r! zi4Fw3KMp^|{9RlJD}wbVAgn@oaTM=vcI@}U9euuou-R;7ITh9m=876M z55%yS#x}pP_}D*8?GbmtzZg<~{~m-NTOmpyb<%ly!JD?w7TexvKng}u)u6V@UECrj z`I>&=J^=`LHwf~ORuExXy3|EILAiEM!oAw}L|z|YM*qOi7WiSV5L2UAnL3}W;1ZlH zRw{u@1I}~@_C+BNLnbb4!2Xbi)UdUewKasRe>X_Dc+3$E{~=m+hm?ws;7+uHJNlT>jHsG{)|Fuyle#}_>xzOTa>rPzuHnfw znwvXXS630OL+!xH1{MNcTt%v_aolIotW9AvWrTO#UBa1ROyFX|0cV7o`GYs>F5$#o zo~N_!{qz`5^%B3S>eZ!g`y$=OQ@$v+*tyLfj{3b?+?MP^jDe@?i!NZ^(T0iQpG-K% zffp!vb;>HYyrhNYEw>;&6>dOzoA*tb2^sI#Cz+3a$vTuw3YJynkYB^)vjlQdNU{Pv zdbrK0G+G+NE9nhjlA}4=`-p;Koqa2x%uS^GrCH*l(L!}Hzgb>_hl?)?6`l8ymMAv zmpOLS-^R~`LsQ^>;!$p)dK&!p08x$0z{{3o4>^T{Zs~#FZg3V% zEIT3rEzJmsGR2(Q){V$&`{(j;Qe7Ay9X9;Q|A#pRp#LO)5EL5E>ps0NzZ8g~QX z_Br8UiM8ASiksmV5%w{o>8>bw;(!bi60ZZi2+d6;fT=qqx7eV6pbu-hf2aiw{nOBX>bUg?@XgL>>nC=`O z*uDMkiBDE?dP-N?GX=}-PS^HA8bidzK zgTv3HzV@S2zTB(Hwh)D?oPIgMd|H=Jjy66o`RZl*!igp>)})){Af&CmAGS5>mS2$4u69(w)Kg7_s% zuYYEQ;<$^+Pyd|rv-#W*7=YMiATy)aSz7EM4h8a>1Kk-Rqp)%BcsU`mFfwK3@Fdz9 z7>TxUG5lU@dsJn8M|maU@C$p}Nya$jdyv^$xiQQ0c)yl5FKvf~rfDj>lvsCgei~$f zQafPdXAqpH5*cq;`n-G7E^UjR2i=TUmqppTYZ7b_;Gf22mhF|LNn=?N%veVLnclhTin2at7em=GIWV?aQI@c*UdVMVTKR;$BmKhN+7k;n{T91>9Ad;@ zc~(Ji0f|%AR6Ms88jE5V0nqSLSSiq*eCK_Pxs!#BXD_>nP zjn(w01(HEMn%EBxPad-V!DRhf3IDdVbF<*cQN|_2@PhpV%3c%!N*xqM9lu@9-5;ZJ z1JX7;aP#o2uOMI5Z**FFO?|5P^@uE|TXzApk4i%1R#J@c^xiMm4mKpF>g23iaFLzM_Yq(fluW4?f!8Cf1p+-Rcn`HOVLf#2==yCY!Ui(ZV6U3 z_lwfGjv@ygM{H2?aDez``VYChsNr=Bdz*9^Hpbmm5g~q-u2P6EDugFs6eCs=5b3Uf z4RN$0umi!`;H*_6`rlSX!)sTEvI#x1N031EB?p=ekVw!Iu?<4@lN`pd-+}FgP2VCU zf4O_L#**>TO!m}~zQPv8eJ}_L_@45*a143X;~v!m#QwLb;P&o(R1qp6P}N#)E0*3# zKrlbmO!jN@-UUyepBAM>`(bR&k1R0Or{LdVV-}GihdsiCCk@BjCN-PKX`i~4dGKR` zqEqfE*qb1{vti4hjH}tMNGpLGw<$>+P_i;_>qae?yP)^PJA~AkmM&Pf+Oh!w6aCK7 zy(IDc2u>S3Ku#j8zQtgHfwwAPy3jDG?ZEKx+sV@GXPg8MP2w(XKyDgFa7(n|`0Qog z4@Zs;4SN@3l?%MY%XSY;D0C-S2#yJs0hgtfygv=1SYgOB#*dV=8?q4ERq9m_d8zl^ zdNL^_9f}t7BY4lB%k4VbP*;MGfxj)gz))l&N|#xi@_prj&I8cx#f(m(Qithc@y8+Y zOUAInq4d9Z);=H3{T_IKPISM65NGnOwffkU)NZQ8!3E>KBusqGSgZfe%JXm-SNq<# zmcPOWKQ`^NNLeJ5AAp7bBK)+caTYP!_A(%j)8`IK^w$~2B* z%_9ertWh|pczg4$w_%EN#9JO2qC!9aMa30g*GKLJD%>b(BI_N_Y&P=@;yp&%7N2$z zM1t|Sj<{fZTwrYBDIC)9hE0xmjOW7>rauvS^`Ysy<+L5+0xvBN#wleg3*;X4WBDC%1i{jk@fp6*UcV zTlN`s&vx8&pXl&%I7TJ@7A`8iZz!1c*hF-#G~glbOqxZ?I5gf$L_aY>PoFPZe|7?k zvax+AO57F26S^83idq((+ABKQ+!Fi)`GE0+d)a!l;y>v`5-9h`Fg~0P&cG&;1Qo^p z7#p0=JlJ+#V7lZmwtge)n;L_!zAn1*=3M?}Soc)w-CbUBQfWk6ZZ=>Yc zjSoR{6%*#FD2x9&QS1qM$Vh3l;EiIlV=YJivInE^WzhAqW`4L_AjU4;;zy)lhZNjB zu+kiNe2eWq`7SZQcuCH-l;VFpRxcrT8xE-~40lkA;M2s8>PK~^%cHs-jwHbVZfc@BTiNdCI1HVl=$=&vAnqi4Ox=Sk;>pTTu#v9u8-xZPEP2y1D@*FrH3)|tK zCcKjUk#Zatcv`hh1qb_hDNL|_FyYTy>M)FM=_W}=R9NeKDvV_9fz!_a!c|L%Gw@s{SETU)nyQvWFJ z0(pNtPFeERkdJ@*UnA`9LK*jfjS8H53K;)bWP9Yp-ePw$yXSXoDq9f(h4yuHDCS3# zXVvG^47L=6$2?bpo;j8Y8cZPLp5Gg8gZs{eF2!vV4*gT>19}S*=U@1wI_S zHYG_s4S8(s^g#Ni@3pRnu&evm&&`Z@PPF{0fQhSXHM5SMRuNdr_8+Jn-I|>@Q5h00 z?dj1P0{w%SC}bj>o2#CgFQg+gJD-AqMySSqK7$i=ZO{=YnKpd%yaA- zmZUETlO7eo-hw}grLft_=PnO5$$QVg&DU?s{ti(#(iR3uz6E#V{KkJD@bn9CP71}m zIjFMt&AN`q0sm_L@_G37{Y9ivoMOx(bDu1Z?Vyn_enUvY9GJIm28+iH6-E&!voC%n z7CD%E7#F&DKY{^mD0DDfiFiQ>+Yf#{oR8it{gLJ(Nylb99{ zrs{9J!uSTVZWH|lA%=Q-_8!C1)u{X2NGn&}`VqF2aBX}Bfo+R-1!D>Kp zzfj`tj=a@?JT6eJ_7dUI5qRwvtP8*WpqbVZU}NiVLSJ&`DFTH{ftz9 zwRt16=Zp7yT77|zZdPtlWxoU#z?;1fR}kLs+5B42qMD$qn(M9K<^2Wh8L~@Y#jp%r zW!Dn6Bu8>Cu(AsbwK7)dOkE{Yw#WwlWWrtLbASgjZO-}*NW&|B4_T#5wQ%UM(tbSs zt@t)-59vhXZNs~JXSAo5qK7-u9Y|+U)|Z$6EKP~fMwnxEZdSyym3r!G*a_J+&xxDR zL$mvqa_WE7>|Y;_Q7-$nrnec=#4k73Kv_$kbH1w^bqt5r>hfMt;0;#n(7V`Lbkb>$ zJ0|+MBBRc)714?;k%P^~@()@`k~5g|Jh0c&?-G@{Ag1mg?L=qKk9h(kN!?Ya2(qOJ zYmnNCYb6}m{4OB=u!(i9V1!6BV~8r!dlm%kAR|~VvWdU)M}6tg0y|;N+2sAP&gU-P zn%@+7Dtdqc$}To&1VbYF2B=<_rp>sI=EYQlI}1bVa%A~*d-SdmL@M}OZRx=7+p-2} z0=wz!U5o1*X0WxGRWniaSJK$K59>PtNlpYk7#jL|?K-lJrR@vIg!hIxPr|W zJybiBpEePnx!0lAy;8uAcXSN(t~a7=!2uq2Fn<-8IJZK!d2oeN_brwq^>a2x#=MHr; z(ufi)P1_sT3rvSuu$_f&g9oPsqf#@EJZr2$n?~0vPI3tM1i7eDdUum3IB{4Ds^qVg zu=q2~V@}%cVFJ5`ni9EpsqR#B`24EA(tJ^(k8iu?`CY9=v9zp#w?hD!CH7LZbY^k# zK_gf;?#rv4WJ?}#5u}M~U1SUtLMH7ZW3^F_Dax=aH^nje?wKHnCR-Uc_Un0|*1)bn zGY2cot2G#O6!|*f<26>?By1Hq4N3t9cME|7O1IIUOuA3WJW#cisg8GRXOfA1+@gYW zJn5mnzWw`dMKlZ6>Y)kdKkp{*X1-ipbn7;y5MJ$|$C-Pq{2p4@bC3uN+EHD4W^>4Q zRc#W#Xv6jRtC51t0_CP%o>nI{6AkIOa1=t>QVMw=$=N9)w#+Q6`Y65Sc8aP zZv7k3m#WhbL4Aexxq~0bBejsLN)AUrsGNST-*^>m2A56eo>w*cB!5vn%d^lu{GGF1 ztI_2k1eE4%!v?|73pL8j?{Lp6o9=sh|e(G$%(kkS;2!GpR z-xE^0Mpz zTKH$eHuL;Au_Q}GeF83dD_!E0LrnAEv5B#7@Ze)1G$wj3Fca-#VtoU9$VUbgh%BkY zbc38h_B+^J#4~~OZCpqKyfWhYr$cbQ9H(3U=bOLor*{V)lnX8-_otU z9X2mDz=c_$JFzja%^Ro?2#FX3ZKR(QxA|wDm)bQC^Y^u+9m6~p>>NyqnN+D*1Ef)V zM2#^xmxRMZfFX*W$B1~@jY1FDa$cY@teTGD|Bc4=rdusO+_!(k4)y$*;jtH5=xC>e zmzexMS`a2g^UCSxQT_kiiC2U@*I9!r15VSIYGYf5ik(Q7e*J`x$2OwE>A%k{=^~Lg zjO;fv8UpT%YQt6q^N}@*H?kpazx#Xl;S(gQ z6DyJlZZqSH?APU45a9=R(&x8o(AP`JKZiarGP+Se&v)-dn1dd=-eDOf?zr<>7>GXq zI~e0QIc5zM6_tx4IhHeJS69bpPy4;6yG#;gM>~wi3FXO4%Ehc60UZF!hXKiVqhnSW zb&@Z?v0Vm`PSU`y*F3JrveDFAf_!!6s`a$@hh1I^dF3kzPLyFggkX7~%{p>}H%B7;4I`#qifm=rAnGAbnj z0bK);b9Er*Imv;3veb1tKDvA?b3c2}jG0I!g-Zs2rlq{SvzOBY=farK&T0vs0o28# zI;x7kwHvWi`s*W!o>h0RRe1@A!8O=oY)9DpmahBc8H{PVXms{cLFXc#SdmV#Fo zIGo9D;fD)mmuBiXV0<(T%K;6?&=(x9z_oXVhOTJ3Q-qcORD;J;bDj1;ODm#^3=CqAu8t2|u;;yba?#34|B*ieAT2y|8n2RcpupVO$^e zBPeA`?y?W?e&}hGyq8aDGaqHo%h#{fySggYP+8-|V!)EYV&u;vgY=S}T2H$T50r#< zHoxz&yb=km)c6j#_bPmwp%EuHmSc1wudy~xo;=vbCediVUpv+%cciOKtFX134|-3z zwz@TYe<_FNB-NgXzZNNIlq1D@kw>xj>h!>$C`|kut$WQ{7$AJEVsh{cq4GNJW?g|0 zu_;-EixQ7OZ%R8In!lRGPiL;hZWsM%65j_WLDKIyXE&*`p3SQCQ{-RbUA!o3yVC;r ztnbrARuSLHbM=_g`-hvjGz;*I=!HqN?&q}Tw(2n zUm9rQO-$`Rm9Bj)FJV)0s%KRQ(#5B_47Bp8QX^}f(d z63O&9qk_W2pxUd-TZZ8?&eywilj#0ROiAtJm%Ae}64FHq99sM@Yl=?Yth%Ru%bYei z;~)~Zwrp@*ZL@b|!vIAk(cPP$f2{H87SGa9Qy(W*vIpskvuf`aCzjG(zsRxy(RD-X z|5k4=H;Yb~3OTOvFZ-o@FJPk7D;wtz=y4FKhRc>Xaw^2_^zZSoz3e-MeXiX!~5Q!t4Z70jBy+q9; zG+vPXnB4}U)|k)81S)M`v?4DiGQE{_*53J|yzLA{(OZ%q_QhSnraip zL^Bg}NHQT!=}_h-NY32>yAbs1TB&rilC8!`lE<}P@rZfAeCW;$Ohs)vP8}O6J%*`~ z@#1pG2@bplW~RjQy5{+2vV33;S*?%mBs&@EY!V(K5fhpOd&YH#YrRlk|Jx_pb|^P+ zhsshG7Q;n4cIhVKzk)T&tJWjema|0Dtg_O_8GqPfravJ-GI;Ek!TI1Dfz=tc1Om|JRdinmZf&miG;aT3j(Pu`*+9{+5T$E( z#2L%E4x(R^G7+(Z0h9TS%^a*VhqA%BDr9Hr>k;@ZruY*=6n|_=1w`KO_Jo0-PFRZ6 z8c;bPdY;T>zDWasA7db}SmaTMN0RljAc-cbiAzKFlUK6LAJwg(#fG(s!re^3422Ol zdrks@>3H06`Je_)cE5=tv*cyD6m_YGl!19N3HS~iN_?SQmvjqYw*|VC&>LHT={_a96bKUVra?YBGb7^YeHic=<=?MjQm zotmt~=CgiLS6&g;!eKP-3F0WwNa~ON#KsV)S%e!bbMnL#WWl${;XYUuuE5iHOqe@_ z+3iIZMl&eWWI?)?BqWjHDe?+E­|gqpAvJPFF?uyU#{bHmIUs~>X;rPdN{nQaAF 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%0AO79C7FZ+F82u#vW&#;2wP}`*&)6CNI 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≥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�nzv2(-q<+w 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

vDyqWK05V-FIL4@vDZ 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%0DI>@}z)~z(6 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ಃZed1zs#A?w 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 J9rwHUe*nGWfu;Ze literal 0 HcmV?d00001 diff --git a/nano/images/shaded_hills/shaded_hills-4.png b/nano/images/shaded_hills/shaded_hills-4.png new file mode 100644 index 0000000000000000000000000000000000000000..97408dc32f63d7b90dfa328cffb0e1841978ff10 GIT binary patch literal 222998 zcmYJa2{@GB|Nl=am90|NVJa1+EZNt|TjkxVow5w3lI+HsSxAyBQxRgAB&jSzcE*f- zvJMr4!C)|HFvc)5%=YvCey;!ZzpvMI-S>U2`<&~X$9bOnKKFUOPU7`z4sv_c_DD!b z$X)#R+)W9I?OT`IC3Z<|o&Ig3R7gl{8^3<#_IVW*m4gQlDl01=P*G7*Qc_h_1p+vI6N{0>|wz5$_cKo2Ks*;MT7U(Ph08mywc;v_tz;SJrtwc2y6)i2bBU%TQ zlnxv`sH(0GIDTA3<$wlI1E8U?RSz`{bqx)T0{}oSy6^+$OIBt+Ca(yOCsuyPVaw|A zO`Q$(t+h4HZLK{7!jICD+QLtzdFam{^S^$``_jL+FH9Szc*Es zH`Y`W>S|l+>srdo8$K13}e>RQ^{dTMJ3xW@MCDtr^JqrSeis

GVOc@`w}Oww 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%0Av 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 literal 0 HcmV?d00001 diff --git a/nano/images/shaded_hills/shaded_hills-5.png b/nano/images/shaded_hills/shaded_hills-5.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d8cf90dd2d56a2126def56e204f4a24ba7bcdd GIT binary patch literal 501209 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­|gqpAvJPFF?uyU#{bHmIUs~>X;rPdN{nQaAF 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%0AO79C7FZ+F82u#vW&#;2wP}`*&)6CNI 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≥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 @t(t|dZbNXT<-&uQK0 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

M6JWF#00w)zbOhneU5_*ZvLWd7lDcpaS3mBuai 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 literal 0 HcmV?d00001 diff --git a/nano/images/shaded_hills/shaded_hills-6.png b/nano/images/shaded_hills/shaded_hills-6.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb34e5cb67cc8eccb62a2b191ee7aeab0e94629 GIT binary patch literal 547818 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­|gqpAvJPFF?uyU#{bHmIUs~>X;rPdN{nQaAF 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%0AO79C7FZ+F82u#vW&#;2wP}`*&)6CNI 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≥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ⓈFlp) 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 Date: Mon, 6 Jan 2025 00:52:35 +1100 Subject: [PATCH 311/554] Fixed holsters considering their holstered weapon as also in storage. --- code/game/objects/items/weapons/storage/belt.dm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 3a5cde951c7..641a512ce20 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -57,12 +57,18 @@ . = ..() set_extension(src, /datum/extension/holster, storage, sound_in, sound_out, can_holster) -/obj/item/belt/holster/attackby(obj/item/W, mob/user) - var/datum/extension/holster/H = get_extension(src, /datum/extension/holster) - if(H.holster(W, user)) +/obj/item/belt/holster/get_stored_inventory() + . = ..() + if(length(.)) + var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) + if(holster.holstered) + . -= holster.holstered + +/obj/item/belt/holster/attackby(obj/item/used_item, mob/user) + var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) + if(holster?.holster(used_item, user)) return TRUE - else - . = ..(W, user) + return ..(used_item, user) /obj/item/belt/holster/attack_hand(mob/user) if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) From 456fe957bcf9a5e22300c82cb3ebf8074725bbe3 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 5 Jun 2024 17:13:10 -0400 Subject: [PATCH 312/554] Allow handmade goods to be used to make moulds --- code/modules/crafting/handmade_items.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/crafting/handmade_items.dm b/code/modules/crafting/handmade_items.dm index 1135a26cc8b..a04fc7eb13f 100644 --- a/code/modules/crafting/handmade_items.dm +++ b/code/modules/crafting/handmade_items.dm @@ -12,6 +12,9 @@ if((. = ..())) update_icon() +/obj/item/chems/glass/handmade/get_mould_difficulty() + return SKILL_NONE + /obj/item/chems/glass/handmade/teapot name = "teapot" desc = "A handmade, slightly lumpy teapot." From a3acdd5350f92e4a476dc5e6b561b948e7d26bf9 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 5 Jun 2024 17:09:06 -0400 Subject: [PATCH 313/554] Fix fingerprints infinitely duplicating and lagging the server --- .../detectivework/evidence/_evidence_type.dm | 13 +++++++------ code/modules/detectivework/evidence/fingerprints.dm | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/modules/detectivework/evidence/_evidence_type.dm b/code/modules/detectivework/evidence/_evidence_type.dm index 631f8e4c148..3606e7c553f 100644 --- a/code/modules/detectivework/evidence/_evidence_type.dm +++ b/code/modules/detectivework/evidence/_evidence_type.dm @@ -4,17 +4,18 @@ var/max_entries = 10 //will hold that many entries, removing oldest when overflown var/list/data var/remove_on_transfer //if it should be removed when picked up by forensic samplers - var/spot_skill = SKILL_EXPERT // at what Forensics skill level someone can see it on examine. Set to null, can never see it + var/spot_skill = SKILL_EXPERT // at what Forensics skill level someone can see it on examine. Set to null, can never see it //subtypes can implement any merging if needed before calling parent /datum/forensics/proc/add_data(newdata) if(!newdata) return - if(unique && (newdata in data)) - return - LAZYADD(data, newdata) + if(unique) + LAZYDISTINCTADD(data, newdata) + else + LAZYADD(data, newdata) if(length(data) > max_entries) - data.Cut(1,2) + data.len = max_entries /datum/forensics/proc/add_from_atom(atom/A) @@ -28,7 +29,7 @@ for(var/D in data) . += "

  • [D]" return jointext(., "
    ") - + /datum/forensics/proc/can_spot(mob/detective, atom/location) . = FALSE if(spot_skill && detective.skill_check(SKILL_FORENSICS,spot_skill)) diff --git a/code/modules/detectivework/evidence/fingerprints.dm b/code/modules/detectivework/evidence/fingerprints.dm index 290bccd19c4..0fad8bbb784 100644 --- a/code/modules/detectivework/evidence/fingerprints.dm +++ b/code/modules/detectivework/evidence/fingerprints.dm @@ -17,6 +17,7 @@ continue for(var/datum/fingerprint/F in data) if(F.merge(newprint)) + newdata -= newprint continue ..() From b98168e5c9f826b2395562d4e592b064be2c3485 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 13:23:45 -0500 Subject: [PATCH 314/554] Optimize ship mass calculation --- code/modules/overmap/ships/ship_physics.dm | 51 ++++++++++++++-------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/code/modules/overmap/ships/ship_physics.dm b/code/modules/overmap/ships/ship_physics.dm index 66e85a3f0b9..28e71cf1f5b 100644 --- a/code/modules/overmap/ships/ship_physics.dm +++ b/code/modules/overmap/ships/ship_physics.dm @@ -36,31 +36,43 @@ /obj/effect/overmap/visitable/ship/proc/recalculate_vessel_mass() var/list/zones = list() + // for(var/turf/tile in area) is an implied in-world loop + // an in-world loop per area is very bad, so instead + // we do one in-world loop and check area + var/list/areas = list() + // create an associative list of area -> TRUE so that lookup is faster for(var/area/A in get_areas()) - - // Do not include space please - if(istype(A, world.area)) + if(istype(A, world.area)) // exclude the base area continue + areas[A] = TRUE + var/start_z = min(map_z) + var/end_z = max(map_z) + if(!start_z || !end_z) + return initial(vessel_mass) // This shouldn't happen ideally so just go with the initial vessel mass + for(var/z_level in start_z to end_z) + var/datum/level_data/z_data = SSmapping.levels_by_z[z_level] + for(var/turf/tile in block(z_data.level_inner_min_x, z_data.level_inner_min_y, z_level, z_data.level_inner_max_x, z_data.level_inner_max_y)) + var/area/tile_area = tile.loc + if(!tile_area || !areas[tile_area]) + continue - for(var/turf/T in A) - - if(!T.simulated || T.is_open()) + if(!tile.simulated || tile.is_open()) continue . += DEFAULT_TURF_MASS - if(istype(T, /turf/wall)) - var/turf/wall/W = T - if(W.material) - . += W.material.weight * 5 - if(W.reinf_material) - . += W.reinf_material.weight * 5 - if(W.girder_material) - . += W.girder_material.weight * 5 + if(istype(tile, /turf/wall)) + var/turf/wall/wall_tile = tile + if(wall_tile.material) + . += wall_tile.material.weight * 5 + if(wall_tile.reinf_material) + . += wall_tile.reinf_material.weight * 5 + if(wall_tile.girder_material) + . += wall_tile.girder_material.weight * 5 - if(T.zone) - zones |= T.zone + if(tile.zone) + zones[tile.zone] = TRUE // assoc list for fast deduplication - for(var/atom/movable/C in T) + for(var/atom/movable/C as anything in tile) // as anything is safe here since only movables can be in turf contents if(!C.simulated) continue . += C.get_mass() @@ -69,8 +81,9 @@ continue . += C2.get_mass() - for(var/zone/Z in zones) - . += Z.air.get_mass() + // loop over keys of all zones in the list + for(var/zone/zone as anything in zones) + . += zone.air.get_mass() // Convert kilograms to metric tonnes. . = . / 1000 \ No newline at end of file From 5deaa895f1c5dd5ec827c523a77b14ecc1e15631 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 16:05:26 -0500 Subject: [PATCH 315/554] Port TG's ref()less garbage collector --- code/__defines/qdel.dm | 6 ++ code/controllers/subsystems/garbage.dm | 104 ++++++++++++++++++------- code/datums/datum.dm | 9 ++- 3 files changed, 87 insertions(+), 32 deletions(-) diff --git a/code/__defines/qdel.dm b/code/__defines/qdel.dm index 48a9f0e0973..2c81f12ad7d 100644 --- a/code/__defines/qdel.dm +++ b/code/__defines/qdel.dm @@ -15,6 +15,12 @@ #define GC_QUEUE_HARDDELETE 3 #define GC_QUEUE_COUNT 3 //increase this when adding more steps. +// Defines for the ssgarbage queue items +#define GC_QUEUE_ITEM_QUEUE_TIME 1 //! Time this item entered the queue +#define GC_QUEUE_ITEM_REF 2 //! Ref to the item +#define GC_QUEUE_ITEM_GCD_DESTROYED 3 //! Item's gc_destroyed var value. Used to detect ref reuse. +#define GC_QUEUE_ITEM_INDEX_COUNT 3 //! Number of item indexes, used for allocating the nested lists. Don't forget to increase this if you add a new queue item index + #define GC_QUEUED_FOR_HARD_DEL -1 #define GC_CURRENTLY_BEING_QDELETED -2 diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index 47c1be9e245..c27fcb3238e 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -130,30 +130,33 @@ SUBSYSTEM_DEF(garbage) lastlevel = level +// 1 from the hard reference in the queue, and 1 from `D` in the code below +#define REFS_WE_EXPECT 2 + //We do this rather then for(var/refID in queue) because that sort of for loop copies the whole list. //Normally this isn't expensive, but the gc queue can grow to 40k items, and that gets costly/causes overrun. - for (var/refidx in 1 to length(queue)) - var/refID = queue[refidx] - if (isnull(refID)) + for (var/i in 1 to length(queue)) + var/list/L = queue[i] + if (length(L) < GC_QUEUE_ITEM_INDEX_COUNT) count++ if (MC_TICK_CHECK) return continue - var/GCd_at_time = queue[refID] - if(GCd_at_time > cut_off_time) + var/queued_at_time = L[GC_QUEUE_ITEM_QUEUE_TIME] + if(queued_at_time > cut_off_time) break // Everything else is newer, skip them count++ - var/datum/D - D = locate(refID) + var/datum/D = L[GC_QUEUE_ITEM_REF] - if (isnull(D) || D.gc_destroyed != GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake + // If that's all we've got, send er off + if (refcount(D) == REFS_WE_EXPECT) ++gcedlasttick ++totalgcs pass_counts[level]++ #ifdef TESTING - reference_find_on_fail -= refID //It's deleted we don't care anymore. + reference_find_on_fail -= ref(D) //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) return @@ -161,14 +164,18 @@ SUBSYSTEM_DEF(garbage) // Something's still referring to the qdel'd object. fail_counts[level]++ + switch (level) if (GC_QUEUE_CHECK) #ifdef TESTING + // Decides how many refs to look for (potentially) + // Based off the remaining and the ones we can account for + var/remaining_refs = refcount(D) - REFS_WE_EXPECT if(reference_find_on_fail[refID]) - D.find_references() + D.find_references(remaining_refs) #ifdef GC_FAILURE_HARD_LOOKUP else - D.find_references() + D.find_references(remaining_refs) #endif reference_find_on_fail -= refID #endif @@ -201,12 +208,14 @@ SUBSYSTEM_DEF(garbage) if (level > GC_QUEUE_COUNT) HardDelete(D) return - var/gctime = world.time - var/refid = "\ref[D]" + var/queue_time = world.time - D.gc_destroyed = gctime + if(D.gc_destroyed <= 0) // hasn't been queued yet, or is queued for harddel/actively being qdeleted + D.gc_destroyed = queue_time var/list/queue = queues[level] - queue[refid] = gctime + // not += for byond reasons + // we include D.gc_destroyed to skip things under the cutoff + queue[++queue.len] = list(queue_time, D, D.gc_destroyed) //this is mainly to separate things profile wise. /datum/controller/subsystem/garbage/proc/HardDelete(datum/D) @@ -378,7 +387,7 @@ SUBSYSTEM_DEF(garbage) return find_references() -/datum/proc/find_references() +/datum/proc/find_references(references_to_clear = INFINITY) running_find_references = type if(usr && usr.client) if(usr.client.running_find_references) @@ -406,13 +415,19 @@ SUBSYSTEM_DEF(garbage) normal_globals[global_var] = global.vars[global_var] DoSearchVar(normal_globals, "(global) -> ") //globals testing("Finished searching globals") + if(src.references_to_clear == 0) // Found all expected references! + return for(var/atom/atom_thing) //atoms DoSearchVar(atom_thing, "World -> [atom_thing]") + if(src.references_to_clear == 0) // Found all expected references! + return testing("Finished searching atoms") for (var/datum/datum_thing) //datums DoSearchVar(datum_thing, "World -> [datum_thing]") + if(src.references_to_clear == 0) // Found all expected references! + return testing("Finished searching datums") #ifndef FIND_REF_SKIP_CLIENTS @@ -420,6 +435,8 @@ SUBSYSTEM_DEF(garbage) // IT WILL CRASH!!! for (var/client/client_thing) //clients DoSearchVar(client_thing, "World -> [client_thing]") + if(src.references_to_clear == 0) // Found all expected references! + return testing("Finished searching clients") #endif @@ -455,37 +472,47 @@ SUBSYSTEM_DEF(garbage) #define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) ) #define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST) -/datum/proc/DoSearchVar(X, Xname, recursive_limit = 128) +/datum/proc/DoSearchVar(X, container_name, recursive_limit = 128) if(usr && usr.client && !usr.client.running_find_references) return if (!recursive_limit) return + if(references_to_clear == 0) + return #ifndef FIND_REF_NO_CHECK_TICK CHECK_TICK #endif if(istype(X, /datum)) - var/datum/D = X - if(D.last_find_references == last_find_references) + var/datum/datum_container = X + if(datum_container.last_find_references == last_find_references) return - D.last_find_references = last_find_references - var/list/L = D.vars + datum_container.last_find_references = last_find_references + var/list/vars_list = datum_container.vars - for(var/varname in L) + var/is_atom = FALSE + var/is_area = FALSE + if(isatom(datum_container)) + is_atom = TRUE + if(isarea(datum_container)) + is_area = TRUE + for(var/varname in vars_list) #ifndef FIND_REF_NO_CHECK_TICK CHECK_TICK #endif - if (varname == "vars") + //Fun fact, vis_locs don't count for references + if(varname == "vars" || (is_atom && (varname == "vis_locs" || varname == "overlays" || varname == "underlays" || varname == "filters" || varname == "verbs" || (is_area && varname == "contents")))) continue - var/variable = L[varname] + var/variable = vars_list[varname] if(variable == src) - testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") + testing("Found [src.type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]") + references_to_clear -= 1 else if(islist(variable)) - DoSearchVar(variable, "[Xname] -> [varname] (list)", recursive_limit-1) + DoSearchVar(variable, "[container_name] -> [varname] (list)", recursive_limit-1) else if(islist(X)) var/normal = IS_NORMAL_LIST(X) @@ -494,16 +521,33 @@ SUBSYSTEM_DEF(garbage) CHECK_TICK #endif if (I == src) - testing("Found [src.type] \ref[src] in list [Xname].") + testing("Found [src.type] \ref[src] in list [container_name].") + + // This is dumb as hell I'm sorry + // I don't want the garbage subsystem to count as a ref for the purposes of this number + // If we find all other refs before it I want to early exit, and if we don't I want to keep searching past it + var/ignore_ref = FALSE + var/list/queues = SSgarbage.queues + for(var/list/queue in queues) + if(potential_cache in queue) + ignore_ref = TRUE + break + if(ignore_ref) + testing("[container_name] does not count as a ref for our count") + else + references_to_clear -= 1 + if(references_to_clear == 0) + testing("All references to [type] \ref[src] found, exiting.") + return else if (I && !isnum(I) && normal) if(X[I] == src) - testing("Found [src.type] \ref[src] in list [Xname]\[[I]\]") + testing("Found [src.type] \ref[src] in list [container_name]\[[I]\]") else if(islist(X[I])) - DoSearchVar(X[I], "[Xname]\[[I]\]", recursive_limit-1) + DoSearchVar(X[I], "[container_name]\[[I]\]", recursive_limit-1) else if (islist(I)) var/list/Xlist = X - DoSearchVar(I, "[Xname]\[[Xlist.Find(I)]\] -> list", recursive_limit-1) + DoSearchVar(I, "[container_name]\[[Xlist.Find(I)]\] -> list", recursive_limit-1) #endif diff --git a/code/datums/datum.dm b/code/datums/datum.dm index a0aeed07808..61780203703 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -12,7 +12,12 @@ #ifdef TESTING var/tmp/running_find_references + /// When was this datum last touched by a reftracker? + /// If this value doesn't match with the start of the search + /// We know this datum has never been seen before, and we should check it var/tmp/last_find_references = 0 + /// How many references we're trying to find when searching + var/tmp/references_to_clear = 0 #endif // Default implementation of clean-up code. @@ -54,11 +59,11 @@ cleanup_events(src) if(has_state_machine) - var/list/machines = global.state_machines["\ref[src]"] + var/list/machines = global.state_machines[src] if(length(machines)) for(var/base_type in machines) qdel(machines[base_type]) - global.state_machines -= "\ref[src]" + global.state_machines -= src return QDEL_HINT_QUEUE From 0c15e2dcc2f422c2cc58b0698f8284ad7db1876d Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 16:05:46 -0500 Subject: [PATCH 316/554] Remove ID var from seed piles --- code/game/machinery/vending/_vending.dm | 6 +-- code/modules/hydroponics/seed_storage.dm | 69 +++++++++--------------- 2 files changed, 27 insertions(+), 48 deletions(-) diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm index 866062f2a54..b3036e17317 100644 --- a/code/game/machinery/vending/_vending.dm +++ b/code/game/machinery/vending/_vending.dm @@ -309,10 +309,8 @@ if (href_list["vend"] && !currently_vending) var/key = text2num(href_list["vend"]) - if(!is_valid_index(key, product_records)) - return TOPIC_REFRESH - var/datum/stored_items/vending_products/R = product_records[key] - if(!istype(R)) + var/datum/stored_items/vending_products/R = LAZYACCESS(product_records, key) + if(!R) return TOPIC_REFRESH // This should not happen unless the request from NanoUI was bad diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 2d609cf629e..840d453ce50 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -3,14 +3,12 @@ var/amount var/datum/seed/seed_type // Keeps track of what our seed is var/list/obj/item/seeds/seeds = list() // Tracks actual objects contained in the pile - var/ID -/datum/seed_pile/New(var/obj/item/seeds/O, var/ID) +/datum/seed_pile/New(var/obj/item/seeds/O) name = O.name amount = 1 seed_type = O.seed seeds += O - src.ID = ID /datum/seed_pile/proc/matches(var/obj/item/seeds/O) if (O.seed == seed_type) @@ -195,7 +193,8 @@ if ("soil" in scanner) dat += "NutriWater" dat += "NotesAmount" - for (var/datum/seed_pile/S in piles) + for (var/key in 1 to length(piles)) + var/datum/seed_pile/S = piles[key] var/datum/seed/seed = S.seed_type if(!seed) continue @@ -281,7 +280,7 @@ dat += "LUM " dat += "" dat += "[S.amount]" - dat += "
    Vend Purge" + dat += "Vend Purge" dat += "" dat += "" @@ -292,29 +291,26 @@ if (..()) return var/task = href_list["task"] - var/ID = text2num(href_list["id"]) + var/id = text2num(href_list["id"]) + var/datum/seed_pile/our_pile = LAZYACCESS(piles, id) - for (var/datum/seed_pile/N in piles) - if (N.ID == ID) - if (task == "vend") - var/obj/O = pick(N.seeds) - if (O) - --N.amount - N.seeds -= O - if (N.amount <= 0 || N.seeds.len <= 0) - piles -= N - qdel(N) - flick("[initial(icon_state)]-vend", src) - O.dropInto(loc) - else - piles -= N - qdel(N) - else if (task == "purge") - for (var/obj/O in N.seeds) - qdel(O) - piles -= N - qdel(N) - break + switch(task) + if ("vend") + var/obj/O = pick(our_pile.seeds) + if (O) + --our_pile.amount + our_pile.seeds -= O + if (our_pile.amount <= 0 || our_pile.seeds.len <= 0) + piles -= our_pile + qdel(our_pile) + flick("[initial(icon_state)]-vend", src) + O.dropInto(loc) + if ("purge") + QDEL_LIST(our_pile.seeds) + our_pile.seeds.Cut() + if(!length(our_pile.seeds)) + piles -= our_pile + QDEL_NULL(our_pile) updateUsrDialog() /obj/machinery/seed_storage/attackby(var/obj/item/O, var/mob/user) @@ -334,7 +330,7 @@ if (loaded) user.visible_message(SPAN_NOTICE("\The [user] puts the seeds from \the [O] into \the [src].")) else - to_chat(user, SPAN_WARNING("There are no seeds in \the [O.name].")) + to_chat(user, SPAN_WARNING("There are no seeds in \the [O].")) return TRUE return ..() @@ -349,28 +345,13 @@ O.loc?.storage?.remove_from_storage(null, O, src) O.forceMove(src) - var/newID = 0 for (var/datum/seed_pile/N in piles) if (N.matches(O)) ++N.amount N.seeds += (O) return - else if(N.ID >= newID) - newID = N.ID + 1 - piles += new /datum/seed_pile(O, newID) + piles += new /datum/seed_pile(O) flick("[initial(icon_state)]-vend", src) return - -/obj/machinery/seed_storage/cannot_transition_to(state_path, mob/user) - if(state_path == /decl/machine_construction/default/deconstructed) - var/alert = alert(user, "Are you certain you wish to deconstruct this? It will destroy all seeds stored inside!", "Deconstruct Warning", "Yes", "No") - if(alert != "Yes" || !CanPhysicallyInteract(user)) - return MCS_BLOCK - return ..() - -/obj/machinery/seed_storage/dismantle() - for(var/obj/item/seeds/seed in src) - qdel(seed) // ..() would dump them; this would cause lots of client lag. We did warn them above... - return ..() \ No newline at end of file From 6e2e8d7c0b6ddd61aaa5fc566e563c056c12edd7 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 16:06:20 -0500 Subject: [PATCH 317/554] Fix unnecessary UI updates on storage object destroy --- code/datums/extensions/storage/_storage.dm | 2 ++ code/datums/extensions/storage/_storage_ui.dm | 3 ++- code/game/atoms_init.dm | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/datums/extensions/storage/_storage.dm b/code/datums/extensions/storage/_storage.dm index c79e91a7357..4ff70967e1c 100644 --- a/code/datums/extensions/storage/_storage.dm +++ b/code/datums/extensions/storage/_storage.dm @@ -252,6 +252,8 @@ var/global/list/_test_storage_items = list() storage_ui?.on_insertion() /datum/storage/proc/update_ui_after_item_removal(obj/item/removed) + if(QDELETED(holder)) + return prepare_ui() storage_ui?.on_post_remove() diff --git a/code/datums/extensions/storage/_storage_ui.dm b/code/datums/extensions/storage/_storage_ui.dm index 6f4db924f32..a3e1f23bfcb 100644 --- a/code/datums/extensions/storage/_storage_ui.dm +++ b/code/datums/extensions/storage/_storage_ui.dm @@ -216,7 +216,8 @@ closer.screen_loc = "LEFT+[SCREEN_LOC_MOD_FIRST + cols + 1]:[SCREEN_LOC_MOD_DIVIDED],BOTTOM+[SCREEN_LOC_MOD_SECOND]:[SCREEN_LOC_MOD_DIVIDED]" /datum/storage_ui/default/proc/space_orient_objs() - + if(QDELETED(_storage?.holder)) // don't bother if we've been deleted + return var/baseline_max_storage_space = DEFAULT_BOX_STORAGE //storage size corresponding to 224 pixels var/storage_cap_width = 2 //length of sprite for start and end of the box representing total storage space var/stored_cap_width = 4 //length of sprite for start and end of the box representing the stored item diff --git a/code/game/atoms_init.dm b/code/game/atoms_init.dm index 3a2f3b619c1..d1cd533c796 100644 --- a/code/game/atoms_init.dm +++ b/code/game/atoms_init.dm @@ -80,7 +80,7 @@ /atom/Destroy() // must be done before deletion // TODO: ADD PRE_DELETION OBSERVATION - if(isatom(loc) && loc.storage) + if(isatom(loc) && loc.storage && !QDELETED(loc.storage)) loc.storage.on_item_pre_deletion(src) UNQUEUE_TEMPERATURE_ATOM(src) QDEL_NULL(reagents) @@ -94,7 +94,7 @@ QDEL_NULL(atom_codex_ref) var/atom/oldloc = loc . = ..() - if(isatom(oldloc) && oldloc.storage) + if(isatom(oldloc) && oldloc.storage && !QDELETED(loc.storage)) oldloc.storage.on_item_post_deletion(src) // must be done after deletion // This might need to be moved onto a Del() override at some point. QDEL_NULL(storage) From 2dbbf4d3edb84f4359d0d1b3e76d2889fa9c9bc9 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 16:10:36 -0500 Subject: [PATCH 318/554] Optimize icon state checks via more caching --- code/game/objects/item_mob_overlay.dm | 28 +++++++++++++++---- code/modules/client/ui_styles/_ui_style.dm | 2 +- code/modules/economy/worth_currency.dm | 4 +-- code/modules/persistence/graffiti.dm | 6 ++-- code/modules/projectiles/ammunition.dm | 3 +- .../metadata/accessory_metadata_gradient.dm | 3 +- code/unit_tests/alt_appearances_test.dm | 3 +- code/unit_tests/closets.dm | 8 +++--- code/unit_tests/clothing.dm | 2 +- code/unit_tests/job_tests.dm | 8 +++--- code/unit_tests/mob_tests.dm | 6 ++-- 11 files changed, 44 insertions(+), 29 deletions(-) diff --git a/code/game/objects/item_mob_overlay.dm b/code/game/objects/item_mob_overlay.dm index d6881129c23..fe253ea6f0b 100644 --- a/code/game/objects/item_mob_overlay.dm +++ b/code/game/objects/item_mob_overlay.dm @@ -8,13 +8,14 @@ var/global/list/bodypart_to_slot_lookup_table = list( ) /obj/item/proc/reconsider_single_icon(var/update_icon) - use_single_icon = check_state_in_icon(ICON_STATE_INV, icon) || check_state_in_icon(ICON_STATE_WORLD, icon) + var/list/icon_states = get_states_in_icon_cached(icon) // pre-cache to make our up-to-three checks faster + // except now we only do two because i rewrote it + has_inventory_icon = use_single_icon = icon_states[ICON_STATE_INV] + if(!has_inventory_icon) + use_single_icon = icon_states[ICON_STATE_WORLD] if(use_single_icon) - has_inventory_icon = check_state_in_icon(ICON_STATE_INV, icon) icon_state = get_world_inventory_state() . = TRUE - else - has_inventory_icon = FALSE if(. || update_icon) update_icon() @@ -27,6 +28,23 @@ var/global/list/icon_state_cache = list() // isicon() is apparently quite expensive so short-circuit out early if we can. if(!istext(checkstate) || isnull(checkicon) || !(isfile(checkicon) || isicon(checkicon))) return FALSE + var/list/check = _fetch_icon_state_cache_entry(checkicon) // should never return null once we reach this point + return check[checkstate] + +/// A proc for getting an associative list of icon states in an icon. +/// Uses the same cache as check_state_in_icon. +/// Does not copy, MUST NOT BE MUTATED. +/proc/get_states_in_icon_cached(checkicon) /* as OD_MAP(text, OD_BOOL) */ + return _fetch_icon_state_cache_entry(checkicon) || list() + +/// get_states_in_icon_cached but it does a copy, so the return value can be mutated. +/proc/get_states_in_icon(checkicon) /* as OD_MAP(text, OD_BOOL) */ + var/list/out = get_states_in_icon_cached(checkicon) + return out.Copy() + +/proc/_fetch_icon_state_cache_entry(checkicon) + if(isnull(checkicon) || !(isfile(checkicon) || isicon(checkicon))) + return null var/checkkey = "\ref[checkicon]" var/list/check = global.icon_state_cache[checkkey] if(!check) @@ -34,7 +52,7 @@ var/global/list/icon_state_cache = list() for(var/istate in icon_states(checkicon)) check[istate] = TRUE global.icon_state_cache[checkkey] = check - . = check[checkstate] + return check /obj/item/proc/update_world_inventory_state() if(use_single_icon && has_inventory_icon) diff --git a/code/modules/client/ui_styles/_ui_style.dm b/code/modules/client/ui_styles/_ui_style.dm index 5e0a5ba34c4..1a5885cfac6 100644 --- a/code/modules/client/ui_styles/_ui_style.dm +++ b/code/modules/client/ui_styles/_ui_style.dm @@ -46,7 +46,7 @@ var/check_icon = icons[ui_key] var/list/missing_states = list() var/list/checking_states = states_to_check[ui_key] - var/list/remaining_states = icon_states(check_icon) + var/list/remaining_states = get_states_in_icon(check_icon) for(var/check_state in checking_states) remaining_states -= check_state if(!check_state_in_icon(check_state, check_icon)) diff --git a/code/modules/economy/worth_currency.dm b/code/modules/economy/worth_currency.dm index ed12b938e92..9e5de940b12 100644 --- a/code/modules/economy/worth_currency.dm +++ b/code/modules/economy/worth_currency.dm @@ -70,13 +70,13 @@ if(!name_singular) . += "No singular name set." - var/list/coinage_states = icon_states(icon) + var/list/coinage_states = get_states_in_icon_cached(icon) // cache this to avoid excessive ref() usage for(var/datum/denomination/denomination in denominations) if(!istext(denomination.name)) . += "Non-text name found for '[denomination.type]'." else if(!(denomination.state in coinage_states)) . += "State '[denomination.state]' not found in icon file for '[denomination.type]'." - else if(denomination.mark && !(denomination.mark in coinage_states)) + else if(denomination.mark && !coinage_states[denomination.mark]) . += "Mark state '[denomination.mark]' not found in icon file for '[denomination.type]'." else if(!isnum(denomination.marked_value)) . += "Non-numerical denomination marked value found for '[denomination]'." diff --git a/code/modules/persistence/graffiti.dm b/code/modules/persistence/graffiti.dm index e9afbbad8d8..1ed8a188417 100644 --- a/code/modules/persistence/graffiti.dm +++ b/code/modules/persistence/graffiti.dm @@ -14,10 +14,10 @@ var/author = "unknown" /obj/effect/decal/writing/Initialize(mapload, var/_age, var/_message, var/_author) - var/list/random_icon_states = icon_states(icon) + var/list/random_icon_states = get_states_in_icon(icon) for(var/obj/effect/decal/writing/W in loc) - random_icon_states.Remove(W.icon_state) - if(random_icon_states.len) + random_icon_states -= W.icon_state + if(length(random_icon_states)) icon_state = pick(random_icon_states) SSpersistence.track_value(src, /decl/persistence_handler/graffiti) . = ..(mapload) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index f163d0f64c7..a32f2909997 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -270,10 +270,9 @@ var/global/list/magazine_icondata_states = list() /proc/magazine_icondata_cache_add(var/obj/item/ammo_magazine/M) var/list/icon_keys = list() var/list/ammo_states = list() - var/list/states = icon_states(M.icon) for(var/i = 0, i <= M.max_ammo, i++) var/ammo_state = "[M.icon_state]-[i]" - if(ammo_state in states) + if(check_state_in_icon(ammo_state, M.icon)) icon_keys += i ammo_states += ammo_state diff --git a/code/modules/sprite_accessories/metadata/accessory_metadata_gradient.dm b/code/modules/sprite_accessories/metadata/accessory_metadata_gradient.dm index 8b5d7b48734..d134b6782f8 100644 --- a/code/modules/sprite_accessories/metadata/accessory_metadata_gradient.dm +++ b/code/modules/sprite_accessories/metadata/accessory_metadata_gradient.dm @@ -19,8 +19,7 @@ var/list/selectable_labels_to_states = list() /decl/sprite_accessory_metadata/gradient/Initialize() - var/list/selectable = icon_states(icon) - for(var/state in selectable) + for(var/state in get_states_in_icon_cached(icon)) if(!selectable_states_to_labels[state]) selectable_states_to_labels[state] = capitalize(state) for(var/state in selectable_states_to_labels) diff --git a/code/unit_tests/alt_appearances_test.dm b/code/unit_tests/alt_appearances_test.dm index 1bfd0ed325e..d1c4b22a8e8 100644 --- a/code/unit_tests/alt_appearances_test.dm +++ b/code/unit_tests/alt_appearances_test.dm @@ -20,9 +20,8 @@ for(var/ca_type in decls_repository.get_decl_paths_of_subtype(/decl/cardborg_appearance)) var/decl/cardborg_appearance/ca = ca_type - var/list/existing_icon_states = icon_states(initial(ca.icon)) var/icon_state = initial(ca.icon_state) - if(!(icon_state in existing_icon_states)) + if(!check_state_in_icon(icon_state, initial(ca.icon))) log_unit_test("Icon state [icon_state] is missing.") failed = TRUE if(failed) diff --git a/code/unit_tests/closets.dm b/code/unit_tests/closets.dm index 9bc236f8ff9..10688fd7231 100644 --- a/code/unit_tests/closets.dm +++ b/code/unit_tests/closets.dm @@ -29,18 +29,18 @@ if(!closet.base_icon) LAZYADD(bad_base_icon, "[closet.type]") else - var/list/base_states = icon_states(closet.base_icon) + var/list/base_states = get_states_in_icon_cached(closet.base_icon) for(var/thing in check_base_states) - if(!(thing in base_states)) + if(!base_states[thing]) LAZYADD(bad_base_state, "[closet.type] - [thing] - [closet.base_icon]") if(LAZYLEN(closet.decals) && !closet.decal_icon) LAZYADD(bad_decal_icon, "[closet.type]") else - var/list/decal_states = icon_states(closet.decal_icon) + var/list/decal_states = get_states_in_icon_cached(closet.decal_icon) for(var/thing in closet.decals) if(isnull(closet.decals[thing])) LAZYADD(bad_decal_colour, "[check_appearance] - [thing]") - if(!(thing in decal_states)) + if(!decal_states[thing]) LAZYADD(bad_decal_state, "[check_appearance] - [thing] - [closet.decal_icon]") if( \ diff --git a/code/unit_tests/clothing.dm b/code/unit_tests/clothing.dm index 2b3889695c3..8219e6d0418 100644 --- a/code/unit_tests/clothing.dm +++ b/code/unit_tests/clothing.dm @@ -99,7 +99,7 @@ generated_tokens += "[token][clothes.markings_state_modifier]" // Keep track of which states we've looked for or otherwise evaluated for later state checking. - var/list/check_states = icon_states(clothes.icon) + var/list/check_states = get_states_in_icon(clothes.icon) // Validate against the list of generated tokens. for(var/gen_token in generated_tokens) diff --git a/code/unit_tests/job_tests.dm b/code/unit_tests/job_tests.dm index b1295165734..858063c9bad 100644 --- a/code/unit_tests/job_tests.dm +++ b/code/unit_tests/job_tests.dm @@ -42,20 +42,20 @@ var/failed_jobs = 0 var/failed_sanity_checks = 0 - var/job_huds = icon_states(global.using_map.id_hud_icons) + var/list/job_huds = get_states_in_icon_cached(global.using_map.id_hud_icons) - if(!("" in job_huds)) + if(!job_huds[""]) log_bad("Sanity Check - Missing default/unnamed HUD icon") failed_sanity_checks++ - if(!("hudunknown" in job_huds)) + if(!job_huds["hudunknown"]) log_bad("Sanity Check - Missing HUD icon: hudunknown") failed_sanity_checks++ for(var/job_name in SSjobs.titles_to_datums) var/datum/job/J = SSjobs.titles_to_datums[job_name] var/hud_icon_state = J.hud_icon - if(!(hud_icon_state in job_huds)) + if(!job_huds[hud_icon_state]) log_bad("[J.title] - Missing HUD icon: [hud_icon_state]") failed_jobs++ diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index 5867dd2ca90..0228ea80341 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -260,15 +260,15 @@ var/global/default_mobloc = null fail("[icon_file] is not a valid icon file.") return 1 - var/list/valid_states = icon_states(icon_file) + var/list/valid_states = get_states_in_icon_cached(icon_file) - if(!valid_states.len) + if(!length(valid_states)) return 1 for(var/i=1, i<=SSrobots.all_module_names.len, i++) var/modname = lowertext(SSrobots.all_module_names[i]) var/bad_msg = "[ascii_red]--------------- [modname]" - if(!(modname in valid_states)) + if(!valid_states[modname]) log_unit_test("[bad_msg] does not contain a valid icon state in [icon_file][ascii_reset]") failed=1 From 07cf2d127f2e6a06471002fd3229894ecda9a350 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 16:11:32 -0500 Subject: [PATCH 319/554] Fix bookcase icon state check --- code/game/objects/structures/bookcase.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index 06d58e357aa..944bcd3fe0f 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -168,7 +168,7 @@ var/global/list/station_bookcases = list() add_overlay(book_overlay) var/page_state = "[book_overlay.icon_state]-pages" - if(check_state_in_icon(book_overlay.icon, page_state)) + if(check_state_in_icon(page_state, book_overlay.icon)) var/image/page_overlay = overlay_image(book_overlay.icon, page_state, COLOR_WHITE, RESET_COLOR) page_overlay.pixel_x = book_overlay.pixel_x page_overlay.pixel_y = book_overlay.pixel_y From a05b48bfd240f9eb9ad412be1f47ea92d56a681b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 16:12:40 -0500 Subject: [PATCH 320/554] Make state machine list use hardrefs --- code/datums/extensions/state_machine.dm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/code/datums/extensions/state_machine.dm b/code/datums/extensions/state_machine.dm index 63e58f0dd67..edba84c7965 100644 --- a/code/datums/extensions/state_machine.dm +++ b/code/datums/extensions/state_machine.dm @@ -3,16 +3,15 @@ var/global/list/state_machines = list() /proc/get_state_machine(var/datum/holder, var/base_type) if(istype(holder) && base_type && holder.has_state_machine) - var/list/machines = global.state_machines["\ref[holder]"] + var/list/machines = global.state_machines[holder] return islist(machines) && machines[base_type] /proc/add_state_machine(var/datum/holder, var/datum/state_machine/fsm_type) if(istype(holder) && fsm_type) - var/holder_ref = "\ref[holder]" - var/list/machines = global.state_machines[holder_ref] + var/list/machines = global.state_machines[holder] if(!islist(machines)) machines = list() - global.state_machines[holder_ref] = machines + global.state_machines[holder] = machines var/base_type = fsm_type::base_type if(!machines[base_type]) var/datum/state_machine/machine = new fsm_type(holder) @@ -22,12 +21,11 @@ var/global/list/state_machines = list() /proc/remove_state_machine(var/datum/holder, var/base_type) if(istype(holder) && base_type && holder.has_state_machine) - var/holder_ref = "\ref[holder]" - var/list/machines = global.state_machines[holder_ref] + var/list/machines = global.state_machines[holder] if(length(machines)) machines -= base_type if(!length(machines)) - global.state_machines -= holder_ref + global.state_machines -= holder holder.has_state_machine = FALSE return TRUE return FALSE From 7b614a7de91a275ee9c0d9435ce847ae4ae4a8ce Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 16:13:52 -0500 Subject: [PATCH 321/554] Fix unnecessary .name usage in text strings --- code/game/objects/items/blueprints.dm | 2 +- code/game/objects/items/devices/lightreplacer.dm | 2 +- code/game/objects/items/devices/paint_sprayer.dm | 2 +- code/game/objects/items/weapons/soap.dm | 8 ++++---- .../structures/stool_bed_chair_nest_sofa/wheelchair.dm | 2 +- code/modules/mechs/mech_wreckage.dm | 2 +- code/modules/mob/living/living_defense.dm | 2 +- code/modules/multiz/movement.dm | 2 +- code/modules/overmap/ships/landable.dm | 6 +++--- code/modules/paperwork/paper_bundle.dm | 2 +- code/modules/surgery/necrotic.dm | 6 +++--- code/modules/surgery/organs_internal.dm | 6 +++--- code/modules/surgery/robotics.dm | 4 ++-- 13 files changed, 23 insertions(+), 23 deletions(-) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index c9c67e53fc7..5a082bb9180 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -59,7 +59,7 @@ return FALSE name += " - [S.name]" - desc = "Blueprints of \the [S.name]. There is a \"Classified\" stamp and several coffee stains on it." + desc = "Blueprints of \the [S]. There is a \"Classified\" stamp and several coffee stains on it." valid_z_levels += S.map_z area_prefix = S.name return TRUE diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 3565259a08e..34115f49b63 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -110,7 +110,7 @@ if(!user.try_unequip(L)) return TRUE AddUses(1) - to_chat(user, "You insert \the [L.name] into \the [src]. You have [uses] light\s remaining.") + to_chat(user, "You insert \the [L] into \the [src]. You have [uses] light\s remaining.") qdel(L) return TRUE else diff --git a/code/game/objects/items/devices/paint_sprayer.dm b/code/game/objects/items/devices/paint_sprayer.dm index a9dbd8a0878..88c1e1195d7 100644 --- a/code/game/objects/items/devices/paint_sprayer.dm +++ b/code/game/objects/items/devices/paint_sprayer.dm @@ -223,7 +223,7 @@ return FALSE if(!flooring.can_paint || F.is_floor_damaged()) - to_chat(user, SPAN_WARNING("\The [src] cannot paint \the [F.name].")) + to_chat(user, SPAN_WARNING("\The [src] cannot paint \the [F].")) return FALSE var/list/decal_data = decals[decal] diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index c14047c71f6..7667753288a 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -68,13 +68,13 @@ //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn var/cleaned = FALSE if(user.client && (target in user.client.screen)) - to_chat(user, SPAN_NOTICE("You need to take that [target.name] off before cleaning it.")) + to_chat(user, SPAN_NOTICE("You need to take \the [target] off before cleaning it.")) else if(istype(target,/obj/effect/decal/cleanable/blood)) - to_chat(user, SPAN_NOTICE("You scrub \the [target.name] out.")) + to_chat(user, SPAN_NOTICE("You scrub \the [target] out.")) target.clean() //Blood is a cleanable decal, therefore needs to be accounted for before all cleanable decals. cleaned = TRUE else if(istype(target,/obj/effect/decal/cleanable)) - to_chat(user, SPAN_NOTICE("You scrub \the [target.name] out.")) + to_chat(user, SPAN_NOTICE("You scrub \the [target] out.")) qdel(target) cleaned = TRUE else if(isturf(target) || istype(target, /obj/structure/catwalk)) @@ -90,7 +90,7 @@ to_chat(user, SPAN_NOTICE("You wet \the [src] in the sink.")) wet() else - to_chat(user, SPAN_NOTICE("You clean \the [target.name].")) + to_chat(user, SPAN_NOTICE("You clean \the [target].")) target.clean() //Clean bloodied atoms. Blood decals themselves need to be handled above. cleaned = TRUE diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm index caa3e14df93..67640a583fd 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm @@ -141,7 +141,7 @@ user.visible_message("[user] starts to lay out \the [src].") if(do_after(user, 4 SECONDS, src)) var/obj/structure/bed/chair/wheelchair/W = new structure_form_type(get_turf(user)) - user.visible_message(SPAN_NOTICE("[user] lays out \the [W.name].")) + user.visible_message(SPAN_NOTICE("[user] lays out \the [W].")) W.add_fingerprint(user) qdel(src) diff --git a/code/modules/mechs/mech_wreckage.dm b/code/modules/mechs/mech_wreckage.dm index b22b3923107..a78f4c7596c 100644 --- a/code/modules/mechs/mech_wreckage.dm +++ b/code/modules/mechs/mech_wreckage.dm @@ -12,7 +12,7 @@ /obj/structure/mech_wreckage/Initialize(mapload, var/mob/living/exosuit/exosuit, var/gibbed) . = ..(mapload) if(exosuit) - name = "wreckage of \the [exosuit.name]" + name = "wreckage of \the [exosuit]" loot_pool = list() if(!gibbed) for(var/obj/item/thing in list(exosuit.arms, exosuit.legs, exosuit.head, exosuit.body)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index a74526afdd4..4cacbc889af 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -189,7 +189,7 @@ visible_message(SPAN_NOTICE("\The [O] misses \the [src] narrowly!")) return FALSE - visible_message(SPAN_DANGER("\The [src] is hit [affecting ? "in \the [affecting.name] " : ""]by \the [O]!")) + visible_message(SPAN_DANGER("\The [src] is hit [affecting ? "in \the [affecting] " : ""]by \the [O]!")) if(TT?.thrower?.client) admin_attack_log(TT.thrower, src, "Threw \an [O] at the victim.", "Had \an [O] thrown at them.", "threw \an [O] at") try_embed_in_mob(TT.thrower, O, zone, throw_damage, dtype, null, affecting, direction = TT.init_dir) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index a3009921249..585f57d0d7e 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -225,7 +225,7 @@ for(var/mob/living/M in landing.contents) if(M == src) continue - visible_message("\The [src] hits \the [M.name]!") + visible_message("\The [src] hits \the [M]!") M.take_overall_damage(fall_damage) return TRUE return FALSE diff --git a/code/modules/overmap/ships/landable.dm b/code/modules/overmap/ships/landable.dm index 375e4253ec2..24f4d999c0a 100644 --- a/code/modules/overmap/ships/landable.dm +++ b/code/modules/overmap/ships/landable.dm @@ -231,14 +231,14 @@ if(SHIP_STATUS_LANDED) var/obj/effect/overmap/visitable/location = loc if(istype(loc, /obj/effect/overmap/visitable/sector)) - return "Landed on \the [location.name]. Use secondary thrust to get clear before activating primary engines." + return "Landed on \the [location]. Use secondary thrust to get clear before activating primary engines." if(istype(loc, /obj/effect/overmap/visitable/ship)) - return "Docked with \the [location.name]. Use secondary thrust to get clear before activating primary engines." + return "Docked with \the [location]. Use secondary thrust to get clear before activating primary engines." return "Docked with an unknown object." if(SHIP_STATUS_ENCOUNTER) var/datum/shuttle/autodock/overmap/child_shuttle = SSshuttle.shuttles[shuttle] var/obj/effect/overmap/visitable/location = global.overmap_sectors[num2text(child_shuttle.current_location.z)] - return "Maneuvering nearby \the [location.name]." + return "Maneuvering nearby \the [location]." if(SHIP_STATUS_TRANSIT) return "Maneuvering under secondary thrust." if(SHIP_STATUS_OVERMAP) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index bf75bc60846..b01ab304426 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -40,7 +40,7 @@ // merging bundles else if(istype(W, /obj/item/paper_bundle) && merge(W, user, cur_page)) - to_chat(user, SPAN_NOTICE("You add \the [W.name] to \the [name].")) + to_chat(user, SPAN_NOTICE("You add \the [W] to \the [name].")) return TRUE // burning diff --git a/code/modules/surgery/necrotic.dm b/code/modules/surgery/necrotic.dm index 14b39b1f739..6f41080ae0d 100644 --- a/code/modules/surgery/necrotic.dm +++ b/code/modules/surgery/necrotic.dm @@ -133,15 +133,15 @@ var/list/dead_organs if(E.status & ORGAN_DEAD) var/image/radial_button = image(icon = E.icon, icon_state = E.icon_state) - radial_button.name = "Regenerate \the [E.name]" + radial_button.name = "Regenerate \the [E]" LAZYSET(dead_organs, E.organ_tag, radial_button) for(var/obj/item/organ/I in target.get_internal_organs()) if(I && (I.status & ORGAN_DEAD) && I.parent_organ == target_zone) if(!I.can_recover()) - to_chat(user, SPAN_WARNING("\The [I.name] is beyond saving.")) + to_chat(user, SPAN_WARNING("\The [I] is beyond saving.")) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Regenerate \the [I.name]" + radial_button.name = "Regenerate \the [I]" LAZYSET(dead_organs, I.organ_tag, radial_button) if(!LAZYLEN(dead_organs)) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index f6b9bffb28e..916db17c1d2 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -104,7 +104,7 @@ for(var/obj/item/organ/I in target.get_internal_organs()) if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Detach \the [I.name]" + radial_button.name = "Detach \the [I]" LAZYSET(attached_organs, I.organ_tag, radial_button) if(!LAZYLEN(attached_organs)) to_chat(user, SPAN_WARNING("You can't find any organs to separate.")) @@ -158,7 +158,7 @@ for(var/obj/item/organ/internal/I in affected.implants) if(I.status & ORGAN_CUT_AWAY) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Remove \the [I.name]" + radial_button.name = "Remove \the [I]" LAZYSET(removable_organs, I, radial_button) if(!LAZYLEN(removable_organs)) to_chat(user, SPAN_WARNING("You can't find any removable organs.")) @@ -336,7 +336,7 @@ for(var/obj/item/organ/I in (affected.implants|affected.internal_organs)) if(I.status & ORGAN_CUT_AWAY) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Attach \the [I.name]" + radial_button.name = "Attach \the [I]" LAZYSET(attachable_organs, I, radial_button) if(!LAZYLEN(attachable_organs)) diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 44020605dee..8695ab98499 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -416,7 +416,7 @@ for(var/obj/item/organ/I in target.get_internal_organs()) if(I && !(I.status & ORGAN_CUT_AWAY) && !BP_IS_CRYSTAL(I) && I.parent_organ == target_zone) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Detach \the [I.name]" + radial_button.name = "Detach \the [I]" LAZYSET(attached_organs, I.organ_tag, radial_button) if(!LAZYLEN(attached_organs)) to_chat(user, SPAN_WARNING("There are no appropriate internal components to decouple.")) @@ -461,7 +461,7 @@ for(var/obj/item/organ/I in affected.implants) if ((I.status & ORGAN_CUT_AWAY) && BP_IS_PROSTHETIC(I) && !BP_IS_CRYSTAL(I) && (I.parent_organ == target_zone)) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Reattach \the [I.name]" + radial_button.name = "Reattach \the [I]" LAZYSET(removable_organs, I.organ_tag, radial_button) var/organ_to_replace = show_radial_menu(user, tool, removable_organs, radius = 42, require_near = TRUE, use_labels = RADIAL_LABELS_OFFSET, check_locs = list(tool)) if(!organ_to_replace) From 2d3c37fff214de57a6a36248996bc85fb3d46b40 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 16:19:54 -0500 Subject: [PATCH 322/554] Make NanoUI use hardrefs for src_object --- .../controllers/subsystems/processing/nano.dm | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/code/controllers/subsystems/processing/nano.dm b/code/controllers/subsystems/processing/nano.dm index dfaae9e7999..dd358012c92 100644 --- a/code/controllers/subsystems/processing/nano.dm +++ b/code/controllers/subsystems/processing/nano.dm @@ -37,11 +37,10 @@ PROCESSING_SUBSYSTEM_DEF(nano) * @return /nanoui Returns the found ui, or null if none exists */ /datum/controller/subsystem/processing/nano/proc/get_open_ui(mob/user, src_object, ui_key) - var/src_object_key = "\ref[src_object]" - if (!open_uis[src_object_key] || !open_uis[src_object_key][ui_key]) + if (!open_uis[src_object] || !open_uis[src_object][ui_key]) return - for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) + for (var/datum/nanoui/ui in open_uis[src_object][ui_key]) if (ui.user == user) return ui @@ -54,12 +53,11 @@ PROCESSING_SUBSYSTEM_DEF(nano) */ /datum/controller/subsystem/processing/nano/proc/update_uis(src_object) . = 0 - var/src_object_key = "\ref[src_object]" - if (!open_uis[src_object_key]) + if (!open_uis[src_object]) return - for (var/ui_key in open_uis[src_object_key]) - for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) + for (var/ui_key in open_uis[src_object]) + for (var/datum/nanoui/ui in open_uis[src_object][ui_key]) if(ui.src_object && ui.user && ui.src_object.nano_host()) ui.try_update(1) .++ @@ -78,12 +76,11 @@ PROCESSING_SUBSYSTEM_DEF(nano) if (!length(open_uis)) return - var/src_object_key = "\ref[src_object]" - if (!open_uis[src_object_key]) + if (!open_uis[src_object]) return - for (var/ui_key in open_uis[src_object_key]) - for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) + for (var/ui_key in open_uis[src_object]) + for (var/datum/nanoui/ui in open_uis[src_object][ui_key]) ui.close() // If it's missing src_object or user, we want to close it even more. .++ @@ -134,9 +131,9 @@ PROCESSING_SUBSYSTEM_DEF(nano) * @return nothing */ /datum/controller/subsystem/processing/nano/proc/ui_opened(datum/nanoui/ui) - var/src_object_key = "\ref[ui.src_object]" - LAZYINITLIST(open_uis[src_object_key]) - LAZYDISTINCTADD(open_uis[src_object_key][ui.ui_key], ui) + var/src_object = ui.src_object + LAZYINITLIST(open_uis[src_object]) + LAZYDISTINCTADD(open_uis[src_object][ui.ui_key], ui) LAZYDISTINCTADD(ui.user.open_uis, ui) START_PROCESSING(SSnano, ui) @@ -149,18 +146,18 @@ PROCESSING_SUBSYSTEM_DEF(nano) * @return int 0 if no ui was removed, 1 if removed successfully */ /datum/controller/subsystem/processing/nano/proc/ui_closed(var/datum/nanoui/ui) - var/src_object_key = "\ref[ui.src_object]" - if (!open_uis[src_object_key] || !open_uis[src_object_key][ui.ui_key]) + var/src_object = ui.src_object + if (!open_uis[src_object] || !open_uis[src_object][ui.ui_key]) return 0 // wasn't open STOP_PROCESSING(SSnano, ui) if(ui.user) // Sanity check in case a user has been deleted (say a blown up borg watching the alarm interface) LAZYREMOVE(ui.user.open_uis, ui) - open_uis[src_object_key][ui.ui_key] -= ui - if(!length(open_uis[src_object_key][ui.ui_key])) - open_uis[src_object_key] -= ui.ui_key - if(!length(open_uis[src_object_key])) - open_uis -= src_object_key + open_uis[src_object][ui.ui_key] -= ui + if(!length(open_uis[src_object][ui.ui_key])) + open_uis[src_object] -= ui.ui_key + if(!length(open_uis[src_object])) + open_uis -= src_object return 1 /** From 3cbff133ab22ef1077133bd5df06b2891f3e16ad Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 17:37:06 -0500 Subject: [PATCH 323/554] Fix del the world with new SSgarbage queues --- code/unit_tests/del_the_world.dm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/unit_tests/del_the_world.dm b/code/unit_tests/del_the_world.dm index 3a9c575e699..9d3f151e81d 100644 --- a/code/unit_tests/del_the_world.dm +++ b/code/unit_tests/del_the_world.dm @@ -64,8 +64,9 @@ if(!length(filter_queue)) filter_queue_finished = TRUE break - var/oldest_item = filter_queue[1] - var/qdel_time = filter_queue[oldest_item] + var/list/oldest_packet = filter_queue[1] + //Pull out the time we inserted at + var/qdel_time = oldest_packet[GC_QUEUE_ITEM_GCD_DESTROYED] if(qdel_time > start_time) // Everything is in the check queue now! filter_queue_finished = TRUE break @@ -89,9 +90,9 @@ garbage_queue_processed = TRUE break - var/oldest_packet = check_queue[1] - //Pull out the time we deld at - var/qdeld_at = check_queue[oldest_packet] + var/list/oldest_packet = filter_queue[1] + //Pull out the time we inserted at + var/qdeld_at = oldest_packet[GC_QUEUE_ITEM_GCD_DESTROYED] //If we've found a packet that got del'd later then we finished, then all our shit has been processed if(qdeld_at > start_time) garbage_queue_processed = TRUE From 0fa9e1fe424fde5993d1d2375db344e6534971ad Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 18:03:44 -0500 Subject: [PATCH 324/554] Fix harddel issues found by improved GC --- .../objects/items/devices/transfer_valve.dm | 21 +++++++++++++++++-- code/game/objects/items/weapons/ecigs.dm | 4 ++++ code/modules/assembly/assembly.dm | 7 ++----- code/modules/clothing/masks/voice.dm | 4 ++++ code/modules/mechs/equipment/_equipment.dm | 4 ---- code/modules/mechs/equipment/medical.dm | 2 +- code/modules/mechs/mech.dm | 5 ++++- code/modules/projectiles/ammunition.dm | 4 ++++ 8 files changed, 38 insertions(+), 13 deletions(-) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index b83f35bca48..2f2506b6aa0 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -7,11 +7,27 @@ var/obj/item/tank/tank_one var/obj/item/tank/tank_two var/obj/item/assembly/attached_device - var/mob/attacher = null + var/weakref/attacher_ref = null var/valve_open = 0 var/toggle = 1 movable_flags = MOVABLE_FLAG_PROXMOVE +/obj/item/transfer_valve/Destroy() + if(!QDELETED(tank_one)) + QDEL_NULL(tank_one) + else + tank_one = null + if(!QDELETED(tank_two)) + QDEL_NULL(tank_two) + else + tank_two = null + if(!QDELETED(attached_device)) + QDEL_NULL(attached_device) + else + attached_device = null + attacher_ref = null + return ..() + /obj/item/transfer_valve/attackby(obj/item/item, mob/user) var/turf/location = get_turf(src) // For admin logs if(istype(item, /obj/item/tank)) @@ -56,7 +72,7 @@ global.bombers += "[key_name(user)] attached a [item] to a transfer valve." message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (JMP)") log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") - attacher = user + attacher_ref = weakref(user) . = TRUE if(.) update_icon() @@ -189,6 +205,7 @@ var/area/A = get_area(bombturf) var/attacher_name = "" + var/mob/attacher = attacher_ref.resolve() if(!attacher) attacher_name = "Unknown" else diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index dc05320c090..0a55a70a950 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -22,6 +22,10 @@ ec_cartridge = new cartridge_type(src) . = ..() +/obj/item/clothing/mask/smokable/ecig/Destroy() + QDEL_NULL(ec_cartridge) + return ..() + /obj/item/clothing/mask/smokable/ecig/setup_power_supply(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) loaded_cell_type = loaded_cell_type || /obj/item/cell/device/standard accepted_cell_type = accepted_cell_type || /obj/item/cell/device diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index a4cf742c410..47dcc913a45 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -12,7 +12,7 @@ var/secured = 1 var/list/attached_overlays = null - var/obj/item/assembly_holder/holder = null + var/obj/item/assembly_holder/holder = null // currently can be a TTV or assemblyholder, todo make ttv use assemblyholder var/cooldown = 0//To prevent spam var/wires = WIRE_RECEIVE | WIRE_PULSE @@ -24,10 +24,7 @@ /obj/item/assembly/Destroy() if(!QDELETED(holder)) - if(holder.a_left == src) - holder.a_left = null - if(holder.a_right == src) - holder.a_right = null + // the holder has the responsibility to clear its associated vars on destroy QDEL_NULL(holder) else holder = null diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm index edee4acd8eb..8ecc47d727c 100644 --- a/code/modules/clothing/masks/voice.dm +++ b/code/modules/clothing/masks/voice.dm @@ -30,3 +30,7 @@ /obj/item/clothing/mask/chameleon/voice/Initialize() . = ..() changer = new(src) + +/obj/item/clothing/mask/chameleon/voice/Destroy() + QDEL_NULL(changer) + return ..() diff --git a/code/modules/mechs/equipment/_equipment.dm b/code/modules/mechs/equipment/_equipment.dm index 03ba4a1ac81..9df6c691597 100644 --- a/code/modules/mechs/equipment/_equipment.dm +++ b/code/modules/mechs/equipment/_equipment.dm @@ -71,10 +71,6 @@ owner = null canremove = TRUE -/obj/item/mech_equipment/Destroy() - owner = null - . = ..() - /obj/item/mech_equipment/proc/get_effective_obj() return src diff --git a/code/modules/mechs/equipment/medical.dm b/code/modules/mechs/equipment/medical.dm index 7c39947f122..4aadea64370 100644 --- a/code/modules/mechs/equipment/medical.dm +++ b/code/modules/mechs/equipment/medical.dm @@ -22,7 +22,7 @@ /obj/item/mech_equipment/sleeper/uninstalled() . = ..() - sleeper.go_out() + sleeper?.go_out() /obj/item/mech_equipment/sleeper/attack_self(var/mob/user) . = ..() diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 03469507760..962f42e6777 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -157,10 +157,13 @@ hud_elements.Cut() for(var/hardpoint in hardpoints) - qdel(hardpoints[hardpoint]) + var/obj/item/equipment = hardpoints[hardpoint] // cache before removal + remove_system(hardpoint, null, force = TRUE) + QDEL_NULL(equipment) hardpoints.Cut() QDEL_NULL(access_card) + QDEL_NULL(radio) QDEL_NULL(arms) QDEL_NULL(legs) QDEL_NULL(head) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index a32f2909997..9230d872fd5 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -39,6 +39,10 @@ pixel_y = rand(-randpixel, randpixel) . = ..() +/obj/item/ammo_casing/Destroy() + QDEL_NULL(BB) + return ..() + //removes the projectile from the ammo casing /obj/item/ammo_casing/proc/expend() . = BB From e1c1aa06b0b89e9dc283a55152c2579a8f9ee63c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 18:05:54 -0500 Subject: [PATCH 325/554] Enable reftracking in CI --- code/__defines/_compile_options.dm | 13 +++++++++++++ code/__defines/qdel.dm | 4 ++-- code/controllers/subsystems/garbage.dm | 27 ++++++++++++++------------ code/datums/datum.dm | 2 +- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/code/__defines/_compile_options.dm b/code/__defines/_compile_options.dm index d2f61e13dca..0c60ba0a5dd 100644 --- a/code/__defines/_compile_options.dm +++ b/code/__defines/_compile_options.dm @@ -1,3 +1,16 @@ // The default value for all uses of set background. Set background can cause gradual lag and is recommended you only turn this on if necessary. // 1 will enable set background. 0 will disable set background. #define BACKGROUND_ENABLED 0 + +// If REFTRACK_IN_CI is defined, the reftracker will run in CI. +#define REFTRACK_IN_CI +#if defined(REFTRACK_IN_CI) && defined(UNIT_TEST) && !defined(SPACEMAN_DMM) +#define REFTRACKING_ENABLED +#define GC_FAILURE_HARD_LOOKUP +#define FIND_REF_NO_CHECK_TICK +#endif + +// parity with previous behavior where TESTING enabled reftracking +#ifdef TESTING +#define REFTRACKING_ENABLED +#endif \ No newline at end of file diff --git a/code/__defines/qdel.dm b/code/__defines/qdel.dm index 2c81f12ad7d..fa9cf0a8deb 100644 --- a/code/__defines/qdel.dm +++ b/code/__defines/qdel.dm @@ -5,8 +5,8 @@ #define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it. #define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference. #define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste. -#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm. - //if TESTING is enabled, qdel will call this object's find_references() verb. +#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if REFTRACKING_ENABLED is not enabled in _compiler_options.dm. + //if REFTRACKING_ENABLED is enabled, qdel will call this object's find_references() verb. #define QDEL_HINT_IFFAIL_FINDREFERENCE 6 //Above but only if gc fails. //defines for the gc_destroyed var diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index c27fcb3238e..d44e5410646 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -37,7 +37,7 @@ SUBSYSTEM_DEF(garbage) //Queue var/list/queues - #ifdef TESTING + #ifdef REFTRACKING_ENABLED var/list/reference_find_on_fail = list() #endif @@ -155,7 +155,7 @@ SUBSYSTEM_DEF(garbage) ++gcedlasttick ++totalgcs pass_counts[level]++ - #ifdef TESTING + #ifdef REFTRACKING_ENABLED reference_find_on_fail -= ref(D) //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) @@ -167,10 +167,11 @@ SUBSYSTEM_DEF(garbage) switch (level) if (GC_QUEUE_CHECK) - #ifdef TESTING + #ifdef REFTRACKING_ENABLED // Decides how many refs to look for (potentially) // Based off the remaining and the ones we can account for var/remaining_refs = refcount(D) - REFS_WE_EXPECT + var/refID = ref(D) if(reference_find_on_fail[refID]) D.find_references(remaining_refs) #ifdef GC_FAILURE_HARD_LOOKUP @@ -279,7 +280,7 @@ SUBSYSTEM_DEF(garbage) /datum/qdel_item/New(mytype) name = "[mytype]" -#ifdef TESTING +#ifdef REFTRACKING_ENABLED /proc/qdel_and_find_ref_if_fail(datum/D, force = FALSE) SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE qdel(D, force) @@ -337,7 +338,7 @@ SUBSYSTEM_DEF(garbage) return // Returning LETMELIVE after being told to force destroy // indicates the objects Destroy() does not respect force - #ifdef TESTING + #ifdef REFTRACKING_ENABLED if(!I.no_respect_force) PRINT_STACK_TRACE("WARNING: [D.type] has been force deleted, but is \ returning an immortal QDEL_HINT, indicating it does \ @@ -353,18 +354,19 @@ SUBSYSTEM_DEF(garbage) SSgarbage.HardQueue(D) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. SSgarbage.HardDelete(D) - if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. + if (QDEL_HINT_FINDREFERENCE)//qdel will, if REFTRACKING_ENABLED is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(D) - #ifdef TESTING - D.find_references() + #ifdef REFTRACKING_ENABLED + var/remaining_refs = refcount(D) - REFS_WE_EXPECT + D.find_references(remaining_refs) #endif if (QDEL_HINT_IFFAIL_FINDREFERENCE) SSgarbage.Queue(D) - #ifdef TESTING + #ifdef REFTRACKING_ENABLED SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE #endif else - #ifdef TESTING + #ifdef REFTRACKING_ENABLED if(!I.no_hint) PRINT_STACK_TRACE("WARNING: [D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.") #endif @@ -373,7 +375,7 @@ SUBSYSTEM_DEF(garbage) else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") -#ifdef TESTING +#ifdef REFTRACKING_ENABLED /datum/verb/find_refs() set category = "Debug" @@ -389,6 +391,7 @@ SUBSYSTEM_DEF(garbage) /datum/proc/find_references(references_to_clear = INFINITY) running_find_references = type + src.references_to_clear = references_to_clear if(usr && usr.client) if(usr.client.running_find_references) testing("CANCELLED search for references to a [usr.client.running_find_references].") @@ -529,7 +532,7 @@ SUBSYSTEM_DEF(garbage) var/ignore_ref = FALSE var/list/queues = SSgarbage.queues for(var/list/queue in queues) - if(potential_cache in queue) + if(X in queue) ignore_ref = TRUE break if(ignore_ref) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 61780203703..aa855c0b1e3 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -10,7 +10,7 @@ /// Used to avoid unnecessary refstring creation in Destroy(). var/tmp/has_state_machine = FALSE -#ifdef TESTING +#ifdef REFTRACKING_ENABLED var/tmp/running_find_references /// When was this datum last touched by a reftracker? /// If this value doesn't match with the start of the search From 46e7debf87de4f2348dc979a7ac4fb3494c82053 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 20:12:09 -0500 Subject: [PATCH 326/554] Fix terminal GC fail from geothermal generator --- code/modules/power/geothermal/_geothermal.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/power/geothermal/_geothermal.dm b/code/modules/power/geothermal/_geothermal.dm index 5f76fa6dd0f..3425a37cd2c 100644 --- a/code/modules/power/geothermal/_geothermal.dm +++ b/code/modules/power/geothermal/_geothermal.dm @@ -148,6 +148,7 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 12000 /obj/machinery/geothermal/Destroy() var/atom/last_loc = loc unset_vent() + connector = null . = ..() if(istype(last_loc)) propagate_refresh_neighbors(last_loc) From e509f48b75756aac2b0dc8b1fc6cdf561cf0fea9 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 20:12:32 -0500 Subject: [PATCH 327/554] Add additional safeguards to graphs --- code/datums/graph/graph.dm | 2 ++ code/unit_tests/graph_tests.dm | 15 ++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/code/datums/graph/graph.dm b/code/datums/graph/graph.dm index 249f513e419..736a33f6a4e 100644 --- a/code/datums/graph/graph.dm +++ b/code/datums/graph/graph.dm @@ -35,6 +35,8 @@ /datum/graph/proc/Connect(var/datum/node/node, var/list/neighbours, var/queue = TRUE) SHOULD_NOT_SLEEP(TRUE) SHOULD_NOT_OVERRIDE(TRUE) + if(QDELETED(src)) + CRASH("Attempted to connect node [node] to a qdeleted graph!") if(!istype(neighbours)) neighbours = list(neighbours) if(!length(neighbours)) diff --git a/code/unit_tests/graph_tests.dm b/code/unit_tests/graph_tests.dm index 66a939e3a8f..1d1cd69b621 100644 --- a/code/unit_tests/graph_tests.dm +++ b/code/unit_tests/graph_tests.dm @@ -480,7 +480,7 @@ /atom/movable/graph_test is_spawnable_type = FALSE var/datum/node/physical/node - var/list/neighoursByDirection = list() + var/list/neighboursByDirection = list() /atom/movable/graph_test/Initialize() . = ..() @@ -497,20 +497,21 @@ /atom/movable/graph_test/proc/Connect(atom/movable/graph_test/neighbour) var/direction = get_dir(src, neighbour) - neighoursByDirection[num2text(direction)] = neighbour - neighbour.neighoursByDirection[num2text(global.flip_dir[direction])] = src + neighboursByDirection[num2text(direction)] = neighbour + neighbour.neighboursByDirection[num2text(global.flip_dir[direction])] = src node.Connect(neighbour.node) /atom/movable/graph_test/CheckNodeNeighbours() // This is a lazy setup for ease of debugging // In a practical setup you'd preferably gather a list of neighbours to be disconnected and pass them in a single Disconnect-call // You'd possibly also verify the dir of this and neighbour nodes, to ensure that they're still facing each other properly - for(var/direction in neighoursByDirection) - var/atom/movable/graph_test/neighbour = neighoursByDirection[direction] + for(var/direction in neighboursByDirection) + var/atom/movable/graph_test/neighbour = neighboursByDirection[direction] var/turf/expected_loc = get_step(src, text2num(direction)) - if(neighbour.loc != expected_loc) + // can't connect in nullspace + if(isnull(neighbour.loc) || neighbour.loc != expected_loc) node.Disconnect(neighbour.node) - neighoursByDirection -= direction + neighboursByDirection -= direction return TRUE /datum/graph/testing From cf96ecaba700d43e9916216fffb0a2a13165d688 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 20:27:52 -0500 Subject: [PATCH 328/554] Fix GC fails from ballistic weapons --- code/modules/projectiles/guns/projectile.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 1466e138166..8534b7ddc7a 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -49,6 +49,12 @@ ammo_magazine = new magazine_type(src) update_icon() +/obj/item/gun/projectile/Destroy() + chambered = null + loaded.Cut() + ammo_magazine = null + return ..() + /obj/item/gun/projectile/consume_next_projectile() if(!is_jammed && prob(jam_chance)) src.visible_message("\The [src] jams!") From b79e75145d3c944eb3951375de47d241abd45bc9 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 5 Jan 2025 20:30:44 -0500 Subject: [PATCH 329/554] Remove GC exceptions list --- code/unit_tests/del_the_world.dm | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/code/unit_tests/del_the_world.dm b/code/unit_tests/del_the_world.dm index 9d3f151e81d..0ceff60ef7d 100644 --- a/code/unit_tests/del_the_world.dm +++ b/code/unit_tests/del_the_world.dm @@ -7,15 +7,6 @@ var/turf/spawn_loc = get_safe_turf() var/list/cached_contents = spawn_loc.contents.Copy() - /// Types to except from GC checking tests. - var/list/gc_exceptions = list( - // I hate doing this, but until the graph tests are fixed by someone who actually understands them, - // this is the best I can do without breaking other stuff. - /datum/node/physical, - // Randomly fails to GC during CI, cause unclear. Remove this if the root cause is identified. - /obj/item/organ/external/chest - ) - var/list/ignore = typesof( // will error if the area already has one /obj/machinery/power/apc, @@ -110,8 +101,6 @@ //Alright, time to see if anything messed up var/list/cache_for_sonic_speed = SSgarbage.items for(var/path in cache_for_sonic_speed) - if(path in gc_exceptions) - continue var/datum/qdel_item/item = cache_for_sonic_speed[path] if(item.failures) failures += "[item.name] hard deleted [item.failures] times out of a total del count of [item.qdels]" From e8c033f8b0a56416f99cc8a47c3780a233d6b624 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 6 Jan 2025 00:13:17 -0500 Subject: [PATCH 330/554] Fix miscellaneous GC issues --- code/game/alpha_masks.dm | 2 +- code/game/atoms.dm | 4 +++- code/game/objects/auras/aura.dm | 1 + code/modules/mechs/mech.dm | 5 +++-- .../mob/living/simple_animal/hostile/retaliate/drone.dm | 4 ++++ 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/code/game/alpha_masks.dm b/code/game/alpha_masks.dm index 05b23f45eaa..9c8a341a482 100644 --- a/code/game/alpha_masks.dm +++ b/code/game/alpha_masks.dm @@ -57,7 +57,7 @@ var/global/list/_alpha_masks = list() // Proc called by /turf/Entered() to update a mob's mask overlay. /atom/movable/proc/update_turf_alpha_mask() set waitfor = FALSE - if(!simulated || updating_turf_alpha_mask) + if(!simulated || QDELETED(src) || updating_turf_alpha_mask) return updating_turf_alpha_mask = TRUE sleep(0) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5dd985c6064..d13760956e3 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -145,10 +145,12 @@ /atom/proc/try_on_reagent_change() SHOULD_NOT_OVERRIDE(TRUE) set waitfor = FALSE - if(_reagent_update_started >= world.time) + if(QDELETED(src) ||_reagent_update_started >= world.time) return FALSE _reagent_update_started = world.time sleep(0) // Defer to end of tick so we don't drop subsequent reagent updates. + if(QDELETED(src)) + return return on_reagent_change() /atom/proc/on_reagent_change() diff --git a/code/game/objects/auras/aura.dm b/code/game/objects/auras/aura.dm index 8d1d35a0680..5de18f3adf6 100644 --- a/code/game/objects/auras/aura.dm +++ b/code/game/objects/auras/aura.dm @@ -15,6 +15,7 @@ They should also be used for when you want to effect the ENTIRE mob, like having /obj/aura/Destroy() if(user) user.remove_aura(src) + removed() return ..() /obj/aura/proc/added_to(var/mob/living/target) diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 962f42e6777..809f205d2bd 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -157,8 +157,9 @@ hud_elements.Cut() for(var/hardpoint in hardpoints) - var/obj/item/equipment = hardpoints[hardpoint] // cache before removal - remove_system(hardpoint, null, force = TRUE) + var/obj/item/mech_equipment/equipment = hardpoints[hardpoint] + if(istype(equipment)) + equipment.uninstalled() QDEL_NULL(equipment) hardpoints.Cut() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index e3f5b4fe9ff..c8de00b79d2 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -82,6 +82,10 @@ ion_trail.set_up(src) ion_trail.start() +/mob/living/simple_animal/hostile/malf_drone/Destroy() + QDEL_NULL(ion_trail) + return ..() + /mob/living/simple_animal/hostile/malf_drone/Process_Spacemove() return 1 From 75eac099ce1c2bea532fc9377dd047cad9cca48d Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 6 Jan 2025 00:13:31 -0500 Subject: [PATCH 331/554] Fix graph GC --- code/datums/graph/graph.dm | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/code/datums/graph/graph.dm b/code/datums/graph/graph.dm index 736a33f6a4e..1610a6b4397 100644 --- a/code/datums/graph/graph.dm +++ b/code/datums/graph/graph.dm @@ -92,8 +92,7 @@ if(neighbours_to_disconnect) neighbours |= neighbours_to_disconnect - if(neighbours.len) - LAZYSET(pending_disconnections, node, neighbours) + LAZYSET(pending_disconnections, node, neighbours) if(queue) SSgraphs_update.Queue(src) @@ -195,8 +194,6 @@ neighbour_edges |= N LAZYCLEARLIST(pending_connections) - if(!LAZYLEN(pending_disconnections)) - return for(var/pending_node_disconnect in pending_disconnections) var/pending_edge_disconnects = pending_disconnections[pending_node_disconnect] @@ -213,7 +210,8 @@ if(!length(other_pending_edge_disconnects)) pending_disconnections -= connected_node - edges[pending_node_disconnect] -= pending_edge_disconnects + if(edges[pending_node_disconnect]) + edges[pending_node_disconnect] -= pending_edge_disconnects if(!length(edges[pending_node_disconnect])) edges -= pending_node_disconnect @@ -227,12 +225,15 @@ var/checked_nodes = list() var/list/nodes_to_traverse = list(root_node) while(length(nodes_to_traverse)) - var/node_to_check = nodes_to_traverse[nodes_to_traverse.len] + var/datum/node/node_to_check = nodes_to_traverse[nodes_to_traverse.len] nodes_to_traverse.len-- + if(QDELETED(node_to_check)) + continue checked_nodes += node_to_check nodes_to_traverse |= ((edges[node_to_check] || list()) - checked_nodes) - all_nodes -= checked_nodes - subgraphs[++subgraphs.len] = checked_nodes + if(length(checked_nodes)) + all_nodes -= checked_nodes + subgraphs[++subgraphs.len] = checked_nodes if(length(subgraphs) == 1) if(!length(nodes)) From 6ef7d8717779d2a7c08b3dc8bf1c6f428a1fdd9a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 6 Jan 2025 00:32:31 -0500 Subject: [PATCH 332/554] Fix hard-queued objects causing runtimes --- code/controllers/subsystems/garbage.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index d44e5410646..18f92570395 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -250,11 +250,6 @@ SUBSYSTEM_DEF(garbage) message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).") postpone(time) -/datum/controller/subsystem/garbage/proc/HardQueue(datum/D) - if (D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) - queues[GC_QUEUE_FILTER] += D - D.gc_destroyed = GC_QUEUED_FOR_HARD_DEL - /datum/controller/subsystem/garbage/Recover() if (istype(SSgarbage.queues)) for (var/i in 1 to SSgarbage.queues.len) @@ -351,7 +346,7 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(D) if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() GC_CHECK_AM_NULLSPACE(D, "QDEL_HINT_HARDDEL") - SSgarbage.HardQueue(D) + SSgarbage.Queue(D, GC_QUEUE_HARDDELETE) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. SSgarbage.HardDelete(D) if (QDEL_HINT_FINDREFERENCE)//qdel will, if REFTRACKING_ENABLED is enabled, display all references to this object, then queue the object for deletion. From 8be553419f302977b75f38e72c011f759060a71d Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 7 Jan 2025 00:50:48 +0000 Subject: [PATCH 333/554] Automatic changelog generation [ci skip] --- html/changelog.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index e3ca3498482..357f4dcea1f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -98,14 +98,6 @@

    Penelope Haze updated:

  • Crayons are now slowly used up while writing on paper, at a rate of one charge per 25 characters. (Crayons have a default of 30 charges.)
  • Added new furniture to the Shaded Hills inn.
  • - -

    05 November 2024

    -

    Neerti updated:

    -
      -
    • Mining drill braces are now crafted from steel sheets directly.
    • -
    • Microlasers added to mining drills no longer multiply ore out of the ground, but make the drill mine faster, proportionally increasing the energy usage.
    • -
    • Capacitors added to mining drills are less powerful.
    • -

    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

    From 937681b6a44d756e019d8ac4816cadb92caa0df2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 16:35:19 +1100 Subject: [PATCH 334/554] Corrects trench color. --- code/game/turfs/floors/floor_icon.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/floors/floor_icon.dm b/code/game/turfs/floors/floor_icon.dm index 5e060f35848..a9985ecf74e 100644 --- a/code/game/turfs/floors/floor_icon.dm +++ b/code/game/turfs/floors/floor_icon.dm @@ -76,7 +76,7 @@ var/trench_icon = (istype(neighbor) && neighbor.get_trench_icon()) || get_trench_icon() if(trench_icon) // cache the trench image, keyed by icon and color - var/trench_color = isatom(neighbor) ? neighbor.color : color + var/trench_color = isatom(neighbor) ? neighbor.get_color() : get_color() var/trench_icon_key = "[ref(trench_icon)][trench_color]" I = _trench_image_cache[trench_icon_key] if(!I) From da0c6263da45288816961d7144aacb252715158b Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 16:39:32 +1100 Subject: [PATCH 335/554] Fixes backfilling. --- code/game/turfs/floors/floor_attackby.dm | 8 ++++---- code/modules/materials/_materials.dm | 2 +- .../definitions/solids/materials_solid_ice.dm | 2 +- .../definitions/solids/materials_solid_mineral.dm | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/game/turfs/floors/floor_attackby.dm b/code/game/turfs/floors/floor_attackby.dm index c87c7b79ce9..d023e3d2ee5 100644 --- a/code/game/turfs/floors/floor_attackby.dm +++ b/code/game/turfs/floors/floor_attackby.dm @@ -73,8 +73,8 @@ if((istype(flooring) && flooring.constructed) || !istype(used_item) || !istype(user)) return FALSE - flooring = get_base_flooring() - if(istype(flooring) && flooring.constructed) + var/decl/flooring/base_flooring = get_base_flooring() + if(istype(base_flooring) && base_flooring.constructed) return FALSE if(!istype(used_item, /obj/item/stack/material/ore) && !istype(used_item, /obj/item/stack/material/lump)) @@ -84,11 +84,11 @@ to_chat(user, SPAN_WARNING("\The [src] is flush with ground level and cannot be backfilled.")) return TRUE - if(!used_item.material?.can_backfill_turf_type) + if(!used_item.material?.can_backfill_floor_type) to_chat(user, SPAN_WARNING("You cannot use \the [used_item] to backfill \the [src].")) return TRUE - var/can_backfill = islist(used_item.material.can_backfill_turf_type) ? is_type_in_list(src, used_item.material.can_backfill_turf_type) : istype(src, used_item.material.can_backfill_turf_type) + var/can_backfill = islist(used_item.material.can_backfill_floor_type) ? is_type_in_list(flooring, used_item.material.can_backfill_floor_type) : istype(flooring, used_item.material.can_backfill_floor_type) if(!can_backfill) to_chat(user, SPAN_WARNING("You cannot use \the [used_item] to backfill \the [src].")) return TRUE diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 986ecb5e4cc..54ad43620bb 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -112,7 +112,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/toxicity = 0 // Organ damage from ingestion. var/toxicity_targets_organ // Bypass liver/kidneys when ingested, harm this organ directly (using BP_FOO defines). - var/can_backfill_turf_type + var/can_backfill_floor_type // Shards/tables/structures var/shard_type = SHARD_SHRAPNEL // Path of debris object. diff --git a/code/modules/materials/definitions/solids/materials_solid_ice.dm b/code/modules/materials/definitions/solids/materials_solid_ice.dm index c90937ccd3b..34144fe8393 100644 --- a/code/modules/materials/definitions/solids/materials_solid_ice.dm +++ b/code/modules/materials/definitions/solids/materials_solid_ice.dm @@ -40,7 +40,7 @@ hardness = MAT_VALUE_MALLEABLE dug_drop_type = /obj/item/stack/material/ore/handful default_solid_form = /obj/item/stack/material/ore/handful - can_backfill_turf_type = /turf/floor/snow + can_backfill_floor_type = /decl/flooring/snow /decl/material/solid/ice/aspium name = "aspium" diff --git a/code/modules/materials/definitions/solids/materials_solid_mineral.dm b/code/modules/materials/definitions/solids/materials_solid_mineral.dm index 8302ac13a99..6b11ffc0f8b 100644 --- a/code/modules/materials/definitions/solids/materials_solid_mineral.dm +++ b/code/modules/materials/definitions/solids/materials_solid_mineral.dm @@ -234,7 +234,7 @@ ) dug_drop_type = /obj/item/stack/material/ore/handful default_solid_form = /obj/item/stack/material/ore/handful - can_backfill_turf_type = /turf/floor/rock/sand + can_backfill_floor_type = /decl/flooring/sand /decl/material/solid/clay name = "clay" @@ -257,7 +257,7 @@ melting_point = null // Clay is already almost a liquid... // lower than the temperature expected from a kiln so that clay can be used to make bricks to make a high-temperature kiln. bakes_into_at_temperature = 950 CELSIUS - can_backfill_turf_type = /turf/floor/clay + can_backfill_floor_type = /decl/flooring/clay /decl/material/solid/soil name = "soil" @@ -272,9 +272,9 @@ dirtiness = 30 dug_drop_type = /obj/item/stack/material/lump/large tillable = TRUE - can_backfill_turf_type = list( - /turf/floor/mud, - /turf/floor/dirt + can_backfill_floor_type = list( + /decl/flooring/mud, + /decl/flooring/dirt ) /decl/material/solid/hematite From 123f861ef619425e46782458e27092f9c821fc62 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 17:12:17 +1100 Subject: [PATCH 336/554] Resets pixel_z on turfs when height is 0. --- code/game/turfs/floors/floor_icon.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/game/turfs/floors/floor_icon.dm b/code/game/turfs/floors/floor_icon.dm index a9985ecf74e..c4c7cbb8315 100644 --- a/code/game/turfs/floors/floor_icon.dm +++ b/code/game/turfs/floors/floor_icon.dm @@ -45,11 +45,14 @@ layer = initial(layer) if(istype(flooring) && !flooring.render_trenches) // TODO: Update pool tiles/edges to behave properly with this new system. + default_pixel_z = initial(default_pixel_z) + pixel_z = default_pixel_z return FALSE var/my_height = get_physical_height() - if(my_height < 0) - + if(my_height >= 0) + default_pixel_z = initial(default_pixel_z) + else var/height_ratio = clamp(abs(my_height) / FLUID_DEEP, 0, 1) default_pixel_z = -(min(HEIGHT_OFFSET_RANGE, round(HEIGHT_OFFSET_RANGE * height_ratio))) pixel_z = default_pixel_z @@ -97,6 +100,7 @@ I.appearance_flags |= RESET_COLOR | RESET_ALPHA _height_north_shadow_cache[shadow_alpha_key] = I add_overlay(I) + pixel_z = default_pixel_z /turf/floor/on_update_icon(var/update_neighbors) . = ..() From b2f6d4dbcedf83775cbbe388773774f1e6d84a48 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 17:35:51 +1100 Subject: [PATCH 337/554] Prevents /mob/living/brain from deleting its turf on gib(). --- code/modules/mob/living/brain/death.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/brain/death.dm b/code/modules/mob/living/brain/death.dm index a58511aaaef..1c185d241c6 100644 --- a/code/modules/mob/living/brain/death.dm +++ b/code/modules/mob/living/brain/death.dm @@ -19,7 +19,7 @@ var/obj/item/organ/internal/brain/sponge = loc . = ..() if(.) - if(!QDELETED(container)) + if(istype(container) && !QDELETED(container)) qdel(container) - if(!QDELETED(sponge)) + if(istype(sponge) && !QDELETED(sponge)) qdel(sponge) From e00cd6f6c016cc8eb598ea922356bc1b301585c3 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 7 Jan 2025 18:14:07 +1100 Subject: [PATCH 338/554] Automatic changelog generation for PR #4695 [ci skip] --- html/changelogs/AutoChangeLog-pr-4695.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4695.yml diff --git a/html/changelogs/AutoChangeLog-pr-4695.yml b/html/changelogs/AutoChangeLog-pr-4695.yml new file mode 100644 index 00000000000..84dde3ff37c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4695.yml @@ -0,0 +1,4 @@ +author: MistakeNot4892 +changes: + - {tweak: Mud and blood can now leave footprints.} +delete-after: true From 2b87100f52d5b964ad09d92105289c4a7d3c7fec Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 20:12:45 +1100 Subject: [PATCH 339/554] Prevented MC restarts from spamming Discord. --- code/controllers/master.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 7db377082bd..f5f59fe940c 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -220,12 +220,17 @@ var/global/datum/controller/master/Master = new CRASH("Attempted to set invalid runlevel: [new_runlevel]") // Starts the mc, and sticks around to restart it if the loop ever ends. +var/global/_announced_start = FALSE /datum/controller/master/proc/StartProcessing(delay) set waitfor = 0 if(delay) sleep(delay) report_progress("Master starting processing") - SSwebhooks.send(WEBHOOK_ROUNDPREP, list("map" = station_name(), "url" = get_world_url())) + + if(!global._announced_start) // Only announce roundstart once. + SSwebhooks.send(WEBHOOK_ROUNDPREP, list("map" = station_name(), "url" = get_world_url())) + global._announced_start = TRUE + var/rtn = Loop() if (rtn > 0 || processing < 0) return //this was suppose to happen. From 698043ec0cbb2d2e316ba26ab276671081e3d1aa Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 Jan 2025 09:11:08 +1100 Subject: [PATCH 340/554] Fixes inverted is_watertight() logic. --- code/game/atoms.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5dd985c6064..50583b963a4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -993,7 +993,7 @@ return /atom/proc/is_watertight() - return ATOM_IS_OPEN_CONTAINER(src) + return !ATOM_IS_OPEN_CONTAINER(src) /atom/proc/can_drink_from(mob/user) return ATOM_IS_OPEN_CONTAINER(src) && reagents?.total_volume && user.check_has_mouth() From 972e321e3858d1d23ccd766f87cff320d8e7317e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 Jan 2025 09:16:14 +1100 Subject: [PATCH 341/554] Moves nanite fluid into compounds, disambiguates the recipe name. --- code/modules/reagents/reactions/reaction_compounds.dm | 11 +++++++++++ code/modules/reagents/reactions/reaction_drugs.dm | 10 ---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index bbd64250900..35de17d707e 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -158,3 +158,14 @@ /decl/chemical_reaction/compound/condensed_capsaicin/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) . = ..() holder?.add_reagent(/decl/material/liquid/water, created_volume) + + +/decl/chemical_reaction/compound/nanitefluid + name = "Nanite Fluid Synthesis" + result = /decl/material/liquid/nanitefluid + required_reagents = list(/decl/material/liquid/plasticide = 1, /decl/material/solid/metal/aluminium = 1, /decl/material/liquid/lube = 1) + catalysts = list(/decl/material/liquid/crystal_agent = 1) + result_amount = 3 + minimum_temperature = (-25 CELSIUS) - 100 + maximum_temperature = -25 CELSIUS + mix_message = "The solution becomes a metallic slime." diff --git a/code/modules/reagents/reactions/reaction_drugs.dm b/code/modules/reagents/reactions/reaction_drugs.dm index 8f10b625a3c..a4f85cb3fa7 100644 --- a/code/modules/reagents/reactions/reaction_drugs.dm +++ b/code/modules/reagents/reactions/reaction_drugs.dm @@ -111,16 +111,6 @@ required_reagents = list(/decl/material/liquid/antirads = 1, /decl/material/solid/carbon = 1) result_amount = 2 -/decl/chemical_reaction/compound/nanitefluid - name = "Nanite Fluid" - result = /decl/material/liquid/nanitefluid - required_reagents = list(/decl/material/liquid/plasticide = 1, /decl/material/solid/metal/aluminium = 1, /decl/material/liquid/lube = 1) - catalysts = list(/decl/material/liquid/crystal_agent = 1) - result_amount = 3 - minimum_temperature = (-25 CELSIUS) - 100 - maximum_temperature = -25 CELSIUS - mix_message = "The solution becomes a metallic slime." - /decl/chemical_reaction/drug/antibiotics name = "Antibiotics" result = /decl/material/liquid/antibiotics From 7ef6054f59dfdaf36f652ceb79af520f57a363c5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:06:54 -0500 Subject: [PATCH 342/554] Add a modpack compatibility patch system --- maps/exodus/exodus.dm | 35 ++++++++-------- maps/ministation/ministation.dm | 40 +++++++++---------- maps/modpack_testing/modpack_testing.dm | 38 +++++++++--------- maps/tradeship/tradeship.dm | 37 +++++++++-------- mods/content/fantasy/datum/overrides.dm | 22 ---------- mods/content/psionics/_psionics.dme | 2 - mods/content/standard_jobs/jobs/medical.dm | 9 ----- mods/gamemodes/cult/overrides.dm | 1 + mods/gamemodes/heist/_heist.dme | 8 ---- mods/gamemodes/mixed.dm | 7 ++++ mods/gamemodes/mixed/_mixed.dm | 2 - mods/gamemodes/mixed/_mixed.dme | 15 ------- mods/mobs/borers/_borers.dme | 5 --- mods/species/drakes/_drakes.dme | 5 --- mods/species/vox/_vox.dme | 1 - mods/~compatibility/patches/fantasy.dm | 4 ++ .../patches/fantasy/drake_fantasy.dm | 21 ++++++++++ .../patches/heist_vox.dm} | 2 - .../~compatibility/patches/mixed_gamemodes.dm | 12 ++++++ .../patches/mixed_gamemodes}/crossfire.dm | 0 .../patches/mixed_gamemodes}/siege.dm | 0 .../patches/mixed_gamemodes}/uprising.dm | 0 mods/~compatibility/patches/psionics.dm | 13 ++++++ .../patches/psionics/borer_psi.dm} | 4 +- .../patches/psionics/cult_psi.dm} | 7 ++-- .../patches/psionics/psi_jobs.dm | 6 +++ mods/~compatibility/readme.md | 22 ++++++++++ mods/~compatibility/~compatibility.dm | 16 ++++++++ nebula.dme | 1 + 29 files changed, 179 insertions(+), 156 deletions(-) create mode 100644 mods/gamemodes/mixed.dm delete mode 100644 mods/gamemodes/mixed/_mixed.dm delete mode 100644 mods/gamemodes/mixed/_mixed.dme create mode 100644 mods/~compatibility/patches/fantasy.dm create mode 100644 mods/~compatibility/patches/fantasy/drake_fantasy.dm rename mods/{species/vox/datum/heist_compatibility.dm => ~compatibility/patches/heist_vox.dm} (98%) create mode 100644 mods/~compatibility/patches/mixed_gamemodes.dm rename mods/{gamemodes/mixed => ~compatibility/patches/mixed_gamemodes}/crossfire.dm (100%) rename mods/{gamemodes/mixed => ~compatibility/patches/mixed_gamemodes}/siege.dm (100%) rename mods/{gamemodes/mixed => ~compatibility/patches/mixed_gamemodes}/uprising.dm (100%) create mode 100644 mods/~compatibility/patches/psionics.dm rename mods/{content/psionics/system/psionics/mob/borer_power.dm => ~compatibility/patches/psionics/borer_psi.dm} (97%) rename mods/{content/psionics/items/soulstone.dm => ~compatibility/patches/psionics/cult_psi.dm} (61%) create mode 100644 mods/~compatibility/patches/psionics/psi_jobs.dm create mode 100644 mods/~compatibility/readme.md create mode 100644 mods/~compatibility/~compatibility.dm diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 9372a9368a7..09ef9d18d9d 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,38 +1,35 @@ #if !defined(USING_MAP_DATUM) - #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/heist/_heist.dme" - #include "../../mods/gamemodes/meteor/_meteor.dme" - #include "../../mods/gamemodes/ninja/_ninja.dme" - #include "../../mods/gamemodes/revolution/_revolution.dme" - #include "../../mods/gamemodes/traitor/_traitor.dme" - #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" - #include "../../mods/content/mundane.dm" + #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/corporate/_corporate.dme" #include "../../mods/content/government/_government.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/mobs/borers/_borers.dme" - - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/mixed.dm" - // Must come after psionics for counsellor compatibility. - #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/species/ascent/_ascent.dme" - #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/utility_frames/_utility_frames.dme" - #include "../../mods/species/bayliens/_bayliens.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 2ecca91fa60..2f82716a80c 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -15,31 +15,37 @@ Twice... #include "../../code/unit_tests/offset_tests.dm" #endif + #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" + + #include "../../mods/content/mundane.dm" + #include "../../mods/content/scaling_descriptors.dm" + + #include "../../mods/content/bigpharma/_bigpharma.dme" + #include "../../mods/content/corporate/_corporate.dme" + #include "../../mods/content/government/_government.dme" + #include "../../mods/content/matchmaking/_matchmaking.dme" + #include "../../mods/content/modern_earth/_modern_earth.dme" + #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" + #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/xenobiology/_xenobiology.dme" + #include "../../mods/gamemodes/cult/_cult.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/traitor/_traitor.dme" #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" + #include "../../mods/gamemodes/mixed.dm" - #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" + #include "../../mods/mobs/dionaea/_dionaea.dme" + #include "../../mods/mobs/borers/_borers.dme" - #include "../../mods/content/standard_jobs/_standard_jobs.dme" - #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/content/corporate/_corporate.dme" - #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/neoavians/_neoavians.dme" - #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/species/serpentid/_serpentid.dme" - #include "../../mods/species/bayliens/_bayliens.dme" - #include "../../mods/content/mundane.dm" - #include "../../mods/content/bigpharma/_bigpharma.dme" - #include "../../mods/content/government/_government.dme" - #include "../../mods/content/modern_earth/_modern_earth.dme" - #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/scaling_descriptors.dm" #include "ministation_antagonists.dm" #include "ministation_areas.dm" @@ -70,12 +76,6 @@ Twice... #include "../away/yacht/yacht.dm" #include "../away/liberia/liberia.dm" - #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/mobs/borers/_borers.dme" - - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" - #include "ministation_overmap.dm" #include "jobs/command.dm" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index f94fbbc844c..d7843b96d6b 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -3,45 +3,43 @@ #include "modpack_testing_lobby.dm" #include "blank.dmm" - #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/heist/_heist.dme" - #include "../../mods/gamemodes/meteor/_meteor.dme" - #include "../../mods/gamemodes/ninja/_ninja.dme" - #include "../../mods/gamemodes/revolution/_revolution.dme" - #include "../../mods/gamemodes/traitor/_traitor.dme" - #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" - #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" - #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/byond_membership/_byond_membership.dm" #include "../../mods/content/corporate/_corporate.dme" + #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" + #include "../../mods/content/fantasy/_fantasy.dme" #include "../../mods/content/generic_shuttles/_generic_shuttles.dme" #include "../../mods/content/government/_government.dme" + #include "../../mods/content/inertia/_inertia.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" + #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/shackles/_shackles.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/content/pheromones/_pheromones.dme" - #include "../../mods/species/drakes/_drakes.dme" // include before _fantasy.dme so overrides work - #include "../../mods/content/fantasy/_fantasy.dme" - #include "../../mods/content/inertia/_inertia.dme" - #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/mixed.dm" - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/bayliens/_bayliens.dme" + #include "../../mods/species/drakes/_drakes.dme" #include "../../mods/species/neoavians/_neoavians.dme" + #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/utility_frames/_utility_frames.dme" - #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/vox/_vox.dme" #define USING_MAP_DATUM /datum/map/modpack_testing diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 32eeb975e2c..e13776a4276 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -4,44 +4,43 @@ #include "../../code/unit_tests/offset_tests.dm" #endif - #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/heist/_heist.dme" - #include "../../mods/gamemodes/ninja/_ninja.dme" - #include "../../mods/gamemodes/revolution/_revolution.dme" - #include "../../mods/gamemodes/traitor/_traitor.dme" - #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" - #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" #include "../../mods/content/government/away_sites/icarus/icarus.dm" #include "../../mods/content/corporate/away_sites/lar_maria/lar_maria.dm" - #include "../../mods/content/standard_jobs/_standard_jobs.dme" - #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/mundane.dm" + #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/corporate/_corporate.dme" + #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/government/_government.dme" + #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/scaling_descriptors.dm" - #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/mixed.dm" - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/drakes/_drakes.dme" + #include "../../mods/species/neoavians/_neoavians.dme" #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/utility_frames/_utility_frames.dme" - #include "../../mods/species/neoavians/_neoavians.dme" - #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/vox/_vox.dme" #include "../away/bearcat/bearcat.dm" diff --git a/mods/content/fantasy/datum/overrides.dm b/mods/content/fantasy/datum/overrides.dm index 0726866427d..6183c93b33c 100644 --- a/mods/content/fantasy/datum/overrides.dm +++ b/mods/content/fantasy/datum/overrides.dm @@ -31,28 +31,6 @@ /decl/background_category/religion = /decl/background_detail/religion/other ) -// Rename grafadreka -/decl/species/grafadreka - name = "Meredrake" - name_plural = "Meredrakes" - description = "Meredrakes, sometimes called mire-drakes, are large reptillian pack predators, widely assumed to be cousins to true dragons. \ - They are commonly found living in caves or burrows bordering grassland or forest, and while they prefer to hunt deer or rabbits, they will sometimes attack travellers if pickings are slim enough. \ - While they are not domesticated, they can be habituated and trained as working animals if captured young enough." - -/decl/sprite_accessory/marking/grafadreka - species_allowed = list("Meredrake") - -/decl/language/grafadreka - desc = "Hiss hiss, feed me rabbits." - -/decl/material/liquid/sifsap - name = "drake spittle" - lore_text = "A complex chemical slurry brewed up in the gullet of meredrakes." - -/obj/aura/sifsap_salve - name = "Drakespittle Salve" - descriptor = "glowing spittle" - // Rename wooden prostheses /decl/bodytype/prosthetic/wooden name = "carved wooden" // weird to call it 'crude' when it's cutting-edge for the setting diff --git a/mods/content/psionics/_psionics.dme b/mods/content/psionics/_psionics.dme index df5544cffe1..b978b8a0c7b 100644 --- a/mods/content/psionics/_psionics.dme +++ b/mods/content/psionics/_psionics.dme @@ -27,7 +27,6 @@ #include "items\literature.dm" #include "items\null_ammo.dm" #include "items\nullrod.dm" -#include "items\soulstone.dm" #include "machines\psimeter.dm" #include "machines\psimonitor.dm" #include "system\subsystem_psi.dm" @@ -54,7 +53,6 @@ #include "system\psionics\interface\ui.dm" #include "system\psionics\interface\ui_hub.dm" #include "system\psionics\interface\ui_toggles.dm" -#include "system\psionics\mob\borer_power.dm" #include "system\psionics\mob\mob.dm" #include "system\psionics\mob\mob_assay.dm" #include "system\psionics\mob\mob_interactions.dm" diff --git a/mods/content/standard_jobs/jobs/medical.dm b/mods/content/standard_jobs/jobs/medical.dm index 14e68446da0..f2c11cb05d1 100644 --- a/mods/content/standard_jobs/jobs/medical.dm +++ b/mods/content/standard_jobs/jobs/medical.dm @@ -199,15 +199,6 @@ ) give_psionic_implant_on_join = FALSE -#ifdef MODPACK_PSIONICS -/datum/job/counselor/equip_job(var/mob/living/human/H) - if(H.mind.role_alt_title == "Counselor") - psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) - if(H.mind.role_alt_title == "Mentalist") - psi_faculties = list("[PSI_COERCION]" = PSI_RANK_OPERANT) - return ..() -#endif - // Department-flavor IDs /obj/item/card/id/medical name = "identification card" diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm index 2077c9f0b1e..f536e4eabe6 100644 --- a/mods/gamemodes/cult/overrides.dm +++ b/mods/gamemodes/cult/overrides.dm @@ -15,6 +15,7 @@ playsound(src, 'sound/effects/ghost2.ogg', 10, 5) /datum/trader/ship/clothingshop/hatglovesaccessories/New() + ..() possible_trading_items[/obj/item/clothing/head/culthood] = TRADER_BLACKLIST_ALL /mob/living/silicon/ai diff --git a/mods/gamemodes/heist/_heist.dme b/mods/gamemodes/heist/_heist.dme index 57bf5c58b42..de2a67d69d3 100644 --- a/mods/gamemodes/heist/_heist.dme +++ b/mods/gamemodes/heist/_heist.dme @@ -1,13 +1,5 @@ #ifndef GAMEMODE_PACK_HEIST #define GAMEMODE_PACK_HEIST - -#ifdef MODPACK_VOX -#warn Vox modpack loaded before Heist modpack, compatibility features will be missing. -#endif -#ifdef GAMEMODE_PACK_MIXED -#warn Mixed gamemodes modpack loaded before Heist modpack, Heist combination modes will be missing. -#endif - // BEGIN_INCLUDE #include "_heist.dm" #include "areas.dm" diff --git a/mods/gamemodes/mixed.dm b/mods/gamemodes/mixed.dm new file mode 100644 index 00000000000..f89baef2aa8 --- /dev/null +++ b/mods/gamemodes/mixed.dm @@ -0,0 +1,7 @@ +#ifndef GAMEMODE_PACK_MIXED +#define GAMEMODE_PACK_MIXED +#endif + +// This modpack doesn't actually have anything here, and instead it uses the compatibility patch system to make load order not matter. +/decl/modpack/mixed_modes + name = "Mixed Gamemodes" \ No newline at end of file diff --git a/mods/gamemodes/mixed/_mixed.dm b/mods/gamemodes/mixed/_mixed.dm deleted file mode 100644 index c1c9167d414..00000000000 --- a/mods/gamemodes/mixed/_mixed.dm +++ /dev/null @@ -1,2 +0,0 @@ -/decl/modpack/mixed_modes - name = "Mixed Gamemodes" \ No newline at end of file diff --git a/mods/gamemodes/mixed/_mixed.dme b/mods/gamemodes/mixed/_mixed.dme deleted file mode 100644 index 6db33d07706..00000000000 --- a/mods/gamemodes/mixed/_mixed.dme +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef GAMEMODE_PACK_MIXED -#define GAMEMODE_PACK_MIXED -// BEGIN_INCLUDE -#include "_mixed.dm" -#if defined(GAMEMODE_PACK_HEIST) // TODO: && defined(GAMEMODE_PACK_MERCENARY) -#include "crossfire.dm" -#endif -#if defined(GAMEMODE_PACK_REVOLUTIONARY) -#include "siege.dm" -#endif -#if defined(GAMEMODE_PACK_REVOLUTIONARY) && defined(GAMEMODE_PACK_CULT) -#include "uprising.dm" -#endif -// END_INCLUDE -#endif \ No newline at end of file diff --git a/mods/mobs/borers/_borers.dme b/mods/mobs/borers/_borers.dme index 380c95f4e87..7f230fc9536 100644 --- a/mods/mobs/borers/_borers.dme +++ b/mods/mobs/borers/_borers.dme @@ -1,10 +1,5 @@ #ifndef CONTENT_PACK_BORERS #define CONTENT_PACK_BORERS - -#ifdef MODPACK_PSIONICS -#warn Psionics modpack loaded before Borers modpack, compatibility features will be missing. -#endif - // BEGIN_INCLUDE #include "borer.dm" #include "datum\antagonist.dm" diff --git a/mods/species/drakes/_drakes.dme b/mods/species/drakes/_drakes.dme index 1143d6a510e..025f1c54c51 100644 --- a/mods/species/drakes/_drakes.dme +++ b/mods/species/drakes/_drakes.dme @@ -1,10 +1,5 @@ #ifndef MODPACK_DRAKES #define MODPACK_DRAKES - -#ifdef MODPACK_FANTASY -#warn Fantasy modpack loaded before Drakes modpack, compatibility features will be missing. -#endif - // BEGIN_INCLUDE #include "_drakes.dm" #include "_overrides.dm" diff --git a/mods/species/vox/_vox.dme b/mods/species/vox/_vox.dme index 83d61f50f51..0e0e635d99b 100644 --- a/mods/species/vox/_vox.dme +++ b/mods/species/vox/_vox.dme @@ -8,7 +8,6 @@ #include "datum\cultures_vox.dm" #include "datum\descriptors_vox.dm" #include "datum\factions_vox.dm" -#include "datum\heist_compatibility.dm" #include "datum\language.dm" #include "datum\locations_vox.dm" #include "datum\outfits.dm" diff --git a/mods/~compatibility/patches/fantasy.dm b/mods/~compatibility/patches/fantasy.dm new file mode 100644 index 00000000000..c176360672c --- /dev/null +++ b/mods/~compatibility/patches/fantasy.dm @@ -0,0 +1,4 @@ +// Override drake lore and names for the fantasy modpack. +#ifdef MODPACK_DRAKES +#include "fantasy/drake_fantasy.dm" +#endif \ No newline at end of file diff --git a/mods/~compatibility/patches/fantasy/drake_fantasy.dm b/mods/~compatibility/patches/fantasy/drake_fantasy.dm new file mode 100644 index 00000000000..70ad5e628e7 --- /dev/null +++ b/mods/~compatibility/patches/fantasy/drake_fantasy.dm @@ -0,0 +1,21 @@ +// Rename grafadreka +/decl/species/grafadreka + name = "Meredrake" + name_plural = "Meredrakes" + description = "Meredrakes, sometimes called mire-drakes, are large reptillian pack predators, widely assumed to be cousins to true dragons. \ + They are commonly found living in caves or burrows bordering grassland or forest, and while they prefer to hunt deer or rabbits, they will sometimes attack travellers if pickings are slim enough. \ + While they are not domesticated, they can be habituated and trained as working animals if captured young enough." + +/decl/sprite_accessory/marking/grafadreka + species_allowed = list("Meredrake") + +/decl/language/grafadreka + desc = "Hiss hiss, feed me rabbits." + +/decl/material/liquid/sifsap + name = "drake spittle" + lore_text = "A complex chemical slurry brewed up in the gullet of meredrakes." + +/obj/aura/sifsap_salve + name = "Drakespittle Salve" + descriptor = "glowing spittle" diff --git a/mods/species/vox/datum/heist_compatibility.dm b/mods/~compatibility/patches/heist_vox.dm similarity index 98% rename from mods/species/vox/datum/heist_compatibility.dm rename to mods/~compatibility/patches/heist_vox.dm index 776057948c0..e37a3416faa 100644 --- a/mods/species/vox/datum/heist_compatibility.dm +++ b/mods/~compatibility/patches/heist_vox.dm @@ -1,4 +1,3 @@ -#ifdef GAMEMODE_PACK_HEIST /decl/special_role/raider/Initialize() . = ..() LAZYSET(outfits_per_species, SPECIES_VOX, /decl/outfit/vox_raider) @@ -41,4 +40,3 @@ vox.SetName(vox.real_name) var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) raiders.update_access(vox) -#endif \ No newline at end of file diff --git a/mods/~compatibility/patches/mixed_gamemodes.dm b/mods/~compatibility/patches/mixed_gamemodes.dm new file mode 100644 index 00000000000..c554702eff5 --- /dev/null +++ b/mods/~compatibility/patches/mixed_gamemodes.dm @@ -0,0 +1,12 @@ +// TODO: #ifdef GAMEMODE_PACK_MERCENARY +#if defined(GAMEMODE_PACK_HEIST) +#include "mixed_gamemodes/crossfire.dm" +#endif +#if defined(GAMEMODE_PACK_REVOLUTIONARY) +#include "mixed_gamemodes/siege.dm" +#endif +// #endif + +#if defined(GAMEMODE_PACK_REVOLUTIONARY) && defined(GAMEMODE_PACK_CULT) +#include "mixed_gamemodes/uprising.dm" +#endif \ No newline at end of file diff --git a/mods/gamemodes/mixed/crossfire.dm b/mods/~compatibility/patches/mixed_gamemodes/crossfire.dm similarity index 100% rename from mods/gamemodes/mixed/crossfire.dm rename to mods/~compatibility/patches/mixed_gamemodes/crossfire.dm diff --git a/mods/gamemodes/mixed/siege.dm b/mods/~compatibility/patches/mixed_gamemodes/siege.dm similarity index 100% rename from mods/gamemodes/mixed/siege.dm rename to mods/~compatibility/patches/mixed_gamemodes/siege.dm diff --git a/mods/gamemodes/mixed/uprising.dm b/mods/~compatibility/patches/mixed_gamemodes/uprising.dm similarity index 100% rename from mods/gamemodes/mixed/uprising.dm rename to mods/~compatibility/patches/mixed_gamemodes/uprising.dm diff --git a/mods/~compatibility/patches/psionics.dm b/mods/~compatibility/patches/psionics.dm new file mode 100644 index 00000000000..93473b9271f --- /dev/null +++ b/mods/~compatibility/patches/psionics.dm @@ -0,0 +1,13 @@ +// Give borers a paramount rank psi aura, and gives them a ranged psychic attack. +#ifdef CONTENT_PACK_BORERS +#include "psionics/borer_psi.dm" +#endif +// Allows psion blood to be used to create soulstones, +// and lets full soulstones nullify psi and shatter into nullglass. +#ifdef GAMEMODE_PACK_CULT +#include "psionics/cult_psi.dm" +#endif +// Adds psi abilities to the counselor. +#ifdef MODPACK_STANDARD_JOBS +#include "psionics/psi_jobs.dm" +#endif \ No newline at end of file diff --git a/mods/content/psionics/system/psionics/mob/borer_power.dm b/mods/~compatibility/patches/psionics/borer_psi.dm similarity index 97% rename from mods/content/psionics/system/psionics/mob/borer_power.dm rename to mods/~compatibility/patches/psionics/borer_psi.dm index 48f62c8adab..68c70ec95f7 100644 --- a/mods/content/psionics/system/psionics/mob/borer_power.dm +++ b/mods/~compatibility/patches/psionics/borer_psi.dm @@ -1,4 +1,3 @@ -#ifdef CONTENT_PACK_BORERS /mob/living/simple_animal/borer var/image/aura_image @@ -52,5 +51,4 @@ SET_STATUS_MAX(M, STAT_WEAK, 10) set_ability_cooldown(15 SECONDS) - return TRUE -#endif \ No newline at end of file + return TRUE \ No newline at end of file diff --git a/mods/content/psionics/items/soulstone.dm b/mods/~compatibility/patches/psionics/cult_psi.dm similarity index 61% rename from mods/content/psionics/items/soulstone.dm rename to mods/~compatibility/patches/psionics/cult_psi.dm index 3d984a0711c..85c20391362 100644 --- a/mods/content/psionics/items/soulstone.dm +++ b/mods/~compatibility/patches/psionics/cult_psi.dm @@ -1,15 +1,14 @@ -#ifdef GAMEMODE_PACK_CULT +// Make soulstones interact with psionics. /obj/item/soulstone/disrupts_psionics() . = !full ? src : FALSE /obj/item/soulstone/shatter() for(var/i=1 to rand(2,5)) - new /obj/item/shard(get_turf(src), /decl/material/nullglass) + new /obj/item/shard(get_turf(src), full ? /decl/material/nullglass : /decl/material/solid/gemstone/crystal) . = ..() /obj/item/soulstone/withstand_psi_stress(var/stress, var/atom/source) . = ..(stress, source) if(. > 0) . = max(0, . - rand(2,5)) - shatter() -#endif \ No newline at end of file + shatter() \ No newline at end of file diff --git a/mods/~compatibility/patches/psionics/psi_jobs.dm b/mods/~compatibility/patches/psionics/psi_jobs.dm new file mode 100644 index 00000000000..f4579e9d7c0 --- /dev/null +++ b/mods/~compatibility/patches/psionics/psi_jobs.dm @@ -0,0 +1,6 @@ +/datum/job/counselor/equip_job(var/mob/living/human/H) + if(H.mind.role_alt_title == "Counselor") + psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) + if(H.mind.role_alt_title == "Mentalist") + psi_faculties = list("[PSI_COERCION]" = PSI_RANK_OPERANT) + return ..() \ No newline at end of file diff --git a/mods/~compatibility/readme.md b/mods/~compatibility/readme.md new file mode 100644 index 00000000000..d422273e7bb --- /dev/null +++ b/mods/~compatibility/readme.md @@ -0,0 +1,22 @@ +# Modpack Compatibility System +This folder exists as a way to work around the fact that the previous system for modpack cross-compatibility, define-gating, is sensitive to include order. This resulted in a lot of boilerplate, like having to emit warnings if modpacks were included in the wrong order. This meant that you could also introduce cyclical dependencies, where no matter what it would emit a warning and content would be missing. + +To avoid this issue, we instead include all compatibility patches last, so it is load order agnostic. + +## FAQ +### Why aren't the compatibility files in the modpacks themselves? +I didn't want to edit the modpack include validation script to exclude the compatibility patches from all DMEs. + +### Why is it organised using subfolders? +I didn't like using `#if defined(FOO) && defined(BAR)` and nested `#ifdef`s were hard to follow, so instead I group them by modpack. + +### Is there a general rule for which modpacks get their own folder? +Not really. I just grouped them in roughly the way that would result in the largest existing groupings, and then chose groupings that would make the most sense to expand in the future (fantasy and standard jobs). + +### Do all patches need to be in a subfolder? +No, it's totally fine to just put something in the base patches directory if there's only one patch for either of the mods in that pairing. That said, sometimes it can make sense to add a folder with just one patch if you can foresee future development requiring additional patches in the same category. + +### How do I decide which folder a patch goes in if both modpacks have folders? +I tend to personally go based on whatever it's mostly about; a hypothetical patch renaming and respriting psionics for the fantasy modpack would go in the fantasy folder. Alternatively, you could think of it as going for whichever one is more specific. + +That said, if one has a lot more patches than the other, or if one modpack (take Standard Jobs, for example) is patched by several modpacks that already have folders, it's fine to just go with whatever produces the largest patch subfolders (or gets rid of small/redundant ones). \ No newline at end of file diff --git a/mods/~compatibility/~compatibility.dm b/mods/~compatibility/~compatibility.dm new file mode 100644 index 00000000000..f59ac86c052 --- /dev/null +++ b/mods/~compatibility/~compatibility.dm @@ -0,0 +1,16 @@ +// Add Vox-specific content for the Heist gamemode (Vox raider outfit, mirror to transform into a Vox as a raider) +#if defined(GAMEMODE_PACK_HEIST) && defined(MODPACK_VOX) +#include "patches/heist_vox.dm" +#endif + +#ifdef MODPACK_PSIONICS +#include "patches/psionics.dm" +#endif + +#ifdef GAMEMODE_PACK_MIXED +#include "patches/mixed_gamemodes.dm" +#endif + +#ifdef MODPACK_FANTASY_SPECIES +#include "patches/fantasy.dm" +#endif \ No newline at end of file diff --git a/nebula.dme b/nebula.dme index db8ca013548..5d10b384d1c 100644 --- a/nebula.dme +++ b/nebula.dme @@ -4101,5 +4101,6 @@ #include "maps\~mapsystem\maps_unit_testing.dm" #include "maps\~unit_tests\unit_testing.dm" #include "mods\_modpack.dm" +#include "mods\~compatibility\~compatibility.dm" #include "~code\global_init.dm" // END_INCLUDE From 54b94a4948d9efbad9a9ddcae55485910427840a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:22:56 -0500 Subject: [PATCH 343/554] Rewrite soulstone reaction handling --- code/modules/reagents/reactions/_reaction.dm | 6 ++--- .../reagents/reactions/reaction_compounds.dm | 2 +- .../reactions/reaction_grenade_reaction.dm | 16 +++++------ .../reagents/reactions/reaction_herbal.dm | 2 +- .../reagents/reactions/reaction_other.dm | 2 +- .../reactions/reaction_recipe_food.dm | 2 +- .../reagents/reactions/reaction_synthesis.dm | 14 +++++----- mods/content/psionics/datum/chems.dm | 27 ------------------- .../cult/mobs/constructs/soulstone.dm | 27 +++++++++++++++++++ .../patches/psionics/cult_psi.dm | 4 +++ 10 files changed, 52 insertions(+), 50 deletions(-) diff --git a/code/modules/reagents/reactions/_reaction.dm b/code/modules/reagents/reactions/_reaction.dm index e743ecf0ab2..fbc2eaa85d6 100644 --- a/code/modules/reagents/reactions/_reaction.dm +++ b/code/modules/reagents/reactions/_reaction.dm @@ -38,7 +38,7 @@ return 1 -/decl/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(thermal_product && location && ATOM_SHOULD_TEMPERATURE_ENQUEUE(location)) ADJUST_ATOM_TEMPERATURE(location, location.temperature + (location.get_thermal_mass_coefficient() * thermal_product)) @@ -61,8 +61,6 @@ if(reaction_volume > A) reaction_volume = A - var/alt_reaction_indicator = get_alternate_reaction_indicator(holder) - for(var/reactant in required_reagents) holder.remove_reagent(reactant, reaction_volume * required_reagents[reactant], safety = 1) @@ -71,7 +69,7 @@ if(result) holder.add_reagent(result, amt_produced, data, safety = 1) - on_reaction(holder, amt_produced, alt_reaction_indicator, data) + on_reaction(holder, amt_produced, data) //called after processing reactions, if they occurred /decl/chemical_reaction/proc/post_reaction(var/datum/reagents/holder) diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index 8e530dacaa5..d76c4b9630c 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -155,7 +155,7 @@ required_reagents = list(/decl/material/liquid/capsaicin = 2) result = list(/decl/material/liquid/capsaicin/condensed = 1) -/decl/chemical_reaction/compound/condensed_capsaicin/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/compound/condensed_capsaicin/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) . = ..() holder?.add_reagent(/decl/material/liquid/water, created_volume) diff --git a/code/modules/reagents/reactions/reaction_grenade_reaction.dm b/code/modules/reagents/reactions/reaction_grenade_reaction.dm index ec529bef717..7827c6ac054 100644 --- a/code/modules/reagents/reactions/reaction_grenade_reaction.dm +++ b/code/modules/reagents/reactions/reaction_grenade_reaction.dm @@ -11,7 +11,7 @@ required_reagents = list(/decl/material/liquid/water = 1, /decl/material/solid/potassium = 1) mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/explosion_potassium/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/explosion_potassium/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) @@ -32,7 +32,7 @@ result_amount = null mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -58,7 +58,7 @@ mix_message = "The solution bubbles vigorously!" maximum_temperature = T100C -/decl/chemical_reaction/grenade_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) @@ -79,7 +79,7 @@ reaction_sound = 'sound/items/Welder.ogg' mix_message = "The solution suddenly ignites!" -/decl/chemical_reaction/grenade_reaction/flash_fire/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/flash_fire/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(istype(location)) @@ -93,7 +93,7 @@ result_amount = 0.4 mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/chemsmoke/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/chemsmoke/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -112,7 +112,7 @@ result_amount = 2 mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/foam/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/foam/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -129,7 +129,7 @@ result_amount = 5 mix_message = "The solution foams up violently!" -/decl/chemical_reaction/grenade_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) @@ -151,7 +151,7 @@ result_amount = 5 mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) diff --git a/code/modules/reagents/reactions/reaction_herbal.dm b/code/modules/reagents/reactions/reaction_herbal.dm index b8a02ca07fe..62950dd1d64 100644 --- a/code/modules/reagents/reactions/reaction_herbal.dm +++ b/code/modules/reagents/reactions/reaction_herbal.dm @@ -3,7 +3,7 @@ result_amount = 2 minimum_temperature = 100 CELSIUS -/decl/chemical_reaction/drug/herbal/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/drug/herbal/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) . = ..() // Add plant matter to represent the herbs that the medicine has been leached out of. holder?.add_reagent(/decl/material/solid/organic/plantmatter, created_volume) diff --git a/code/modules/reagents/reactions/reaction_other.dm b/code/modules/reagents/reactions/reaction_other.dm index 19c5613ea7e..dca52f041f6 100644 --- a/code/modules/reagents/reactions/reaction_other.dm +++ b/code/modules/reagents/reactions/reaction_other.dm @@ -10,7 +10,7 @@ return ..() return 0 -/decl/chemical_reaction/soap_key/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/soap_key/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/obj/item/soap/S = holder.get_reaction_loc(chemical_reaction_flags) if(istype(S) && S.key_data) new /obj/item/key/temporary(get_turf(S), /decl/material/liquid/cleaner, S.key_data, strength) diff --git a/code/modules/reagents/reactions/reaction_recipe_food.dm b/code/modules/reagents/reactions/reaction_recipe_food.dm index bc052960e91..0ece0daefd2 100644 --- a/code/modules/reagents/reactions/reaction_recipe_food.dm +++ b/code/modules/reagents/reactions/reaction_recipe_food.dm @@ -4,7 +4,7 @@ abstract_type = /decl/chemical_reaction/recipe/food var/obj_result -/decl/chemical_reaction/recipe/food/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/recipe/food/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(obj_result && isturf(location)) diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index 5c4f5b710f4..2cf1dfce05f 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -19,7 +19,7 @@ ) . = ..() -/decl/chemical_reaction/synthesis/fiberglass/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/fiberglass/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -47,7 +47,7 @@ if(rtype != /decl/material/liquid/crystal_agent && REAGENT_VOLUME(holder, rtype) >= REAGENT_UNITS_PER_MATERIAL_SHEET) return TRUE -/decl/chemical_reaction/synthesis/crystalization/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/crystalization/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) var/list/removing_reagents = list() @@ -81,7 +81,7 @@ continue return TRUE -/decl/chemical_reaction/synthesis/aerogel/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/aerogel/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) var/list/removing_reagents = list() @@ -100,7 +100,7 @@ required_reagents = list(/decl/material/liquid/acid = 1, /decl/material/liquid/plasticide = 2) mix_message = "The solution solidifies into a grey-white mass." -/decl/chemical_reaction/synthesis/plastication/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/plastication/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -115,7 +115,7 @@ result_amount = 3 mix_message = "The solution hardens and begins to crystallize." -/decl/chemical_reaction/synthesis/resin_pack/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/resin_pack/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(!istype(T)) @@ -136,7 +136,7 @@ mix_message = "The solution thickens and solidifies." minimum_temperature = 100 CELSIUS -/decl/chemical_reaction/synthesis/soap/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/soap/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(!istype(T)) @@ -167,7 +167,7 @@ minimum_temperature = 100 CELSIUS var/chipboard_type = /decl/material/solid/organic/wood/chipboard -/decl/chemical_reaction/synthesis/chipboard/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/chipboard/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(!istype(T)) diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index 1bc713de0eb..945334faa79 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -5,30 +5,3 @@ ..() var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics) psi?.check_latency_trigger(30, "a [name] overdose") - -/decl/chemical_reaction/synthesis/nullglass - name = "Soulstone" - result = null - required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) - result_amount = 1 - -#ifdef GAMEMODE_PACK_CULT -/decl/chemical_reaction/synthesis/nullglass/get_alternate_reaction_indicator(var/datum/reagents/holder) - var/list/blood_data = REAGENT_DATA(holder, /decl/material/liquid/blood) - var/weakref/donor_ref = LAZYACCESS(blood_data, DATA_BLOOD_DONOR) - var/mob/living/donor = donor_ref?.resolve() - . = istype(donor) && !!donor.get_ability_handler(/datum/ability_handler/psionics) -#endif - -/decl/chemical_reaction/synthesis/nullglass/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) - var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) - if(reaction_flags) - #ifdef GAMEMODE_PACK_CULT - for(var/i = 1, i <= created_volume, i++) - new /obj/item/soulstone(location) - #else - CRASH("Nullglass alternate reaction triggered in [holder.my_atom] without cult modpack loaded!") - #endif - else - for(var/i = 1, i <= created_volume*2, i++) - new /obj/item/shard(location, /decl/material/solid/gemstone/crystal) \ No newline at end of file diff --git a/mods/gamemodes/cult/mobs/constructs/soulstone.dm b/mods/gamemodes/cult/mobs/constructs/soulstone.dm index a6e8d693c3b..b5a8f6f0948 100644 --- a/mods/gamemodes/cult/mobs/constructs/soulstone.dm +++ b/mods/gamemodes/cult/mobs/constructs/soulstone.dm @@ -107,6 +107,33 @@ full = f update_icon() +// Soulstone synthesis recipe. +/decl/chemical_reaction/synthesis/soulstone + name = "Soulstone" + result = null + required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) + result_amount = 1 + hidden_from_codex = TRUE // This shouldn't show up in search. Maybe it should be linked in a 'guide to cult' or something? + +/decl/chemical_reaction/synthesis/soulstone/send_data(datum/reagents/holder, reaction_limit) + return REAGENT_DATA(holder, /decl/material/liquid/blood) // allow on_reaction to get donor data + +/// Whether or not the reaction should produce a soulstone or a normal crystal. +/// The donor mob parameter may either be /mob/living or null. +/decl/chemical_reaction/synthesis/soulstone/proc/donor_is_magic(mob/living/donor) + return FALSE // By default, no one is magic! This is for modpacks to override. + +/decl/chemical_reaction/synthesis/soulstone/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) + var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) + var/weakref/donor_ref = LAZYACCESS(reaction_data, DATA_BLOOD_DONOR) + if(donor_is_magic(donor_ref?.resolve())) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/soulstone(location) + else // waste it and produce useless crystal shards + for(var/i = 1, i <= created_volume*2, i++) + new /obj/item/shard(location, /decl/material/solid/gemstone/crystal) + +// Construct shells. These accept soulstones. /obj/structure/constructshell name = "empty shell" icon = 'icons/obj/structures/construct.dmi' diff --git a/mods/~compatibility/patches/psionics/cult_psi.dm b/mods/~compatibility/patches/psionics/cult_psi.dm index 85c20391362..0fa46de32d6 100644 --- a/mods/~compatibility/patches/psionics/cult_psi.dm +++ b/mods/~compatibility/patches/psionics/cult_psi.dm @@ -1,3 +1,7 @@ +// Make psion blood usable for soulstone synthesis. +/decl/chemical_reaction/synthesis/soulstone/donor_is_magic(mob/living/donor) + return ..() || !!donor?.get_ability_handler(/datum/ability_handler/psionics) + // Make soulstones interact with psionics. /obj/item/soulstone/disrupts_psionics() . = !full ? src : FALSE From efe0c557c83b0e7c860eec1a5777524b1506f670 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 8 Jan 2025 00:50:37 +0000 Subject: [PATCH 344/554] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-4695.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4695.yml diff --git a/html/changelog.html b/html/changelog.html index 357f4dcea1f..daa00b874bd 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
    +

    08 January 2025

    +

    MistakeNot4892 updated:

    +
      +
    • Mud and blood can now leave footprints.
    • +
    +

    03 January 2025

    MistakeNot4892 updated: