diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index ee1379ac28..61ace40879 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -1,4 +1,4 @@ -//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively, +//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively, //but it does not permit gas to flow back from the environment into the injector. Can be turned off to prevent any gas flow. //When it receives the "inject" signal, it will try to pump it's entire contents into the environment regardless of pressure, using power. @@ -13,7 +13,7 @@ use_power = 0 idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 15000 //15000 W ~ 20 HP - + var/injecting = 0 var/volume_rate = 50 //flow rate limit @@ -26,7 +26,7 @@ /obj/machinery/atmospherics/unary/outlet_injector/New() ..() - air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more. + air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more. /obj/machinery/atmospherics/unary/outlet_injector/Destroy() unregister_radio(src, frequency) @@ -60,21 +60,21 @@ if((stat & (NOPOWER|BROKEN)) || !use_power) return - + var/power_draw = -1 var/datum/gas_mixture/environment = loc.return_air() - + if(environment && air_contents.temperature > 0) var/transfer_moles = (volume_rate/air_contents.volume)*air_contents.total_moles //apply flow rate limit power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating) - + if (power_draw >= 0) last_power_draw = power_draw use_power(power_draw) - + if(network) network.update = 1 - + return 1 /obj/machinery/atmospherics/unary/outlet_injector/proc/inject() @@ -84,7 +84,7 @@ var/datum/gas_mixture/environment = loc.return_air() if (!environment) return 0 - + injecting = 1 if(air_contents.temperature > 0) @@ -155,4 +155,23 @@ update_icon() /obj/machinery/atmospherics/unary/outlet_injector/hide(var/i) - update_underlays() \ No newline at end of file + update_underlays() + +/obj/machinery/atmospherics/unary/outlet_injector/attack_hand(mob/user as mob) + to_chat(user, "You toggle \the [src].") + injecting = !injecting + use_power = injecting + update_icon() + +/obj/machinery/atmospherics/unary/outlet_injector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!W.is_wrench()) + return ..() + + playsound(src, W.usesound, 50, 1) + to_chat(user, "You begin to unfasten \the [src]...") + if (do_after(user, 40 * W.toolspeed)) + user.visible_message( \ + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") + deconstruct() \ No newline at end of file diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm index b77d442e82..bf5b8ba53b 100644 --- a/code/datums/supplypacks/misc.dm +++ b/code/datums/supplypacks/misc.dm @@ -143,4 +143,30 @@ ) cost = 25 containertype = /obj/structure/closet/crate - containername = "Glucose Hypo Crate" \ No newline at end of file + containername = "Glucose Hypo Crate" + +/datum/supply_pack/misc/mre_rations + num_contained = 6 + name = "Emergency - MREs" + contains = list(/obj/item/weapon/storage/mre, + /obj/item/weapon/storage/mre/menu2, + /obj/item/weapon/storage/mre/menu3, + /obj/item/weapon/storage/mre/menu4, + /obj/item/weapon/storage/mre/menu5, + /obj/item/weapon/storage/mre/menu6, + /obj/item/weapon/storage/mre/menu7, + /obj/item/weapon/storage/mre/menu8, + /obj/item/weapon/storage/mre/menu9, + /obj/item/weapon/storage/mre/menu10) + cost = 50 + containertype = /obj/structure/closet/crate/freezer + containername = "ready to eat rations" + +/datum/supply_pack/misc/paste_rations + name = "Emergency - Paste" + contains = list( + /obj/item/weapon/storage/mre/menu11 = 2 + ) + cost = 25 + containertype = /obj/structure/closet/crate/freezer + containername = "emergency rations" diff --git a/code/datums/supplypacks/misc_vr.dm b/code/datums/supplypacks/misc_vr.dm index 613a01cfd4..9e4ee3879d 100644 --- a/code/datums/supplypacks/misc_vr.dm +++ b/code/datums/supplypacks/misc_vr.dm @@ -13,24 +13,6 @@ containername = "Belt-miner gear crate" access = access_mining -/datum/supply_pack/misc/rations - name = "Emergency rations" - contains = list( - /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4, - ) - cost = 20 - containertype = /obj/structure/closet/crate/freezer - containername = "emergency rations" - -/datum/supply_pack/misc/proteinrations - name = "Emergency meat rations" - contains = list( - /obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 4, - ) - cost = 30 - containertype = /obj/structure/closet/crate/freezer - containername = "emergency meat rations" - /datum/supply_pack/misc/eva_rig name = "eva hardsuit (empty)" contains = list( diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 3d9c4ea140..dd3ddb29ca 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -76,6 +76,10 @@ name = "\improper \"LiquidFood\" ration" icon_state = "liquidfood" +/obj/item/trash/liquidprotein + name = "\improper \"LiquidProtein\" ration" + icon_state = "liquidprotein" + /obj/item/trash/tastybread name = "bread tube" icon_state = "tastybread" diff --git a/code/game/objects/items/trash_vr.dm b/code/game/objects/items/trash_vr.dm index 43cadda3f7..20f7e32c4c 100644 --- a/code/game/objects/items/trash_vr.dm +++ b/code/game/objects/items/trash_vr.dm @@ -26,11 +26,6 @@ return ..() -/obj/item/trash/liquidprotein - name = "\improper \"LiquidProtein\" ration" - icon = 'icons/obj/trash_vr.dmi' - icon_state = "liquidprotein" - /obj/item/trash/fancyplate name = "dirty fancy plate" icon = 'icons/obj/trash_vr.dmi' diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 7d754d8f14..1d1934bf8a 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -67,6 +67,7 @@ item_state = "candlebox5" throwforce = 2 slot_flags = SLOT_BELT + max_storage_space = ITEMSIZE_COST_SMALL * 5 starts_with = list(/obj/item/weapon/flame/candle = 5) /obj/item/weapon/storage/fancy/whitecandle_box @@ -78,6 +79,7 @@ item_state = "whitecandlebox5" throwforce = 2 slot_flags = SLOT_BELT + max_storage_space = ITEMSIZE_COST_SMALL * 5 starts_with = list(/obj/item/weapon/flame/candle/white = 5) /obj/item/weapon/storage/fancy/blackcandle_box @@ -89,6 +91,7 @@ item_state = "blackcandlebox5" throwforce = 2 slot_flags = SLOT_BELT + max_storage_space = ITEMSIZE_COST_SMALL * 5 starts_with = list(/obj/item/weapon/flame/candle/black = 5) @@ -179,6 +182,21 @@ return ..() +/* + * Cracker Packet + */ + +/obj/item/weapon/storage/fancy/crackers + name = "\improper Getmore Crackers" + icon = 'icons/obj/food.dmi' + icon_state = "crackerbox" + icon_type = "cracker" + max_storage_space = ITEMSIZE_COST_TINY * 6 + max_w_class = ITEMSIZE_TINY + w_class = ITEMSIZE_SMALL + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/cracker) + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cracker = 6) + //////////// //CIG PACK// //////////// diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm new file mode 100644 index 0000000000..c3adc484e0 --- /dev/null +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -0,0 +1,276 @@ +/* +MRE Stuff + */ + +/obj/item/weapon/storage/mre + name = "standard MRE" + desc = "A vacuum-sealed bag containing a day's worth of nutrients for an adult in strenuous situations. There is no visible expiration date on the package." + icon = 'icons/obj/food.dmi' + icon_state = "mre" + max_storage_space = ITEMSIZE_COST_SMALL * 6 + max_w_class = ITEMSIZE_SMALL + var/opened = FALSE + var/meal_desc = "This one is menu 1, meat pizza." + starts_with = list( + /obj/item/weapon/storage/mrebag, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/examine(mob/user) + . = ..() + to_chat(user, meal_desc) + +/obj/item/weapon/storage/mre/update_icon() + if(opened) + icon_state = "[initial(icon_state)][opened]" + . = ..() + +/obj/item/weapon/storage/mre/attack_self(mob/user) + open(user) + +/obj/item/weapon/storage/mre/open(mob/user) + if(!opened) + to_chat(usr, "You tear open the bag, breaking the vacuum seal.") + opened = 1 + update_icon() + . = ..() + +/obj/item/weapon/storage/mre/menu2 + meal_desc = "This one is menu 2, margherita." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu2, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu3 + meal_desc = "This one is menu 3, vegetable pizza." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu3, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu4 + meal_desc = "This one is menu 4, hamburger." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu4, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu5 + meal_desc = "This one is menu 5, taco." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu5, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu6 + meal_desc = "This one is menu 6, meatbread." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu6, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu7 + meal_desc = "This one is menu 7, salad." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu7, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu8 + meal_desc = " This one is menu 8, hot chili." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu8, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu9 + name = "vegan MRE" + meal_desc = "This one is menu 9, boiled rice (skrell-safe)." + icon_state = "vegmre" + starts_with = list( + /obj/item/weapon/storage/mrebag/menu9, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert/menu9, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread/vegan, + /obj/random/mre/drink, + /obj/random/mre/sauce/vegan, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu10 + name = "protein MRE" + meal_desc = "This one is menu 10, protein." + icon_state = "meatmre" + starts_with = list( + /obj/item/weapon/storage/mrebag/menu10, + /obj/item/weapon/storage/mrebag/menu10, + /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/protein, + /obj/random/mre/sauce/sugarfree, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu11 + name = "emergency MRE" + meal_desc = "This one is menu 11, nutriment paste. Only for emergencies." + icon_state = "crayonmre" + starts_with = list( + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidprotein, + /obj/item/weapon/reagent_containers/food/snacks/liquidprotein, + ) + +/obj/item/weapon/storage/mre/menu12 + name = "crayon MRE" + meal_desc = "This one doesn't have a menu listing. How very odd." + icon_state = "crayonmre" + starts_with = list( + /obj/item/weapon/storage/fancy/crayons, + /obj/item/weapon/storage/mrebag/dessert/menu11, + /obj/random/mre/sauce/crayon, + /obj/random/mre/sauce/crayon, + /obj/random/mre/sauce/crayon + ) + +/obj/item/weapon/storage/mre/random + meal_desc = "The menu label is faded out." + starts_with = list( + /obj/random/mre/main, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mrebag + name = "main course" + desc = "A vacuum-sealed bag containing the MRE's main course. Self-heats when opened." + icon = 'icons/obj/food.dmi' + icon_state = "pouch_medium" + storage_slots = 1 + w_class = ITEMSIZE_SMALL + max_w_class = ITEMSIZE_SMALL + var/opened = FALSE + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/meatpizza/filled) + +/obj/item/weapon/storage/mrebag/Initialize() + . = ..() + +/obj/item/weapon/storage/mrebag/update_icon() + if(opened) + icon_state = "[initial(icon_state)][opened]" + . = ..() + +/obj/item/weapon/storage/mrebag/attack_self(mob/user) + open(user) + +/obj/item/weapon/storage/mrebag/open(mob/user) + if(!opened) + to_chat(usr, "The pouch heats up as you break the vaccum seal.") + opened = 1 + update_icon() + . = ..() + +/obj/item/weapon/storage/mrebag/menu2 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/margherita/filled) + +/obj/item/weapon/storage/mrebag/menu3 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/vegetablepizza/filled) + +/obj/item/weapon/storage/mrebag/menu4 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/monkeyburger) + +/obj/item/weapon/storage/mrebag/menu5 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/taco) + +/obj/item/weapon/storage/mrebag/menu6 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/meatbread/filled) + +/obj/item/weapon/storage/mrebag/menu7 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad) + +/obj/item/weapon/storage/mrebag/menu8 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/hotchili) + +/obj/item/weapon/storage/mrebag/menu9 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/boiledrice) + +/obj/item/weapon/storage/mrebag/menu10 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/meatcube) + +/obj/item/weapon/storage/mrebag/side + name = "side dish" + desc = "A vacuum-sealed bag containing the MRE's side dish. Self-heats when opened." + icon_state = "pouch_small" + starts_with = list(/obj/random/mre/side) + +/obj/item/weapon/storage/mrebag/side/menu10 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/meatcube) + +/obj/item/weapon/storage/mrebag/dessert + name = "dessert" + desc = "A vacuum-sealed bag containing the MRE's dessert." + icon_state = "pouch_small" + starts_with = list(/obj/random/mre/dessert) + +/obj/item/weapon/storage/mrebag/dessert/menu9 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit) + +/obj/item/weapon/storage/mrebag/dessert/menu11 + starts_with = list(/obj/item/weapon/pen/crayon/rainbow) diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 790e5471d6..1e1fed268b 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -540,3 +540,149 @@ var/possible_object_paths = list(/obj/item/weapon/paper/carbon/cursedform) possible_object_paths |= subtypesof(/obj/item/clothing/head/psy_crown) return pick(possible_object_paths) + +//Random MRE stuff + +/obj/random/mre + name = "random MRE" + desc = "This is a random single MRE." + icon = 'icons/obj/food.dmi' + icon_state = "mre" + +/obj/random/mre/item_to_spawn() + return pick(/obj/item/weapon/storage/mre, + /obj/item/weapon/storage/mre/menu2, + /obj/item/weapon/storage/mre/menu3, + /obj/item/weapon/storage/mre/menu4, + /obj/item/weapon/storage/mre/menu5, + /obj/item/weapon/storage/mre/menu6, + /obj/item/weapon/storage/mre/menu7, + /obj/item/weapon/storage/mre/menu8, + /obj/item/weapon/storage/mre/menu9, + /obj/item/weapon/storage/mre/menu10) + + +/obj/random/mre/main + name = "random MRE main course" + desc = "This is a random main course for MREs." + icon_state = "pouch" + drop_get_turf = FALSE + +/obj/random/mre/main/item_to_spawn() + return pick(/obj/item/weapon/storage/mrebag, + /obj/item/weapon/storage/mrebag/menu2, + /obj/item/weapon/storage/mrebag/menu3, + /obj/item/weapon/storage/mrebag/menu4, + /obj/item/weapon/storage/mrebag/menu5, + /obj/item/weapon/storage/mrebag/menu6, + /obj/item/weapon/storage/mrebag/menu7, + /obj/item/weapon/storage/mrebag/menu8) + +/obj/random/mre/side + name = "random MRE side dish" + desc = "This is a random side dish for MREs." + icon_state = "pouch" + drop_get_turf = FALSE + +/obj/random/mre/main/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad, + /obj/item/weapon/reagent_containers/food/snacks/boiledrice, + /obj/item/weapon/reagent_containers/food/snacks/poppypretzel, + /obj/item/weapon/reagent_containers/food/snacks/twobread, + /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast) + +/obj/random/mre/dessert + name = "random MRE dessert" + desc = "This is a random dessert for MREs." + icon_state = "pouch" + drop_get_turf = FALSE + +/obj/random/mre/dessert/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/snacks/candy, + /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar, + /obj/item/weapon/reagent_containers/food/snacks/donut/normal, + /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly, + /obj/item/weapon/reagent_containers/food/snacks/chocolatebar, + /obj/item/weapon/reagent_containers/food/snacks/cookie) + +/obj/random/mre/dessert/vegan + name = "random vegan MRE dessert" + desc = "This is a random vegan dessert for MREs." + +/obj/random/mre/dessert/vegan/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/snacks/candy, + /obj/item/weapon/reagent_containers/food/snacks/chocolatebar, + /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly, + /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit) + +/obj/random/mre/drink + name = "random MRE drink" + desc = "This is a random drink for MREs." + icon_state = "packet" + drop_get_turf = FALSE + +/obj/random/mre/drink/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/tea, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/grape, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/orange, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/apple) + +/obj/random/mre/spread + name = "random MRE spread" + desc = "This is a random spread packet for MREs." + icon_state = "packet" + drop_get_turf = FALSE + +/obj/random/mre/spread/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/honey) + +/obj/random/mre/spread/vegan + name = "random vegan MRE spread" + desc = "This is a random vegan spread packet for MREs" + +/obj/random/mre/spread/vegan/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly) + +/obj/random/mre/sauce + name = "random MRE sauce" + desc = "This is a random sauce packet for MREs." + icon_state = "packet" + drop_get_turf = FALSE + +/obj/random/mre/sauce/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy) + +/obj/random/mre/sauce/vegan/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy) + +/obj/random/mre/sauce/sugarfree/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy) + +/obj/random/mre/sauce/crayon/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/generic, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/red, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/orange, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/yellow, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/green, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/blue, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index da686ad455..43f50a8387 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -97,6 +97,7 @@ /obj/item/clothing/glasses/meson, /obj/item/weapon/cartridge/engineering, /obj/item/taperoll/engineering, + /obj/item/clothing/head/hardhat, /obj/item/clothing/suit/storage/hooded/wintercoat/engineering, /obj/item/clothing/shoes/boots/winter/engineering, /obj/item/weapon/tank/emergency/oxygen/engi, @@ -125,6 +126,7 @@ starts_with = list( /obj/item/clothing/accessory/storage/brown_vest, /obj/item/clothing/suit/fire/firefighter, + /obj/item/clothing/head/hardhat/red, /obj/item/device/flashlight, /obj/item/weapon/extinguisher, ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index aafa6f85f3..6517dda8f8 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -346,7 +346,7 @@ desc = "A crate of emergency rations." starts_with = list( - /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4) + /obj/random/mre = 6) /obj/structure/closet/crate/bin diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 3475e60314..72e2b3b39b 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -368,7 +368,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return var/location = alert(src,"Please specify where to spawn them.", "Location", "Right Here", "Arrivals", "Cancel") - if(!location) + if(location == "Cancel" || !location) return var/announce = alert(src,"Announce as if they had just arrived?", "Announce", "Yes", "No", "Cancel") diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b5aa5d7594..3f7a659808 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -293,6 +293,17 @@ punch_force = initial(punch_force) wearer = null +/obj/item/clothing/gloves + var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? + var/special_attack_type = null + +/obj/item/clothing/gloves/New() + ..() + if(special_attack_type && ispath(special_attack_type)) + special_attack = new special_attack_type + + + ///////////////////////////////////////////////////////////////////// //Rings diff --git a/code/modules/clothing/gloves/gauntlets.dm b/code/modules/clothing/gloves/gauntlets.dm index b65884d3f9..8807fb93ad 100644 --- a/code/modules/clothing/gloves/gauntlets.dm +++ b/code/modules/clothing/gloves/gauntlets.dm @@ -18,6 +18,10 @@ var/mob/living/carbon/human/H = user if(H.gloves) gloves = H.gloves + if(!istype(gloves)) + to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") + gloves = null + return 0 if(gloves.overgloves) to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") gloves = null diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm index a6625ccf30..9d6ba9ec83 100644 --- a/code/modules/food/food/condiment.dm +++ b/code/modules/food/food/condiment.dm @@ -182,6 +182,198 @@ . = ..() reagents.add_reagent("sugar", 20) +//MRE condiments and drinks. + +/obj/item/weapon/reagent_containers/food/condiment/small/packet + icon_state = "packet_small" + w_class = ITEMSIZE_TINY + possible_transfer_amounts = "1;5;10" + amount_per_transfer_from_this = 1 + volume = 5 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt + name = "salt packet" + desc = "Contains 5u of table salt." + icon_state = "packet_small_white" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("sodiumchloride", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper + name = "pepper packet" + desc = "Contains 5u of black pepper." + icon_state = "packet_small_black" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("blackpepper", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar + name = "sugar packet" + desc = "Contains 5u of refined sugar." + icon_state = "packet_small_white" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("sugar", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly + name = "jelly packet" + desc = "Contains 10u of cherry jelly. Best used for spreading on crackers." + icon_state = "packet_medium" + volume = 10 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("cherryjelly", 10) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/honey + name = "honey packet" + desc = "Contains 10u of honey." + icon_state = "packet_medium" + volume = 10 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("honey", 10) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin + name = "hot sauce packet" + desc = "Contains 5u of hot sauce. Enjoy in moderation." + icon_state = "packet_small_red" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("capsaicin", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup + name = "ketchup packet" + desc = "Contains 5u of ketchup." + icon_state = "packet_small_red" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("ketchup", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo + name = "mayonnaise packet" + desc = "Contains 5u of mayonnaise." + icon_state = "packet_small_white" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("mayo", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy + name = "soy sauce packet" + desc = "Contains 5u of soy sauce." + icon_state = "packet_small_black" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("soysauce", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee + name = "coffee powder packet" + desc = "Contains 5u of coffee powder. Mix with 25u of water and heat." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("coffeepowder", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/tea + name = "tea powder packet" + desc = "Contains 5u of black tea powder. Mix with 25u of water and heat." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("tea", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa + name = "cocoa powder packet" + desc = "Contains 5u of cocoa powder. Mix with 25u of water and heat." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("coco", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/grape + name = "grape juice powder packet" + desc = "Contains 5u of powdered grape juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("instantgrape", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/orange + name = "orange juice powder packet" + desc = "Contains 5u of powdered orange juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("instantorange", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon + name = "watermelon juice powder packet" + desc = "Contains 5u of powdered watermelon juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("instantwatermelon", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/apple + name = "apple juice powder packet" + desc = "Contains 5u of powdered apple juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("instantapple", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/protein + name = "protein powder packet" + desc = "Contains 10u of powdered protein. Mix with 20u of water." + icon_state = "packet_medium" + volume = 10 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/protein/Initialize() + . = ..() + reagents.add_reagent("protein", 10) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon + name = "crayon powder packet" + desc = "Contains 10u of powdered crayon. Mix with 30u of water." + volume = 10 +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/generic/Initialize() + . = ..() + reagents.add_reagent("crayon_dust", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/red/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_red", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/orange/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_orange", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/yellow/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_yellow", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/green/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_green", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/blue/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_blue", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_purple", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_grey", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_brown", 10) + +//End of MRE stuff. + /obj/item/weapon/reagent_containers/food/condiment/flour name = "flour sack" desc = "A big bag of flour. Good for baking!" diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 4e6e2bfac8..848ecc2742 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -21,12 +21,7 @@ /obj/item/weapon/reagent_containers/food/snacks/Initialize() . = ..() if(nutriment_amt) - reagents.add_reagent("nutriment",nutriment_amt,nutriment_desc) - -/obj/item/weapon/reagent_containers/food/snacks/Initialize() - . = ..() - if(nutriment_amt) - reagents.add_reagent("nutriment", nutriment_amt) + reagents.add_reagent("nutriment",(nutriment_amt*2),nutriment_desc) //Placeholder for effect that trigger on eating that aren't tied to reagents. /obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M) @@ -3088,6 +3083,7 @@ filling_color = "#F5DEB8" center_of_mass = list("x"=16, "y"=6) nutriment_desc = list("salt" = 1, "cracker" = 2) + w_class = ITEMSIZE_TINY nutriment_amt = 1 @@ -3738,6 +3734,33 @@ reagents.add_reagent("iron", 3) bitesize = 4 +/obj/item/weapon/reagent_containers/food/snacks/liquidprotein + name = "\improper LiquidProtein Ration" + desc = "A variant of the liquidfood ration, designed for obligate carnivore species. Only barely more appealing than regular liquidfood. Should this be crunchy?" + icon_state = "liquidprotein" + trash = /obj/item/trash/liquidprotein + filling_color = "#A8A8A8" + survivalfood = TRUE + center_of_mass = list("x"=16, "y"=15) + +/obj/item/weapon/reagent_containers/food/snacks/liquidprotein/Initialize() + ..() + reagents.add_reagent("protein", 30) + reagents.add_reagent("iron", 3) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/meatcube + name = "cubed meat" + desc = "Fried, salted lean meat compressed into a cube. Not very appetizing." + icon_state = "meatcube" + filling_color = "#7a3d11" + center_of_mass = "x=16;y=16" + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/meatcube/Initialize() + . = ..() + reagents.add_reagent(/datum/reagent/nutriment/protein, 15) + /obj/item/weapon/reagent_containers/food/snacks/tastybread name = "bread tube" desc = "Bread in a tube. Chewy...and surprisingly tasty." diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 22b4b2e6c6..c1c7ebedaf 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -126,6 +126,38 @@ slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', ) item_state = "boxing" + special_attack_type = /datum/unarmed_attack/holopugilism + +datum/unarmed_attack/holopugilism + sparring_variant_type = /datum/unarmed_attack/holopugilism + +datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone) + user.do_attack_animation(src) + var/damage = rand(0, 9) + if(!damage) + playsound(target.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + target.visible_message("[user] has attempted to punch [target]!") + return TRUE + var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting)) + var/armor_block = target.run_armor_check(affecting, "melee") + var/armor_soak = target.get_armor_soak(affecting, "melee") + + if(HULK in user.mutations) + damage += 5 + + playsound(target.loc, "punch", 25, 1, -1) + + target.visible_message("[user] has punched [target]!") + + if(armor_soak >= damage) + return TRUE + + target.apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak) + if(damage >= 9) + target.visible_message("[user] has weakened [target]!") + target.apply_effect(4, WEAKEN, armor_block) + + return TRUE /obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob) if(!istype(W)) @@ -262,8 +294,8 @@ spark_system.set_up(5, 0, user.loc) spark_system.start() playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) - return 1 - return 0 + return TRUE + return FALSE /obj/item/weapon/holo/esword/New() item_color = pick("red","blue","green","purple") diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index b616d456b6..c362054cfa 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -438,7 +438,7 @@ var/list/name_to_material // Very rare alloy that is reflective, should be used sparingly. /material/durasteel name = "durasteel" - stack_type = /obj/item/stack/material/durasteel + stack_type = /obj/item/stack/material/durasteel/hull integrity = 600 melting_point = 7000 icon_base = "metal" @@ -460,6 +460,9 @@ var/list/name_to_material explosion_resistance = 90 reflectivity = 0.9 +/material/durasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal durasteel sheets. + new /obj/item/stack/material/durasteel(target) + /material/plasteel/titanium name = MAT_TITANIUM stack_type = /obj/item/stack/material/titanium @@ -475,6 +478,9 @@ var/list/name_to_material icon_base = "hull" icon_reinf = "reinf_mesh" +/material/plasteel/titanium/hull/place_sheet(var/turf/target) //Deconstructed into normal titanium sheets. + new /obj/item/stack/material/titanium(target) + /material/glass name = "glass" stack_type = /obj/item/stack/material/glass diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 982ad0d8ad..3da050bacb 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -591,9 +591,9 @@ turf/simulated/mineral/floor/light_corner if(is_clean) X = new /obj/item/weapon/archaeological_find(src, new_item_type = F.find_type) else - X = new /obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type) + X = new /obj/item/weapon/strangerock(src, inside_item_type = F.find_type) geologic_data.UpdateNearbyArtifactInfo(src) - var/obj/item/weapon/ore/strangerock/SR = X + var/obj/item/weapon/strangerock/SR = X SR.geologic_data = geologic_data //some find types delete the /obj/item/weapon/archaeological_find and replace it with something else, this handles when that happens diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index ad0ceb7f62..bee85326fc 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -8,6 +8,14 @@ return soft_type return src.default_attack // VOREStation Edit - End + if(src.gloves) + var/obj/item/clothing/gloves/G = src.gloves + if(istype(G) && G.special_attack && G.special_attack.is_usable(src, target, hit_zone)) + if(pulling_punches) + var/datum/unarmed_attack/soft_type = G.special_attack.get_sparring_variant() + if(soft_type) + return soft_type + return G.special_attack for(var/datum/unarmed_attack/u_attack in species.unarmed_attacks) if(u_attack.is_usable(src, target, hit_zone)) if(pulling_punches) @@ -41,39 +49,11 @@ H.do_attack_animation(src) playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[H] reaches for [src], but misses!") - return 0 + return FALSE if(H != src && check_shields(0, null, H, H.zone_sel.selecting, H.name)) H.do_attack_animation(src) - return 0 - - if(istype(H.gloves, /obj/item/clothing/gloves/boxing/hologlove)) - H.do_attack_animation(src) - var/damage = rand(0, 9) - if(!damage) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[H] has attempted to punch [src]!") - return 0 - var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting)) - var/armor_block = run_armor_check(affecting, "melee") - var/armor_soak = get_armor_soak(affecting, "melee") - - if(HULK in H.mutations) - damage += 5 - - playsound(loc, "punch", 25, 1, -1) - - visible_message("[H] has punched [src]!") - - if(armor_soak >= damage) - return - - apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak) - if(damage >= 9) - visible_message("[H] has weakened [src]!") - apply_effect(4, WEAKEN, armor_block) - - return + return FALSE if(istype(M,/mob/living/carbon)) var/mob/living/carbon/C = M @@ -122,7 +102,7 @@ else if(!(M == src && apply_pressure(M, M.zone_sel.selecting))) help_shake_act(M) - return 1 + return TRUE if(I_GRAB) if(M == src || anchored) @@ -149,7 +129,7 @@ //VORESTATION EDIT visible_message("[M] has grabbed [src] [(M.zone_sel.selecting == BP_L_HAND || M.zone_sel.selecting == BP_R_HAND)? "by [(gender==FEMALE)? "her" : ((gender==MALE)? "his": "their")] hands": "passively"]!") //VORESTATION END END - return 1 + return TRUE if(I_HURT) @@ -175,7 +155,7 @@ if(!affecting || affecting.is_stump()) M << "They are missing that limb!" - return 1 + return TRUE switch(src.a_intent) if(I_HELP) @@ -245,7 +225,10 @@ // See what attack they use var/datum/unarmed_attack/attack = H.get_unarmed_attack(src, hit_zone) if(!attack) - return 0 + return FALSE + + if(attack.unarmed_override(H, src, hit_zone)) + return FALSE H.do_attack_animation(src) if(!attack_message) @@ -258,7 +241,7 @@ add_attack_logs(H,src,"Melee attacked with fists (miss/block)") if(miss_type) - return 0 + return FALSE var/real_damage = rand_damage var/hit_dam_type = attack.damage_type @@ -268,7 +251,7 @@ var/obj/item/clothing/gloves/G = H.gloves real_damage += G.punch_force hit_dam_type = G.punch_damtype - if(H.pulling_punches) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN + if(H.pulling_punches && !attack.sharp && !attack.edge) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN, BUT YOU CAN'T "PULL" A KNIFE hit_dam_type = AGONY real_damage *= damage_multiplier rand_damage *= damage_multiplier @@ -359,7 +342,7 @@ var/armor_soak = get_armor_soak(affecting, armor_type, armor_pen) apply_damage(damage, BRUTE, affecting, armor_block, armor_soak, sharp = a_sharp, edge = a_edge) updatehealth() - return 1 + return TRUE //Used to attack a joint through grabbing /mob/living/carbon/human/proc/grab_joint(var/mob/living/user, var/def_zone) @@ -370,43 +353,43 @@ break if(!has_grab) - return 0 + return FALSE if(!def_zone) def_zone = user.zone_sel.selecting var/target_zone = check_zone(def_zone) if(!target_zone) - return 0 + return FALSE var/obj/item/organ/external/organ = get_organ(check_zone(target_zone)) if(!organ || organ.dislocated > 0 || organ.dislocated == -1) //don't use is_dislocated() here, that checks parent - return 0 + return FALSE user.visible_message("[user] begins to dislocate [src]'s [organ.joint]!") if(do_after(user, 100)) organ.dislocate(1) src.visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!") - return 1 - return 0 + return TRUE + return FALSE //Breaks all grips and pulls that the mob currently has. /mob/living/carbon/human/proc/break_all_grabs(mob/living/carbon/user) - var/success = 0 + var/success = FALSE if(pulling) visible_message("[user] has broken [src]'s grip on [pulling]!") - success = 1 + success = TRUE stop_pulling() if(istype(l_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/lgrab = l_hand if(lgrab.affecting) visible_message("[user] has broken [src]'s grip on [lgrab.affecting]!") - success = 1 + success = TRUE spawn(1) qdel(lgrab) if(istype(r_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/rgrab = r_hand if(rgrab.affecting) visible_message("[user] has broken [src]'s grip on [rgrab.affecting]!") - success = 1 + success = TRUE spawn(1) qdel(rgrab) return success @@ -421,11 +404,11 @@ /mob/living/carbon/human/proc/apply_pressure(mob/living/user, var/target_zone) var/obj/item/organ/external/organ = get_organ(target_zone) if(!organ || !(organ.status & ORGAN_BLEEDING) || (organ.robotic >= ORGAN_ROBOT)) - return 0 + return FALSE if(organ.applied_pressure) user << "Someone is already applying pressure to [user == src? "your [organ.name]" : "[src]'s [organ.name]"]." - return 0 + return FALSE var/datum/gender/TU = gender_datums[user.get_visible_gender()] @@ -446,4 +429,4 @@ else user.visible_message("\The [user] stops applying pressure to [src]'s [organ.name]!", "You stop applying pressure to [src]'s [organ.name]!") - return 1 + return TRUE diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index f3526983ef..43a5ae66f2 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -25,18 +25,18 @@ var/global/list/sparring_attack_cache = list() /datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if(user.restrained()) - return 0 + return FALSE // Check if they have a functioning hand. var/obj/item/organ/external/E = user.organs_by_name["l_hand"] if(E && !E.is_stump()) - return 1 + return TRUE E = user.organs_by_name["r_hand"] if(E && !E.is_stump()) - return 1 + return TRUE - return 0 + return FALSE /datum/unarmed_attack/proc/get_unarmed_damage() return damage @@ -105,6 +105,9 @@ var/global/list/sparring_attack_cache = list() return user.visible_message("[user] attempts to press [TU.his] [eye_attack_text] into [target]'s eyes, but [TT.he] [TT.does]n't have any!") +/datum/unarmed_attack/proc/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone) + return FALSE //return true if the unarmed override prevents further attacks + /datum/unarmed_attack/bite attack_verb = list("bit") attack_sound = 'sound/weapons/bite.ogg' @@ -121,7 +124,7 @@ var/global/list/sparring_attack_cache = list() return 0 if (user == target && (zone == BP_HEAD || zone == O_EYES || zone == O_MOUTH)) return 0 - return 1 + return TRUE /datum/unarmed_attack/punch attack_verb = list("punched") @@ -187,20 +190,20 @@ var/global/list/sparring_attack_cache = list() /datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if (user.legcuffed) - return 0 + return FALSE if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", BP_GROIN))) - return 0 + return FALSE var/obj/item/organ/external/E = user.organs_by_name["l_foot"] if(E && !E.is_stump()) - return 1 + return TRUE E = user.organs_by_name["r_foot"] if(E && !E.is_stump()) - return 1 + return TRUE - return 0 + return FALSE /datum/unarmed_attack/kick/get_unarmed_damage(var/mob/living/carbon/human/user) var/obj/item/clothing/shoes = user.shoes @@ -231,23 +234,23 @@ var/global/list/sparring_attack_cache = list() /datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if (user.legcuffed) - return 0 + return FALSE if(!istype(target)) - return 0 + return FALSE if (!user.lying && (target.lying || (zone in list("l_foot", "r_foot")))) if(target.grabbed_by == user && target.lying) - return 0 + return FALSE var/obj/item/organ/external/E = user.organs_by_name["l_foot"] if(E && !E.is_stump()) - return 1 + return TRUE E = user.organs_by_name["r_foot"] if(E && !E.is_stump()) - return 1 + return TRUE - return 0 + return FALSE /datum/unarmed_attack/stomp/get_unarmed_damage(var/mob/living/carbon/human/user) var/obj/item/clothing/shoes = user.shoes diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm index 4022198fdf..9fbb2926bb 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm @@ -411,7 +411,7 @@ /obj/random/bomb_supply = 7, /obj/random/contraband = 3, /obj/random/unidentified_medicine/old_medicine = 7, - /obj/item/weapon/ore/strangerock = 3, + /obj/item/weapon/strangerock = 3, /obj/item/weapon/ore/phoron = 7, /obj/random/handgun = 1, /obj/random/toolbox = 4, diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 0da87f2d0c..48afe19b7e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -148,6 +148,24 @@ if(!istype(T, /turf/space)) new /obj/effect/decal/cleanable/flour(T) +/datum/reagent/nutriment/coffee + name = "Coffee Powder" + id = "coffeepowder" + description = "A bitter powder made by grinding coffee beans." + taste_description = "bitterness" + taste_mult = 1.3 + nutriment_factor = 1 + color = "#482000" + +/datum/reagent/nutriment/tea + name = "Tea Powder" + id = "teapowder" + description = "A dark, tart powder made from black tea leaves." + taste_description = "tartness" + taste_mult = 1.3 + nutriment_factor = 1 + color = "#101000" + /datum/reagent/nutriment/coco name = "Coco Powder" id = "coco" @@ -158,6 +176,41 @@ nutriment_factor = 5 color = "#302000" +/datum/reagent/nutriment/instantjuice + name = "Juice Powder" + id = "instantjuice" + description = "Dehydrated, powdered juice of some kind." + taste_mult = 1.3 + nutriment_factor = 1 + +/datum/reagent/nutriment/instantjuice/grape + name = "Grape Juice Powder" + id = "instantgrape" + description = "Dehydrated, powdered grape juice." + taste_description = "dry grapes" + color = "#863333" + +/datum/reagent/nutriment/instantjuice/orange + name = "Orange Juice Powder" + id = "instantorange" + description = "Dehydrated, powdered orange juice." + taste_description = "dry oranges" + color = "#e78108" + +/datum/reagent/nutriment/instantjuice/watermelon + name = "Watermelon Juice Powder" + id = "instantwatermelon" + description = "Dehydrated, powdered watermelon juice." + taste_description = "dry sweet watermelon" + color = "#b83333" + +/datum/reagent/nutriment/instantjuice/apple + name = "Apple Juice Powder" + id = "instantapple" + description = "Dehydrated, powdered apple juice." + taste_description = "dry sweet apples" + color = "#c07c40" + /datum/reagent/nutriment/soysauce name = "Soysauce" id = "soysauce" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index a903454801..01de315c2d 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1200,6 +1200,20 @@ new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location) return +/datum/chemical_reaction/drinks/coffee + name = "Coffee" + id = "coffee" + result = "coffee" + required_reagents = list("water" = 5, "coffeepowder" = 1) + result_amount = 5 + +/datum/chemical_reaction/drinks/tea + name = "Black tea" + id = "tea" + result = "tea" + required_reagents = list("water" = 5, "teapowder" = 1) + result_amount = 5 + /datum/chemical_reaction/drinks/hot_coco name = "Hot Coco" id = "hot_coco" @@ -1214,6 +1228,34 @@ required_reagents = list("soymilk" = 4, "sacid" = 1) result_amount = 5 +/datum/chemical_reaction/drinks/grapejuice + name = "Grape Juice" + id = "grapejuice" + result = "grapejuice" + required_reagents = list("water" = 3, "instantgrape" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/orangejuice + name = "Orange Juice" + id = "orangejuice" + result = "orangejuice" + required_reagents = list("water" = 3, "instantorange" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/watermelonjuice + name = "Watermelon Juice" + id = "watermelonjuice" + result = "watermelonjuice" + required_reagents = list("water" = 3, "instantwatermelon" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/applejuice + name = "Apple Juice" + id = "applejuice" + result = "applejuice" + required_reagents = list("water" = 3, "instantapple" = 1) + result_amount = 3 + /datum/chemical_reaction/food/ketchup name = "Ketchup" id = "ketchup" diff --git a/code/modules/xenoarcheaology/finds/finds.dm b/code/modules/xenoarcheaology/finds/finds.dm index ab5d00e786..8e89dcd947 100644 --- a/code/modules/xenoarcheaology/finds/finds.dm +++ b/code/modules/xenoarcheaology/finds/finds.dm @@ -14,20 +14,22 @@ clearance_range = rand(4, 12) dissonance_spread = rand(1500, 2500) / 100 -/obj/item/weapon/ore/strangerock +/obj/item/weapon/strangerock name = "Strange rock" desc = "Seems to have some unusal strata evident throughout it." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "strange" + var/datum/geosample/geologic_data origin_tech = list(TECH_MATERIAL = 5) -/obj/item/weapon/ore/strangerock/New(loc, var/inside_item_type = 0) - ..(loc) +/obj/item/weapon/strangerock/New(loc, var/inside_item_type = 0) + pixel_x = rand(0,16)-8 + pixel_y = rand(0,8)-8 if(inside_item_type) new /obj/item/weapon/archaeological_find(src, new_item_type = inside_item_type) -/obj/item/weapon/ore/strangerock/attackby(var/obj/item/I, var/mob/user) +/obj/item/weapon/strangerock/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/weapon/pickaxe/brush)) var/obj/item/inside = locate() in src if(inside) diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 65d92bbe67..de2f69b813 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/icons/obj/food_vr.dmi b/icons/obj/food_vr.dmi index 7a6d3c5226..ea92af4493 100644 Binary files a/icons/obj/food_vr.dmi and b/icons/obj/food_vr.dmi differ diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi index 4585d41d70..2fe1a91c98 100644 Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ diff --git a/icons/obj/trash_vr.dmi b/icons/obj/trash_vr.dmi index 17004c289d..2c7fed4c7a 100644 Binary files a/icons/obj/trash_vr.dmi and b/icons/obj/trash_vr.dmi differ diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm index 251de4e3f1..564e7d95e2 100644 --- a/maps/tether/tether-06-station2.dmm +++ b/maps/tether/tether-06-station2.dmm @@ -7210,9 +7210,8 @@ /area/tether/exploration/hallway) "kC" = ( /obj/item/weapon/material/twohanded/spear/foam, -/obj/item/weapon/storage/fancy/crayons{ - desc = "Special food for special warriors of the expedition force."; - name = "spearman ration" +/obj/item/weapon/storage/mre/menu12{ + name = "spearman MRE" }, /turf/simulated/floor, /area/tether/exploration/hallway) diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm index cebc944428..679bb55a44 100644 --- a/maps/tether/tether-07-station3.dmm +++ b/maps/tether/tether-07-station3.dmm @@ -28961,10 +28961,9 @@ dir = 1 }, /obj/structure/closet/crate/freezer/rations, -/obj/item/weapon/reagent_containers/food/snacks/liquidprotein, -/obj/item/weapon/reagent_containers/food/snacks/liquidprotein, -/obj/item/weapon/reagent_containers/food/snacks/liquidprotein, -/obj/item/weapon/reagent_containers/food/snacks/liquidprotein, +/obj/item/weapon/storage/mre/menu11, +/obj/item/weapon/storage/mre/menu11, +/obj/item/weapon/storage/mre/menu10, /turf/simulated/floor/tiled/techfloor/grid, /area/shuttle/excursion/tether) "Vi" = ( diff --git a/maps/tether/tether-10-colony.dmm b/maps/tether/tether-10-colony.dmm index 517c9d7b21..d4e346d5bf 100644 --- a/maps/tether/tether-10-colony.dmm +++ b/maps/tether/tether-10-colony.dmm @@ -414,18 +414,12 @@ /area/centcom/specops) "aI" = ( /obj/structure/closet/crate/medical, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, -/obj/item/weapon/reagent_containers/food/snacks/liquidfood, +/obj/item/weapon/storage/mre/menu11, +/obj/item/weapon/storage/mre/menu11, +/obj/item/weapon/storage/mre/menu11, +/obj/item/weapon/storage/mre/menu11, +/obj/item/weapon/storage/mre/menu11, +/obj/item/weapon/storage/mre/menu11, /turf/unsimulated/floor{ icon_state = "vault"; dir = 5 @@ -471,6 +465,7 @@ /obj/item/bodybag/cryobag, /obj/item/bodybag/cryobag, /obj/item/weapon/reagent_containers/glass/beaker/large, +/obj/item/weapon/reagent_containers/glass/beaker/large, /turf/unsimulated/floor{ icon_state = "vault"; dir = 5 diff --git a/vorestation.dme b/vorestation.dme index a12fd39804..90f728269c 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1173,6 +1173,7 @@ #include "code\game\objects\items\weapons\storage\laundry_basket.dm" #include "code\game\objects\items\weapons\storage\lockbox.dm" #include "code\game\objects\items\weapons\storage\misc.dm" +#include "code\game\objects\items\weapons\storage\mre.dm" #include "code\game\objects\items\weapons\storage\quickdraw.dm" #include "code\game\objects\items\weapons\storage\secure.dm" #include "code\game\objects\items\weapons\storage\storage.dm"