From 8ac52fef61408f83d5dd5b384c182f87c2b5afd0 Mon Sep 17 00:00:00 2001 From: Heroman Date: Wed, 12 Feb 2020 12:33:46 +1000 Subject: [PATCH 001/187] Adds Maintenance Predator random event --- code/datums/ghost_query_vr.dm | 7 +- code/modules/events/event_container_vr.dm | 3 +- .../modules/events/maintenance_predator_vr.dm | 73 +++++++++++++++++++ maps/tether/tether-01-surface1.dmm | 18 ++++- maps/tether/tether-02-surface2.dmm | 15 +++- maps/tether/tether-06-station2.dmm | 8 +- maps/tether/tether-07-station3.dmm | 73 +++++++++++-------- vorestation.dme | 1 + 8 files changed, 162 insertions(+), 36 deletions(-) create mode 100644 code/modules/events/maintenance_predator_vr.dm diff --git a/code/datums/ghost_query_vr.dm b/code/datums/ghost_query_vr.dm index e74aa9ff1a..aba3165c63 100644 --- a/code/datums/ghost_query_vr.dm +++ b/code/datums/ghost_query_vr.dm @@ -1,4 +1,9 @@ /datum/ghost_query/morph role_name = "Morph" - question = "A weird morphic creature appears to have snuck onstation. Do you want to play as it? ((Expect to be treated as vore predator))" + question = "A weird morphic creature appears to have snuck onstation. Do you want to play as it? ((Expect to be treated as vore predator.))" + cutoff_number = 1 + +/datum/ghost_query/maints_pred + role_name = "Maintenance Predator" + question = "It appears a predatory critter is lurking in the maintenance. Do you want to play as it? ((You get to choose type of critter. Expect to be treated as vore predator.))" cutoff_number = 1 \ No newline at end of file diff --git a/code/modules/events/event_container_vr.dm b/code/modules/events/event_container_vr.dm index 284d74906f..3c6733984c 100644 --- a/code/modules/events/event_container_vr.dm +++ b/code/modules/events/event_container_vr.dm @@ -82,7 +82,8 @@ //Evil grubs that drain station power slightly new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 0, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 10, list(ASSIGNMENT_SCIENTIST = 40), 1), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/morph_spawn, 75, list(ASSIGNMENT_SECURITY = 35), 1) + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/morph_spawn, 75, list(ASSIGNMENT_SECURITY = 35), 1), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Predator", /datum/event/maintenance_predator, 75, list(ASSIGNMENT_SECURITY = 25, ASSIGNMENT_SCIENTIST = 10), 1) ) add_disabled_events(list( new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1), diff --git a/code/modules/events/maintenance_predator_vr.dm b/code/modules/events/maintenance_predator_vr.dm new file mode 100644 index 0000000000..856e8276be --- /dev/null +++ b/code/modules/events/maintenance_predator_vr.dm @@ -0,0 +1,73 @@ +/datum/event/maintenance_predator + startWhen = 1 + announceWhen = 50 + endWhen = 100 + var/announceProb = 35 + var/list/possible_mobs = list("Space Bumblebee" = /mob/living/simple_mob/vore/bee, + "Voracious Lizard" = /mob/living/simple_mob/vore/aggressive/dino, + "Giant Frog" = /mob/living/simple_mob/vore/aggressive/frog, + "Giant Rat" = /mob/living/simple_mob/vore/aggressive/rat, + "Crate Mimic" = /mob/living/simple_mob/vore/aggressive/mimic, + "Juvenile Solargrub" = /mob/living/simple_mob/vore/solargrub, + "Red Panda" = /mob/living/simple_mob/vore/redpanda, + "Fennec" = /mob/living/simple_mob/vore/fennec, + "Fennix" = /mob/living/simple_mob/vore/fennix, + "Jelly Blob" = /mob/living/simple_mob/animal/space/jelly, + "Wolf" = /mob/living/simple_mob/animal/wolf) + +/datum/event/maintenance_predator/start() + + var/obj/effect/landmark/spawnspot = null + var/list/possibleSpawnspots = list() + for(var/obj/effect/landmark/L in landmarks_list) + if(L.name == "maint_pred") + possibleSpawnspots += L + if(possibleSpawnspots.len) + spawnspot = pick(possibleSpawnspots) + else + kill() // To prevent fake announcements + return + + if(!spawnspot) + kill() // To prevent fake announcements + return + + var/datum/ghost_query/Q = new /datum/ghost_query/maints_pred() + var/list/winner = Q.query() + + if(winner.len) + var/mob/observer/dead/D = winner[1] + var/choice + var/randomize + var/finalized = "No" + + while(finalized == "No" && D.client) + choice = input(D,"What type of predator do you want to play as?") as null|anything in possible_mobs + if(!choice) + randomize = TRUE + break + + if(choice) + finalized = alert(D, "Are you sure you want to play as [choice]?","Confirmation","No","Yes") + + if(randomize) + choice = pick(possible_mobs) + + var/mobtype = possible_mobs[choice] + var/mob/living/simple_mob/newPred = new mobtype(get_turf(spawnspot)) + newPred.movement_cooldown = 0 // Remove the needless artificial speed cap + if(D.mind) + D.mind.transfer_to(newPred) + to_chat(D, "You are [newPred], somehow having gotten aboard the station in search of food. \ + You are wary of environment around you, but you do feel rather peckish. Stick around dark, secluded places to avoid danger or, \ + if you are cute enough, try to make friends with this place's inhabitants.") + newPred.ckey = D.ckey + newPred.visible_message("[newPred] emerges from somewhere!") + else + kill() // To prevent fake announcements + return + + +/datum/event/maintenance_predator/announce() + if(prob(announceProb)) + command_announcement.Announce("Unexpected biosignature detected in the maintenance tunnels of [station_name()].", "Lifesign Alert") \ No newline at end of file diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index 025989c772..ee2cccd109 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -32277,6 +32277,20 @@ }, /turf/simulated/floor/outdoors/grass/sif/virgo3b, /area/tether/surfacebase/outside/outside1) +"bcW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark{ + name = "maint_pred" + }, +/turf/simulated/floor/plating, +/area/maintenance/lower/research) +"bcX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark{ + name = "maint_pred" + }, +/turf/simulated/floor/plating, +/area/maintenance/lower/atmos) "cGJ" = ( /turf/simulated/floor/plating, /area/maintenance/lower/mining_eva) @@ -41487,7 +41501,7 @@ aah aah aah aBO -aHZ +bcW aHc aJF aKk @@ -42650,7 +42664,7 @@ aUT aVn aVn aTZ -aUE +bcX aVn aVn aXz diff --git a/maps/tether/tether-02-surface2.dmm b/maps/tether/tether-02-surface2.dmm index 1542fcf9a0..0f5ae0caac 100644 --- a/maps/tether/tether-02-surface2.dmm +++ b/maps/tether/tether-02-surface2.dmm @@ -2142,6 +2142,9 @@ /obj/effect/floor_decal/techfloor{ dir = 8 }, +/obj/effect/landmark{ + name = "maint_pred" + }, /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/north) "aeD" = ( @@ -14060,6 +14063,9 @@ /obj/effect/floor_decal/corner_techfloor_grid/full{ dir = 4 }, +/obj/effect/landmark{ + name = "maint_pred" + }, /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/south) "azV" = ( @@ -21560,6 +21566,13 @@ /obj/structure/window/reinforced, /turf/simulated/floor/plating, /area/maintenance/lower/atmos) +"aOt" = ( +/obj/structure/catwalk, +/obj/effect/landmark{ + name = "maint_pred" + }, +/turf/simulated/floor/plating, +/area/maintenance/lower/atmos) "aOw" = ( /obj/machinery/camera/network/command{ icon_state = "camera"; @@ -39158,7 +39171,7 @@ aMq aMq aDS aNG -aEp +aOt aDS aac aac diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm index fea2bb4960..fcdb64e995 100644 --- a/maps/tether/tether-06-station2.dmm +++ b/maps/tether/tether-06-station2.dmm @@ -15688,6 +15688,12 @@ }, /turf/simulated/floor/tiled/white, /area/medical/biostorage) +"xL" = ( +/obj/effect/landmark{ + name = "maint_pred" + }, +/turf/simulated/floor, +/area/maintenance/station/sec_lower) "xO" = ( /obj/structure/table/standard, /obj/item/weapon/storage/box/syringegun, @@ -32131,7 +32137,7 @@ aP at TW OY -RS +xL at RS RS diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm index f0ba8ae234..e552f481ac 100644 --- a/maps/tether/tether-07-station3.dmm +++ b/maps/tether/tether-07-station3.dmm @@ -29232,13 +29232,11 @@ /turf/simulated/floor/tiled, /area/security/hallwayaux) "UD" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_l" +/obj/effect/landmark{ + name = "maint_pred" }, -/turf/simulated/floor/tiled/asteroid_steel/airless, -/turf/simulated/shuttle/plating/airless/carry, -/area/shuttle/belter/station) +/turf/simulated/floor, +/area/maintenance/station/ai) "UE" = ( /obj/structure/bed/chair/shuttle, /turf/simulated/floor/tiled, @@ -29415,12 +29413,12 @@ /turf/simulated/floor/tiled, /area/quartermaster/belterdock) "UY" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8 +/obj/structure/catwalk, +/obj/effect/landmark{ + name = "maint_pred" }, -/turf/simulated/floor/tiled/asteroid_steel/airless, -/turf/simulated/shuttle/plating/airless/carry, -/area/shuttle/belter/station) +/turf/simulated/floor, +/area/maintenance/cargo) "UZ" = ( /obj/structure/shuttle/engine/heater{ dir = 8 @@ -29651,7 +29649,7 @@ "Vz" = ( /obj/structure/shuttle/engine/propulsion{ dir = 8; - icon_state = "propulsion_r" + icon_state = "propulsion_l" }, /turf/simulated/floor/tiled/asteroid_steel/airless, /turf/simulated/shuttle/plating/airless/carry, @@ -29683,12 +29681,11 @@ /area/shuttle/excursion/tether) "VC" = ( /obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_l" + dir = 8 }, -/turf/space, +/turf/simulated/floor/tiled/asteroid_steel/airless, /turf/simulated/shuttle/plating/airless/carry, -/area/shuttle/large_escape_pod1/station) +/area/shuttle/belter/station) "VD" = ( /obj/machinery/atmospherics/binary/pump, /obj/machinery/atmospherics/pipe/simple/hidden/universal{ @@ -29766,15 +29763,23 @@ /area/ai_core_foyer) "VN" = ( /obj/structure/shuttle/engine/propulsion{ - dir = 8 + dir = 8; + icon_state = "propulsion_r" + }, +/turf/simulated/floor/tiled/asteroid_steel/airless, +/turf/simulated/shuttle/plating/airless/carry, +/area/shuttle/belter/station) +"VO" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_l" }, /turf/space, /turf/simulated/shuttle/plating/airless/carry, /area/shuttle/large_escape_pod1/station) -"VO" = ( +"VP" = ( /obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion_r" + dir = 8 }, /turf/space, /turf/simulated/shuttle/plating/airless/carry, @@ -29792,6 +29797,14 @@ }, /turf/simulated/floor/tiled/techfloor/grid, /area/shuttle/excursion/tether) +"VS" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion_r" + }, +/turf/space, +/turf/simulated/shuttle/plating/airless/carry, +/area/shuttle/large_escape_pod1/station) "VU" = ( /obj/machinery/firealarm{ dir = 2; @@ -40184,11 +40197,11 @@ MK Iy ab NL -VC -VN -VN -VN VO +VP +VP +VP +VS NL vt vt @@ -41415,7 +41428,7 @@ jV ms Oz be -nx +UY RT dT Se @@ -44109,7 +44122,7 @@ du fy fy RI -gK +UD fp RN eI @@ -44297,11 +44310,11 @@ Ty TL QG Ue -UD -UY -UY -UY Vz +VC +VC +VC +VN VH vt vt diff --git a/vorestation.dme b/vorestation.dme index e0e0c6b9b9..4d1dc2cb32 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1871,6 +1871,7 @@ #include "code\modules\events\ian_storm_vr.dm" #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" +#include "code\modules\events\maintenance_predator_vr.dm" #include "code\modules\events\meteor_strike_vr.dm" #include "code\modules\events\meteors.dm" #include "code\modules\events\money_hacker.dm" From 5ba0e0805cdb8d478868458a7ca2ae48ffab51f6 Mon Sep 17 00:00:00 2001 From: Heroman Date: Thu, 13 Feb 2020 09:39:32 +1000 Subject: [PATCH 002/187] Prevents the pred going buck wild if player leaves --- code/modules/events/maintenance_predator_vr.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/events/maintenance_predator_vr.dm b/code/modules/events/maintenance_predator_vr.dm index 856e8276be..f86cab1ca1 100644 --- a/code/modules/events/maintenance_predator_vr.dm +++ b/code/modules/events/maintenance_predator_vr.dm @@ -55,6 +55,8 @@ var/mobtype = possible_mobs[choice] var/mob/living/simple_mob/newPred = new mobtype(get_turf(spawnspot)) + qdel(newPred.ai_holder) + newPred.ai_holder = null newPred.movement_cooldown = 0 // Remove the needless artificial speed cap if(D.mind) D.mind.transfer_to(newPred) From 0ebf8b163af6f9f47e77aec934ad904cb3b58bf0 Mon Sep 17 00:00:00 2001 From: Heroman Date: Thu, 13 Feb 2020 09:40:29 +1000 Subject: [PATCH 003/187] Removes Crate Mimic from list of available maintenance preds --- code/modules/events/maintenance_predator_vr.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/events/maintenance_predator_vr.dm b/code/modules/events/maintenance_predator_vr.dm index f86cab1ca1..06e9f6e501 100644 --- a/code/modules/events/maintenance_predator_vr.dm +++ b/code/modules/events/maintenance_predator_vr.dm @@ -7,7 +7,6 @@ "Voracious Lizard" = /mob/living/simple_mob/vore/aggressive/dino, "Giant Frog" = /mob/living/simple_mob/vore/aggressive/frog, "Giant Rat" = /mob/living/simple_mob/vore/aggressive/rat, - "Crate Mimic" = /mob/living/simple_mob/vore/aggressive/mimic, "Juvenile Solargrub" = /mob/living/simple_mob/vore/solargrub, "Red Panda" = /mob/living/simple_mob/vore/redpanda, "Fennec" = /mob/living/simple_mob/vore/fennec, From b9abe73b7ca4c8d37ea5f4fbd1ebc464fc8c03cb Mon Sep 17 00:00:00 2001 From: Meghan-Rossi <56671765+Meghan-Rossi@users.noreply.github.com> Date: Tue, 18 Feb 2020 05:21:13 +0000 Subject: [PATCH 004/187] Fluff item *Adds custom latex clothing for Excess - Approved in https://forum.vore-station.net/viewtopic.php?f=27&t=1593 --- .../loadout/loadout_fluffitems_vr.dm | 6 ++++ .../vore/fluffstuff/custom_clothes_vr.dm | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index 40835cb091..7384efa196 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -467,6 +467,12 @@ ckeywhitelist = list("killerdragn") character_name = list("Excess") +/datum/gear/fluff/excess_uniform + path = /obj/item/clothing/under/fluff/excess + display_name = "Excess's Uniform" + ckeywhitelist = list("killerdragn") + character_name = list("Excess") + /datum/gear/fluff/lassara_sheath path = /obj/item/clothing/accessory/storage/knifeharness display_name = "Lassara's Knife Harness" diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 0a0f61455e..9dcae143c5 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1919,3 +1919,32 @@ Departamental Swimsuits, for general use /obj/item/clothing/accessory/collar/pink/fluff/warning name = "Warning Collar (AGGRESSIVE)" desc = "A bright red warning collar with white text - \"AGGRESSIVE\"." + +//KillerDragn:Excess +/obj/item/clothing/under/fluff/excess + name = "XS-21E Labeled Latex Clothing" + desc = "A latex navy blue tube-top and matching compression shorts, with a bright yellow stripe down the side. \"XS-21E\" is written on the thigh. \"Warning\" is written in yellow by the stripe on the top." + body_parts_covered = UPPER_TORSO|LOWER_TORSO + icon = 'icons/mob/human.dmi' + icon_state = "compression_shorts" + item_icons = list() + default_worn_icon = 'icons/mob/human.dmi' + color = COLOR_NAVY + sprite_sheets = null + +/obj/item/clothing/under/fluff/excess/get_worn_icon_state(var/slot_name) + . = ..() + . = copytext(. , 1 , lentext( . ) - 1) //get rid of the extra "_s" added by /obj/item/clothing/under/get_worn_icon_state() + +/obj/item/clothing/under/fluff/excess/update_icon() + . = ..() + overlays += image("icon" = 'icons/mob/human.dmi', "icon_state" = "tubetop") + +/obj/item/clothing/under/fluff/excess/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) + var/image/standing = ..() + standing.add_overlay(image("icon" = 'icons/mob/human.dmi', "icon_state" = "tubetop")) + return standing + +/obj/item/clothing/under/fluff/excess/New() + . = ..() + overlays += image("icon" = 'icons/mob/human.dmi', "icon_state" = "tubetop") From ee6f1558921ab0374aaae984bd9289007c25723f Mon Sep 17 00:00:00 2001 From: Atermonera Date: Tue, 18 Feb 2020 18:32:53 -0800 Subject: [PATCH 005/187] Fixes broken tool usability logic --- code/_onclick/item_attack.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index ad904e46ff..c58293d1a6 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -46,7 +46,10 @@ avoid code duplication. This includes items that may sometimes act as a standard return 0 if(can_operate(src) && I.do_surgery(src,user)) return 1 +<<<<<<< HEAD if(attempt_vr(src,"vore_attackby",args)) return //VOREStation Add - The vore, of course. +======= +>>>>>>> 7825217... Merge pull request #6707 from Heroman3003/surgfix return I.attack(src, user, user.zone_sel.selecting, attack_modifier) // Used to get how fast a mob should attack, and influences click delay. From d27f527a267930bad8ae1f0dd9cb46478a243764 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Tue, 18 Feb 2020 21:39:01 -0500 Subject: [PATCH 006/187] Update item_attack.dm --- code/_onclick/item_attack.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index c58293d1a6..15129285c3 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -46,10 +46,7 @@ avoid code duplication. This includes items that may sometimes act as a standard return 0 if(can_operate(src) && I.do_surgery(src,user)) return 1 -<<<<<<< HEAD if(attempt_vr(src,"vore_attackby",args)) return //VOREStation Add - The vore, of course. -======= ->>>>>>> 7825217... Merge pull request #6707 from Heroman3003/surgfix return I.attack(src, user, user.zone_sel.selecting, attack_modifier) // Used to get how fast a mob should attack, and influences click delay. @@ -113,4 +110,4 @@ avoid code duplication. This includes items that may sometimes act as a standard power *= attack_modifier - return target.hit_with_weapon(src, user, power, hit_zone) \ No newline at end of file + return target.hit_with_weapon(src, user, power, hit_zone) From a1081d80123ab1969da7afd51c933d8b4e484b5c Mon Sep 17 00:00:00 2001 From: Heroman Date: Wed, 19 Feb 2020 16:07:59 +1000 Subject: [PATCH 007/187] Adds biochemical dispenser to medical's chemistry --- .../dispenser/cartridge_presets_vr.dm | 6 +- .../dispenser/dispenser_presets_vr.dm | 19 +++++++ icons/obj/chemical_vr.dmi | Bin 2199 -> 3149 bytes maps/tether/tether-03-surface3.dmm | 37 ++++++------ maps/tether/tether-07-station3.dmm | 53 +++++++++--------- 5 files changed, 70 insertions(+), 45 deletions(-) diff --git a/code/modules/reagents/dispenser/cartridge_presets_vr.dm b/code/modules/reagents/dispenser/cartridge_presets_vr.dm index 37d7514f03..ebec2278a0 100644 --- a/code/modules/reagents/dispenser/cartridge_presets_vr.dm +++ b/code/modules/reagents/dispenser/cartridge_presets_vr.dm @@ -3,4 +3,8 @@ ammonia spawn_reagent = "ammonia" diethylamine spawn_reagent = "diethylamine" plantbgone spawn_reagent = "plantbgone" - mutagen spawn_reagent = "mutagen" \ No newline at end of file + mutagen spawn_reagent = "mutagen" + + //Biochem + nutriment spawn_reagent = "nutriment" + protein spawn_reagent = "protein" \ No newline at end of file diff --git a/code/modules/reagents/dispenser/dispenser_presets_vr.dm b/code/modules/reagents/dispenser/dispenser_presets_vr.dm index be95daa438..3a3d0031ff 100644 --- a/code/modules/reagents/dispenser/dispenser_presets_vr.dm +++ b/code/modules/reagents/dispenser/dispenser_presets_vr.dm @@ -1,5 +1,8 @@ /obj/machinery/chemical_dispenser/xenoflora name = "xenoflora chem dispenser" + icon = 'icons/obj/chemical_vr.dmi' + icon_state = "dispenser-small-green" + ui_title = "Xenoflora Chemical Dispenser" dispense_reagents = list( "water", "sugar", "ethanol", "radium", "ammonia", "diethylamine", "plantbgone", "mutagen", "calcium" ) @@ -15,4 +18,20 @@ /obj/item/weapon/reagent_containers/chem_disp_cartridge/plantbgone, /obj/item/weapon/reagent_containers/chem_disp_cartridge/mutagen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/calcium + ) + +/obj/machinery/chemical_dispenser/biochemistry + name = "bioproduct dispenser" + icon = 'icons/obj/chemical_vr.dmi' + icon_state = "dispenser-small" + ui_title = "Bioproduct Dispenser" + dispense_reagents = list( + "nutriment", "protein", "milk" + ) + +/obj/machinery/chemical_dispenser/biochemistry/full + spawn_cartridges = list( + /obj/item/weapon/reagent_containers/chem_disp_cartridge/nutriment, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/protein, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/milk ) \ No newline at end of file diff --git a/icons/obj/chemical_vr.dmi b/icons/obj/chemical_vr.dmi index 19589b33880766b232949e2b6bce82ba44dfbef4..973be492af55795e897f0aae7e1829a87c8bde67 100644 GIT binary patch literal 3149 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 Q{11SUfth~!d6(P&229Tt=>Px# literal 2199 zcmai0c~sK*7XKk4Cb&kLTbPy$<&s&UQ$nQ~?z!ifn&ynQpedOP3FXTamwZXjG!-&U z91U@%(ySEAjZz6qbIB!?Y+O+Am7*v^|Gf9kna+8CeD6K?dp`Gjx6k>Wo8|54qN<{& z0sw$2?zoeWT$8^aWhJ?M<#_syTotGI1reO05+dVc;s`OZcmPN$@ePQJzqI^s-#F3N zDU_Qfs<)f#%ksD3?VaH7=DJ&OyyeDzKEL~Tk2}}=Y8=H)%gtxY`7PA=y}Nv};nYU7 zuWdF(egS`qen-(t@ZEmiFDhg3_Q|-54=O(I2tW;@w*E=S63+3L#4zz2-|Wmsd42+1 zn}r?wq4&wwey($C`-cJ;0L=-V;PtJ*007#Eb2{voR5D*$A3Jgk(Sd>BG=h%hI}5{q z`9k&kqJ>V^3Q~S?<_q;OWcb#of(waE1}v`)DC-%KGxGBCEqyfTdcSvME80Y(2fHE| zT~zqY+p}@oyD|#Y=E9L~yb6NLHfP>)bGvr()WUJcF+(pREq)ZQv*Xew(|MKrzWyP! z{%n)bX^1&8|Ct|`Wqp&DJq-EMBn)|x;vapN7yXa47E-xZo7YXG1>pXUU=`N9`}yeD zSQ)hdOH3wyvSQnLRQaJcy?W7S*Yi+O^iBYSkah4QPc$C+p-v|!>!zlr9vRWZoJ^}Y zY?MwyjSEnuu@se&Cz=Q1v#e=Ii3Pb;Hb5#4!dE}L>LqxFjy;r1F;2Ti6atKZ8nbQo z4_Z$aRSG-WY*$;_$3YW?=dRc1i8>p=szB3p%7H8zoOaHb5&Y2MJ})*2zF+4=JOdpH##3?L%&) zUzqy1+I@@LHnYbqEyyrQ^3jsb=Nl`m-Ae`OL-)Z9f?p^aO{v}K7|*EM<$9I-DA$0A z$r^)D#0?7&cT*LEmbZR3cQaWR?yl)l|9t)xQR%bk*|TRtLInv$&CMv1rkn8JOvAWf z7EYNr9b8t;rSoh=1p*ipTkZEU4&BzCt+U5Kt^V=j>#mi2W^BWV@YmRFtx&CsuF>w{1)>6w-K&`psZ9yR^1 z!R+<5)>XtFaIuz^QnYTf@B%2{_sh$fdzt{Bddba^&8R{%Vro?Gx*&PS&!J1HyT zm6ss;Y||vEk~3b*;vSCTJF01hS%t0KX3J2Z_DtC;^-IVqlC?WSxTy4qgdl+(Ob2GJip&X&$K-mRUgS zMVJL{*h#>1&m}f{zcYdm0oT}xDHBxuaqyBD+Qq#wKt1!iBK$b%{lau-hvE@S?C=H< zD*2i0-R$J-uz`>W_H7Qh0@BX27Q2E4!#w>@a*Huq^qK&sr!p@u1(=~RrKjLBeG9iy zRpQrqu32K!`%!k?oUGda4%24i5$|zkxdCaISo2OXpksNm7gh@dK+Qk62bIPNLnPqE zOp!CKCTe=Rsz*JQxjeg`edDd^;(uuN_xb#Qi$4a1)I+actej05_V*5!Go{gXUL8xR z>jG(*VGi{kMB|vo5OPd$Z?66UW6;nU2&9#0p0EMzc>0=(0dUO`5^z_Smsw>^S335j z