From d3b6781a675e7df2b31b5116108f1bb4a3c39eb5 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 13 Oct 2024 00:53:10 +0000 Subject: [PATCH 01/34] 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 5764b2b41d6..fa05769cd46 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -195,12 +195,6 @@

NataKilar updated:

- -

11 August 2024

-

Penelope Haze updated:

- From 069908a66e47c7df95a2024e44ed8fe44e8e493a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 12 Oct 2024 13:08:42 +1100 Subject: [PATCH 02/34] Adjusting various tool item sizes. --- code/modules/tools/subtypes/drills.dm | 1 + code/modules/tools/subtypes/hammers.dm | 2 ++ code/modules/tools/subtypes/hoes.dm | 17 +++++++++-------- code/modules/tools/subtypes/machetes.dm | 1 - code/modules/tools/subtypes/pickaxes.dm | 1 + code/modules/tools/subtypes/shovel.dm | 2 +- code/modules/tools/tool.dm | 2 +- 7 files changed, 15 insertions(+), 11 deletions(-) diff --git a/code/modules/tools/subtypes/drills.dm b/code/modules/tools/subtypes/drills.dm index e3f2cf4f2bb..d57df30cbb1 100644 --- a/code/modules/tools/subtypes/drills.dm +++ b/code/modules/tools/subtypes/drills.dm @@ -3,6 +3,7 @@ desc = "The most basic of mining drills, for short excavations and small mineral extractions." icon = 'icons/obj/items/tool/drills/drill.dmi' material_alteration = 0 + w_class = ITEM_SIZE_HUGE /obj/item/tool/drill/Initialize(ml, material_key, _handle_material, _binding_material, override_tool_qualities, override_tool_properties) . = ..() diff --git a/code/modules/tools/subtypes/hammers.dm b/code/modules/tools/subtypes/hammers.dm index ffeec48f00c..20304b690e5 100644 --- a/code/modules/tools/subtypes/hammers.dm +++ b/code/modules/tools/subtypes/hammers.dm @@ -48,6 +48,7 @@ "hammers" ) demolisher_type = /datum/extension/demolisher + w_class = ITEM_SIZE_HUGE /obj/item/tool/hammer/sledge/get_initial_tool_qualities() var/static/list/tool_qualities = list( @@ -65,6 +66,7 @@ material_alteration = 0 can_be_twohanded = TRUE _base_attack_force = 15 + w_class = ITEM_SIZE_HUGE /obj/item/tool/hammer/jack/get_initial_tool_qualities() var/static/list/tool_qualities = list( diff --git a/code/modules/tools/subtypes/hoes.dm b/code/modules/tools/subtypes/hoes.dm index ca283a3edb7..05edd5b61f7 100644 --- a/code/modules/tools/subtypes/hoes.dm +++ b/code/modules/tools/subtypes/hoes.dm @@ -1,13 +1,14 @@ /obj/item/tool/hoe - name = "hoe" - desc = "It's used for removing weeds or scratching your back." - icon = 'icons/obj/items/tool/hoes/hoe.dmi' - icon_state = "preview" - sharp = TRUE - edge = TRUE - attack_verb = list("slashed", "sliced", "cut", "clawed") - material = /decl/material/solid/metal/steel + name = "hoe" + desc = "It's used for removing weeds or scratching your back." + icon = 'icons/obj/items/tool/hoes/hoe.dmi' + icon_state = "preview" + sharp = TRUE + edge = TRUE + attack_verb = list("slashed", "sliced", "cut", "clawed") + material = /decl/material/solid/metal/steel material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + w_class = ITEM_SIZE_LARGE /obj/item/tool/hoe/wood color = /decl/material/solid/organic/wood::color diff --git a/code/modules/tools/subtypes/machetes.dm b/code/modules/tools/subtypes/machetes.dm index b0b471a740e..566d4148ee9 100644 --- a/code/modules/tools/subtypes/machetes.dm +++ b/code/modules/tools/subtypes/machetes.dm @@ -2,7 +2,6 @@ name = "machete" desc = "A long, sturdy blade with a rugged handle. Leading the way to cursed treasures since before space travel." icon = 'icons/obj/items/weapon/machetes/machete.dmi' - w_class = ITEM_SIZE_NORMAL slot_flags = SLOT_LOWER_BODY material = /decl/material/solid/metal/titanium base_parry_chance = 50 diff --git a/code/modules/tools/subtypes/pickaxes.dm b/code/modules/tools/subtypes/pickaxes.dm index 3a6a2747b21..0b2bdf0d586 100644 --- a/code/modules/tools/subtypes/pickaxes.dm +++ b/code/modules/tools/subtypes/pickaxes.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/items/tool/pickaxe.dmi' sharp = TRUE edge = TRUE + w_class = ITEM_SIZE_HUGE handle_material = /decl/material/solid/organic/wood _base_attack_force = 15 diff --git a/code/modules/tools/subtypes/shovel.dm b/code/modules/tools/subtypes/shovel.dm index 20ef6053ab0..da05b5532f8 100644 --- a/code/modules/tools/subtypes/shovel.dm +++ b/code/modules/tools/subtypes/shovel.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/tool/shovels/shovel.dmi' icon_state = "preview" // mapping preview icon slot_flags = SLOT_LOWER_BODY - w_class = ITEM_SIZE_HUGE + w_class = ITEM_SIZE_LARGE edge = TRUE sharp = TRUE attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") diff --git a/code/modules/tools/tool.dm b/code/modules/tools/tool.dm index e2cac273065..889d2ab199d 100644 --- a/code/modules/tools/tool.dm +++ b/code/modules/tools/tool.dm @@ -3,7 +3,7 @@ icon_state = ICON_STATE_WORLD obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_LOWER_BODY - w_class = ITEM_SIZE_HUGE + w_class = ITEM_SIZE_NORMAL origin_tech = @'{"materials":1,"engineering":1}' attack_verb = list("hit", "pierced", "sliced", "attacked") sharp = 0 From d5a2332fa2fc28132ef2150bc2452d3d65bf7fef Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 18:29:36 +1100 Subject: [PATCH 03/34] Mantles now work as suit accessories. --- code/modules/clothing/suits/mantle.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/clothing/suits/mantle.dm b/code/modules/clothing/suits/mantle.dm index 9897f9f8254..6d7888cfebb 100644 --- a/code/modules/clothing/suits/mantle.dm +++ b/code/modules/clothing/suits/mantle.dm @@ -2,6 +2,7 @@ name = "mantle" desc = "A light garment worn draped over and around the shoulders." icon = 'icons/clothing/suits/mantle.dmi' + accessory_slot = ACCESSORY_SLOT_OVER /obj/item/clothing/suit/mantle/fated desc = "A heavy, gold-chained mantle." From af709c623e3dc5e4541e6d74b0cb176b74bb2b25 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 18:32:34 +1100 Subject: [PATCH 04/34] Mask slot items show different strings on examine based on facial coverage. --- code/datums/inventory_slots/slots/slot_mask.dm | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/code/datums/inventory_slots/slots/slot_mask.dm b/code/datums/inventory_slots/slots/slot_mask.dm index 7772cc4b5a4..33f44fa9044 100644 --- a/code/datums/inventory_slots/slots/slot_mask.dm +++ b/code/datums/inventory_slots/slots/slot_mask.dm @@ -37,6 +37,13 @@ /datum/inventory_slot/mask/get_examined_string(mob/owner, mob/user, distance, hideflags, decl/pronouns/pronouns) if(_holding && !(hideflags & HIDEMASK)) - if(user == owner) - return "You are wearing [_holding.get_examine_line()] on your face." - return "[pronouns.He] [pronouns.is] wearing [_holding.get_examine_line()] on [pronouns.his] face." + if(_holding.body_parts_covered & SLOT_FACE) + if(user == owner) + return "You are wearing [_holding.get_examine_line()] on your face." + else + return "[pronouns.He] [pronouns.is] wearing [_holding.get_examine_line()] on [pronouns.his] face." + else + if(user == owner) + return "You are wearing [_holding.get_examine_line()] around your neck." + else + return "[pronouns.He] [pronouns.is] wearing [_holding.get_examine_line()] around [pronouns.his] neck." From 99b4e299a6f9d928ee6e74597663d48850375789 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 18:35:02 +1100 Subject: [PATCH 05/34] Dark filler turfs now layer over physical atoms/lighting. --- code/modules/overmap/_defines.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/overmap/_defines.dm b/code/modules/overmap/_defines.dm index 323729e6e21..e82c7adc05c 100644 --- a/code/modules/overmap/_defines.dm +++ b/code/modules/overmap/_defines.dm @@ -26,6 +26,8 @@ dynamic_lighting = FALSE opacity = TRUE density = TRUE + plane = ABOVE_LIGHTING_PLANE + layer = OBFUSCATION_LAYER // Cover all non-hud material. ///Turf with its map coordinate written on. Handy for debugging. /turf/unsimulated/debug_grid From 9cdec36827a2f892f74f9add75b9083bdb46003d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 18:41:48 +1100 Subject: [PATCH 06/34] Simplemob natural weapons can no longer knock humans prone (by default). --- code/game/objects/items/__item.dm | 3 +++ code/modules/mob/living/human/human_defense.dm | 10 ++++------ .../mob/living/simple_animal/natural_weapons.dm | 1 + 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 4fa8335b7fd..72707813ca7 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -112,6 +112,9 @@ /// Can this object leak into water sources? var/watertight = FALSE + /// Can this item knock someone out if used as a weapon? Overridden for natural weapons as a nerf to simplemobs. + var/weapon_can_knock_prone = TRUE + /obj/item/get_color() if(paint_color) return paint_color diff --git a/code/modules/mob/living/human/human_defense.dm b/code/modules/mob/living/human/human_defense.dm index 9d5ded964b9..1014326d217 100644 --- a/code/modules/mob/living/human/human_defense.dm +++ b/code/modules/mob/living/human/human_defense.dm @@ -169,7 +169,7 @@ meteor_act forcesay(global.hit_appends) //forcesay checks stat already radio_interrupt_cooldown = world.time + (RADIO_INTERRUPT_DEFAULT * 0.8) //getting beat on can briefly prevent radio use - if((I.atom_damage_type == BRUTE || I.atom_damage_type == PAIN) && prob(25 + (effective_force * 2))) + if(!stat && I.weapon_can_knock_prone && (I.atom_damage_type == BRUTE || I.atom_damage_type == PAIN) && prob(25 + (effective_force * 2))) if(!stat) if(headcheck(hit_zone)) //Harder to score a stun but if you do it lasts a bit longer @@ -184,11 +184,9 @@ meteor_act if(current_posture.prone) visible_message("[src] has been knocked down!") - //Apply blood - attack_bloody(I, user, effective_force, hit_zone) - - animate_receive_damage(src) - + //Apply blood + attack_bloody(I, user, effective_force, hit_zone) + animate_receive_damage(src) return 1 /mob/living/human/proc/attack_bloody(obj/item/W, mob/attacker, var/effective_force, var/hit_zone) diff --git a/code/modules/mob/living/simple_animal/natural_weapons.dm b/code/modules/mob/living/simple_animal/natural_weapons.dm index 7a20a6b4b30..161bf49f7cd 100644 --- a/code/modules/mob/living/simple_animal/natural_weapons.dm +++ b/code/modules/mob/living/simple_animal/natural_weapons.dm @@ -7,6 +7,7 @@ obj_flags = OBJ_FLAG_CONDUCTIBLE //for intent of shocking checks, they're right inside the animal is_spawnable_type = FALSE needs_attack_dexterity = DEXTERITY_NONE + weapon_can_knock_prone = FALSE // Very powerful in the hands of simplemobs. var/show_in_message // whether should we show up in attack message, e.g. 'urist has been bit with teeth by carp' vs 'urist has been bit by carp' /obj/item/natural_weapon/get_attack_force(mob/living/user) From 7dcb4140034b4d364414d89e7df61764bb0cd760 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 18:45:00 +1100 Subject: [PATCH 07/34] Tweaks simplemob attack delay. --- .../mob/living/simple_animal/_simple_animal.dm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/simple_animal/_simple_animal.dm b/code/modules/mob/living/simple_animal/_simple_animal.dm index 239cfe25c73..1fecd977c88 100644 --- a/code/modules/mob/living/simple_animal/_simple_animal.dm +++ b/code/modules/mob/living/simple_animal/_simple_animal.dm @@ -17,10 +17,12 @@ /decl/move_intent/run/animal ) - var/base_movement_delay = 0 // Added to the delay expected from movement decls. - ai = /datum/mob_controller + /// Added to the delay expected from movement decls. + var/base_movement_delay = 0 + /// Can this mob in theory have a mob riding it? var/can_have_rider = TRUE + /// If the mob can be ridden, what is the largest size of rider? var/max_rider_size = MOB_SIZE_SMALL /// Does the percentage health show in the stat panel for the mob? @@ -81,8 +83,12 @@ var/scannable_result // Codex page generated when this mob is scanned. var/base_animal_type // set automatically in Initialize(), used for language checking. - var/attack_delay = DEFAULT_ATTACK_COOLDOWN // How long in ds that a creature winds up before attacking. - var/sa_accuracy = 85 //base chance to hit out of 100 + // By default, simple mobs should attack slightly slower than players, allowing a suitably attentive + // player to dodge/kite if they're paying attention, and not letting themselves get cornered/incapacitated. + var/attack_delay = DEFAULT_ATTACK_COOLDOWN * 1.5 // strong but slower than other spiders. + + // Base percentage chance to hit in melee against another mob, if controlled by an AI. + var/telegraphed_melee_accuracy = 85 // Visible message shown when the mob dies. var/death_message = "dies!" @@ -491,7 +497,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() bodytype_category = "quadrupedal animal body" /mob/living/simple_animal/get_base_telegraphed_melee_accuracy() - return sa_accuracy + return telegraphed_melee_accuracy /mob/living/simple_animal/check_has_mouth() return TRUE From a14cd3a3e09c1a68d7e03ac7683a28ced8fbbc4a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 18:53:28 +1100 Subject: [PATCH 08/34] Simplemobs will target random limbs based on limb relative size, instead of always targeting the chest. --- code/datums/ai/_ai.dm | 7 +++++++ code/modules/mob/living/living.dm | 1 + .../mob/living/simple_animal/_simple_animal.dm | 2 +- code/modules/mob/mob.dm | 5 +++++ code/modules/mob/mob_helpers.dm | 16 +--------------- 5 files changed, 15 insertions(+), 16 deletions(-) diff --git a/code/datums/ai/_ai.dm b/code/datums/ai/_ai.dm index be51dd0ee08..ba6f3d2f81e 100644 --- a/code/datums/ai/_ai.dm +++ b/code/datums/ai/_ai.dm @@ -307,3 +307,10 @@ /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() + if(body) + return body.set_target_zone(ran_zone()) + return FALSE diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9c9ed33d687..3f7e387625b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1836,6 +1836,7 @@ default behaviour is: reset_offsets(anim_time = 2) return FALSE + ai?.update_target_zone() reset_offsets(anim_time = 2) 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 1fecd977c88..95b6c06bb8b 100644 --- a/code/modules/mob/living/simple_animal/_simple_animal.dm +++ b/code/modules/mob/living/simple_animal/_simple_animal.dm @@ -85,7 +85,7 @@ // By default, simple mobs should attack slightly slower than players, allowing a suitably attentive // player to dodge/kite if they're paying attention, and not letting themselves get cornered/incapacitated. - var/attack_delay = DEFAULT_ATTACK_COOLDOWN * 1.5 // strong but slower than other spiders. + var/attack_delay = DEFAULT_ATTACK_COOLDOWN * 1.3 // Base percentage chance to hit in melee against another mob, if controlled by an AI. var/telegraphed_melee_accuracy = 85 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f99ee59aaf4..4f66e2d04e0 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1263,6 +1263,11 @@ /mob/proc/toggle_internals(var/mob/living/user) return +/mob/proc/set_target_zone(new_zone) + if(zone_sel) + return zone_sel?.set_selected_zone(new_zone) + return FALSE + /mob/proc/get_target_zone() return zone_sel?.selecting || BP_CHEST diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index d942be08641..5fb27df3f1d 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -117,23 +117,9 @@ var/global/list/global/organ_rel_size = list( zone = check_zone(zone, target) if(prob(probability)) return zone - var/ran_zone = zone while (ran_zone == zone) - ran_zone = pick ( - organ_rel_size[BP_HEAD]; BP_HEAD, - organ_rel_size[BP_CHEST]; BP_CHEST, - organ_rel_size[BP_GROIN]; BP_GROIN, - organ_rel_size[BP_L_ARM]; BP_L_ARM, - organ_rel_size[BP_R_ARM]; BP_R_ARM, - organ_rel_size[BP_L_LEG]; BP_L_LEG, - organ_rel_size[BP_R_LEG]; BP_R_LEG, - organ_rel_size[BP_L_HAND]; BP_L_HAND, - organ_rel_size[BP_R_HAND]; BP_R_HAND, - organ_rel_size[BP_L_FOOT]; BP_L_FOOT, - organ_rel_size[BP_R_FOOT]; BP_R_FOOT - ) - + ran_zone = pickweight(organ_rel_size) return ran_zone // Emulates targetting a specific body part, and miss chances From df25c9f68da2b4ac0ef579536bb28b8b935af548 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 19:11:55 +1100 Subject: [PATCH 09/34] You can no longer drink/wash hands in a plot of soil. --- code/game/objects/items/_item_interactions.dm | 2 +- code/modules/hydroponics/trays/tray_soil.dm | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/_item_interactions.dm b/code/game/objects/items/_item_interactions.dm index 1adee746738..43117038eab 100644 --- a/code/game/objects/items/_item_interactions.dm +++ b/code/game/objects/items/_item_interactions.dm @@ -95,7 +95,7 @@ interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION /decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) - return ..() && target?.reagents?.total_volume && user.check_has_mouth() && !istype(target, /obj/item) + return ..() && ATOM_IS_OPEN_CONTIANER(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) diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index d33a3f9d02f..ca88be8d82a 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -12,6 +12,11 @@ color = "#7c5e42" var/obj/item/stack/material/brick/reinforced_with +/obj/machinery/portable_atmospherics/hydroponics/soil/get_alt_interactions(var/mob/user) + . = ..() + . -= /decl/interaction_handler/drink + . -= /decl/interaction_handler/wash_hands + /obj/machinery/portable_atmospherics/hydroponics/soil/Initialize() . = ..() From 03d727c9b39dc3093cb025cacfc1928c3bc86258 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 19:20:37 +1100 Subject: [PATCH 10/34] Shovels can be used to remove plants from a hydrotray. --- code/game/objects/items/_item_interactions.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 61 ++++++++++--------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/code/game/objects/items/_item_interactions.dm b/code/game/objects/items/_item_interactions.dm index 43117038eab..c2213f0f52d 100644 --- a/code/game/objects/items/_item_interactions.dm +++ b/code/game/objects/items/_item_interactions.dm @@ -95,7 +95,7 @@ interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION /decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) - return ..() && ATOM_IS_OPEN_CONTIANER(target) && target?.reagents?.total_volume && user.check_has_mouth() && !istype(target, /obj/item) + 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) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 155f054fccf..2edad5d68c9 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -121,14 +121,30 @@ /decl/material/liquid/mutagenics = 15 ) -/obj/machinery/portable_atmospherics/hydroponics/proc/set_seed(var/new_seed) +/obj/machinery/portable_atmospherics/hydroponics/proc/set_seed(new_seed, reset_values) + if(seed == new_seed) return + seed = new_seed + if(seed?.scannable_result) set_extension(src, /datum/extension/scannable, seed.scannable_result) else if(has_extension(src, /datum/extension/scannable)) remove_extension(src, /datum/extension/scannable) + + dead = 0 + age = 0 + sampled = 0 + harvest = 0 + + if(reset_values) + yield_mod = 0 + mutation_mod = 0 + lastproduce = 0 + weedlevel = 0 + + check_plant_health() update_icon() /obj/machinery/portable_atmospherics/hydroponics/attack_ghost(var/mob/observer/ghost/user) @@ -176,7 +192,7 @@ if(istype(Proj, /obj/item/projectile/energy/floramut/gene)) var/obj/item/projectile/energy/floramut/gene/G = Proj if(seed) - set_seed(seed.diverge_mutate_gene(G.gene, get_turf(loc))) //get_turf just in case it's not in a turf. + set_seed(seed.diverge_mutate_gene(G.gene, get_turf(loc)), reset_values = FALSE) //get_turf just in case it's not in a turf. else mutate(1) return @@ -282,10 +298,6 @@ if(!seed.get_trait(TRAIT_HARVEST_REPEAT)) yield_mod = 0 set_seed(null) - dead = 0 - age = 0 - sampled = 0 - mutation_mod = 0 check_plant_health() @@ -304,24 +316,16 @@ set_seed(null) - dead = 0 - sampled = 0 - age = 0 - yield_mod = 0 - mutation_mod = 0 - lastproduce = 0 - check_plant_health() return TRUE // If a weed growth is sufficient, this proc is called. /obj/machinery/portable_atmospherics/hydroponics/proc/weed_invasion() - set_seed(SSplants.seeds[pick(list("reishi", "nettles", "amanita", "mushrooms", "plumphelmet", "towercap", "harebells", "weeds"))]) + set_seed(SSplants.seeds[pick(list("reishi", "nettles", "amanita", "mushrooms", "plumphelmet", "towercap", "harebells", "weeds"))], reset_values = FALSE) if(!seed) return //Weed does not exist, someone fucked up. - dead = 0 age = 0 plant_health = seed.get_trait(TRAIT_ENDURANCE) lastcycle = world.time @@ -349,7 +353,7 @@ // If it's not in the global list, then no products of the line have been // harvested yet and it's safe to assume it's restricted to this tray. if(!isnull(SSplants.seeds[seed.name])) - set_seed(seed.diverge()) + set_seed(seed.diverge(), reset_values = FALSE) seed.mutate(severity,get_turf(src)) return @@ -385,20 +389,15 @@ /obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species() - var/previous_plant = seed.display_name - var/newseed = seed.get_mutant_variant() - if(newseed in SSplants.seeds) - set_seed(SSplants.seeds[newseed]) - else + var/newseed = seed?.get_mutant_variant() + if(!newseed || !(newseed in SSplants.seeds)) return - dead = 0 + var/previous_plant = seed.display_name + set_seed(SSplants.seeds[newseed]) mutate(1) - age = 0 plant_health = seed.get_trait(TRAIT_ENDURANCE) lastcycle = world.time - harvest = 0 - weedlevel = 0 update_icon() visible_message("The [previous_plant] has suddenly mutated into [seed.display_name]!") @@ -451,6 +450,15 @@ to_chat(user, SPAN_WARNING("This plot is completely devoid of weeds. It doesn't need uprooting.")) return TRUE + if(IS_SHOVEL(O)) + if(seed) + var/removing_seed = seed + if(O.do_tool_interaction(TOOL_SHOVEL, user, src, 3 SECONDS, start_message = "removing \the [seed.display_name] from", success_message = "removing \the [seed.display_name] from") && seed == removing_seed) + set_seed(null) + else + to_chat(user, SPAN_WARNING("There is no plant in \the [src] to remove.")) + return TRUE + if (istype(O, /obj/item/plants)) physical_attack_hand(user) // Harvests and clears out dead plants. if(O.storage) @@ -536,7 +544,6 @@ to_chat(user, SPAN_NOTICE("You plant the [plant_noun].")) lastproduce = 0 set_seed(planting_seed) //Grab the seed datum. - dead = 0 age = 1 //Snowflakey, maybe move this to the seed datum @@ -635,8 +642,6 @@ var/obj/item/seeds/S = locate() in get_turf(src) if(S.seed) set_seed(S.seed) - lastproduce = 0 - dead = 0 age = 1 plant_health = (istype(S, /obj/item/seeds/extracted/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE)) lastcycle = world.time From 149ebfea4ecda7b52676378e2860913285b60ceb Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 19:31:05 +1100 Subject: [PATCH 11/34] Some alt interactions will now refuse to be called without user confirmation, even if default. --- code/__defines/interactions.dm | 6 ++++++ code/game/objects/items/_item_interactions.dm | 4 ++-- code/modules/interactions/interactions_atom.dm | 7 +++---- code/modules/reagents/reagent_containers.dm | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/code/__defines/interactions.dm b/code/__defines/interactions.dm index d624b0bee87..e51fa7ac213 100644 --- a/code/__defines/interactions.dm +++ b/code/__defines/interactions.dm @@ -1,4 +1,10 @@ +/// This interaction requires the user to be adjacent to the target. #define INTERACTION_NEEDS_ADJACENCY BITFLAG(0) +/// This interaction requires the user to pass a physical interaction check. #define INTERACTION_NEEDS_PHYSICAL_INTERACTION BITFLAG(1) +/// This interaction requires the target to be on a turf #define INTERACTION_NEEDS_TURF BITFLAG(2) +/// This interaction requires the target to be in the user's inventory. #define INTERACTION_NEEDS_INVENTORY BITFLAG(3) +/// This interaction will always prompt for a selection from the user, even if it is the only available interaction. +#define INTERACTION_NEVER_AUTOMATIC BITFLAG(4) \ No newline at end of file diff --git a/code/game/objects/items/_item_interactions.dm b/code/game/objects/items/_item_interactions.dm index c2213f0f52d..d926931f8c5 100644 --- a/code/game/objects/items/_item_interactions.dm +++ b/code/game/objects/items/_item_interactions.dm @@ -44,7 +44,7 @@ /decl/interaction_handler/wash_hands name = "Wash Hands" expected_target_type = /atom - interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION + 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) @@ -92,7 +92,7 @@ /decl/interaction_handler/drink name = "Drink" expected_target_type = /atom - interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION + 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) diff --git a/code/modules/interactions/interactions_atom.dm b/code/modules/interactions/interactions_atom.dm index 0bce0a3ca78..e8073b75f4a 100644 --- a/code/modules/interactions/interactions_atom.dm +++ b/code/modules/interactions/interactions_atom.dm @@ -14,10 +14,9 @@ if(!length(possibilities)) return FALSE - var/decl/interaction_handler/choice - if(length(possibilities) == 1) - choice = possibilities[1] - else + var/decl/interaction_handler/choice = possibilities[1] + if(length(possibilities) > 1 || (choice.interaction_flags & INTERACTION_NEVER_AUTOMATIC)) + choice = null choice = show_radial_menu(user, src, possibilities, use_labels = RADIAL_LABELS_CENTERED) if(!istype(choice) || QDELETED(user) || !(choice.type in get_alt_interactions(user)) || !choice.is_possible(src, user, prop)) return TRUE diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index d3fee37783c..d52f3a700d7 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -220,7 +220,7 @@ /decl/interaction_handler/empty/chems name = "Empty On Floor" expected_target_type = /obj/item/chems - interaction_flags = INTERACTION_NEEDS_INVENTORY | INTERACTION_NEEDS_PHYSICAL_INTERACTION + interaction_flags = INTERACTION_NEEDS_INVENTORY | INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC /decl/interaction_handler/empty/chems/invoked(atom/target, mob/user, obj/item/prop) var/turf/T = get_turf(user) From 9ac60d60fe3763b4052b7b06b6cc4b44ff476f15 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 19:51:00 +1100 Subject: [PATCH 12/34] Doing a pass on flooring decls to readd descs/sounds/gender. --- code/game/turfs/flooring/_flooring.dm | 7 +++++++ code/game/turfs/flooring/flooring_carpet.dm | 2 +- code/game/turfs/flooring/flooring_concrete.dm | 5 +++-- code/game/turfs/flooring/flooring_grass.dm | 2 ++ code/game/turfs/flooring/flooring_holowater.dm | 2 +- code/game/turfs/flooring/flooring_lava.dm | 1 + code/game/turfs/flooring/flooring_misc.dm | 8 ++++++-- code/game/turfs/flooring/flooring_mud.dm | 4 ++-- code/game/turfs/flooring/flooring_natural.dm | 8 +++++--- code/game/turfs/flooring/flooring_path.dm | 4 +++- code/game/turfs/flooring/flooring_reinforced.dm | 4 ++++ code/game/turfs/flooring/flooring_rock.dm | 1 + code/game/turfs/flooring/flooring_sand.dm | 3 ++- code/game/turfs/flooring/flooring_snow.dm | 2 +- code/game/turfs/flooring/flooring_tiled.dm | 1 + code/game/turfs/flooring/flooring_wood.dm | 3 ++- code/game/turfs/floors/_floor.dm | 1 + 17 files changed, 43 insertions(+), 15 deletions(-) diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index c31500af0c4..1ff678dddc3 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -13,6 +13,7 @@ var/global/list/flooring_cache = list() var/name var/desc var/icon + var/gender = PLURAL /// "that's some grass" var/icon_base var/color = COLOR_WHITE var/footstep_type = /decl/footsteps/blank @@ -120,6 +121,12 @@ var/global/list/flooring_cache = list() /decl/flooring/validate() . = ..() + if(!istext(name)) + . += "null or invalid name string" + + if(!istext(desc)) + . += "null or invalid desc string" + if(!icon) . += "null icon" diff --git a/code/game/turfs/flooring/flooring_carpet.dm b/code/game/turfs/flooring/flooring_carpet.dm index 1158eb56ff1..27a9aa6b06b 100644 --- a/code/game/turfs/flooring/flooring_carpet.dm +++ b/code/game/turfs/flooring/flooring_carpet.dm @@ -1,6 +1,6 @@ /decl/flooring/carpet name = "brown carpet" - desc = "Comfy and fancy carpeting." + desc = "A stretch of cut pile carpet. Comfy and fancy." icon = 'icons/turf/flooring/carpet.dmi' icon_base = "brown" build_type = /obj/item/stack/tile/carpet diff --git a/code/game/turfs/flooring/flooring_concrete.dm b/code/game/turfs/flooring/flooring_concrete.dm index 8924ba7901f..4b747fc28d2 100644 --- a/code/game/turfs/flooring/flooring_concrete.dm +++ b/code/game/turfs/flooring/flooring_concrete.dm @@ -1,6 +1,6 @@ /decl/flooring/concrete name = "concrete" - desc = "A flat expanse of artificial stone-like artificial material." + desc = "A flat expanse of stone-like artificial material." icon = 'icons/turf/flooring/concrete.dmi' icon_base = "inset" has_base_range = null @@ -10,9 +10,10 @@ /decl/flooring/concrete/reinforced name = "reinforced concrete" icon_base = "hexacrete" - desc = "Stone-like artificial material. It has been reinforced with an unknown compound." + desc = "A flat stretch of stone-like artificial material. It has been reinforced with an unknown compound." /decl/flooring/concrete/asphalt name = "asphalt" color = COLOR_GRAY40 icon_base = "concrete" + desc = "A stretch of rough blacktop, probably part of a road." diff --git a/code/game/turfs/flooring/flooring_grass.dm b/code/game/turfs/flooring/flooring_grass.dm index 6dc48401b69..802c509f573 100644 --- a/code/game/turfs/flooring/flooring_grass.dm +++ b/code/game/turfs/flooring/flooring_grass.dm @@ -2,6 +2,7 @@ name = "grass" icon = 'icons/turf/flooring/grass.dmi' icon_base = "grass" + desc = "A patch of thriving meadowgrass." has_base_range = 3 footstep_type = /decl/footsteps/grass icon_edge_layer = FLOOR_EDGE_GRASS @@ -24,6 +25,7 @@ name = "wild grass" icon = 'icons/turf/flooring/wildgrass.dmi' icon_base = "wildgrass" + desc = "A lush, overgrown patch of wild meadowgrass. Watch out for snakes." has_base_range = null icon_edge_layer = FLOOR_EDGE_GRASS_WILD harvestable = TRUE diff --git a/code/game/turfs/flooring/flooring_holowater.dm b/code/game/turfs/flooring/flooring_holowater.dm index 5d9eab0b44a..d873db21a10 100644 --- a/code/game/turfs/flooring/flooring_holowater.dm +++ b/code/game/turfs/flooring/flooring_holowater.dm @@ -1,6 +1,6 @@ /decl/flooring/fake_water name = "holowater" - desc = "The ripples are a fraction of a second out of sync." + desc = "The ripples are a fraction of a second out of sync with each other." color = COLOR_LIQUID_WATER icon = 'icons/turf/flooring/fake_water.dmi' icon_base = "fakewater" diff --git a/code/game/turfs/flooring/flooring_lava.dm b/code/game/turfs/flooring/flooring_lava.dm index 4f3f6d338e9..beebb36b775 100644 --- a/code/game/turfs/flooring/flooring_lava.dm +++ b/code/game/turfs/flooring/flooring_lava.dm @@ -3,6 +3,7 @@ name = "lava" icon_base = "lava" icon = 'icons/turf/flooring/lava.dmi' + desc = "A pool of incredibly hot molten rock. You can feel the heat radiating even from a distance. Watch your step." movement_delay = 4 footstep_type = /decl/footsteps/lava has_environment_proc = TRUE diff --git a/code/game/turfs/flooring/flooring_misc.dm b/code/game/turfs/flooring/flooring_misc.dm index dd718fe4e0d..48598df7f40 100644 --- a/code/game/turfs/flooring/flooring_misc.dm +++ b/code/game/turfs/flooring/flooring_misc.dm @@ -1,6 +1,6 @@ /decl/flooring/linoleum name = "linoleum" - desc = "It's like the 2090's all over again." + desc = "A stretch of inlaid sections of flexible linoleum." icon = 'icons/turf/flooring/linoleum.dmi' icon_base = "lino" can_paint = 1 @@ -11,7 +11,8 @@ constructed = TRUE /decl/flooring/crystal - name = "crystal floor" + name = "crystal flooring" + desc = "A hard, reflective section of flooring made from crystal." icon = 'icons/turf/flooring/crystal.dmi' icon_base = "crystal" build_type = null @@ -56,6 +57,7 @@ render_trenches = FALSE force_material = /decl/material/solid/stone/ceramic constructed = TRUE + gender = NEUTER /decl/flooring/woven name = "woven floor" @@ -69,6 +71,7 @@ color = COLOR_BEIGE force_material = /decl/material/solid/organic/plantmatter/grass/dry constructed = TRUE + gender = NEUTER /decl/flooring/straw name = "straw floor" @@ -83,3 +86,4 @@ color = COLOR_WHEAT force_material = /decl/material/solid/organic/plantmatter/grass/dry constructed = TRUE + gender = NEUTER diff --git a/code/game/turfs/flooring/flooring_mud.dm b/code/game/turfs/flooring/flooring_mud.dm index 6dbe53a90f2..59be34fdfad 100644 --- a/code/game/turfs/flooring/flooring_mud.dm +++ b/code/game/turfs/flooring/flooring_mud.dm @@ -1,6 +1,6 @@ /decl/flooring/mud name = "mud" - desc = "Thick, waterlogged mud." + desc = "A stretch of thick, waterlogged mud." icon = 'icons/turf/flooring/mud.dmi' icon_base = "mud" icon_edge_layer = FLOOR_EDGE_MUD @@ -20,7 +20,7 @@ /decl/flooring/dry_mud name = "dry mud" - desc = "Should have stayed hydrated." + desc = "This was once mud, but forgot to keep hydrated." icon = 'icons/turf/flooring/seafloor.dmi' icon_base = "seafloor" icon_edge_layer = FLOOR_EDGE_MUD diff --git a/code/game/turfs/flooring/flooring_natural.dm b/code/game/turfs/flooring/flooring_natural.dm index 6d3876ab316..55742476ec3 100644 --- a/code/game/turfs/flooring/flooring_natural.dm +++ b/code/game/turfs/flooring/flooring_natural.dm @@ -6,10 +6,11 @@ icon_edge_layer = FLOOR_EDGE_SEAFLOOR turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/sand + gender = NEUTER /decl/flooring/shrouded name = "packed sand" - desc = "Sand that has been packed in to solid earth." + desc = "Packed-down sand forming a solid layer." icon = 'icons/turf/flooring/shrouded.dmi' icon_base = "shrouded" dirt_color = "#3e3960" @@ -29,7 +30,7 @@ /decl/flooring/barren name = "ground" - desc = "Bare, barren sand." + desc = "A stretch of bare, barren sand." icon = 'icons/turf/flooring/barren.dmi' icon_base = "barren" color = COLOR_WHITE @@ -41,7 +42,7 @@ /decl/flooring/clay name = "clay" - desc = "Thick, claggy clay." + desc = "A stretch of thick, claggy clay." icon = 'icons/turf/flooring/clay.dmi' icon_base = "clay" icon_edge_layer = FLOOR_EDGE_CLAY @@ -52,6 +53,7 @@ /decl/flooring/ice name = "ice" + desc = "A hard, slippery layer of frozen water." icon = 'icons/turf/flooring/ice.dmi' icon_base = "ice" footstep_type = /decl/footsteps/plating diff --git a/code/game/turfs/flooring/flooring_path.dm b/code/game/turfs/flooring/flooring_path.dm index 1ceddda2e1f..37ce339b7ec 100644 --- a/code/game/turfs/flooring/flooring_path.dm +++ b/code/game/turfs/flooring/flooring_path.dm @@ -21,7 +21,7 @@ target.desc = "[jointext_no_nulls(list("A", paving_adjective, "path made of", paver_adjective, material.adjective_name, paver_noun), " ")]." /decl/flooring/path/cobblestone - name = "cobblestone path" + name = "cobblestones" desc = "A rustic cobblestone path." icon_base = "cobble" icon_edge_layer = FLOOR_EDGE_PATH @@ -31,8 +31,10 @@ name = "stone path" desc = "A rustic stone path, laid out in a running bond pattern." icon_base = "runningbond" + gender = NEUTER /decl/flooring/path/herringbone name = "stone path" desc = "A rustic stone path, laid out in a herringbone pattern." icon_base = "herringbone" + gender = NEUTER diff --git a/code/game/turfs/flooring/flooring_reinforced.dm b/code/game/turfs/flooring/flooring_reinforced.dm index 80fce0d663c..88756a989e3 100644 --- a/code/game/turfs/flooring/flooring_reinforced.dm +++ b/code/game/turfs/flooring/flooring_reinforced.dm @@ -12,9 +12,11 @@ footstep_type = /decl/footsteps/plating force_material = /decl/material/solid/metal/steel constructed = TRUE + gender = NEUTER /decl/flooring/reinforced/circuit name = "processing strata" + desc = "A complex network of circuits beneath reinforced glass." icon = 'icons/turf/flooring/circuit.dmi' icon_base = "bcircuit" build_type = null @@ -32,11 +34,13 @@ /decl/flooring/reinforced/shuttle name = "floor" + desc = "A stretch of plastic shuttle flooring." icon = 'icons/turf/flooring/shuttle.dmi' build_type = null flooring_flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK | TURF_REMOVE_CROWBAR can_paint = 1 can_engrave = FALSE + gender = NEUTER /decl/flooring/reinforced/shuttle/blue icon_base = "floor" diff --git a/code/game/turfs/flooring/flooring_rock.dm b/code/game/turfs/flooring/flooring_rock.dm index 88c97f71a37..89b3fd45535 100644 --- a/code/game/turfs/flooring/flooring_rock.dm +++ b/code/game/turfs/flooring/flooring_rock.dm @@ -6,6 +6,7 @@ has_base_range = null color = null icon_edge_layer = FLOOR_EDGE_VOLCANIC + gender = NEUTER /decl/flooring/rock/update_turf_strings(turf/floor/target) var/decl/material/material = target?.get_material() diff --git a/code/game/turfs/flooring/flooring_sand.dm b/code/game/turfs/flooring/flooring_sand.dm index d09f5ca8b0c..27084c19ecb 100644 --- a/code/game/turfs/flooring/flooring_sand.dm +++ b/code/game/turfs/flooring/flooring_sand.dm @@ -46,10 +46,11 @@ icon_base = "space" has_base_range = 25 holographic = TRUE + gender = NEUTER /decl/flooring/melted_sand name = "molten silica" - desc = "A glassed patch of sand." + desc = "A patch of sand that has been fused into glass by extreme temperature." icon = 'icons/turf/flooring/sand.dmi' icon_base = "glass" has_base_range = null diff --git a/code/game/turfs/flooring/flooring_snow.dm b/code/game/turfs/flooring/flooring_snow.dm index 34de06ab67b..6055cdda83d 100644 --- a/code/game/turfs/flooring/flooring_snow.dm +++ b/code/game/turfs/flooring/flooring_snow.dm @@ -30,7 +30,7 @@ /decl/flooring/permafrost name = "permafrost" - desc = "Let it snow, let it snow, let it snow..." + desc = "A stretch of frozen soil that hasn't seen a thaw for many seasons." icon = 'icons/turf/flooring/snow.dmi' icon_base = "permafrost" force_material = /decl/material/solid/ice diff --git a/code/game/turfs/flooring/flooring_tiled.dm b/code/game/turfs/flooring/flooring_tiled.dm index 686f2d75d1d..3f826561b8b 100644 --- a/code/game/turfs/flooring/flooring_tiled.dm +++ b/code/game/turfs/flooring/flooring_tiled.dm @@ -14,6 +14,7 @@ wall_smooth = SMOOTH_ALL space_smooth = SMOOTH_ALL constructed = TRUE + gender = NEUTER /decl/flooring/tiling/mono icon_base = "monotile" diff --git a/code/game/turfs/flooring/flooring_wood.dm b/code/game/turfs/flooring/flooring_wood.dm index 132cadb1b46..a7f19021bfe 100644 --- a/code/game/turfs/flooring/flooring_wood.dm +++ b/code/game/turfs/flooring/flooring_wood.dm @@ -1,6 +1,6 @@ /decl/flooring/wood name = "wooden floor" - desc = "Polished wood planks." + desc = "A stretch of closely-fitted wooden planks." icon = 'icons/turf/flooring/wood.dmi' icon_base = "wood" damage_temperature = T0C+200 @@ -11,6 +11,7 @@ color = /decl/material/solid/organic/wood::color force_material = /decl/material/solid/organic/wood constructed = TRUE + gender = NEUTER /decl/flooring/wood/mahogany color = /decl/material/solid/organic/wood/mahogany::color diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index 0dd9e8e4365..2068c66a92c 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -171,6 +171,7 @@ update_floor_strings() + gender = copy_from.gender layer = copy_from.floor_layer turf_flags = copy_from.turf_flags z_flags = copy_from.z_flags From 5aae4ed07e138b92b70cd041646c641c91817b3c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 19:59:19 +1100 Subject: [PATCH 13/34] Floors will now return the correct flooring sound even if they are plating. --- code/game/turfs/floors/_floor.dm | 10 ++++------ code/game/turfs/turf_footsteps.dm | 7 +------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index 2068c66a92c..52fe81a776e 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -223,12 +223,10 @@ physically_destroyed() /turf/floor/get_footstep_sound(var/mob/caller) - . = ..() - if(!.) - var/decl/flooring/use_flooring = get_topmost_flooring() - if(istype(use_flooring)) - return get_footstep_for_mob(use_flooring.footstep_type) - return get_footstep_for_mob(/decl/footsteps/blank) + var/decl/flooring/use_flooring = get_topmost_flooring() + if(istype(use_flooring)) + return get_footstep_for_mob(use_flooring.footstep_type, caller) + return ..() /turf/floor/get_movable_alpha_mask_state(atom/movable/mover) . = ..() diff --git a/code/game/turfs/turf_footsteps.dm b/code/game/turfs/turf_footsteps.dm index 093a144bc96..371d40feefa 100644 --- a/code/game/turfs/turf_footsteps.dm +++ b/code/game/turfs/turf_footsteps.dm @@ -5,16 +5,11 @@ . = pick(FS.footstep_sounds) /turf/proc/get_footstep_sound(var/mob/caller) - for(var/obj/structure/S in contents) if(S.footstep_type) return get_footstep_for_mob(S.footstep_type, caller) - if(check_fluid_depth(10) && !is_flooded(TRUE)) return get_footstep_for_mob(/decl/footsteps/water, caller) - if(footstep_type) return get_footstep_for_mob(footstep_type, caller) - - if(is_plating()) - return get_footstep_for_mob(/decl/footsteps/plating, caller) + return get_footstep_for_mob(/decl/footsteps/blank, caller) \ No newline at end of file From dbc9d38c736a9f62a10affee572991129f6f0cbf Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 20:09:48 +1100 Subject: [PATCH 14/34] Adjusted several w_class values to prevent putting a number of items behind your ear (and to increase matter calc). --- .../machinery/_machines_base/stock_parts/legacy_parts.dm | 6 +----- .../_machines_base/stock_parts/stock_parts_interface.dm | 2 +- code/game/objects/items/devices/taperecorder.dm | 2 +- code/game/objects/items/devices/traitordevices.dm | 2 +- code/game/objects/items/flame/flame_candle.dm | 2 +- code/game/objects/items/flashlights/flare.dm | 2 +- code/game/objects/items/flashlights/slime.dm | 2 +- code/game/objects/items/toys.dm | 6 +++--- code/game/objects/items/weapons/shields.dm | 2 +- code/game/objects/items/weapons/storage/bags.dm | 2 +- code/game/objects/items/weapons/storage/matches.dm | 2 +- code/game/objects/items/weapons/tools/crowbar.dm | 2 +- code/modules/clothing/underwear/base.dm | 2 +- code/modules/games/cards.dm | 2 +- code/modules/locks/keyring.dm | 2 +- code/modules/multiz/movement.dm | 2 +- code/modules/organs/organ.dm | 2 +- code/modules/paperwork/paper.dm | 9 +++++---- code/modules/paperwork/pen/crayon.dm | 2 -- code/modules/paperwork/photography.dm | 2 +- code/modules/paperwork/stamps.dm | 2 +- code/modules/power/lighting.dm | 2 +- code/modules/projectiles/guns/launcher/syringe_gun.dm | 2 +- code/modules/reagents/reagent_containers/blood_pack.dm | 6 +++--- code/modules/reagents/reagent_containers/hypospray.dm | 2 +- code/modules/spells/artifacts/spellbound_servants.dm | 2 +- code/modules/xenoarcheaology/tools/core_sampler.dm | 2 +- mods/content/xenobiology/slime/items.dm | 2 +- mods/species/ascent/items/molt.dm | 2 +- 29 files changed, 36 insertions(+), 41 deletions(-) diff --git a/code/game/machinery/_machines_base/stock_parts/legacy_parts.dm b/code/game/machinery/_machines_base/stock_parts/legacy_parts.dm index 7eb99203b77..15cc987b406 100644 --- a/code/game/machinery/_machines_base/stock_parts/legacy_parts.dm +++ b/code/game/machinery/_machines_base/stock_parts/legacy_parts.dm @@ -8,7 +8,6 @@ material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) base_type = /obj/item/stock_parts/scanning_module - w_class = ITEM_SIZE_TINY /obj/item/stock_parts/manipulator name = "micro-manipulator" @@ -17,7 +16,6 @@ origin_tech = @'{"materials":1,"programming":1}' material = /decl/material/solid/metal/steel base_type = /obj/item/stock_parts/manipulator - w_class = ITEM_SIZE_TINY /obj/item/stock_parts/micro_laser name = "micro-laser" @@ -27,7 +25,6 @@ material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) base_type = /obj/item/stock_parts/micro_laser - w_class = ITEM_SIZE_TINY /obj/item/stock_parts/matter_bin name = "matter bin" @@ -44,10 +41,9 @@ origin_tech = @'{"powerstorage":1}' material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) + base_type = /obj/item/stock_parts/capacitor var/charge = 0 var/max_charge = 1000 - base_type = /obj/item/stock_parts/capacitor - w_class = ITEM_SIZE_TINY /obj/item/stock_parts/capacitor/Initialize() . = ..() diff --git a/code/game/machinery/_machines_base/stock_parts/stock_parts_interface.dm b/code/game/machinery/_machines_base/stock_parts/stock_parts_interface.dm index b1aa3c32f90..e56703abc15 100644 --- a/code/game/machinery/_machines_base/stock_parts/stock_parts_interface.dm +++ b/code/game/machinery/_machines_base/stock_parts/stock_parts_interface.dm @@ -26,7 +26,7 @@ material = /decl/material/solid/organic/plastic base_type = /obj/item/stock_parts/keyboard part_flags = PART_FLAG_HAND_REMOVE - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL ignore_damage_types = list(ELECTROCUTE) // emp damage is annoying enough without destroying purely physical or mechanical components /obj/item/stock_parts/keyboard/on_refresh(obj/machinery/machine) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 13f3073fda5..9420c22919e 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -367,7 +367,7 @@ desc = "A magnetic tape that can hold up to ten minutes of content." icon = 'icons/obj/items/device/tape_recorder/tape_casette_white.dmi' icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL material = /decl/material/solid/organic/plastic matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 337483b95f4..60f957f8c43 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -19,7 +19,7 @@ effective or pretty fucking useless. desc = "A strange device with twin antennas." icon = 'icons/obj/items/weapon/batterer.dmi' icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL throw_speed = 4 throw_range = 10 obj_flags = OBJ_FLAG_CONDUCTIBLE diff --git a/code/game/objects/items/flame/flame_candle.dm b/code/game/objects/items/flame/flame_candle.dm index a934ecaf687..dcf647104f6 100644 --- a/code/game/objects/items/flame/flame_candle.dm +++ b/code/game/objects/items/flame/flame_candle.dm @@ -2,7 +2,7 @@ name = "candle" desc = "A small pillar candle. Its specially-formulated fuel-oxidizer wax mixture allows continued combustion in airless environments." icon = 'icons/obj/items/flame/candle.dmi' - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL material = /decl/material/solid/organic/wax material_alteration = MAT_FLAG_ALTERATION_COLOR lit_light_range = 2 diff --git a/code/game/objects/items/flashlights/flare.dm b/code/game/objects/items/flashlights/flare.dm index 380d8536110..f91985f0ca3 100644 --- a/code/game/objects/items/flashlights/flare.dm +++ b/code/game/objects/items/flashlights/flare.dm @@ -3,7 +3,7 @@ /obj/item/flashlight/flare name = "flare" desc = "A red standard-issue flare. There are instructions on the side reading 'pull cord, make light'." - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL light_color = "#e58775" icon = 'icons/obj/lighting/flare.dmi' action_button_name = null //just pull it manually, neckbeard. diff --git a/code/game/objects/items/flashlights/slime.dm b/code/game/objects/items/flashlights/slime.dm index d4ea318e7a5..f460042af3f 100644 --- a/code/game/objects/items/flashlights/slime.dm +++ b/code/game/objects/items/flashlights/slime.dm @@ -3,7 +3,7 @@ gender = PLURAL desc = "A glowing ball of what appears to be amber." icon = 'icons/obj/lighting/slime.dmi' - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL flashlight_flags = FLASHLIGHT_ALWAYS_ON flashlight_range = 5 light_wedge = LIGHT_OMNI diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ca37cd8d7a3..b6058c4afa8 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -219,7 +219,7 @@ icon = 'icons/obj/toy/toy.dmi' icon_state = "ripleytoy" var/cooldown = 0 - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL //all credit to skasi for toy mech fun ideas /obj/item/toy/prize/attack_self(mob/user) @@ -299,7 +299,7 @@ desc = "A \"Space Life\" brand... wait, what the hell is this thing? It seems to be requesting the sweet release of death." icon_state = "assistant" icon = 'icons/obj/toy/toy.dmi' - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL /obj/item/toy/figure/cmo name = "Chief Medical Officer action figure" @@ -622,7 +622,7 @@ name = "magic eightball" desc = "A black ball with a stencilled number eight in white on the side. It seems full of dark liquid.\nThe instructions state that you should ask your question aloud, and then shake." icon_state = "eightball" - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL var/static/list/possible_answers = list( "It is certain", diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 34c54b222e5..65a980ac373 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -201,7 +201,7 @@ else set_base_attack_force(3) update_icon() - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) to_chat(user, SPAN_NOTICE("\The [src] can now be concealed.")) diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index dadc1a6c57b..5b60770ac97 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -76,7 +76,7 @@ icon_state = "plasticbag" item_state = "plasticbag" storage = /datum/storage/bag/plastic - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL material = /decl/material/solid/organic/plastic material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC diff --git a/code/game/objects/items/weapons/storage/matches.dm b/code/game/objects/items/weapons/storage/matches.dm index 7e1cf7c5d91..8312621ce0c 100644 --- a/code/game/objects/items/weapons/storage/matches.dm +++ b/code/game/objects/items/weapons/storage/matches.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/storage/matchbox.dmi' icon_state = "matchbox" item_state = "zippo" - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL slot_flags = SLOT_LOWER_BODY storage = /datum/storage/box/matches diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index 99ee7edcc83..00652f68a13 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -73,5 +73,5 @@ name = "discount pry bar" desc = "A plastic bar with a wedge. It looks so poorly manufactured that you're sure it will break if you try to use it." material = /decl/material/solid/organic/plastic - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL shape_variations = 6 diff --git a/code/modules/clothing/underwear/base.dm b/code/modules/clothing/underwear/base.dm index 613f5767060..de1457d3f67 100644 --- a/code/modules/clothing/underwear/base.dm +++ b/code/modules/clothing/underwear/base.dm @@ -1,6 +1,6 @@ /obj/item/underwear icon = 'icons/mob/human.dmi' - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL material = /decl/material/solid/organic/cloth var/required_free_body_parts var/slot_offset_str diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 803f869b122..1ca1c8faa3d 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -273,7 +273,7 @@ var/global/list/card_decks = list() desc = "For those with disposible income." icon_state = "card_pack" icon = 'icons/obj/items/playing_cards.dmi' - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL material = /decl/material/solid/organic/cardboard var/list/cards = list() diff --git a/code/modules/locks/keyring.dm b/code/modules/locks/keyring.dm index b1439aefb1b..8b92a615431 100644 --- a/code/modules/locks/keyring.dm +++ b/code/modules/locks/keyring.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/keyring.dmi' icon_state = ICON_STATE_WORLD storage = /datum/storage/keyring - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL slot_flags = SLOT_LOWER_BODY | SLOT_POCKET material = /decl/material/solid/metal/brass material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 292a1f96591..a3009921249 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -234,7 +234,7 @@ return 0 /obj/fall_damage() - if(w_class == ITEM_SIZE_TINY) + if(w_class <= ITEM_SIZE_TINY) return 0 if(w_class >= ITEM_SIZE_GARGANTUAN) return 100 diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 27227e83704..4d4f558a676 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -2,7 +2,7 @@ name = "organ" icon = 'icons/obj/surgery.dmi' germ_level = 0 - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL default_action_type = /datum/action/item_action/organ origin_tech = @'{"materials":1,"biotech":1}' abstract_type = /obj/item/organ diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 2781d5fe5ca..a69722435dc 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -591,10 +591,11 @@ var/global/datum/topic_state/default/paper_state/paper_topic_state = new // Stub type for moving teleportation scrolls into a modpack. /obj/item/paper/scroll - name = "scroll" - desc = "A length of writing material curled into a scroll." - icon = 'icons/obj/items/paperwork/scroll.dmi' - color = "#feeebc" + name = "scroll" + desc = "A length of writing material curled into a scroll." + icon = 'icons/obj/items/paperwork/scroll.dmi' + color = "#feeebc" + w_class = ITEM_SIZE_SMALL var/furled = FALSE /obj/item/paper/scroll/can_bundle() diff --git a/code/modules/paperwork/pen/crayon.dm b/code/modules/paperwork/pen/crayon.dm index 8db8bdb772d..b4bfb68c3a9 100644 --- a/code/modules/paperwork/pen/crayon.dm +++ b/code/modules/paperwork/pen/crayon.dm @@ -1,8 +1,6 @@ /obj/item/pen/crayon name = "crayon" icon = 'icons/obj/items/crayon.dmi' - icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_TINY attack_verb = list("attacked", "coloured", "crayon'd") stroke_color = COLOR_RED color = COLOR_RED diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index dce571a9346..c548011086d 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -15,7 +15,7 @@ desc = "A camera film cartridge. Insert it into a camera to reload it." icon_state = "film" item_state = "electropack" - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL throw_range = 10 material = /decl/material/solid/organic/plastic var/tmp/max_uses = 10 diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index aa13a089d4f..8562c81d307 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -3,7 +3,7 @@ desc = "A rubber stamp for stamping important documents." icon = 'icons/obj/items/stamps/stamp_deckchief.dmi' icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL throw_speed = 7 throw_range = 15 material = /decl/material/solid/metal/steel diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 2c595e8b788..76ea4bb5e1e 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -461,7 +461,7 @@ /obj/item/light icon = 'icons/obj/lighting.dmi' - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL material = /decl/material/solid/metal/steel atom_flags = ATOM_FLAG_CAN_BE_PAINTED obj_flags = OBJ_FLAG_HOLLOW diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 987d3ef6124..69d244a3137 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -7,7 +7,7 @@ matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) obj_flags = OBJ_FLAG_CONDUCTIBLE slot_flags = SLOT_LOWER_BODY | SLOT_EARS - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL var/icon_flight = "syringe-cartridge-flight" //so it doesn't look so weird when shot var/obj/item/chems/syringe/syringe diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index b8a8a2578ed..90009993966 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -11,7 +11,7 @@ desc = "Flexible bag for IV injectors." icon = 'icons/obj/bloodpack.dmi' icon_state = "empty" - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL volume = 120 possible_transfer_amounts = @"[0.2,1,2]" amount_per_transfer_from_this = REM @@ -28,9 +28,9 @@ if(!(. = ..())) return if(reagents?.total_volume > volume/2) - w_class = ITEM_SIZE_SMALL + w_class = ITEM_SIZE_NORMAL else - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL /obj/item/chems/ivbag/on_update_icon() . = ..() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index ade65a7a020..32808ef48c3 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -175,7 +175,7 @@ volume = 5 origin_tech = @'{"materials":2,"biotech":2}' slot_flags = SLOT_LOWER_BODY | SLOT_EARS - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL detail_state = "_band" detail_color = COLOR_CYAN abstract_type = /obj/item/chems/hypospray/autoinjector diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index a3990de82b7..6477080cfdf 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -235,7 +235,7 @@ icon_state = "stone" throw_speed = 5 throw_range = 10 - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL material = /decl/material/solid/stone/basalt /obj/item/summoning_stone/attack_self(var/mob/user) diff --git a/code/modules/xenoarcheaology/tools/core_sampler.dm b/code/modules/xenoarcheaology/tools/core_sampler.dm index d022291f335..01b4f1401e5 100644 --- a/code/modules/xenoarcheaology/tools/core_sampler.dm +++ b/code/modules/xenoarcheaology/tools/core_sampler.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/geologic_sampler.dmi' icon_state = "sampler0" item_state = "screwdriver_brown" - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) var/obj/item/sample diff --git a/mods/content/xenobiology/slime/items.dm b/mods/content/xenobiology/slime/items.dm index 469ab019e36..0af184e22c3 100644 --- a/mods/content/xenobiology/slime/items.dm +++ b/mods/content/xenobiology/slime/items.dm @@ -3,7 +3,7 @@ desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." icon = 'mods/content/xenobiology/icons/slimes/slime_extract.dmi' icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_TINY + w_class = ITEM_SIZE_SMALL throw_speed = 3 throw_range = 6 origin_tech = @'{"biotech":4}' diff --git a/mods/species/ascent/items/molt.dm b/mods/species/ascent/items/molt.dm index ec4bede323f..0e3843de04f 100644 --- a/mods/species/ascent/items/molt.dm +++ b/mods/species/ascent/items/molt.dm @@ -5,4 +5,4 @@ color = COLOR_PURPLE desc = "The molted carapace of some alien creature." material = /decl/material/solid/gemstone/crystal - w_class = ITEM_SIZE_TINY \ No newline at end of file + w_class = ITEM_SIZE_SMALL \ No newline at end of file From d09001b6b26772cc414d58c0c5ce22167103fcab Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 20:14:00 +1100 Subject: [PATCH 15/34] Added an earthenware mixing bowl for shadyhills. --- code/modules/reagents/reagent_containers/beaker.dm | 3 +++ maps/shaded_hills/shaded_hills-inn.dmm | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index 60affc293c2..258146c77c4 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/pottery + material = /decl/material/solid/stone/pottery + /obj/item/chems/glass/beaker/kettle name = "kettle" desc = "A heavy kettle for heating water." diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 9aaeb584e10..945c6e5dc26 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -1608,7 +1608,7 @@ /area/shaded_hills/farmhouse/porch) "VW" = ( /obj/structure/table/marble, -/obj/item/chems/glass/beaker/bowl{ +/obj/item/chems/glass/beaker/bowl/pottery{ pixel_y = 4 }, /turf/floor/path/herringbone/basalt, From ac3d3e44ad386aff72c6f53102020592235244b9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 20:25:40 +1100 Subject: [PATCH 16/34] Allowing ailments to be treated by alternative low-tech methods. --- .../hydroponics/plant_types/seeds_misc.dm | 10 ++++++++-- code/modules/organs/ailments/_ailment.dm | 17 ++++++++++++----- code/modules/organs/ailments/ailment_codex.dm | 9 +++++++-- .../modules/organs/ailments/ailments_medical.dm | 5 ++++- code/modules/reagents/chems/chems_drinks.dm | 10 ++++++++++ 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index df4181cb529..305868d5d70 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -178,7 +178,10 @@ product_name = "nettle" display_name = "nettle patch" mutants = list("deathnettle") - chems = list(/decl/material/liquid/nutriment = list(1,50), /decl/material/liquid/acid = list(0,1)) + chems = list( + /decl/material/liquid/nutriment = list(1,50), + /decl/material/liquid/juice/nettle = list(1,10) + ) grown_tag = "nettle" slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -200,7 +203,10 @@ product_name = "death nettle" display_name = "death nettle patch" mutants = null - chems = list(/decl/material/liquid/nutriment = list(1,50), /decl/material/liquid/acid/polyacid = list(0,1)) + chems = list( + /decl/material/liquid/nutriment = list(1,50), + /decl/material/liquid/acid/poly = list(0,1) + ) grown_tag = "deathnettle" /datum/seed/nettle/death/New() diff --git a/code/modules/organs/ailments/_ailment.dm b/code/modules/organs/ailments/_ailment.dm index ed975851544..7bcc0c24da6 100644 --- a/code/modules/organs/ailments/_ailment.dm +++ b/code/modules/organs/ailments/_ailment.dm @@ -17,10 +17,10 @@ // Treatment types var/treated_by_item_type // What item type can be used in physical interaction to cure the ailment? var/treated_by_item_cost = 1 // If treated_by_item_type is a stack, how many should be used? - var/treated_by_reagent_type // What reagent type cures this ailment when metabolized? - var/treated_by_reagent_dosage = 1 // What is the minimum dosage for a reagent to cure this ailment? - var/treated_by_chem_effect // What chemical effect cures this ailment? - var/treated_by_chem_effect_strength = 1 // How strong must the chemical effect be to cure this ailment? + var/list/treated_by_reagent_type // What reagent type(s) cures this ailment when metabolized? Can be a single type or a list of types. + var/treated_by_reagent_dosage = 1 // What is the minimum dosage for a reagent to cure this ailment? TODO: merge with list above + var/list/treated_by_chem_effect // What chemical effect cures this ailment? Can be a single effect or a list of effects. + var/treated_by_chem_effect_strength = 1 // How strong must the chemical effect be to cure this ailment? TODO: merge with list above // Fluff strings var/initial_ailment_message = "Your $ORGAN$ $ORGAN_DOES$n't feel quite right..." // Shown in New() @@ -117,7 +117,14 @@ qdel(src) /datum/ailment/proc/treated_by_medication(var/reagent_type, var/dosage) - return treated_by_reagent_type && ispath(reagent_type, treated_by_reagent_type) && dosage >= treated_by_reagent_dosage + if(!treated_by_reagent_type || dosage < treated_by_reagent_dosage) + return FALSE + if(islist(treated_by_reagent_type)) + for(var/treatment_type in treated_by_reagent_type) + if(ispath(reagent_type, treatment_type)) + return TRUE + return FALSE + return ispath(reagent_type, treated_by_reagent_type) /datum/ailment/proc/was_treated_by_medication(var/datum/reagents/source, var/reagent_type) source.remove_reagent(reagent_type, treated_by_reagent_dosage) diff --git a/code/modules/organs/ailments/ailment_codex.dm b/code/modules/organs/ailments/ailment_codex.dm index 808683f2b31..40cc20eb341 100644 --- a/code/modules/organs/ailments/ailment_codex.dm +++ b/code/modules/organs/ailments/ailment_codex.dm @@ -48,8 +48,13 @@ for(var/obj/item/thing as anything in treated_by_types) // if you put a non-item in here you deserve to have your face eaten by runtime errors ailment_cures += "[ailment.treated_by_item_cost] x [initial(thing.name)]" if(ailment.treated_by_reagent_type) - var/decl/material/mat = GET_DECL(ailment.treated_by_reagent_type) - ailment_cures += "[ailment.treated_by_reagent_dosage]u [mat.name]" + if(islist(ailment.treated_by_reagent_type)) + for(var/mat_type in ailment.treated_by_reagent_type) + var/decl/material/mat = GET_DECL(mat_type) + ailment_cures += "[ailment.treated_by_reagent_dosage]u [mat.name]" + else + var/decl/material/mat = GET_DECL(ailment.treated_by_reagent_type) + ailment_cures += "[ailment.treated_by_reagent_dosage]u [mat.name]" if(ailment.treated_by_chem_effect) ailment_cures += get_chem_effect_display_name(ailment.treated_by_chem_effect) if(!length(ailment_cures)) diff --git a/code/modules/organs/ailments/ailments_medical.dm b/code/modules/organs/ailments/ailments_medical.dm index 94974561856..b018f9328d1 100644 --- a/code/modules/organs/ailments/ailments_medical.dm +++ b/code/modules/organs/ailments/ailments_medical.dm @@ -36,7 +36,10 @@ /datum/ailment/head/sneezing name = "sneezing" - treated_by_reagent_type = /decl/material/liquid/antiseptic + treated_by_reagent_type = list( + /decl/material/liquid/antiseptic, + /decl/material/liquid/drink/juice/nettle + ) treated_by_reagent_dosage = 1 medication_treatment_message = "The itching in your sinuses fades away." manual_diagnosis_string = "$USER_THEIR$ sinuses are inflamed and running." diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index 21c8303037c..77c2b2c99d0 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -45,6 +45,16 @@ if(!M.has_trait(/decl/trait/metabolically_inert)) M.immunity = min(M.immunity + 0.25, M.immunity_norm*1.5) +/decl/material/liquid/drink/juice/nettle + name = "nettle juice" + lore_text = "A liquid extracted from nettles. Reputedly useful for treating allergies and sneezing." + taste_description = "stinging" + color = "#7a9b79" + uid = "chem_drink_nettle" + + glass_name = "nettle juice" + glass_desc = "A tall glass of pureed stinging nettles." + /decl/material/liquid/drink/juice/banana name = "banana juice" lore_text = "The raw essence of a banana." From 1808dc0406b76834f7b086c0d9194022f17399d5 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 20:40:32 +1100 Subject: [PATCH 17/34] Adjusting nettle products to not be literal hydrochloric acid. --- .../hydroponics/plant_types/seeds_misc.dm | 7 ++-- .../liquids/materials_liquid_toxins.dm | 2 +- .../organs/ailments/ailments_medical.dm | 5 ++- .../modules/reagents/chems/chems_compounds.dm | 40 ++++++++++++------- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index 305868d5d70..34650444cd0 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -179,8 +179,9 @@ display_name = "nettle patch" mutants = list("deathnettle") chems = list( - /decl/material/liquid/nutriment = list(1,50), - /decl/material/liquid/juice/nettle = list(1,10) + /decl/material/liquid/nutriment = list(1,50), + /decl/material/liquid/drink/juice/nettle = list(1,10), + /decl/material/liquid/nettle_histamine = list(1, 5) ) grown_tag = "nettle" slice_product = /obj/item/food/processed_grown/chopped @@ -205,7 +206,7 @@ mutants = null chems = list( /decl/material/liquid/nutriment = list(1,50), - /decl/material/liquid/acid/poly = list(0,1) + /decl/material/liquid/acid/polyacid = list(0,1) ) grown_tag = "deathnettle" diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 0a0025b5ac1..2b8f8eca63c 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -223,7 +223,7 @@ /decl/material/liquid/ethanol = 0.2 ) heating_point = 145 CELSIUS - heating_message = "separates" + heating_message = "separates." taste_mult = 1.2 metabolism = REM * 0.25 exoplanet_rarity_gas = MAT_RARITY_NOWHERE diff --git a/code/modules/organs/ailments/ailments_medical.dm b/code/modules/organs/ailments/ailments_medical.dm index b018f9328d1..4cf930ac0f9 100644 --- a/code/modules/organs/ailments/ailments_medical.dm +++ b/code/modules/organs/ailments/ailments_medical.dm @@ -84,7 +84,10 @@ name = "coughing" specific_organ_subtype = /obj/item/organ/internal/lungs applies_to_organ = list(BP_LUNGS) - treated_by_reagent_type = /decl/material/liquid/antiseptic + treated_by_reagent_type = list( + /decl/material/liquid/antiseptic, + /decl/material/liquid/drink/juice/nettle + ) medication_treatment_message = "The tickling in your throat fades away." manual_diagnosis_string = "$USER_THEIR$ throat is red and inflamed." diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index 04e6da8e7fb..889a69bfdc9 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -83,6 +83,29 @@ M.emote(/decl/emote/visible/shiver) holder.remove_reagent(/decl/material/liquid/capsaicin, 5) +/decl/material/liquid/nettle_histamine + name = "nettle histamine" + lore_text = "A combination of substances injected by contact with the stinging hairs of the common nettle. Itchy and painful, but not dangerous." + heating_products = null + uid = "chem_nettle_histamine" + exoplanet_rarity_gas = MAT_RARITY_EXOTIC + color = "#9bbe90" + heating_point = 60 CELSIUS + heating_message = "thins as it separates." + heating_products = list( + /decl/material/liquid/drink/juice/nettle = 0.5, + /decl/material/liquid/water = 0.5 + ) + +// This should really be contact only but fruit injects it (do_sting()). +/decl/material/liquid/nettle_histamine/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) + . = ..() + if(M.has_trait(/decl/trait/metabolically_inert) || !M.can_feel_pain()) + return + M.apply_effect(6, PAIN, 0) + if(prob(5)) + to_chat(M, SPAN_DANGER("Your skin [pick("itches", "burns", "stings")]!")) + /decl/material/liquid/capsaicin name = "capsaicin oil" lore_text = "This is what makes chilis hot." @@ -94,7 +117,7 @@ exoplanet_rarity_gas = MAT_RARITY_EXOTIC heating_point = T100C - heating_message = "darkens and thickens as it seperates from its water content" + heating_message = "darkens and thickens as it seperates from its water content." heating_products = list( /decl/material/liquid/capsaicin/condensed = 0.5, /decl/material/liquid/water = 0.5 @@ -113,14 +136,9 @@ . = ..() holder.remove_reagent(/decl/material/liquid/frostoil, 5) - if(M.has_trait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert) || !M.can_feel_pain()) return - if(ishuman(M)) - var/mob/living/human/H = M - if(!H.can_feel_pain()) - return - var/dose = LAZYACCESS(M.chem_doses, type) if(dose < agony_dose) if(prob(5) || dose == metabolism) //dose == metabolism is a very hacky way of forcing the message the first time this procs @@ -205,14 +223,8 @@ /decl/material/liquid/capsaicin/condensed/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() holder.remove_reagent(/decl/material/liquid/frostoil, 5) - - if(M.has_trait(/decl/trait/metabolically_inert)) + if(M.has_trait(/decl/trait/metabolically_inert) || !M.can_feel_pain()) return - - if(ishuman(M)) - var/mob/living/human/H = M - if(!H.can_feel_pain()) - return if(LAZYACCESS(M.chem_doses, type) == metabolism) to_chat(M, "You feel like your insides are burning!") else From f01ce8f014b34d8ecbc268d3114f7c5bb6d40462 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 20:59:52 +1100 Subject: [PATCH 18/34] Simple doors will align with constructed walls and other doors over natural walls. --- code/game/objects/structures/doors/_door.dm | 49 +++++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 71c29e5142a..cbef98d6a94 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -46,22 +46,43 @@ ) return blend_objects +// Preference is: constructed walls, other doors, other walls. +/obj/structure/door/proc/get_turf_blend_priority(turf/neighbor) + if(istype(neighbor, /turf/wall)) + return istype(neighbor, /turf/wall/natural) ? 1 : 3 + if(locate(/obj/structure/door) in neighbor) + return 2 + return 0 + /obj/structure/door/update_connections(var/propagate = FALSE) + . = ..() - if(isturf(loc)) - - if(propagate) - for(var/turf/wall/W in RANGE_TURFS(loc, 1)) - W.wall_connections = null - W.other_connections = null - W.queue_icon_update() - - for(var/turf/wall/W in RANGE_TURFS(loc, 1)) - var/turf_dir = get_dir(loc, W) - if(turf_dir & (turf_dir - 1)) // if diagonal - continue // skip diagonals - set_dir(turn(get_dir(loc, W), 90)) - break + + if(!isturf(loc)) + return + + var/highest_priority + var/highest_dir + + for(var/turf/neighbor as anything in RANGE_TURFS(loc, 1)) + + if(propagate && istype(neighbor, /turf/wall)) + var/turf/wall/wall = neighbor + wall.wall_connections = null + wall.other_connections = null + wall.queue_icon_update() + + var/turf_dir = get_dir(loc, neighbor) + if(turf_dir & (turf_dir - 1)) // if diagonal + continue // skip diagonals + + var/turf_priority = get_turf_blend_priority(neighbor) + if(turf_priority > highest_priority) + highest_dir = turf_dir + highest_priority = turf_priority + + if(highest_priority > 0 && highest_dir) + set_dir(turn(highest_dir, 90)) /obj/structure/door/get_material_health_modifier() . = 10 From 52f07d7ec798387f93d0222c96f67292bbef93cb Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 21:08:24 +1100 Subject: [PATCH 19/34] Prevents non-water liquids from evaporating when boiling, and lowers evaporation rate for water. --- code/modules/materials/_materials.dm | 6 ++++++ .../definitions/liquids/materials_liquid_water.dm | 1 + code/modules/reagents/chems/chems_ethanol.dm | 1 + code/modules/reagents/reagent_containers.dm | 8 ++++++-- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index aa824ec2453..5a1ae11ee14 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -354,6 +354,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /// Set to a type to indicate that a type with a matching milestone type should be used as a reference point for burn temperatures. var/temperature_burn_milestone_material + /// Semi-temporary fix to issues with soup/tea boil-off - only set to TRUE on water and ethanol at time of commit. + var/can_boil_to_gas = FALSE + /// How much of this boils away per evaporation run? + var/boil_evaporation_per_run = 1 + // 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)) @@ -401,6 +406,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) // Null/clear a bunch of physical vars as this material is fake. if(holographic) temperature_burn_milestone_material = null + can_boil_to_gas = FALSE shard_type = SHARD_NONE conductive = 0 hidden_from_codex = TRUE diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index f3ffd98cb57..4d2448f41a2 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -30,6 +30,7 @@ /decl/material/solid/ice = 1 ) temperature_burn_milestone_material = /decl/material/liquid/water + can_boil_to_gas = TRUE /decl/material/liquid/water/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_ethanol.dm index 832384adc21..d23d0e22736 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_ethanol.dm @@ -27,6 +27,7 @@ ) bypass_chilling_products_for_root_type = /decl/material/liquid/ethanol affect_blood_on_ingest = FALSE // prevents automatic toxins/inebriation as though injected + can_boil_to_gas = TRUE var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity. var/alcohol_toxicity = 1 diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index d52f3a700d7..82b5996c9a1 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -178,13 +178,17 @@ return // Vaporize anything over its boiling point. + var/update_reagents = FALSE for(var/reagent in reagents.reagent_volumes) var/decl/material/mat = GET_DECL(reagent) - if(!isnull(mat.boiling_point) && temperature >= mat.boiling_point) + if(mat.can_boil_to_gas && !isnull(mat.boiling_point) && temperature >= mat.boiling_point) // TODO: reduce atom temperature? - var/removing = min(5, reagents.reagent_volumes[reagent]) + var/removing = min(mat.boil_evaporation_per_run, reagents.reagent_volumes[reagent]) reagents.remove_reagent(reagent, removing, defer_update = TRUE, removed_phases = MAT_PHASE_LIQUID) + update_reagents = TRUE loc.take_vaporized_reagent(reagent, removing) + if(update_reagents) + reagents.update_total() /obj/item/chems/take_vaporized_reagent(reagent, amount) if(!reagents?.maximum_volume) From d3f2a19648f6769ab0d398f64764bead17192692 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 21:25:31 +1100 Subject: [PATCH 20/34] Added on-head icons for chickens. --- icons/mob/simple_animal/chicken_black.dmi | Bin 1039 -> 1144 bytes icons/mob/simple_animal/chicken_brown.dmi | Bin 1017 -> 1127 bytes icons/mob/simple_animal/chicken_white.dmi | Bin 1053 -> 1181 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/simple_animal/chicken_black.dmi b/icons/mob/simple_animal/chicken_black.dmi index a5ffdb4610c58554b18115f7c86d1a7ca146004f..399d397ab609ca18c75625e87213a39ecff5d435 100644 GIT binary patch delta 960 zcmV;x13&za2>1vgiBL{Q4GJ0x0000DNk~Le0001>0001h1Oos70Det>D3KvU0h*Cz ziGM@3&I}Z{qUuvtaP@NmhZX>-&|OizO6arz00UV`L_t(&f$f>UPa825$DKFI355~zYHv>ofe z+aRL4J#{zZg>ucfdyGBMK2$r4VL9(t-1-$dtkvLYqp}qg;XMOn=F^ zu1tb7;i?Z6(^T;c=Pa8hUCsrQ5}x6c=UJkfq)G!%w5tU`0$NZqZdPpTQ{-?9RA~pF zE&2XJDXAy4;fmUYGmv0~TCTX5<@1y?lPZ69R6Y!(PB3GsnL(#1LqWYBGXj*S>R7@Z z@UF^c8C03hkWUrOq1L#PD1*KfFn{AzG!M~@+U>X5{Lty|TbO^%NAM{5?Xb&tnRJ~b{Y}aM?vSXx3emK&r`7va2jl2#($eP9zhg8 z_~8bmXpxA^;oP`Y9zm!PU0plZBXMrVu@)?#x~qpYqO5QOfRFXa2B?v`D0&2;Mk{SO zhuC7qM^6cTfEhAZ5NQ-it7iuk4EXex^A-?HTtTG4CJ#=Ai4>q+()I{kymtkWMpSst za56zQvLaUyYxruI1#^AQ1M_aGx?S?7@b!n}^H(#z6rO-3 zcpn^fG9Na$9C;!Z;(u_U##kG4eNA6~NC zcb|`@J>9yXUT_ZRFdtjY5_gW>3qFB917E-rR`+)HTa`c{@LGXIZuM)Al_bdl{0GcV z;`vEjf+&$=SmZWu3Z9fIOBRgtf}0{oZsl0Yl9dxd#duT)8AZLQVE@$c#m+bKq(lh` i1OkCTAP{&Ne*u}d#1W*ywv);L0000mz)0hEzt ziGPDvr?P^pp9|R60Ks8Pt@_iqq5uE__DMuRRA_1T?F^X=7rh}_0i8Bfa60Y^z?HxozS@sn3`?kwiL@ng4a`!WlW`131N#bCjDV42vq=^ISh`!{vF~1 zZKX`i7)%MAe_Cyb?&VyPjufKYL*z=?3UExNno>~0q?wXQM}e7=WeRd!fPw5AIe!3x zNr}(kjxi!9dI8!%7my50dZbSQutcgf0ewV(Qk5Mfs@UcV1lmt)Vp4HL=ts5=focKF zr-%= z4yF#r5T_r34?G3f`qoj9N`cy~j;}lg;?tTlSg);kUCF1`*LdA`ZiTZWnty_t4M|f( zX;w7X*~2sM!P~iR?z$h38m@1>UrH??XWq|-2NBZ>pr`;f|3i-f{mrF*25wn`C*fC` zaegv_rV0uX>Cut4TEoT#bpO^>X3Z7cq3L@J2zV}t_O@KL|E4Z~&$z^axeLGgS(it$ z>ih!v__-YZQ8jt&5wf}h>VKph#^9#0N5I~|K$`AIrJKfnpw2Joo12jpGdGPr0`>+5 z!YGJSH;p}lVOiBL{Q4GJ0x0000DNk~Le0001>0001h1Oos70Det>D3KvR0h*Cw ziGM@3&I}Z{qUuvtaP@NmhZX>-&|OizO6arz00T=&L_t(&f$f<+Z`&{shG~&b08dE+ zbWXB#bs&jd4M@t6$$&%-nF7#cicSR@1Zk!M1>&_o!9bDrZJ5~Hmn-#f%dskcK9_IPH(Nj&19V((`tH$rlV4?Y^t>x5`Op9o&Gpggc>Q=rO0LT z?av5JVT`jmmt!KYKhKtq!S7p5`dTSBAT8l|s%m3!hR~+kjHxtWI5&FOH!eY%N`Etf zig|8ijdRwSOIJ$8wT656%B0aKgNar!<6LFu=t8X~1%F>{I{hWI9WTHTyQb9&7IrO>O@)Bwe1H&c!k=j_ z#AN}m%Ss5GL5}URED71*py|bh{nxrlS&1&pmQ7|eEI1et&tX+3V3%fIfN%Q({saq( zfG-k>yfRMRVRF1JxYdZXeH3&KCr8`jPXZPD45z`T?s)$pAc*3p-`fE>nty~zJzE)% zCLjnk*!@lGJX5aD(xDXuPjDvNdPsxSO*;Vi_?Ya08flASKoDwVdAl>qxbx8~LSfZo zye)_{nlu~x0SyN}yJX>76T;HAAkyIFc`L(IE6^@kdjw7fiU-nQO<)hb!ig-_7Q`B% z8s_-|5gX$pk;t3CFKeMP*MAAWta&A^Gj#d`JMwjJx;xU`-=JqaENL$ys~eOOtUxcr zdyPRA=zl=V_>K|+c7dmBqt=WKInUg;spPQZMG@)`$)_*w_)Y}^HW0jV%;oBEAmImu z?SyX}s8Lyi?!N3$e@F=Yvc>Bw(%*gA;X6^m4DH+h-tHNO??l+Z6@Owh@9B00^@1xv zhq-7mJ6t(_FZjd=8livPqX5l@mc#HR^+m*qAl^pBlbl>xo=;C?SzZBoc{4A}`}F2-32Z U^q2bl00000NkvXXt^-0~f|8oE{Qv*} delta 835 zcmV-J1HAm_2>AygiBL{Q4GJ0x0000DNk~Le0001h0001h1Oos705K4J_>mz%0hEzq ziGPDvr?P^pp9|R60Ks8Pt@_iqq5uE_<4Ht8RA_p6)SpEq=tv_zH^E4Ki(7pP45 z#)dP#HHO6X!4_KWcL~kspj(@3jR}*xFV_8TuNX&wLyUygw?9)_Kp04uE9NHMHVK3On+bs zXbILmGphhpB1c0&MhHOkX3(Ufs1OvH&uEewD?*rCb{2sf0n++8{-Q{kh5(&Wlp4XOb?O(dZ}=CAbQ!ikeMARXLBXs491c+_mTPIb(fFNP zgJ(ku7>Hw^V?@Mr!T54u*43LX{{!O|H})+2>Svdq$m;4B*vHT9@E3OYX^)V16~GVe zP(bLWJp%0wEXW~?>(EX6fq$-k!JOQzEFnWT?Gb2iV4a(O?w2tH@L^NgQKARKs=*GL_|dVSM>f2cm&4hL;LLAfU`z}3D6&+$Dl9; z_>kL>0001h1Oos70Det>D3KvX0h*C$ ziGM@3&I}Z{qUuvtaP@NmhZX>-&|OizO6arz00VnTL_t(&f$f$nx!AXP%>n@VD6^-P?a0o zdeZ4^2X{z{enYtT^xj`jvU7UK2zfjn&wt})!!%2CBOIePW!tf3J4(;=b8W*O%~7%h z${++0_&h$wH4-Hm#oT%*2wV0zjo`gxa8mHrl_<5Oi2X60zsI6Xfzro)2IY|J^U zBl6>u9)3Nb2s0syN+jas=gk{q3dXcei0C45cr=_kD%Ter1)Nfy5Qb13(;j1Hg@4e- zoOQ8aAe}H?511|xhiVuKL=h7`vu57V@mQ|-|~lgu_9|CU_kOOS#k zV-gDXglS7TUEp*RBpCk{MpAxg!tZ5UO0$B4D@4 zvcqQ;qCnY3FO(NFG~fp?^M8eARtOE87c@0oXPD)4opSTyJs!`az&_So$K1WJkG0#a z)%2=^Z>A%OopDRUuP%*uJnr|3LYE`$@EF>obQHTImqm6BlcxDoX(g)R&Og=rUw~cU zc41UOuFH9>@21L|-TMjFT=DNd>gTh3ComVY7o5PZW{;JNjw_-NSAQ#l5Y*^*;&GR_ zv>@mOH3<+9sp{yKUpDLoHSk(wNB!%rJ7Nkjdchg6fs3;GxTjkdqZgb3Ur6H?(-BgH z-3#7fT-Sw;fH^Gg?d)3>kH_;+frs4UYmbFw*)9A5=4Fmz-0hEzw ziGPDvr?P^pp9|R60Ks8Pt@_iqq5uE`0ZBwbRA_ z`|D@tI6og_9*^g_v0;iWr$>#oZ7a5IMSp8ck9!-om9?yZHgVyDQ2pH`9_`IS-49De zKinIe2}Z|yya$PLKhW-se^r8jGNvPw)02?KbCjjbrG$`)pI@~3-C4poAl~^1JpOgH zOA~Yev@8Us3=coe?iAhM=aL07Ny<5r48W{_%3MOq5fW_{Aj1GqyTmbIMiU5>eScjJ zVj`rZd+<-AiyWx{GJ#4U1#0s^?E=ygIVc78i2?zv86?Tr$pI5GpQ=en$caKN+1LcG z3J}`PF@|GFE5s3G=8RyjaV!%m$4P&WJQ!-tT#C+cxa*SHY-Wh8+kZ7>HtV`&JHSrp@w{B#x{Q^BuBr>@NmZdYuj-D> z06cY7aQ3aLo2Etqi$ljhba3&bs+0Py8l-G}v2+v=Ok`EJ)DbvmYtyQWX1Q3-ZQT_0 z8iIYcj@OO^$<6h?ty>`Kq$%S!ne9QHGva(pK9OYwEKqW2dl2Y`mAWW4steR<$KzjoXxz_Q#YNkDc(HoS|13s>rX^&v^1|`P5v1&G&s;FiL_Rt%c_5=Qo z=J9wu{}t!QfJe~YOjpcs;<`#dg6=svs~a($%!{uA&B3L*(XXEGj)>f$?z6pyv reRGNyW0eA`p97wZ{gv0_d1?Fw;V-#S#486o00000NkvXXu0mjfCgzx; From 99811ed79d359570a809e54db6c90869e3896e2a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 13 Oct 2024 22:06:47 +1100 Subject: [PATCH 21/34] Tweaking storage subtypes after resizing tiny items. --- code/datums/extensions/storage/subtypes_box.dm | 12 +++++++----- code/datums/extensions/storage/subtypes_firstaid.dm | 2 +- code/game/objects/items/weapons/storage/boxes.dm | 4 ++++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/code/datums/extensions/storage/subtypes_box.dm b/code/datums/extensions/storage/subtypes_box.dm index 5ce9705d9dd..a6e27dcdfeb 100644 --- a/code/datums/extensions/storage/subtypes_box.dm +++ b/code/datums/extensions/storage/subtypes_box.dm @@ -70,7 +70,7 @@ max_storage_space = 5 /datum/storage/box/parts_pack - max_storage_space = BASE_STORAGE_CAPACITY(ITEM_SIZE_SMALL) + max_storage_space = BASE_STORAGE_CAPACITY(ITEM_SIZE_NORMAL) /datum/storage/box/donut max_storage_space = ITEM_SIZE_SMALL * 6 @@ -108,12 +108,14 @@ max_w_class = ITEM_SIZE_TINY max_storage_space = 6 +/datum/storage/box/tapes + max_storage_space = 28 + /datum/storage/box/candles - max_w_class = ITEM_SIZE_TINY - max_storage_space = 7 + max_storage_space = DEFAULT_LARGEBOX_STORAGE /datum/storage/box/candles/scented - max_storage_space = 5 + max_storage_space = 10 /datum/storage/box/candles/incense - max_storage_space = 9 + max_storage_space = 18 diff --git a/code/datums/extensions/storage/subtypes_firstaid.dm b/code/datums/extensions/storage/subtypes_firstaid.dm index 4e8532b85ed..01ed7512759 100644 --- a/code/datums/extensions/storage/subtypes_firstaid.dm +++ b/code/datums/extensions/storage/subtypes_firstaid.dm @@ -1,6 +1,6 @@ /datum/storage/firstaid max_w_class = ITEM_SIZE_SMALL - max_storage_space = DEFAULT_BOX_STORAGE + max_storage_space = DEFAULT_LARGEBOX_STORAGE use_sound = 'sound/effects/storage/box.ogg' /datum/storage/firstaid/surgery diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 752ecc416d2..84c14901ddd 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -70,6 +70,7 @@ name = "crew survival kit" desc = "A box decorated in warning colors that contains a limited supply of survival tools. The panel and white stripe indicate this one contains oxygen." icon_state = "survival" + storage = /datum/storage/box/large /obj/item/box/survival/WillContain() return list( @@ -87,6 +88,7 @@ name = "engineer survival kit" desc = "A box decorated in warning colors that contains a limited supply of survival tools. The panel and orange stripe indicate this one as the engineering variant." icon_state = "survivaleng" + storage = /datum/storage/box/large /obj/item/box/engineer/WillContain() return list( @@ -602,6 +604,8 @@ /obj/item/box/tapes name = "box of spare tapes" desc = "A box full of blank tapes." + storage = /datum/storage/box/tapes + /obj/item/box/tapes/WillContain() return list(/obj/item/magnetic_tape/random = 14) From f1f855152c594c51cf6f1abec3c6f6f8035b1e8b Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 13 Oct 2024 22:29:53 -0400 Subject: [PATCH 22/34] Fixes heart attacks. --- code/modules/mob/living/human/human_organs.dm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/code/modules/mob/living/human/human_organs.dm b/code/modules/mob/living/human/human_organs.dm index fbc2deadaaf..ef79bb493f7 100644 --- a/code/modules/mob/living/human/human_organs.dm +++ b/code/modules/mob/living/human/human_organs.dm @@ -222,3 +222,15 @@ //Move some blood over to the organ if(!BP_IS_PROSTHETIC(O) && O.species && O.reagents?.total_volume < 5) vessel.trans_to(O, 5 - O.reagents.total_volume, 1, 1) + + +/mob/living/human/is_asystole() + if(isSynthetic()) + var/obj/item/organ/internal/cell/C = get_organ(BP_CELL, /obj/item/organ/internal/cell) + if(!C || !C.is_usable() || !C.percent()) + return TRUE + else if(should_have_organ(BP_HEART)) + var/obj/item/organ/internal/heart/heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) + if(!istype(heart) || !heart.is_working()) + return TRUE + return FALSE From dd1c450538f6670e49e00b26c320f257aa017fdb Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 13 Oct 2024 23:27:57 -0400 Subject: [PATCH 23/34] Fixes exosuits being tossed around on shuttles. --- code/game/area/areas.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 644fa8aa816..38163a445fd 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -434,6 +434,8 @@ var/global/list/mob/living/forced_ambiance_list = new /area/proc/throw_unbuckled_occupant(var/mob/M, var/maxrange, var/speed, var/direction) if(isliving(M)) + if(M.anchored) // So mechs don't get tossed around. + return if(M.buckled) to_chat(M, SPAN_WARNING("Sudden acceleration presses you into your chair!")) shake_camera(M, 3, 1) From 027ebaec37f58544efcee2dc34ecea7b95de71bd Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 15 Oct 2024 00:50:06 +0000 Subject: [PATCH 24/34] Automatic changelog generation [ci skip] --- html/changelog.html | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index fa05769cd46..dfdca17487e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -185,16 +185,6 @@

MistakeNot4892 updated:

  • Bows are now drawn by clicking and holding.
- -

13 August 2024

-

MistakeNot4892 updated:

-
    -
  • Blocking with a shield now uses close combat skill, and bucklers will not survive forever.
  • -
-

NataKilar updated:

-
    -
  • Solid state reagents now behave mostly like solid state reagents.
  • -
From 59c9d17760c548a236e51e824ccf4dcd99f2ef4c Mon Sep 17 00:00:00 2001 From: Neerti Date: Mon, 14 Oct 2024 16:24:17 -0400 Subject: [PATCH 25/34] Rig Jetpacks Start With Gas --- code/game/objects/items/weapons/tanks/jetpack.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 923c79b1a25..44fa64eac6f 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -112,5 +112,6 @@ /obj/item/tank/jetpack/rig name = "integrated manuvering module thrusterpack" desc = "The 'manuvering' part of a manuvering jet module for a hardsuit. You could... probably use this standalone?" + starting_pressure = list(/decl/material/gas/oxygen = 6 ATM) var/obj/item/rig/holder From 38d3ab76ef3079bb7fa30dc7ec8a758899135229 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 16 Oct 2024 00:49:46 +0000 Subject: [PATCH 26/34] 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 dfdca17487e..b14918bc5bf 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -179,12 +179,6 @@

Penelope Haze updated:

  • amatoxin and psychotropics can be composted in a composter
- -

14 August 2024

-

MistakeNot4892 updated:

-
    -
  • Bows are now drawn by clicking and holding.
  • -
From 2e67cfd7d187663a513d5aaa67e4cbf12ad0a14c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 19 Jan 2023 15:49:36 -0600 Subject: [PATCH 27/34] Port parts of Baystation12/Baystation12/#28308 --- code/game/machinery/embedded_controller/tin_can.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/embedded_controller/tin_can.dm b/code/game/machinery/embedded_controller/tin_can.dm index 0f0fc85f343..d2cada82a3d 100644 --- a/code/game/machinery/embedded_controller/tin_can.dm +++ b/code/game/machinery/embedded_controller/tin_can.dm @@ -54,15 +54,15 @@ return state = STATE_EVACUATE toggleDoor(memory["exterior_status"], tag_exterior_door, door_safety, "close") - signalPump(tag_pump_out_internal, 0) - signalPump(tag_pump_out_external, 1) + signalPump(tag_pump_out_internal, 1, 0, 0) // Interior pump, target is a vaccum + signalPump(tag_pump_out_external, 1, 1, 10000) // Exterior pump, target is infinite if("fill_atmos") if(state == STATE_FILL) return state = STATE_FILL toggleDoor(memory["exterior_status"], tag_exterior_door, door_safety, "close") - signalPump(tag_pump_out_internal, 1) - signalPump(tag_pump_out_external, 0) + signalPump(tag_pump_out_internal, 1, 1, memory["external_sensor_pressure"]) // Interior pump, target is exterior pressure + signalPump(tag_pump_out_external, 1, 0, 0) // Exterior pump, target is zero, to intake if("seal") if(state == STATE_SEALED) return From b441818da168a0216c58d11edc4ff10bcb1af8cb Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 25 Jan 2023 21:10:06 -0600 Subject: [PATCH 28/34] Add force_open argument to various nanoui procs --- code/controllers/subsystems/processing/nano.dm | 4 ++-- code/modules/nano/nanoui.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystems/processing/nano.dm b/code/controllers/subsystems/processing/nano.dm index a7d531e8679..dfaae9e7999 100644 --- a/code/controllers/subsystems/processing/nano.dm +++ b/code/controllers/subsystems/processing/nano.dm @@ -96,14 +96,14 @@ PROCESSING_SUBSYSTEM_DEF(nano) * * @return int The number of uis updated */ -/datum/controller/subsystem/processing/nano/proc/update_user_uis(mob/user, src_object, ui_key) +/datum/controller/subsystem/processing/nano/proc/update_user_uis(mob/user, src_object, ui_key = null, force_open = FALSE) . = 0 if (!length(user.open_uis)) return // has no open uis for (var/datum/nanoui/ui in user.open_uis) if ((isnull(src_object) || ui.src_object == src_object) && (isnull(ui_key) || ui.ui_key == ui_key)) - ui.try_update(1) + ui.try_update(update = TRUE, force_open = force_open) .++ /** diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 758be4b14bd..e315b28c580 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -530,13 +530,13 @@ nanoui is used to open and update nano browser uis * * @return nothing */ -/datum/nanoui/proc/try_update(update = 0) +/datum/nanoui/proc/try_update(update = 0, force_open = FALSE) if (!src_object || !user) close() return if (status && (update || is_auto_updating)) - update() // Update the UI (update_status() is called whenever a UI is updated) + update(force_open) // Update the UI (update_status() is called whenever a UI is updated) else update_status(1) // Not updating UI, so lets check here if status has changed From 0511eca3075fe6b2a2d9cc4adedcd8b661971396 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 21 Feb 2023 04:55:53 -0600 Subject: [PATCH 29/34] Improve overmap contact handling --- code/modules/overmap/contacts/_contacts.dm | 17 ++++-- .../overmap/contacts/contact_sensors.dm | 36 ++++++++---- .../overmap/ships/computers/sensors.dm | 58 +++++++++++++------ nano/templates/shipsensors.tmpl | 18 ++++-- 4 files changed, 89 insertions(+), 40 deletions(-) diff --git a/code/modules/overmap/contacts/_contacts.dm b/code/modules/overmap/contacts/_contacts.dm index ea6afc1d83d..e4cab812e76 100644 --- a/code/modules/overmap/contacts/_contacts.dm +++ b/code/modules/overmap/contacts/_contacts.dm @@ -74,6 +74,16 @@ if(istype(M) && M.client) M.client.images |= images +/datum/overmap_contact/proc/hide() + if(!owner) + return + var/list/showing = owner.linked?.navigation_viewers || owner.viewers + if(length(showing)) + for(var/weakref/W in showing) + var/mob/M = W.resolve() + if(istype(M) && M.client) + M.client.images -= images + /datum/overmap_contact/proc/check_effect_shield() var/obj/effect/overmap/visitable/visitable_effect = effect if(!visitable_effect || !istype(visitable_effect)) @@ -98,12 +108,7 @@ /datum/overmap_contact/Destroy() if(owner) - var/list/showing = owner.linked?.navigation_viewers || owner.viewers - if(length(showing)) - for(var/weakref/W in showing) - var/mob/M = W.resolve() - if(istype(M) && M.client) - M.client.images -= images + hide() if(effect) owner.contact_datums -= effect owner = null diff --git a/code/modules/overmap/contacts/contact_sensors.dm b/code/modules/overmap/contacts/contact_sensors.dm index 372c37b56c3..f6dee900ce4 100644 --- a/code/modules/overmap/contacts/contact_sensors.dm +++ b/code/modules/overmap/contacts/contact_sensors.dm @@ -4,21 +4,29 @@ var/list/contact_datums = list() var/list/trackers = list() +/obj/machinery/computer/ship/sensors/attempt_hook_up(obj/effect/overmap/visitable/ship/sector) + . = ..() + if(!linked) + return + for(var/obj/effect/overmap/overmap_object in linked.contents) + if(!overmap_object.requires_contact) + continue + new /datum/overmap_contact(src, overmap_object) + if(istype(loc, /obj/effect/overmap)) + var/obj/effect/overmap/overmap_location = loc + if(overmap_location.requires_contact) + new /datum/overmap_contact(src, overmap_location) + /obj/machinery/computer/ship/sensors/Destroy() objects_in_view.Cut() + QDEL_LIST_ASSOC_VAL(contact_datums) trackers.Cut() - - for(var/key in contact_datums) - var/datum/overmap_contact/record = contact_datums[key] - qdel(record) - contact_datums.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) - contact_datums[linked] = record record.marker.alpha = 255 /obj/machinery/computer/ship/sensors/proc/reveal_contacts(var/mob/user) @@ -58,7 +66,7 @@ var/datum/overmap_contact/record = contact_datums[key] if(record.effect == linked) continue - qdel(record) // Immediately cut records if power is lost. + qdel(record) // Immediately cut records if power is lost. Note that this handles removing from the list. objects_in_view.Cut() return @@ -74,7 +82,14 @@ objects_in_current_view[tracked_effect] = TRUE objects_in_view[tracked_effect] = 100 - for(var/obj/effect/overmap/contact in view(sensor_range, linked)) + for(var/obj/effect/overmap/contained_contact in linked.contents) + if(!contained_contact.requires_contact) + continue + objects_in_current_view[contained_contact] = TRUE + objects_in_view[contained_contact] = 100 + new /datum/overmap_contact(src, contained_contact) // Don't give a contact notification! + + for(var/obj/effect/overmap/contact in view(sensor_range, get_turf(linked))) if(contact == linked) continue if(!contact.requires_contact) // Only some effects require contact for visibility. @@ -83,7 +98,7 @@ if(contact.instant_contact) // Instantly identify the object in range. objects_in_view[contact] = 100 - else if(!(contact in objects_in_view)) + else if(isnull(objects_in_view[contact])) objects_in_view[contact] = 0 for(var/obj/effect/overmap/contact in objects_in_view) //Update everything. @@ -125,11 +140,10 @@ playsound(loc, "sound/machines/sensors/contactgeneric.ogg", 10, 1) //Let players know there's something nearby. if(objects_in_view[contact] >= 100) // Identification complete. record = new /datum/overmap_contact(src, contact) - contact_datums[contact] = record if(contact.scannable) playsound(loc, "sound/machines/sensors/newcontact.ogg", 30, 1) visible_message(SPAN_NOTICE("\The [src] states, \"New contact identified, designation [record.name], bearing [bearing].\"")) - record.show() + record.ping() animate(record.marker, alpha=255, 2 SECOND, 1, LINEAR_EASING) continue // Update identification information for this record. diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index ff228d2034b..cfbf0ad897d 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -45,6 +45,30 @@ else if(sound_token) QDEL_NULL(sound_token) +/obj/machinery/computer/ship/sensors/proc/get_potential_contacts(include_self = FALSE) + var/list/potential_contacts = get_known_contacts(include_self = include_self) + // Broken or disabled sensors can't pick up nearby objects. + var/obj/machinery/shipsensors/sensors = get_sensors() + if(!sensors || sensors.inoperable() || !sensors.use_power || !sensors.range) + return potential_contacts + for(var/obj/effect/overmap/nearby in view(sensors.range,linked)) + if(nearby.requires_contact) + continue + potential_contacts |= nearby + if(!include_self && linked) + potential_contacts -= linked + return potential_contacts + +/obj/machinery/computer/ship/sensors/proc/get_known_contacts(include_self = FALSE) + var/list/known_contacts = list() + // Effects that require contact are only added to the contacts if they have been identified. + // Allows for coord tracking out of range of the player's view. + for(var/obj/effect/overmap/visitable/identified_contact in contact_datums) + known_contacts |= identified_contact + if(!include_self && linked) + known_contacts -= linked + return known_contacts + /obj/machinery/computer/ship/sensors/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!linked) display_reconnect_dialog(user, "sensors") @@ -70,27 +94,27 @@ data["status"] = "OK" var/list/contacts = list() - var/list/potential_contacts = list() - - for(var/obj/effect/overmap/nearby in view(7,linked)) - if(nearby.requires_contact) // Some ships require. - continue - potential_contacts |= nearby - - // Effects that require contact are only added to the contacts if they have been identified. - // Allows for coord tracking out of range of the player's view. - for(var/obj/effect/overmap/visitable/identified_contact in contact_datums) - potential_contacts |= identified_contact - - for(var/obj/effect/overmap/O in potential_contacts) - if(linked == O) - continue + for(var/obj/effect/overmap/O in get_potential_contacts()) if(!O.scannable) continue var/bearing = round(90 - Atan2(O.x - linked.x, O.y - linked.y),5) if(bearing < 0) bearing += 360 - contacts.Add(list(list("name"=O.name, "color"= O.color, "ref"="\ref[O]", "bearing"=bearing))) + contacts.Add(list(list("name"=O.name, "color"= O.color, "ref"="\ref[O]", "bearing"=bearing, "scannable"=TRUE))) + for(var/obj/effect/overmap/UFO in objects_in_view) + var/progress = objects_in_view[UFO] + if((progress >= 100) || !isnull(contact_datums[UFO])) // Not a UFO if it's identified! + continue + if(!UFO.scannable) + continue + var/bearing = round(90 - Atan2(UFO.x - linked.x, UFO.y - linked.y),5) + if(bearing < 0) + bearing += 360 + var/bearing_variability = round(30/sensors.sensor_strength, 5) + var/bearing_estimate = round(rand(bearing-bearing_variability, bearing+bearing_variability), 5) + if(bearing_estimate < 0) + bearing_estimate += 360 + contacts.Add(list(list("name"=UFO.unknown_id, "color"= UFO.color, "variability" = bearing_variability, "progress"=progress, "bearing"=bearing_estimate, "scannable"=FALSE))) if(contacts.len) data["contacts"] = contacts data["last_scan"] = last_scan @@ -142,7 +166,7 @@ if (href_list["scan"]) var/obj/effect/overmap/O = locate(href_list["scan"]) if(istype(O) && !QDELETED(O)) - if((O in view(7,linked))|| (O in contact_datums)) + if((O in view(sensors.range, linked)) || !isnull(contact_datums[O])) playsound(loc, "sound/effects/ping.ogg", 50, 1) LAZYSET(last_scan, "data", O.get_scan_data(user)) LAZYSET(last_scan, "location", "[O.x],[O.y]") diff --git a/nano/templates/shipsensors.tmpl b/nano/templates/shipsensors.tmpl index f714dc67d34..ea937dbfd6f 100644 --- a/nano/templates/shipsensors.tmpl +++ b/nano/templates/shipsensors.tmpl @@ -1,6 +1,6 @@
- Controls + Controls
Power @@ -36,7 +36,7 @@
- Status + Status
Status: @@ -70,14 +70,20 @@
- Contacts + Contacts {{if data.contacts}} {{for data.contacts}}
-
- + + {{/for}} @@ -87,7 +93,7 @@ {{/if}}
- Scan data + Scan data {{if data.last_scan}} {{:data.last_scan.name}} at {{:data.last_scan.location}} {{:helper.link('Print', 'print' ,{ 'print' : 1 }, null, null)}} From 98492013422713e94841e49500a079c854025969 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 19 Jun 2023 23:12:01 -0500 Subject: [PATCH 30/34] Allow jobs to hide 'not available at roundstart' --- code/game/jobs/job/_job.dm | 2 ++ code/modules/client/preference_setup/occupation/occupation.dm | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/jobs/job/_job.dm b/code/game/jobs/job/_job.dm index 0ff60519023..f5df1fe5197 100644 --- a/code/game/jobs/job/_job.dm +++ b/code/game/jobs/job/_job.dm @@ -51,6 +51,8 @@ var/skill_points = 16 //The number of unassigned skill points the job comes with (on top of the minimum skills). var/no_skill_buffs = FALSE //Whether skills can be buffed by age/species modifiers. var/available_by_default = TRUE + /// If TRUE, 'Not available at roundstart.' won't be shown for this job if available_by_default is FALSE. + var/suppress_no_roundstart_warning = FALSE var/list/possible_goals var/min_goals = 1 diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index 1c81c9ae68c..d4a99e6b025 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -225,7 +225,8 @@ no_link = "[no_link]" . += "[yes_link][no_link]" else if(!job.available_by_default) - . += "Not available at roundstart." + if(!job.suppress_no_roundstart_warning) + . += "Not available at roundstart." else var/level_link switch(current_level) From 3c67e2d89fb0a34fcc657893d645b6d481dde53a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 9 Jul 2024 15:26:34 -0400 Subject: [PATCH 31/34] Add nutriment sheets --- code/modules/materials/material_sheets_mapping.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index cb5e0ebcea3..d852c202c26 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -96,6 +96,7 @@ STACK_SUBTYPES(blackbronze, "black bronze", solid/metal/blac STACK_SUBTYPES(redgold, "red gold", solid/metal/redgold, ingot, null) STACK_SUBTYPES(stainlesssteel, "stainless steel", solid/metal/stainlesssteel, ingot, null) STACK_SUBTYPES(ice, "ice", liquid/water, cubes, null) +STACK_SUBTYPES(nutriment, "nutriment", liquid/nutriment, segment, null) STACK_SUBTYPES(cloth, "cloth", solid/organic/cloth, bolt, null) STACK_SUBTYPES(yellow, "yellow cloth", solid/organic/cloth, bolt/yellow, null) From a75ea217538eb170558a3a1fdcdc6ac18354771a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 9 Jul 2024 21:59:22 -0400 Subject: [PATCH 32/34] Allow putting certain hats on top of helmets --- code/__defines/items_clothing.dm | 39 +++++++++++----------- code/modules/clothing/_clothing.dm | 2 ++ code/modules/clothing/head/_head.dm | 1 + code/modules/clothing/head/collectable.dm | 7 ++++ code/modules/clothing/head/earmuffs.dm | 1 + code/modules/clothing/head/fated_key.dm | 1 + code/modules/clothing/head/headphones.dm | 1 + code/modules/clothing/head/helmet.dm | 5 +-- code/modules/clothing/head/misc.dm | 12 +++++++ code/modules/clothing/head/misc_special.dm | 4 +++ 10 files changed, 52 insertions(+), 21 deletions(-) diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 0b361fa94fb..b2a5c347ddf 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -2,25 +2,26 @@ #define CANDLE_LUM 3 // For how bright candles are. -#define ACCESSORY_SLOT_UTILITY "Utility" -#define ACCESSORY_SLOT_HOLSTER "Holster" -#define ACCESSORY_SLOT_ARMBAND "Armband" -#define ACCESSORY_SLOT_RANK "Rank" -#define ACCESSORY_SLOT_DEPT "Department" -#define ACCESSORY_SLOT_DECOR "Decor" -#define ACCESSORY_SLOT_NECK "Neck" -#define ACCESSORY_SLOT_MEDAL "Medal" -#define ACCESSORY_SLOT_INSIGNIA "Insignia" -#define ACCESSORY_SLOT_ARMOR_C "Chest armor" -#define ACCESSORY_SLOT_ARMOR_A "Arm armor" -#define ACCESSORY_SLOT_ARMOR_L "Leg armor" -#define ACCESSORY_SLOT_ARMOR_S "Armor storage" -#define ACCESSORY_SLOT_ARMOR_M "Misc armor" -#define ACCESSORY_SLOT_HELM_C "Helmet cover" -#define ACCESSORY_SLOT_OVER "Over" -#define ACCESSORY_SLOT_SENSORS "Suit Sensors" -#define ACCESSORY_SLOT_GREAVES "Greaves" -#define ACCESSORY_SLOT_GAUNTLETS "Gauntlets" +#define ACCESSORY_SLOT_UTILITY "Utility" +#define ACCESSORY_SLOT_HOLSTER "Holster" +#define ACCESSORY_SLOT_ARMBAND "Armband" +#define ACCESSORY_SLOT_RANK "Rank" +#define ACCESSORY_SLOT_DEPT "Department" +#define ACCESSORY_SLOT_DECOR "Decor" +#define ACCESSORY_SLOT_NECK "Neck" +#define ACCESSORY_SLOT_MEDAL "Medal" +#define ACCESSORY_SLOT_INSIGNIA "Insignia" +#define ACCESSORY_SLOT_ARMOR_C "Chest armor" +#define ACCESSORY_SLOT_ARMOR_A "Arm armor" +#define ACCESSORY_SLOT_ARMOR_L "Leg armor" +#define ACCESSORY_SLOT_ARMOR_S "Armor storage" +#define ACCESSORY_SLOT_ARMOR_M "Misc armor" +#define ACCESSORY_SLOT_HELM_C "Helmet cover" +#define ACCESSORY_SLOT_OVER_HELMET "Hat" +#define ACCESSORY_SLOT_OVER "Over" +#define ACCESSORY_SLOT_SENSORS "Suit Sensors" +#define ACCESSORY_SLOT_GREAVES "Greaves" +#define ACCESSORY_SLOT_GAUNTLETS "Gauntlets" // Accessory will be shown as part of the name of the item when examined. #define ACCESSORY_VISIBILITY_ENSEMBLE 0 diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index b0ea6c2e268..fcda8d3ceb2 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -16,8 +16,10 @@ var/list/accessories + /// Clothing items with an accessory_slot in this list can be equipped to this item. var/list/valid_accessory_slots + /// accessory_slot entries in this list will be limited to only one item at a time. var/list/restricted_accessory_slots = list( ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_HOLSTER, diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 6ee4b8e6092..a4728547633 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -6,6 +6,7 @@ w_class = ITEM_SIZE_SMALL slot_flags = SLOT_HEAD body_parts_covered = SLOT_HEAD + accessory_slot = ACCESSORY_SLOT_OVER_HELMET fallback_slot = slot_head_str var/protects_against_weather = FALSE diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 85a2eb24045..4c51dbe3bb9 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -56,6 +56,7 @@ w_class = ITEM_SIZE_NORMAL body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES flags_inv = HIDEMASK|HIDEEYES|HIDEFACE + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/collectable/slime name = "collectable slime hat" @@ -103,8 +104,14 @@ name = "collectable Thunderdome helmet" desc = "Go Red! I mean Green! I mean Red! No Green!" icon = 'icons/clothing/head/armor/thunderdome.dmi' + valid_accessory_slots = list(ACCESSORY_SLOT_OVER_HELMET) + restricted_accessory_slots = list(ACCESSORY_SLOT_OVER_HELMET) + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/collectable/swat name = "collectable SWAT helmet" desc = "Now you can be in the Deathsquad too!" icon = 'icons/clothing/head/armor/merc.dmi' + valid_accessory_slots = list(ACCESSORY_SLOT_OVER_HELMET) + restricted_accessory_slots = list(ACCESSORY_SLOT_OVER_HELMET) + accessory_slot = null // cannot be equipped on top of helmets diff --git a/code/modules/clothing/head/earmuffs.dm b/code/modules/clothing/head/earmuffs.dm index 87010938248..0e123c6139c 100644 --- a/code/modules/clothing/head/earmuffs.dm +++ b/code/modules/clothing/head/earmuffs.dm @@ -7,3 +7,4 @@ body_parts_covered = SLOT_HEAD|SLOT_EARS gender = PLURAL flags_inv = 0 + accessory_slot = null // cannot be equipped on top of helmets, but like. that'd look pretty funny diff --git a/code/modules/clothing/head/fated_key.dm b/code/modules/clothing/head/fated_key.dm index cb3490ded0e..cc65bd80239 100644 --- a/code/modules/clothing/head/fated_key.dm +++ b/code/modules/clothing/head/fated_key.dm @@ -5,6 +5,7 @@ body_parts_covered = 0 armor = list(ARMOR_MELEE = 55, ARMOR_BULLET = 55, ARMOR_LASER = 55, ARMOR_ENERGY = 55, ARMOR_BOMB = 55, ARMOR_BIO = 100, ARMOR_RAD = 100) flags_inv = 0 + accessory_slot = null // cannot be equipped on top of helmets because this isn't really even an actual clothing item /obj/item/clothing/head/fated/equipped(mob/living/user, slot) . = ..() diff --git a/code/modules/clothing/head/headphones.dm b/code/modules/clothing/head/headphones.dm index 8d93f8ea8d6..9aba353b175 100644 --- a/code/modules/clothing/head/headphones.dm +++ b/code/modules/clothing/head/headphones.dm @@ -7,6 +7,7 @@ body_parts_covered = SLOT_HEAD|SLOT_EARS gender = PLURAL flags_inv = 0 + accessory_slot = null // cannot be equipped on top of helmets. but like, that'd look hilariou var/headphones_on = 0 var/sound_channel var/current_track diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 388401040e3..42e08ecd5fe 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -2,8 +2,9 @@ name = "helmet" desc = "Reinforced headgear. Protects the head from impacts." icon = 'icons/clothing/head/armor/helmet.dmi' - valid_accessory_slots = list(ACCESSORY_SLOT_HELM_C) - restricted_accessory_slots = list(ACCESSORY_SLOT_HELM_C) + accessory_slot = null // you can't equip helmets over other helmets + valid_accessory_slots = list(ACCESSORY_SLOT_HELM_C, ACCESSORY_SLOT_OVER_HELMET) + restricted_accessory_slots = list(ACCESSORY_SLOT_HELM_C, ACCESSORY_SLOT_OVER_HELMET) item_flags = ITEM_FLAG_THICKMATERIAL body_parts_covered = SLOT_HEAD armor = list( diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index a37404a07e4..a435e585d3c 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -5,6 +5,8 @@ siemens_coefficient = 0.9 body_parts_covered = 0 +// i'm gonna let these be equipped on top of helmets. don't make me regret this +// if i do, i'll probably add a 'magnetic' pin type (and also restrict ipcs to only those) /obj/item/clothing/head/hairflower name = "hair flower pin" icon = 'icons/clothing/head/hairflower/red.dmi' @@ -46,6 +48,7 @@ icon = 'icons/clothing/head/plague.dmi' permeability_coefficient = 0.01 siemens_coefficient = 0.9 + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/hasturhood name = "hastur's hood" @@ -53,6 +56,7 @@ icon = 'icons/clothing/head/hastur.dmi' flags_inv = BLOCK_HEAD_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/nursehat name = "nurse's hat" @@ -66,6 +70,7 @@ icon = 'icons/clothing/head/cardborg.dmi' flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/cardborg/Initialize() . = ..() @@ -98,6 +103,7 @@ name = "pirate bandana" desc = "Yarr." icon = 'icons/clothing/head/bandana/pirate.dmi' + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/bandana/green name = "green bandana" @@ -155,6 +161,7 @@ flags_inv = BLOCK_ALL_HAIR siemens_coefficient = 0.7 body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/bearpelt name = "bear pelt hat" @@ -170,6 +177,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR siemens_coefficient = 2.0 body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/philosopher_wig name = "natural philosopher's wig" @@ -181,6 +189,7 @@ desc = "A veil which is wrapped to cover the head and chest." icon = 'icons/clothing/head/hijab.dmi' body_parts_covered = SLOT_HEAD|SLOT_EARS + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/kippa name = "kippa" @@ -191,6 +200,7 @@ name = "turban" desc = "A sturdy cloth, worn around the head." icon = 'icons/clothing/head/turban.dmi' + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/cowboy_hat name = "cowboy hat" @@ -246,6 +256,7 @@ material = /decl/material/solid/organic/leather color = /decl/material/solid/organic/leather::color material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + accessory_slot = null // cannot be equipped on top of helmets /obj/item/clothing/head/hood name = "hood" @@ -256,3 +267,4 @@ flags_inv = HIDEEARS | BLOCK_HEAD_HAIR material = /decl/material/solid/organic/cloth material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + accessory_slot = null // cannot be equipped on top of helmets diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 83adac01d0e..6616b992929 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -32,6 +32,7 @@ flash_protection = FLASH_PROTECTION_MAJOR tint = TINT_HEAVY replaced_in_loadout = FALSE + accessory_slot = null // cannot be equipped on top of helmets var/up = 0 var/base_state @@ -145,6 +146,9 @@ brightness_on = 2 w_class = ITEM_SIZE_NORMAL material = /decl/material/solid/organic/plantmatter + valid_accessory_slots = list(ACCESSORY_SLOT_OVER_HELMET) + restricted_accessory_slots = list(ACCESSORY_SLOT_OVER_HELMET) + accessory_slot = null // cannot be equipped on top of helmets var/plant_type = "pumpkin" // Duplicated from growns for now. TODO: move sliceability down to other objects like clay. From 40b0a779db8a45ce9a95bbdbebb2f4b7c89b1526 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 17 Oct 2024 00:49:12 +0000 Subject: [PATCH 33/34] 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 b14918bc5bf..c2fdf4eddfa 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -173,12 +173,6 @@

Penelope Haze updated:

  • Pumpkins and watermelons are now large objects, while other produce is small.
  • spoons can now be used as a very poor shovel
  • - -

    15 August 2024

    -

    Penelope Haze updated:

    -
      -
    • amatoxin and psychotropics can be composted in a composter
    • -
    {{:helper.link('Scan', 'search' ,{ 'scan' : value.ref }, null, null)}}{{:value.name}}, bearing {{:value.bearing}} + {{if value.scannable}} + {{:helper.link('Scan', 'search', { 'scan' : value.ref }, null, null)}} + {{else}} + {{:helper.link('Unidentified', null, null, 'disabled')}} + {{/if}} + {{:value.name}}, bearing {{:value.bearing}}{{:value.variability ? (" +/- " + value.variability + " degrees") : ""}}{{:value.progress ? (", tracing " + value.progress + "% complete") : ""}}
    From 38c80de3f9645f7cbf06858f4dbe03ecb6fc8eeb Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 18 Oct 2024 00:49:10 +0000 Subject: [PATCH 34/34] Automatic changelog generation [ci skip] --- html/changelog.html | 9 --------- 1 file changed, 9 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index c2fdf4eddfa..a983bc8e2b4 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -164,15 +164,6 @@

    Penelope Haze updated:

  • Chickens lay fewer eggs less often that are fertilized more often but grow slower as both eggs and chicks.
  • Examining soil plots can now give warnings if a plant is low on nutrients or water (<20% each).
  • - -

    16 August 2024

    -

    Penelope Haze updated:

    -
      -
    • lowered the chance of wild plants bearing harvestable fruit by about half, to incentivize farming
    • -
    • inhabited rooms on Shaded Hills now start with open shutters and lit lanterns
    • -
    • Pumpkins and watermelons are now large objects, while other produce is small.
    • -
    • spoons can now be used as a very poor shovel
    • -