From 618777f1c9e9df8ff19256655d533a76939ae360 Mon Sep 17 00:00:00 2001 From: Archie <53913550+ArchieBeepBoop@users.noreply.github.com> Date: Sun, 2 Jan 2022 18:33:47 -0300 Subject: [PATCH] Mortar and Pestle Chemistry --- .../items/stacks/sheets/sheet_types.dm | 2 + .../reagents/reagent_containers/glass.dm | 803 ++++++++++-------- icons/obj/chemical.dmi | Bin 55587 -> 55863 bytes 3 files changed, 434 insertions(+), 371 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 553c9d720..41a9ec53b 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -106,6 +106,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1), \ null, \ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("pestle", /obj/item/pestle, 1, time = 50), \ new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("micro powered fan assembly", /obj/machinery/fan_assembly, 10, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ )) @@ -243,6 +244,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\ null, \ new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\ + new/datum/stack_recipe("mortar", /obj/item/reagent_containers/glass/mortar, 3), \ new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\ new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\ new/datum/stack_recipe("cross", /obj/structure/kitchenspike/cross, 10, time = 10),\ diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index cb38d8855..0a577dc44 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -1,371 +1,432 @@ -/obj/item/reagent_containers/glass - name = "glass" - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50) - volume = 50 - reagent_flags = OPENCONTAINER - spillable = TRUE - resistance_flags = ACID_PROOF - container_HP = 2 - - -/obj/item/reagent_containers/glass/attack(mob/M, mob/user, obj/target) - if(!canconsume(M, user)) - return - - if(!spillable) - return - - if(!reagents || !reagents.total_volume) - to_chat(user, "[src] is empty!") - return - - if(istype(M)) - if(user.a_intent == INTENT_HARM) - M.visible_message("[user] splashes the contents of [src] onto [M]!", \ - "[user] splashes the contents of [src] onto [M]!") - var/R = reagents?.log_list() - if(isturf(target) && reagents.reagent_list.len && thrownby) - log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]") - message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].") - reagents.reaction(M, TOUCH) - log_combat(user, M, "splashed", R) - reagents.clear_reagents() - else - if(M != user) - M.visible_message("[user] attempts to feed something to [M].", \ - "[user] attempts to feed something to you.") - if(!do_mob(user, M)) - return - if(!reagents || !reagents.total_volume) - return // The drink might be empty after the delay, such as by spam-feeding - M.visible_message("[user] feeds something to [M].", "[user] feeds something to you.") - log_combat(user, M, "fed", reagents.log_list()) - else - to_chat(user, "You swallow a gulp of [src].") - var/fraction = min(5/reagents.total_volume, 1) - reagents.reaction(M, INGEST, fraction) - addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5) - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) - -/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity) - . = ..() - if((!proximity) || !check_allowed_items(target,target_self=1)) - return - - if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it. - if(!reagents.total_volume) - to_chat(user, "[src] is empty!") - return - - if(target.reagents.holder_full()) - to_chat(user, "[target] is full.") - return - - var/trans = reagents.trans_to(target, amount_per_transfer_from_this) - to_chat(user, "You transfer [trans] unit\s of the solution to [target].") - - else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. - if(!target.reagents.total_volume) - to_chat(user, "[target] is empty and can't be refilled!") - return - - if(reagents.holder_full()) - to_chat(user, "[src] is full.") - return - - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) - to_chat(user, "You fill [src] with [trans] unit\s of the contents of [target].") - - else if(reagents.total_volume) - if(user.a_intent == INTENT_HARM) - user.visible_message("[user] splashes the contents of [src] onto [target]!", \ - "You splash the contents of [src] onto [target].") - reagents.reaction(target, TOUCH) - reagents.clear_reagents() - -/obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params) - var/hotness = I.is_hot() - if(hotness && reagents) - reagents.expose_temperature(hotness) - to_chat(user, "You heat [name] with [I]!") - - if(istype(I, /obj/item/reagent_containers/food/snacks/egg)) //breaking eggs - var/obj/item/reagent_containers/food/snacks/egg/E = I - if(reagents) - if(reagents.total_volume >= reagents.maximum_volume) - to_chat(user, "[src] is full.") - else - to_chat(user, "You break [E] in [src].") - E.reagents.trans_to(src, E.reagents.total_volume) - qdel(E) - return - ..() - - -/obj/item/reagent_containers/glass/beaker - name = "beaker" - desc = "A beaker. It can hold up to 50 units. Unable to withstand extreme pHes" - icon = 'icons/obj/chemical.dmi' - icon_state = "beaker" - item_state = "beaker" - materials = list(MAT_GLASS=500) - beaker_weakness_bitflag = PH_WEAK - -/obj/item/reagent_containers/glass/beaker/Initialize() - . = ..() - update_icon() - -/obj/item/reagent_containers/glass/beaker/get_part_rating() - return reagents.maximum_volume - -/obj/item/reagent_containers/glass/beaker/on_reagent_change(changetype) - update_icon() - -/obj/item/reagent_containers/glass/beaker/update_icon() - if(!cached_icon) - cached_icon = icon_state - cut_overlays() - - if(reagents.total_volume) - var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[cached_icon]10") - - var/percent = round((reagents.total_volume / volume) * 100) - switch(percent) - if(0 to 9) - filling.icon_state = "[cached_icon]-10" - if(10 to 24) - filling.icon_state = "[cached_icon]10" - if(25 to 49) - filling.icon_state = "[cached_icon]25" - if(50 to 74) - filling.icon_state = "[cached_icon]50" - if(75 to 79) - filling.icon_state = "[cached_icon]75" - if(80 to 90) - filling.icon_state = "[cached_icon]80" - if(91 to INFINITY) - filling.icon_state = "[cached_icon]100" - - filling.color = mix_color_from_reagents(reagents.reagent_list) - add_overlay(filling) - -/obj/item/reagent_containers/glass/beaker/jar - name = "honey jar" - desc = "A jar for honey. It can hold up to 50 units of sweet delight. Unable to withstand reagents of an extreme pH." - icon = 'icons/obj/chemical.dmi' - icon_state = "vapour" - -/obj/item/reagent_containers/glass/beaker/large - name = "large beaker" - desc = "A large beaker. Can hold up to 100 units. Unable to withstand reagents of an extreme pH." - icon_state = "beakerlarge" - materials = list(MAT_GLASS=2500) - volume = 100 - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,50,100) - container_HP = 3 - -/obj/item/reagent_containers/glass/beaker/plastic - name = "x-large beaker" - desc = "An extra-large beaker. Can hold up to 150 units. Is able to resist acid and alkaline solutions, but melts at 444K" - icon_state = "beakerwhite" - materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000) - volume = 150 - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150) - -/obj/item/reagent_containers/glass/beaker/plastic/Initialize() - beaker_weakness_bitflag &= ~PH_WEAK - beaker_weakness_bitflag |= TEMP_WEAK - . = ..() - -/obj/item/reagent_containers/glass/beaker/plastic/update_icon() - icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states - ..() - icon_state = "beakerwhite" - -/obj/item/reagent_containers/glass/beaker/meta - name = "metamaterial beaker" - desc = "A large beaker. Can hold up to 200 units. Is able to withstand all chemical situations." - icon_state = "beakergold" - materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000, MAT_GOLD=1000, MAT_TITANIUM=1000) - volume = 200 - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200) - -/obj/item/reagent_containers/glass/beaker/meta/Initialize() - beaker_weakness_bitflag &= ~PH_WEAK - . = ..() - -/obj/item/reagent_containers/glass/beaker/noreact - name = "cryostasis beaker" - desc = "A cryostasis beaker that allows for chemical storage without \ - reactions. Can hold up to 50 units." - icon_state = "beakernoreact" - materials = list(MAT_METAL=3000) - reagent_flags = OPENCONTAINER | NO_REACT - volume = 50 - amount_per_transfer_from_this = 10 - container_HP = 10//shouldn't be needed - -/obj/item/reagent_containers/glass/beaker/noreact/Initialize() - beaker_weakness_bitflag &= ~PH_WEAK - . = ..() - //reagents.set_reacting(FALSE) was this removed in a recent pr? - -/obj/item/reagent_containers/glass/beaker/bluespace - name = "bluespace beaker" - desc = "A bluespace beaker, powered by experimental bluespace technology \ - and Element Cuban combined with the Compound Pete. Can hold up to \ - 300 units. Unable to withstand reagents of an extreme pH." - icon_state = "beakerbluespace" - materials = list(MAT_GLASS=3000) - volume = 300 - amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) - container_HP = 4 - -/obj/item/reagent_containers/glass/beaker/cryoxadone - list_reagents = list(/datum/reagent/medicine/cryoxadone = 30) - -/obj/item/reagent_containers/glass/beaker/sulphuric - list_reagents = list(/datum/reagent/toxin/acid = 50) - -/obj/item/reagent_containers/glass/beaker/slime - list_reagents = list(/datum/reagent/toxin/slimejelly = 50) - -/obj/item/reagent_containers/glass/beaker/large/styptic - name = "styptic reserve tank" - list_reagents = list(/datum/reagent/medicine/styptic_powder = 50) - -/obj/item/reagent_containers/glass/beaker/large/silver_sulfadiazine - name = "silver sulfadiazine reserve tank" - list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 50) - -/obj/item/reagent_containers/glass/beaker/large/charcoal - name = "charcoal reserve tank" - list_reagents = list(/datum/reagent/medicine/charcoal = 50) - -/obj/item/reagent_containers/glass/beaker/large/epinephrine - name = "epinephrine reserve tank" - list_reagents = list(/datum/reagent/medicine/epinephrine = 50) - -/obj/item/reagent_containers/glass/beaker/synthflesh - list_reagents = list(/datum/reagent/medicine/synthflesh = 50) - -/obj/item/reagent_containers/glass/bucket - name = "bucket" - desc = "It's a bucket." - icon = 'icons/obj/janitor.dmi' - icon_state = "bucket" - item_state = "bucket" - lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' - materials = list(MAT_METAL=200) - w_class = WEIGHT_CLASS_NORMAL - amount_per_transfer_from_this = 20 - possible_transfer_amounts = list(5,10,15,20,25,30,50,70) - volume = 70 - flags_inv = HIDEHAIR - slot_flags = ITEM_SLOT_HEAD - resistance_flags = NONE - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 50) //Weak melee protection, because you can wear it on your head - slot_equipment_priority = list( \ - SLOT_BACK, SLOT_WEAR_ID,\ - SLOT_W_UNIFORM, SLOT_WEAR_SUIT,\ - SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\ - SLOT_SHOES, SLOT_GLOVES,\ - SLOT_EARS, SLOT_GLASSES,\ - SLOT_BELT, SLOT_S_STORE,\ - SLOT_L_STORE, SLOT_R_STORE,\ - SLOT_GENERC_DEXTROUS_STORAGE - ) - container_HP = 1 - -/obj/item/reagent_containers/glass/bucket/Initialize() - beaker_weakness_bitflag |= TEMP_WEAK - . = ..() - -/obj/item/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params) - if(istype(O, /obj/item/mop)) - if(reagents.total_volume < 1) - to_chat(user, "[src] is out of water!") - else - reagents.trans_to(O, 5) - to_chat(user, "You wet [O] in [src].") - playsound(loc, 'sound/effects/slosh.ogg', 25, 1) - else if(isprox(O)) - to_chat(user, "You add [O] to [src].") - qdel(O) - qdel(src) - user.put_in_hands(new /obj/item/bot_assembly/cleanbot) - else - ..() - -/obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot) - ..() - if (slot == SLOT_HEAD) - if(reagents.total_volume) - to_chat(user, "[src]'s contents spill all over you!") - reagents.reaction(user, TOUCH) - reagents.clear_reagents() - reagent_flags = NONE - -/obj/item/reagent_containers/glass/bucket/dropped(mob/user) - . = ..() - reagent_flags = initial(reagent_flags) - -/obj/item/reagent_containers/glass/bucket/equip_to_best_slot(var/mob/M) - if(reagents.total_volume) //If there is water in a bucket, don't quick equip it to the head - var/index = slot_equipment_priority.Find(SLOT_HEAD) - slot_equipment_priority.Remove(SLOT_HEAD) - . = ..() - slot_equipment_priority.Insert(index, SLOT_HEAD) - return - return ..() - -/obj/item/reagent_containers/glass/beaker/waterbottle - name = "bottle of water" - desc = "A bottle of water filled at some factory in space." - icon = 'icons/obj/drinks.dmi' - icon_state = "smallbottle" - item_state = "bottle" - list_reagents = list(/datum/reagent/water = 50)//see desc, don't think about it too hard - materials = list(MAT_GLASS=0) - volume = 50 - amount_per_transfer_from_this = 10 - container_HP = 1 - price = 1 - -/obj/item/reagent_containers/glass/beaker/waterbottle/Initialize() - beaker_weakness_bitflag |= TEMP_WEAK - . = ..() - -/obj/item/reagent_containers/glass/beaker/waterbottle/empty - list_reagents = list() - -/obj/item/reagent_containers/glass/beaker/waterbottle/large - desc = "A fresh commercial-sized bottle of water." - icon_state = "largebottle" - materials = list(MAT_GLASS=0) - list_reagents = list(/datum/reagent/water = 100) - volume = 100 - amount_per_transfer_from_this = 20 - container_HP = 1 - -/obj/item/reagent_containers/glass/beaker/waterbottle/large/empty - list_reagents = list() - -/obj/item/reagent_containers/glass/beaker/waterbottle/wataur - name = "Bottled Wataur" - desc = "Finally, a bottle as proportionate as you. Incredible!" - icon = 'icons/obj/drinks.dmi' - icon_state = "wataur" - list_reagents = list(/datum/reagent/water = 100) //robust ass wataur - volume = 100 - amount_per_transfer_from_this = 20 - container_HP = 1 - -/obj/item/reagent_containers/glass/get_belt_overlay() - return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "bottle") +/obj/item/reagent_containers/glass + name = "glass" + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50) + volume = 50 + reagent_flags = OPENCONTAINER + spillable = TRUE + resistance_flags = ACID_PROOF + container_HP = 2 + + +/obj/item/reagent_containers/glass/attack(mob/M, mob/user, obj/target) + if(!canconsume(M, user)) + return + + if(!spillable) + return + + if(!reagents || !reagents.total_volume) + to_chat(user, "[src] is empty!") + return + + if(istype(M)) + if(user.a_intent == INTENT_HARM) + M.visible_message("[user] splashes the contents of [src] onto [M]!", \ + "[user] splashes the contents of [src] onto [M]!") + var/R = reagents?.log_list() + if(isturf(target) && reagents.reagent_list.len && thrownby) + log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]") + message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].") + reagents.reaction(M, TOUCH) + log_combat(user, M, "splashed", R) + reagents.clear_reagents() + else + if(M != user) + M.visible_message("[user] attempts to feed something to [M].", \ + "[user] attempts to feed something to you.") + if(!do_mob(user, M)) + return + if(!reagents || !reagents.total_volume) + return // The drink might be empty after the delay, such as by spam-feeding + M.visible_message("[user] feeds something to [M].", "[user] feeds something to you.") + log_combat(user, M, "fed", reagents.log_list()) + else + to_chat(user, "You swallow a gulp of [src].") + var/fraction = min(5/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) + addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5) + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + +/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity) + . = ..() + if((!proximity) || !check_allowed_items(target,target_self=1)) + return + + if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it. + if(!reagents.total_volume) + to_chat(user, "[src] is empty!") + return + + if(target.reagents.holder_full()) + to_chat(user, "[target] is full.") + return + + var/trans = reagents.trans_to(target, amount_per_transfer_from_this) + to_chat(user, "You transfer [trans] unit\s of the solution to [target].") + + else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. + if(!target.reagents.total_volume) + to_chat(user, "[target] is empty and can't be refilled!") + return + + if(reagents.holder_full()) + to_chat(user, "[src] is full.") + return + + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) + to_chat(user, "You fill [src] with [trans] unit\s of the contents of [target].") + + else if(reagents.total_volume) + if(user.a_intent == INTENT_HARM) + user.visible_message("[user] splashes the contents of [src] onto [target]!", \ + "You splash the contents of [src] onto [target].") + reagents.reaction(target, TOUCH) + reagents.clear_reagents() + +/obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params) + var/hotness = I.is_hot() + if(hotness && reagents) + reagents.expose_temperature(hotness) + to_chat(user, "You heat [name] with [I]!") + + if(istype(I, /obj/item/reagent_containers/food/snacks/egg)) //breaking eggs + var/obj/item/reagent_containers/food/snacks/egg/E = I + if(reagents) + if(reagents.total_volume >= reagents.maximum_volume) + to_chat(user, "[src] is full.") + else + to_chat(user, "You break [E] in [src].") + E.reagents.trans_to(src, E.reagents.total_volume) + qdel(E) + return + ..() + + +/obj/item/reagent_containers/glass/beaker + name = "beaker" + desc = "A beaker. It can hold up to 50 units. Unable to withstand extreme pHes" + icon = 'icons/obj/chemical.dmi' + icon_state = "beaker" + item_state = "beaker" + materials = list(MAT_GLASS=500) + beaker_weakness_bitflag = PH_WEAK + +/obj/item/reagent_containers/glass/beaker/Initialize() + . = ..() + update_icon() + +/obj/item/reagent_containers/glass/beaker/get_part_rating() + return reagents.maximum_volume + +/obj/item/reagent_containers/glass/beaker/on_reagent_change(changetype) + update_icon() + +/obj/item/reagent_containers/glass/beaker/update_icon() + if(!cached_icon) + cached_icon = icon_state + cut_overlays() + + if(reagents.total_volume) + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[cached_icon]10") + + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 9) + filling.icon_state = "[cached_icon]-10" + if(10 to 24) + filling.icon_state = "[cached_icon]10" + if(25 to 49) + filling.icon_state = "[cached_icon]25" + if(50 to 74) + filling.icon_state = "[cached_icon]50" + if(75 to 79) + filling.icon_state = "[cached_icon]75" + if(80 to 90) + filling.icon_state = "[cached_icon]80" + if(91 to INFINITY) + filling.icon_state = "[cached_icon]100" + + filling.color = mix_color_from_reagents(reagents.reagent_list) + add_overlay(filling) + +/obj/item/reagent_containers/glass/beaker/jar + name = "honey jar" + desc = "A jar for honey. It can hold up to 50 units of sweet delight. Unable to withstand reagents of an extreme pH." + icon = 'icons/obj/chemical.dmi' + icon_state = "vapour" + +/obj/item/reagent_containers/glass/beaker/large + name = "large beaker" + desc = "A large beaker. Can hold up to 100 units. Unable to withstand reagents of an extreme pH." + icon_state = "beakerlarge" + materials = list(MAT_GLASS=2500) + volume = 100 + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5,10,15,20,25,30,50,100) + container_HP = 3 + +/obj/item/reagent_containers/glass/beaker/plastic + name = "x-large beaker" + desc = "An extra-large beaker. Can hold up to 150 units. Is able to resist acid and alkaline solutions, but melts at 444K" + icon_state = "beakerwhite" + materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000) + volume = 150 + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150) + +/obj/item/reagent_containers/glass/beaker/plastic/Initialize() + beaker_weakness_bitflag &= ~PH_WEAK + beaker_weakness_bitflag |= TEMP_WEAK + . = ..() + +/obj/item/reagent_containers/glass/beaker/plastic/update_icon() + icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states + ..() + icon_state = "beakerwhite" + +/obj/item/reagent_containers/glass/beaker/meta + name = "metamaterial beaker" + desc = "A large beaker. Can hold up to 200 units. Is able to withstand all chemical situations." + icon_state = "beakergold" + materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000, MAT_GOLD=1000, MAT_TITANIUM=1000) + volume = 200 + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200) + +/obj/item/reagent_containers/glass/beaker/meta/Initialize() + beaker_weakness_bitflag &= ~PH_WEAK + . = ..() + +/obj/item/reagent_containers/glass/beaker/noreact + name = "cryostasis beaker" + desc = "A cryostasis beaker that allows for chemical storage without \ + reactions. Can hold up to 50 units." + icon_state = "beakernoreact" + materials = list(MAT_METAL=3000) + reagent_flags = OPENCONTAINER | NO_REACT + volume = 50 + amount_per_transfer_from_this = 10 + container_HP = 10//shouldn't be needed + +/obj/item/reagent_containers/glass/beaker/noreact/Initialize() + beaker_weakness_bitflag &= ~PH_WEAK + . = ..() + //reagents.set_reacting(FALSE) was this removed in a recent pr? + +/obj/item/reagent_containers/glass/beaker/bluespace + name = "bluespace beaker" + desc = "A bluespace beaker, powered by experimental bluespace technology \ + and Element Cuban combined with the Compound Pete. Can hold up to \ + 300 units. Unable to withstand reagents of an extreme pH." + icon_state = "beakerbluespace" + materials = list(MAT_GLASS=3000) + volume = 300 + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) + container_HP = 4 + +/obj/item/reagent_containers/glass/beaker/cryoxadone + list_reagents = list(/datum/reagent/medicine/cryoxadone = 30) + +/obj/item/reagent_containers/glass/beaker/sulphuric + list_reagents = list(/datum/reagent/toxin/acid = 50) + +/obj/item/reagent_containers/glass/beaker/slime + list_reagents = list(/datum/reagent/toxin/slimejelly = 50) + +/obj/item/reagent_containers/glass/beaker/large/styptic + name = "styptic reserve tank" + list_reagents = list(/datum/reagent/medicine/styptic_powder = 50) + +/obj/item/reagent_containers/glass/beaker/large/silver_sulfadiazine + name = "silver sulfadiazine reserve tank" + list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 50) + +/obj/item/reagent_containers/glass/beaker/large/charcoal + name = "charcoal reserve tank" + list_reagents = list(/datum/reagent/medicine/charcoal = 50) + +/obj/item/reagent_containers/glass/beaker/large/epinephrine + name = "epinephrine reserve tank" + list_reagents = list(/datum/reagent/medicine/epinephrine = 50) + +/obj/item/reagent_containers/glass/beaker/synthflesh + list_reagents = list(/datum/reagent/medicine/synthflesh = 50) + +/obj/item/reagent_containers/glass/bucket + name = "bucket" + desc = "It's a bucket." + icon = 'icons/obj/janitor.dmi' + icon_state = "bucket" + item_state = "bucket" + lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' + materials = list(MAT_METAL=200) + w_class = WEIGHT_CLASS_NORMAL + amount_per_transfer_from_this = 20 + possible_transfer_amounts = list(5,10,15,20,25,30,50,70) + volume = 70 + flags_inv = HIDEHAIR + slot_flags = ITEM_SLOT_HEAD + resistance_flags = NONE + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 50) //Weak melee protection, because you can wear it on your head + slot_equipment_priority = list( \ + SLOT_BACK, SLOT_WEAR_ID,\ + SLOT_W_UNIFORM, SLOT_WEAR_SUIT,\ + SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\ + SLOT_SHOES, SLOT_GLOVES,\ + SLOT_EARS, SLOT_GLASSES,\ + SLOT_BELT, SLOT_S_STORE,\ + SLOT_L_STORE, SLOT_R_STORE,\ + SLOT_GENERC_DEXTROUS_STORAGE + ) + container_HP = 1 + +/obj/item/reagent_containers/glass/bucket/Initialize() + beaker_weakness_bitflag |= TEMP_WEAK + . = ..() + +/obj/item/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params) + if(istype(O, /obj/item/mop)) + if(reagents.total_volume < 1) + to_chat(user, "[src] is out of water!") + else + reagents.trans_to(O, 5) + to_chat(user, "You wet [O] in [src].") + playsound(loc, 'sound/effects/slosh.ogg', 25, 1) + else if(isprox(O)) + to_chat(user, "You add [O] to [src].") + qdel(O) + qdel(src) + user.put_in_hands(new /obj/item/bot_assembly/cleanbot) + else + ..() + +/obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot) + ..() + if (slot == SLOT_HEAD) + if(reagents.total_volume) + to_chat(user, "[src]'s contents spill all over you!") + reagents.reaction(user, TOUCH) + reagents.clear_reagents() + reagent_flags = NONE + +/obj/item/reagent_containers/glass/bucket/dropped(mob/user) + . = ..() + reagent_flags = initial(reagent_flags) + +/obj/item/reagent_containers/glass/bucket/equip_to_best_slot(var/mob/M) + if(reagents.total_volume) //If there is water in a bucket, don't quick equip it to the head + var/index = slot_equipment_priority.Find(SLOT_HEAD) + slot_equipment_priority.Remove(SLOT_HEAD) + . = ..() + slot_equipment_priority.Insert(index, SLOT_HEAD) + return + return ..() + +/obj/item/reagent_containers/glass/beaker/waterbottle + name = "bottle of water" + desc = "A bottle of water filled at some factory in space." + icon = 'icons/obj/drinks.dmi' + icon_state = "smallbottle" + item_state = "bottle" + list_reagents = list(/datum/reagent/water = 50)//see desc, don't think about it too hard + materials = list(MAT_GLASS=0) + volume = 50 + amount_per_transfer_from_this = 10 + container_HP = 1 + price = 1 + +/obj/item/reagent_containers/glass/beaker/waterbottle/Initialize() + beaker_weakness_bitflag |= TEMP_WEAK + . = ..() + +/obj/item/reagent_containers/glass/beaker/waterbottle/empty + list_reagents = list() + +/obj/item/reagent_containers/glass/beaker/waterbottle/large + desc = "A fresh commercial-sized bottle of water." + icon_state = "largebottle" + materials = list(MAT_GLASS=0) + list_reagents = list(/datum/reagent/water = 100) + volume = 100 + amount_per_transfer_from_this = 20 + container_HP = 1 + +/obj/item/reagent_containers/glass/beaker/waterbottle/large/empty + list_reagents = list() + +/obj/item/reagent_containers/glass/beaker/waterbottle/wataur + name = "Bottled Wataur" + desc = "Finally, a bottle as proportionate as you. Incredible!" + icon = 'icons/obj/drinks.dmi' + icon_state = "wataur" + list_reagents = list(/datum/reagent/water = 100) //robust ass wataur + volume = 100 + amount_per_transfer_from_this = 20 + container_HP = 1 + +/obj/item/reagent_containers/glass/get_belt_overlay() + return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "bottle") + +//Mortar & Pestle + +/obj/item/pestle + name = "pestle" + desc = "An ancient, simple tool used in conjunction with a mortar to grind or juice items." + icon = 'icons/obj/chemical.dmi' + icon_state = "pestle" + force = 4 + +/obj/item/reagent_containers/glass/mortar + name = "mortar" + desc = "A specially formed bowl of ancient design. It is possible to crush or juice items placed in it using a pestle; however the process, unlike modern methods, is slow and physically exhausting. Alt click to eject the item." + icon_state = "mortar" + amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50) + item_flags = NO_MAT_REDEMPTION + reagent_flags = OPENCONTAINER + spillable = TRUE + var/obj/item/grinded + +/obj/item/reagent_containers/glass/mortar/AltClick(mob/user) + . = ..() + if(grinded) + grinded.forceMove(drop_location()) + grinded = null + to_chat(user, "You eject the item inside.") + return TRUE + +/obj/item/reagent_containers/glass/mortar/attackby(obj/item/I, mob/living/carbon/human/user) + ..() + if(istype(I,/obj/item/pestle)) + if(grinded) + to_chat(user, "You start grinding...") + if((do_after(user, 25, target = src)) && grinded) + user.adjustStaminaLoss(20) + if(grinded.juice_results) //prioritize juicing + grinded.on_juice() + reagents.add_reagent_list(grinded.juice_results) + to_chat(user, "You juice [grinded] into a fine liquid.") + QDEL_NULL(grinded) + return + grinded.on_grind() + reagents.add_reagent_list(grinded.grind_results) + if(grinded.reagents) //food and pills + grinded.reagents.trans_to(src, grinded.reagents.total_volume) + to_chat(user, "You break [grinded] into powder.") + QDEL_NULL(grinded) + return + return + else + to_chat(user, "There is nothing to grind!") + return + if(grinded) + to_chat(user, "There is something inside already!") + return + if(I.juice_results || I.grind_results) + I.forceMove(src) + grinded = I + return + to_chat(user, "You can't grind this!") diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index b723785e0d7d6ecbf12931579a4a74936af86a9c..b753093c3cb9a06573114c135b084da0b612be77 100644 GIT binary patch delta 17176 zcmY)VbwE_#7dHwYQb1Cq8x#aYx?3rwyBR>byWxyVgM@%ecXvogcT2a@-5o>BJA8l7 zecpTL4~8>mpLNz=d$0PewX>^G>S|D8UVu108ai%L=B^)ItexDf9UTC`E2T8C-C>On zKX~L)9ivg(*Mxb%!}mD%y~>k52b6Op)DPtHfz01tGW-6^Kl|dMNx=BmVm<#RZQN5VTpN<4>VFB_l~`B2iibs)oP}nS=(}sCW1Ws~r@<@0T*~AL3bVwDF96O%zAO zt6x;2d?&8VLUFO9{q%xDPHa%C$sHGdXO-cRl=MBHUli2e?6g0@M}ZzZ0JJT6Ii<&DE=gU*zcx zjDGynaO!HcCa0mEc)cMKaIq6`BJRh&n|NL;aZ8YC%lQv&SdS2F;-%AN+S!u!5TDOm zF0GA6?^tCCAHP6)Rm$|+)6cn%(by2m+m0mLon)N5C~0u?+6kwI(W~$hsxuwPz-*3- zVVyE6k#4F8g)!T{b${+hDqPg;j$A*HY&B)YLm_*Y)56_Yn6_alJMC#9>qiwjI}Y&2 z=so{+{=KI4IbS;1XZ7(RkK$U%#ycqObvlWgGlv7yMOR|e@s(Yyp>1VP9A|DCm17Vi zS{LEc>!w;(h5+&;zvoHP9&_#gS~ABkK2>~CyHxs^BfdNOIqutRtZ>b^E22fI4WSGABt*Q`!Bv{|M`jG zA;nFIG|O^Wz~>HQek~oV1}Zv7`}u6%(WgO#_3P}Yj<3?$91Gf1Tb!CRiDkVFm8}Gw zX@1&Fj1)_TABOc9c|~rUPmw*8aZ!IRCi6BJ?_2vV^UwqQ%WztEPE2sZ`B(HyTk5-k z>gB@0TE_DwlLf#6RM*=QPe3 z+x*2ChxzddjvLHpL@_DwXF=hy!vryKJicVP8ezW_Ve_hVX_5*53k+{HdP%o3PjUz4 zbP1f}&KyX6f~sQ4#nrg^P7V_#uK=q%{gp6hqUagjx(y);7=E0;N*FiCP4m_zX*08+ zUhX8Ue?JkAPMbU-BWEDzy36cxC?w|ZUjrW7X>6K+g8lmi#Mr7oOVT}L%hfmoN(vSu zei(ufzo&{KhwV?Xl>fUvxe$p!RuBI_lz;v;AbkVTayPA#jv(etJdjz{GvRAVRUAafAmQg3kgKcO0Fy15aU6-_f{6BQwi+Mgr1D~5NSpHE|=y4C+ryvdu8~GzM z*WgOLg@S@24Pgr6*l%^1@Q83Vy{DQSubXzTf|;7*?+#L<5nfF91}n-#jCJD1+HGp& zpO_U`iD7)EwP8?hX`OIp?4Y{^!M_g6ERsN9%TIgfMc6D^&sXxu(2(9!^-s~%+zDhH zqkR~xCcn;mzmj7EI9lnfU*cQTJDvIs@KGfJ(eP(6kx75@@!TDPv(bcz3#cpLy$9$H zbTtSH-vUrZJqMuM?@yS5?qKX$@fDkjUpGkrul!}tfO`_oGCq@+Q&s^W5;UQk=5(($ zGpD> z7m%(#A&>;nutp3ZX&Km@0SVUpPT2k%0Gz(@8!m^_2bXW@{_ltI)|+4i3G6%=yximL zX~>urh>Gg^iS(-srKpbvZ*wnKJ_TQ3nF)eQ_HSL8M}B87=ky-={Wem0b@<^dA|`@_ z-E`)=vY~%Nr)_UnS4;rgc)4rwiqNiEQSc4^YC&A#e8jjQ;_5QXElMb{sQFcDwo;zW zPdvKED-*Fmf&ceN@V}u`S#C1fv5A7NjCc3(QG%9FS%g*cuE@3^-6RR)hFCnkpF6#4`N{AzSZ&oaa*Y-x_jx% z|IUdu%(xx?B?DqoM?5;P5Ah@aqzcb`xX+t`f6ZJOK9L__3-HaK68}5?WW5z$wjK9K zoz{lvFJY|)n%ylbwWIn?2?obMxL) zIvpEB5+7C7wr^+%l?&u%8!us9UPrmLGn&aB(>&i^Mai&WO_(9OPmg}Ei_7QRWwKB} z(?bd)E0|-+!0Ypc8;*H;a|(T?#rUl9rKw3I0KSziu78I)^7PDoe^%AaHg!bTzjBZ7 zg+K2ST!wj?G4@D>tK5C{QIEni1@!!Br6()_h-}?IG z8Z+w=A3aX&%Ch)svDlcHHUK(iHF?o|&l{Xd>d+_Tzhy~>(czuq@R{sl`=bZAkGFrL zG)05ld_jQ~8yl;jqw{m!o1LBg#mkpFMh&tuGF*6K*R%tJx!R$M^70eSDekdhCbiWq zhaXru{lJHtt)ai#Mo7T(-XqzyfR*1(b@0TMUbmxd9N-wwD*Dp(8IGFybdwWmCU8bv zwk|$$)XEPz8>yU!RWZ;Sbi-#>0S0!GbdBuZt8V`Rn)*}zCJ${_@S4};!=%r;ff4sqp_Ro5Jo2Qe0`>f zefF_05Z^t>`>8h9&5!W0%x3Y;=F88DLVz9IFTp0=lI_BrEJih2tOtYj0Zu(TLh%W~ z!}4yr;>||~;oY%b(p&}TA`AydR+0Se8-xsK);Cu>UAK7r%OR(}p=41O67@}Yv9Vw* zwzOnQXSL72-f-c4G3`oF6wX^>{TCTHram-w`R@AeE}nivNqPOB^&s{03U!gEgS*U? z4!PV4sV7ODN1u}tB<;tKMiCu7y zUQS_{F5)Tj>>hvH(xXwRoaO^u6s({rrKq<4Tj_L*5F`;N5<+@B^b8D%mj?@L z)l0xwyU$! z{CQcw%xAP-c3vDGTUnp*+&vUUtLl2Au($H$FD|yGX=p71Z7m~|1OzD8Zf#ZGT?Bvl z(yekGXP~piceV;`RAX*0{}Xwtex1YnG~20gLt-(9Rd^e?#;QjYX8F;Mr$bf*FR+>@ zv$^Wo=?ZqiTs%D)DEafQu2F7;rC4nIs91Bcia^iE9K>(d`^%6N()h#^dpp^&*^)3S z0G#UWYt_IuK`SKo+4J?PdG1fHq$F1Mn=b=?zb84jVJoL3=HNPF{-gY)_isaZc=GYN zorx=s39R5%YcBxM0`H|HHJXB0$t)E@wO}4Np)<`!cL4)nJI(0t$_)>>^fXc)T1qDN z?-6NupjApYZ;G_zeX!Em<}lS}zyCFk-zUcUefQqH9hpL_FBk6jPK0Cdw5Jx+?t%G% zgKt<@M5gbV0poKOWs$#Cya27!zT#JTjd!OT6gtb@(Ep7WGr^Gdv4`g`s=? zgq3I6o2c2*Kc#0h=D>1dg70-rAPJ3eNLIi(MLJ0Q>{$mOp{1pzD8>|A68?2n<(an7 zN32^AkZ1>!SE!@KkpM-dzac^8;XiZ>qtexm`fDBzoN~XplXm{Tq05EUjr|@8Z|p0C zc6W?@_)0#i-@1Rwi?BWOImyGk3?sW|_j{jGd>5}KR)osgZ6xXob+R9Bo~wPU#(x+U z=m$6PYEcRfyrT+0u^{)oX-)v2kZ^5Mqe5@b^__CJjK<&J?(&!FwHk|BrFwIv@eKof zw6p*k8X5)$Muou9%1TOdX-UcY)l)1iFPxW(a;nP(yUmOOPRqc2t$jpR7X8pq&Ueh1 zsHmvRXCvZUC8Pcv1&8=pT})p0A{^H*IIOTqwK14LN8q6E#bySdAqMl9XM!_6_wfatlmtilT$P;5PJIX{px8^2*}ctQYp!eRnr!iI34=M6vdX zxdEk2RJg(huhoN{h%4g(ig z%T3sJ`gQl9&AI8<;S3iDXl6-5FPv;xo5(HlK}AIcy1#GtFt2c&ew?%x)DQf2Q&m7G z?7aKQZu(<&Hw>Yh;z$Hw&r605nzgrz7wytz6lXkuf zh~SY;ICa!)jx{VehPQH1MAtN0C{MrX2z|RED#^h!hz49^Q-^#8QC=3hmqt>)MGt0pFl!OJ@gV7A$u`FKOJrR2kD`|bwc!Qa2m(r62)8#V=v zZ??iN#5PYG$mbnpPN{dm;FnM6i$GPiZ*wvEPSm(7&WPOt z9D@nq2F{ic%TDRh#>++P1d0o~CxuOFGn;)QBeJ@>WZ*ss<9YV(UHiq^Wi)$-P2g(s z?%Mjg84rPm1LjOLG|?xO=Brg|Ye@KeKh!>C2bk%Z{PH zgEYPrWwgS=y`s+JGlmen^+oR9Mk=mY?%F4xFU^fr173YIkw7KQ>9WZ_!X-vGJO5dT z4g4Gozpfde;0M?pA7wi*I7}+Y(y@xXLcp#^=}IIH*JB#hhewM)II*;{&Q9Q8&Uw{H zKlKx=Bm|b5pL2`V6GtZGrGv9^pVngcrvjsqUmG=%&iHcs^$uOndMSK8!f_~zWRhtL zkCb4iz>)1E3vTRaLS|jkjn?wSAy&o8B`^{e7N&rRh|qL|^~IA0>-&%td|3KaG^!Gi z&@-fFYSI;B3;E_N69*?9`Ii5@LUg{dFSRXPSs(+r-!G@xkWXQ5$|84@ zaAW}as3kC{oCV%+3+{zJ0cLS|pHm+#c8Z~HxM9imv{Ju|o@xE!xhOe4qXW5qacJl) zP2ex;w3#M|SdK|bDU|*cI!}}MDppuo2L-;#27JYm;^Ywsm<(I9+9k9)LH>g=o856P z47;F#RtuiuAdDcT-cNkroZQO8iNA$}^lGR~9mytl*C*iAtpthNN_3;!4)WjN?$DSa zCt74Guyj8t}oEmbk=v)-`IhSnH-ru9OPqRGggb9b&HlibVWNO{CeKfgpc9N-|oyjyw_*b(!Z}-s)#|Rz$d) z+k{BWR(IH&TFJjwz1V?RK6CdvOc|Sk%;W3b1htwIlPx;ui^90`gt2nGzUD35gL?uu z3ntvux&AFO9OILp`8R7B+`^xrmqk0-cl5{u?DJr&@l)%2MyUCQxT(Oc99g3SFW=E$ z>)6Bynb|MJcb*3~WSdp=*mrv>w?V~dFiL7_>g~}?l+&{_RbAaMF@M-HA`KM)A4CwJ z(Pm%Ix~K+Q`LSGik^)gIS?h-*?`22!%G-`tLDdW%`ztFeCS->1i6UDH(?S)PpHYiN zfDX5>ZAZC8!-XPovjFdy6}v(Lu|v1^1V**H`dk5@>}j5NiG5YjLCDVTwnpHo_NS+}>N?5f&GfXU7K%Drp2M;} zFu|=`VyVvDe5G-1xz?z)AyNI236p5>GqN|gzHR9Ud^~Y5-04o|^Ct>qTf7EEibebR z)mad1ca7^3?#CF@heWoe50ge&AmTYbL&}yo;ximA>6c^XnSL<-d+a{UJ>yD zrO=}5xaE?)!`*`t0+apM8wc1;!3Kd;Dr~{$dWqzf+kuwq8}zhkiroyfYE*s+26&9j z%mfy$f>_c+zKwe`D+h)XVJ%IIZ^RoEn|KXpHX&NOc13 z4tkzmj&V+kj&ckEy5%cT_IAm_KO6c6Y?e>uX|v~- zW!F9YJdN_B2`6GO>fUcB^P`DyiSOJKH{!bq^5?<5**NtVSRF%K1D_w>>FQ%B8hq7d zFhWynr2ECsvxBm#uG80ACszp)G8RI{C_X9fp6WqiA zmVd3jEje`z`6KGP686r{*VDW_xlOQbX^Ezx#ZKq+*TKFXuS_<9tIR@l0ICmQTHNsA z>t;-mL2lZeXfm>s3;0h!>0N>OKUM8XuS+MTUV)w9tGeVep`LxoTa${ru$3oA*-X zyp}OPw4rhN<4#~J$N4Uin(f8GpTL1csK0EqpyqX+*e8Kxb&$}-+p?S7?|M!qzf6_l z9PedW&oMzcy?Tt60FBj*rU)3)cEV?UBkzH-WiRs2JL&JQ;ApP|!{-iCkro6o zi)^z|Dt~?V_Wk?2XKpi~|f6wkaOU9VVD$i%FCQ~vEp z+LwmrA*8-J8V__~!MbssR{ruw%>7%y!ORSbFJd|GPyN_lfQx_?Dg? zy-?@4Fs!bohMa){mQ1}OeNKFOWFHV9hD%+uwAPZ7gL<$qcocf!;-?-+#E0SsX!uqP zi{D38RB%Mp1c@imm5kcOdR!eEUSD6+;*r>%vKfRT?g>=IW;(hk3CjXS-1)_SOMN$ATz(ph z?qHj0lzfp4v^~(&QOHCm4tUjBvnGXcBmFVvN(2B-RrSjMFj*9Ia<<11+|*8%MWhvm zl?Y_TB2ywQhDY@TA22|5YC$rKxhnJ7%8!TuVz82G7GP z_Wm*>(Z%|m+4FYYFB!zSo}Zo*aBKL?)Ml3%5yYHYrd4h)>)Y%z>4FxwhBH)gE|TjV zifmL-$JQ!yJ124wM}+pfj&#U<;aJU(LX~>zFNWNa2pkIBW|>Qy`tM_}$>7Lzb$*QX zGo~>$HO0>ERWQ#{2sMIDBbdeYhn=_UA9!R_>70$`E7R2IPvcI7Y)|Clc^oYcCqJ#c zTSMKVYX2IqN+?SR#%^qF32O#lG&_FuNEf@ln1S42Wfc_k72e2DB3z8MDiRS9QKmBD zR&RN$kUP~}Tm|M6y0EX;9!$fy)QV800X&T=+8GaM0#1sqEi>PC(Qm@yitI860{mHz z;{=v!ZgdUoqlG%>)h^ESBk`CeV!eCPa{UETk{|nMMw+15xiSp4`1MG$!1E4h)i#MZVX3+4hCpV=7Yo$1GE3uWWL(Ts>!V=#C@Xtdyn+J!;bG`JF*A4 z-LEW~zrTWJAQi@+Z2ZN8t@sHtUJT!gWo=(Lq%N|urcMw2>+vQ$_{Q0g ztK9dr0MPEq(#}M_a8qz`HL#>0iWBG-R7cXdPF2^O=tGWCo=AE!yvyfQKAe1lNPXT| z#|9is%%C(}m1v<#vHB+~6_BtSb(OKD3mF;<8Z>zkaB_0uo^9tYWxjh77!*V&E>1&6 zMz%ec9g?M=Jr-J2#G-31>Zdbza%329@JkU|2iEa7H8)GM(3%sJuh$2>8dzQk^#5G8 zE2fqJ2g_v`uLoX7jKkqbr3sB%9v*!7uVzC^Z%R~-*R-5_Pk7*uNu`Fx8zG9J4ReX_ zUEf(hb}PR2zr~4IJ9W94IQpM~Y`D5xnb+hi|E1))(LDMA;`UsjH;RgYoE!_71)IF9 zx1Xl_9tuW$e6v)Xr%-~69b^JC;DD5@oLN{{tgd!PkcwKcFr?TRGT%pwExt*@1C0Dk ziqv7iHNV16DfjiwO(p_3sQ0;G`S9U`ftXe`By7%3#@o9=aU)~Xrk>J9S^`LTfQ$V} z$gF*UfBEv|#KjN211ous^qoX9h=Gyc>3)oZi`$bbKVaiR`Zb$sQ`PkzdwfP4f_L6x zS$ZywBWGpxN<{d5ByXwA?%l4$w1Cs*mqCiLLe_8JzFoT;?O(JyNsF_x626olL8+{i zxTreo=b-f?uHd&0v%BZBpMTY2oP0e0r%jXE@VA@f`}bk;z1rnQnj1y}k)R9%uyr)7 zYoQ5O7Oa=Py*#Q*#hjp;=Rt{&D4aFA4JMSIo}7k*2-zngg7&kmk+a_E!2Z3<7ZJ%b zpZ4FLV1!ms7D-DCjpO0{%~3$m-VKdwIfSkCh%*QZZsIl8{pQIUC-7OS)`ERIgKDfB zEnnp;SK2}D5jZ{Z783X$9RF}QgRxHrsQVzbrjD+^k7#lUX%i~O)1ZhlYZG7gS9sk7 z)d51$gTb8?F_J}XpFNi8gwX0<8&gMrvX@Dw;o;#<+oN=K(|SL){fkJ(=DY1n9f^idr2)hNGtT%sluM6XLddfp28TTW+0fhn)Zk99r1W~BY zx$oabgW*iPyi=o%o{k|CD=2n^pPC0Q*8AfeKu+Z}5$k&R!|lt#wXH3tJt0JTi^yve zG}90;g;u$_X~TtGlAh@AcZ;>FO2d1GVHlHqYwdKz-30Qk7AwNch#0@X2`*G-++u*m z&VE8;3QX;6a6sNjJ2~O+%y9cZH z6Q!{xRH?y1K_|Fx;UaH~;`&nOO60RTagq@357?bP*Zo{wEgqZh9z9S!bzSdwr`9S@ zU#;9~b=6g$azWqz5=R_cW@p-vXbNCy>-^a@Jf2idRXQ*wGv0keDj(mLm zRY+g)zQKms_xlgJC1jFe@K)|&!otGBU=z_h(!!ZnCa+T@%N8rB1F&BV#TKU%IXaf_ z##DRF&MhoForA6uW;e#Pw7?LX$exs6EClH_jYD%W1E7|0K5DY|6M_rR0Cz2w*lH&0 zIBA7F_LsL-oiwcVlb^~iPzieo+=XnHmP=KCD#id`G`jEgXlPVKuO2#-mMhAw_0blD zRb*+x;729aqw{93K9QSW9$SS$f!>6L7XQZh?~M0)8F-4k2mSjiaO)2QOPU<{0=dXWMfJ)z=WrZU}tAQpo=9hug_*T zd3fXZB53aq$NX%ia}ASu7&x@&==YU&qXpu>_ux2dadqM{|hVP9B;bZQ#MPI-Wrsc4yc&Sb42nqP<4(| zX04x_%#@Re5LO~laJHa{ip2z))`A%N_{_ z_=NI5ZW>C@qv?{@uX+)!C5Sh&DTE%AmyIH(?%OgSESsJboXqcNJfdxP9wd(f#aq&k zGW5NouWR!F`@N5RlNxi6umkG+6R#F#C`TGm<9S%8?&{jFvS_}9n#F&2^C&oQqUVxb zM}Sin$1lcQhhC%jG(Auue~9|cy7o;B2(&n|bAlm$#jcEGg!xo?otSPmUoCc??@T0? z>i^S!NIJ)Si@O4-*{O-&yXDaeeWSFBYe!RHBwPY_+&MCA(@pO)7wZq2(2OkwVlF2y^U9Q#wSS` z{$#vQ#+DTU;sLhbRWLw5IG-dSKSInC?z4kZwglQ+j%7&?g%hzlEw>@volhtOP|qcQ z5=1A(dpS9k=4Xgbn3k57R^+zIB`!*HGyvN#;|Y*aQ!{zM(G>sC_QXfWUiz0a02)0GT#k$SXB#~cFrM>TkJol)NK8!3 zvJ2Up&5iy)tQJ~)4*zzm_>_H@{V`Fvltpx%Jzy}-xDWE!Edc@82o;GZt>^J9W3`dU z3HHQ_E;nM94!L~55UM5&0sri;pGBfqcnwY5Igci$NcEPM&+}2X^%;_x(&9%nZfU*L7){%_#S^}>H(y>2R ztvT^SJ=4`Y(0p2LDWT~@mJDiFXD13GH(QA=Cg**Nn3UZq88(Qnp{c2P#QhlQu$5&J z{rQ>j8{JaugS<}X%HCG*5VFedrd}-{`U}zfl>L>|=`)Sl?2P4aC4M>O!>uK++jggg}mkz4g4?Umy@r9fKADZeFxz}rAOo~X$ z9|ieJrwJrIc-R6}u6rns!7VC4Vj@qmodZ2$=Gnk9;`OA+q;|)=8~{F5TgH0iEtP>Z z11%!Noh?cjZt$2X??iZdU_pbHGPd1BRIPKO8twA%-pC^p5u)7xZVSetz^9@b zrWr}+po)vKnVIwG{I(bxkl%ya^!LVB#CsCF+)-fDQc4cKS*V?g&)3C;+2lDyxTEHX z?dr=K*7NMS6qGuS1QrxJ;_=ecPLq<>DpOdBVWXo6l^TToy*V56nB)4};QE9uY01fn z=vIU)0C~x|%+bp83hTAYaC2j8dE9*scFIZtuD61aI##P#OJpOXl*@AklVUB5Q#*7J z*j}ikQA!s>1NxAb+4}gmZ|S@^O_}ID;ZIxGy_Q$MNuBGtqI-Lz33#*MTwOhVS8hb7 zL=ySm4k`KS9k#BLf~#&T;W%cPSi~+sj*J#^aQ; zJiP=Cy?i_E_}2ES*;JmdCEYQsF>#=v<%5EvxHaRvADR|?OlKn<2%hDH=UB}0 z(jNHxsRW!6OB;Bt0RU0zV>5wXtrc21@vv&Z*>}aX86*D$aD20NdZ+9y0#BInh!SbV zOuMS>iQVGQJj;qr+FNSf;0b$R~UC~|RS<=Xqy411vxMO-=U@lt@#Ux@m8pZjlforT4??@{xNJ)sNF z22bnJ&fNSeBIMBwfVUjd?SB1S*o)wsnMBIxg6~&~xB7Jso8PL|DrU-mBE^1q5grZQ z9s^NbPvOnAv0%YNK|f)y~5@=vvgwuX|nD&&*ZSAO-fy5FK1W ze`$kWk7ryGsTh6it#_X@--Vp^a*9GtggpSjr`#Z{Q#~&Ov2E^_yihtFmU>p0)sOjy z+Ng?c>pSN?msYMIMm18We|t*x_by(Mg1;(kC7K+Udcp{MM_b_%0s2;&NJTfON{>QB zJGTo!%7C0b1+KlSH#>VNoXU?(ILVR zq}lh~rVp3&57i%^;3_A6M({<;`x1?z<(@b!S{#?5E&pTqhC2dnTlpiz@fK941jFW5KVqPV5noObVpa1pBbugzU31r!r-%L16(@_ezhf9B_CqHiq`vcZ$seDB0wgco6+puce+$N=f?p`*UV) zN!i^A61NeZhkgCEy+9|@@~n~IfboyiAK5)8*tvCG77dgu+Ze<81y1Og!2C)?s$q2( z*?)`-H6FFta*%%=8cO6|IXa47T{V3TX`$3p__7#tagn5FfB+Pa^pCC#Le+XY$OH(# z#c)u!iFvb=gROXSQ2kAW6@T($=m!#$Ol|1b&kbg85Vj<`xVzv=P8I=eC=dOW(m~k$ zaFWn-+mMI)lM%Txv#U;rdlFH3IXMnQ`=*SS0t{7Ed}pDKUFo&?t+B{&PU73kgEbr( zMD>{4V_#=KQSd1+3NL+$0P<_jyZ4>$wh5eEKOKXNT{r?~D;o!2*JPvX-AiGi1xWu7 zN)i2?Zwrx_%$8CnKoLq4?R{gItJjXvsAMz_3FO6=H3Y6GG zZd{l@fB9neG?D$sz#mx{Y)8KWX_n*ZG2V7~SP;pqrbjlC$ia3HA`cj#r6lN-<_jEV z?Ktb;(XL@(Da%q1`6J-@2B+C4=tSSL!J`zpp@D?0EcW6SO*>qpJl5`WVM!C+4Qd%0 z!gY%QB6nKa3Xv@!G^`$~3s5`E5Yf?PN_a$B5h~hSCDCDIJ*@Pp)Gy3w$Vp2Fb=PJr zKNArZy*cadmd+|ayK-dp#&M9>K?H3G^suP&ZZ$K&(UIM(SmzZ&S-^kubvSE1TNTQb zbeRAY(etYw+(%kVKwRm#gWQhK_mwVkVXM!j@d&Nhg^P@ac zh<-|9A|mZEgs|5)3`>+uie~&x())9gjAv)Gj?0mtO-&Kovz67|zd5CFg1>!x);uTy zPSPPVbS6QOA4w2IqBeNv9;kYHrHJ{EEXObt81r9`DaKn@@*P9qvE!4LoZ3tR@rChu zl#+`Uu@I<|R#A2+TqZl?U6}Ge7==DC{CC$W@b&+GJf{heQ-H5LS#%1`o$~yqlxpel z&wT&kWvWoQ9=lER1-SRD?vU$T3_)np^hLgDUEWr`GsAigft3AnUCmRk3J8C5#N%t^ zXcwR<3)M_WfR8AwV9ZF*pOJItXNic7rk~H=UbkhVCpU9%wD8c?*y#pOPZ~m8QHUq- z1F8LLefha_9L2GB7Dh}K$JFz=ZtEPG2;U;4g&aZ%2AF*d5M=NhbrHWH>Oi^`rc~-?1KkCfjfp5rVD`X|@&Dd5LZv6wYO3e|GE_Y3 z){oUmQuuyD`45MQ*6>Lt)2I4xY6s_d0cLOOCE&*Nt2};iVXC{n8oi8k7Y>3^74Rl5 z0YmmGY0W($bizq(ui@$UpUB9_*K0?YpkKtg*});?=qP;=Mp!=7)}{YBkX3@Y=JtVE zI@RX0_exNAl?DmV2%{3rq2PuwVCQ(#`@*WezGK^g`7apJ_wU`&S@%U?VIW)QspJ zk!A;}o~HgbO68&j@JFlj|DD;$09@>wt8ME7fW&NcG_C!RQS!YiJglS+_Eunm)AA2x zp6}IR6l9q(aY`nTo37(N@cvRUkz5BPFuXZ!==@e@7$w6jVyrZLq%k5YOSvOz! z#lyo+sW`32a$Rrf16*8b{O~saxw{SHBs5KwbG7}GT;xJ@SN;86i_>0TMt$d}e&^$h zli>1b{_&oDqJLZ1pY>n?bWjLJ44(yiqj-}AyqLkT;xO~=)OnEG(IQCYx;bQ$=6|WX zKhp*TULIJQhyi@hI>-nSN|xoIxNGKz|3fU0{VSRM+~GwA5!xX^h;1Rs}KG@wf!E7LA6LUkGZ+JGTaVh8>ugo;R1 zXFNk#1ghP5B(jrb2@(8hO@9Bp160y^uj<>n;cvG#&ZmB8hew+`9ML{&&>E)u{Ud=i zw=Twi6OA}|_g}uc?U;xKsk{pt2t09Nieny zUc|a!@4B}VkKw^xRix~O?>k$>HB*#3;FPGJ9+=4Yv~xwSylUt!ogYX?tcxH9dOTLg z%k7w-KPp~?Jkk$DiU#8X2F|5M0zP$q47M&yPj$8#B^13~Nj_Ik0^!jkLYD$rC-uue z8R^xN|Kd!S6 zD}!ZiMv~ISh8H)#Vvf}#YHPPjc25_ zmBMG@J^)p?UoR-5y9_R4U+*S?tPhU2f}kc3%aHjit_^x|_9ypG;Al)ycSDY)JENQ! zH&eGGT|*yh%X}eIS0GD?rH(OTkx*AElYFL!?%BvXF!~I>GSHfzI9G&1yLu%DG30dR zm|xS=(j~n|0TywXgE){+%X(nuCvnKxIF*TamBE`R0N0461St~pt5>5M>9-G}W7Uvl z{+)aUJrLgE6O1N98gr}&V-^{!rU~w~DsF{`)k{b*s5_N_?@_y8?SrQ&XN)CEWcXPo zC%p|CUOou)$xinI7luRC?s#_Qa@^aH6si$mgo~IHDbF2Uo@}}kHu(d-xP2?RYHZCp z&%{1yL?WIviIrLeFP@a~SLtx}nkXo(d<@64Q6Xg0%yP~MsqE)G-w= zSfRD|WP#+2GzNnm9c#orz zPP;2qLyRqn|BE_%tPf~=ny-vfPv`h3$3l?rB9SY7&YCx+{aI?H+rNdVoVax}8^7foIP2?;4{t7YMg?OWVbGdu_K$M}zU zeqz@juoS*z|EW_W0RC%oD+|{al}JSUCO;?t%-V7!t=s?VpXJFsf;oB?7OZ4G`=V+@ z8nBcph6v3jg#uNd(1DP;sDJa`Y}z+7=Kk7Y5fL8|hbs#ELkb8H6Cn?B6#GqgGizGu zib9Y6M!Qjd`aj3{VVgaSwEj+3bLx`}xPlT*y+rE_XGZyfayvPtZ2h{FhSRB`Xcb7S z%Z4{G9<{cli-SwGveA@+Sqrz|^-Skd*@IO=!NUq9`$ub3kh@WOgh>5-U}oUWsQQv7 zBH$5b6ceKc9?!QRha(OGsqW!Nh#CBL>tESh1mX8SnMbdkot+i@{6u=9X+S(K8Y#n1 zk7t&CMPb4@+O5p+xl0)kbtbqtiFT%tQzphC^-3Pz_ywd#To|)=htnq4 z*9%x&9sVmyjz(j+H*0QZU6t~Dg}lkX zVn2I^9h%6Hc*w(3KZhhVni(XPR z-=gI9?tT70Ka!!ZmBu+V?-&DPzD%I6e`S{RdT06^RqZqWmc=KG&sIM%Lh4+Iepj5P zFS?Sq!lhw+5i@!e(D-w=z^i?0XZx^r+bmd0ruRObH*6ZckH{ai94nfWwh{{uFJBm5 zm}(`0(sI!SzD_v`EOKR%Ludd^WdYgz{FApRZE24*i(oS~08a7f9!i|e zfRQy##{&W#1Fd72wPmHdBRWzqN^rh3It9y=wQ#g1`Ca|<9IE`->vX&dW3xS;9AfDV1rXWWH7 zlaC{(IpF#w3#T$G+qmdB<@TiubTQkhNG%E{JT$mKOf3pY#gpZ-=ve%TbXWLN>*Vu; z58&zh>+~q-|{}C!Ooj=VUnPC%C*; zxfp>ARQ6VLE8$d42V_~cwykh>KA#{Uhq8~?WfII<;G3w2W{c4t((*{SoOi>Z1=7DT z$5Mz+UZQ)va!_$kk0CEJXbs|W#g!HZG4c`HwT7&LkOH@htozSbYNEu9ONDq_>QITC zz=tH&SWHM!5pE3`S=c?ri$if%E~HsTj}L+fXK#&g_NzTolEiakkevS8@}n*G8hyO| zy5jOT);rdDX6P~*G~dW1>g~DJzKksO$*DU<3uOQD;6jO{PRN_R*O!$LAfyFFhzCc= zpdr*g7*Fu1-E^0PkXPlF=7EM{WqceYghX}kUdV}l`d)aqh6lKU^1&LYW@YFEF;&+B zaxxODYZ;e>RtWd~f`OK<=)?cqw+8CEADN+wdfG!CFq9W*ZbDhEeufb_%k50w zUV;>j;O!V*2a!QIbX_hL1>rWO{7!6v;~-)Je6#l{l$Z!0Gh*8-N|$12QN}CiP~IY3U3+;>R}Upd$mq1^Jq-N=SxhjF zqLj@4JmUXN$O|wZ&sC11*?hL1RY47W^r`>9ahwI|2Unbb>{;V8HwnnK&R_rnPgg&e IbxsLQ0Qcu|HUIzs delta 16905 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