diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm
index f4492c7d6f..d42cbe7f63 100644
--- a/code/controllers/subsystems/vote.dm
+++ b/code/controllers/subsystems/vote.dm
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(vote)
if(mode)
time_remaining = round((started_time + duration - world.time)/10)
if(mode == VOTE_GAMEMODE && ticker.current_state >= GAME_STATE_SETTING_UP)
- to_chat(world, "Gamemode vote aborted: Game has alread ystarted.")
+ to_chat(world, "Gamemode vote aborted: Game has already started.")
reset()
return
if(time_remaining <= 0)
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index cd8320b571..d886a0faf1 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -1,6 +1,6 @@
/obj/machinery/biogenerator
name = "biogenerator"
- desc = ""
+ desc = "Converts plants into biomass, which can be used for fertilizer and sort-of-synthetic products."
icon = 'icons/obj/biogenerator.dmi'
icon_state = "biogen-stand"
density = 1
@@ -50,7 +50,7 @@
return
if(istype(O, /obj/item/weapon/reagent_containers/glass))
if(beaker)
- to_chat(user, "]The [src] is already loaded.")
+ to_chat(user, "\The [src] is already loaded.")
else
user.remove_from_mob(O)
O.loc = src
@@ -104,23 +104,25 @@
if(beaker)
dat += "Activate Biogenerator!
"
dat += "Detach Container
"
- dat += "Food
"
- dat += "10 milk ([round(20/build_eff)])
"
- dat += "Slab of meat ([round(50/build_eff)])
"
- dat += "Nutrient
"
+ dat += "Food:
"
+ dat += "10 milk ([round(20/build_eff)]) | x5
"
+ dat += "10 cream ([round(20/build_eff)]) | x5
"
+ dat += "Slab of meat ([round(50/build_eff)]) | x5
"
+ dat += "Nutrient:
"
dat += "E-Z-Nutrient ([round(60/build_eff)]) | x5
"
dat += "Left 4 Zed ([round(120/build_eff)]) | x5
"
dat += "Robust Harvest ([round(150/build_eff)]) | x5
"
- dat += "Leather
"
+ dat += "Leather:
"
dat += "Wallet ([round(100/build_eff)])
"
dat += "Botanical gloves ([round(250/build_eff)])
"
+ dat += "Plant bag ([round(250/build_eff)])
"
+ dat += "Large plant bag ([round(250/build_eff)])
"
dat += "Utility belt ([round(300/build_eff)])
"
dat += "Leather Satchel ([round(400/build_eff)])
"
dat += "Cash Bag ([round(400/build_eff)])
"
dat += "Chemistry Bag ([round(400/build_eff)])
"
dat += "Workboots ([round(400/build_eff)])
"
dat += "Leather Shoes ([round(400/build_eff)])
"
-
dat += "Leather Chaps ([round(400/build_eff)])
"
dat += "Leather Coat ([round(500/build_eff)])
"
dat += "Leather Jacket ([round(500/build_eff)])
"
@@ -165,10 +167,11 @@
processing = 1
update_icon()
updateUsrDialog()
- playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
+ playsound(src.loc, 'sound/machines/blender.ogg', 40, 1)
use_power(S * 30)
sleep((S + 15) / eat_eff)
processing = 0
+ playsound(src.loc, 'sound/machines/biogenerator_end.ogg', 40, 1)
update_icon()
else
menustat = "void"
@@ -187,8 +190,20 @@
switch(item)
if("milk")
beaker.reagents.add_reagent("milk", 10)
+ if("milk5")
+ beaker.reagents.add_reagent("milk", 50)
+ if("cream")
+ beaker.reagents.add_reagent("cream", 10)
+ if("cream5")
+ beaker.reagents.add_reagent("cream", 50)
if("meat")
new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ if("meat5")
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc) //This is ugly.
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
+ new/obj/item/weapon/reagent_containers/food/snacks/meat(loc)
if("ez")
new/obj/item/weapon/reagent_containers/glass/bottle/eznutrient(loc)
if("l4z")
@@ -217,6 +232,10 @@
new/obj/item/weapon/storage/wallet(loc)
if("gloves")
new/obj/item/clothing/gloves/botanic_leather(loc)
+ if("plantbag")
+ new/obj/item/weapon/storage/bag/plants(loc)
+ if("plantbaglarge")
+ new/obj/item/weapon/storage/bag/plants/large(loc)
if("tbelt")
new/obj/item/weapon/storage/belt/utility(loc)
if("satchel")
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 6c5817c036..cb73fe4d7a 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -15,6 +15,8 @@
var/light_power_on = 1
var/overlay_layer
+ clicksound = "keyboard"
+
/obj/machinery/computer/New()
overlay_layer = layer
..()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index c103f1f39e..5f5387184d 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -112,6 +112,8 @@ Class Procs:
var/uid
var/panel_open = 0
var/global/gl_uid = 1
+ var/clicksound // sound played on succesful interface. Just put it in the list of vars at the start.
+ var/clickvol = 40 // volume
var/interact_offline = 0 // Can the machine be interacted with while de-powered.
var/obj/item/weapon/circuitboard/circuit = null
@@ -228,6 +230,7 @@ Class Procs:
return attack_hand(user)
/obj/machinery/attack_hand(mob/user as mob)
+
if(inoperable(MAINT))
return 1
if(user.lying || user.stat)
@@ -244,6 +247,9 @@ Class Procs:
to_chat(user, "You momentarily forget how to use [src].")
return 1
+ if(clicksound && istype(user, /mob/living/carbon))
+ playsound(src, clicksound, clickvol)
+
add_fingerprint(user)
return ..()
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 2c4fa65abf..9d1365290c 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -170,6 +170,10 @@
w_class = ITEMSIZE_SMALL
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown)
+/obj/item/weapon/storage/bag/plants/large
+ name = "large plant bag"
+ w_class = ITEMSIZE_SMALL
+ max_storage_space = ITEMSIZE_COST_NORMAL * 45
// -----------------------------
// Sheet Snatcher
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
index 2b10bdff4a..c2a8a40e7e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
@@ -16,7 +16,7 @@
/obj/item/clothing/head/greenbandana,
/obj/item/weapon/material/minihoe,
/obj/item/weapon/material/knife/machete/hatchet,
- /obj/item/weapon/tool/wirecutters/clippers,
+ /obj/item/weapon/tool/wirecutters/clippers/trimmers,
/obj/item/weapon/reagent_containers/spray/plantbgone,
/obj/item/clothing/suit/storage/hooded/wintercoat/hydro,
/obj/item/clothing/shoes/boots/winter/hydro)
diff --git a/code/game/sound.dm b/code/game/sound.dm
index d1569259a0..b9810d7915 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -135,6 +135,9 @@
if ("thunder") soundin = pick('sound/effects/thunder/thunder1.ogg', 'sound/effects/thunder/thunder2.ogg', 'sound/effects/thunder/thunder3.ogg', 'sound/effects/thunder/thunder4.ogg',
'sound/effects/thunder/thunder5.ogg', 'sound/effects/thunder/thunder6.ogg', 'sound/effects/thunder/thunder7.ogg', 'sound/effects/thunder/thunder8.ogg', 'sound/effects/thunder/thunder9.ogg',
'sound/effects/thunder/thunder10.ogg')
+ if ("keyboard") soundin = pick('sound/effects/keyboard/keyboard1.ogg','sound/effects/keyboard/keyboard2.ogg','sound/effects/keyboard/keyboard3.ogg', 'sound/effects/keyboard/keyboard4.ogg')
+ if ("button") soundin = pick('sound/machines/button1.ogg','sound/machines/button2.ogg','sound/machines/button3.ogg','sound/machines/button4.ogg')
+ if ("switch") soundin = pick('sound/machines/switch1.ogg','sound/machines/switch2.ogg','sound/machines/switch3.ogg','sound/machines/switch4.ogg')
if ("casing_sound") soundin = pick('sound/weapons/casingfall1.ogg','sound/weapons/casingfall2.ogg','sound/weapons/casingfall3.ogg')
return soundin
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index add5f8a67e..30d4e6adef 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -329,7 +329,8 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
return
if(initiator)
- initiator << 'sound/effects/adminhelp.ogg'
+ if(initiator.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping))
+ initiator << 'sound/effects/adminhelp.ogg'
to_chat(initiator, "- AdminHelp Rejected! -")
to_chat(initiator, "Your admin help was rejected.")
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index c242f30bed..12582f01ed 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -4,6 +4,13 @@
name = "plant clippers"
desc = "A tool used to take samples from plants."
+/obj/item/weapon/tool/wirecutters/clippers/trimmers
+ name = "hedgetrimmers"
+ desc = "An old pair of trimmers with a pretty dull blade. You would probably have a hard time cutting anything but plants with it."
+ icon_state = "hedget"
+ item_state = "hedget"
+ force = 7 //One point extra than standard wire cutters.
+
/obj/item/device/analyzer/plant_analyzer
name = "plant analyzer"
icon = 'icons/obj/device.dmi'
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
index 18e7a2d316..54b83e28a4 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
@@ -45,7 +45,10 @@
var/obj/item/organ/internal/nano/refactory/refactory
var/datum/modifier/healing
- player_msg = "In this form, you can move a little faster, your health will regenerate as long as you have metal in you!"
+ var/obj/prev_left_hand
+ var/obj/prev_right_hand
+
+ player_msg = "In this form, you can move a little faster, your health will regenerate as long as you have metal in you, and you can ventcrawl!"
can_buckle = TRUE //Blobsurfing
@@ -152,7 +155,13 @@
var/obj/item/organ/internal/O = organ
O.removed()
O.forceMove(drop_location())
+ var/list/items = humanform.get_equipped_items()
+ if(prev_left_hand) items += prev_left_hand
+ if(prev_right_hand) items += prev_right_hand
+ for(var/obj/object in items)
+ object.forceMove(drop_location())
QDEL_NULL(humanform) //Don't leave it just sitting in nullspace
+
animate(src,alpha = 0,time = 2 SECONDS)
sleep(2 SECONDS)
qdel(src)
@@ -193,6 +202,13 @@
/mob/living/simple_animal/protean_blob/DoPunch(var/atom/A)
if(refactory && istype(A,/obj/item/stack/material))
var/obj/item/stack/material/S = A
+ var/substance = S.material.name
+ var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones.
+ var allowed = FALSE
+ for(var/material in edible_materials)
+ if(material == substance) allowed = TRUE
+ if(!allowed)
+ return
if(refactory.add_stored_material(S.material.name,1*S.perunit) && S.use(1))
visible_message("[name] gloms over some of \the [S], absorbing it.")
else
@@ -201,6 +217,13 @@
/mob/living/simple_animal/protean_blob/attackby(var/obj/item/O, var/mob/user)
if(refactory && istype(O,/obj/item/stack/material))
var/obj/item/stack/material/S = O
+ var/substance = S.material.name
+ var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones.
+ var allowed = FALSE
+ for(var/material in edible_materials)
+ if(material == substance) allowed = TRUE
+ if(!allowed)
+ return
if(refactory.add_stored_material(S.material.name,1*S.perunit) && S.use(1))
visible_message("[name] gloms over some of \the [S], absorbing it.")
else
@@ -213,11 +236,13 @@
// Helpers - Unsafe, WILL perform change.
/mob/living/carbon/human/proc/nano_intoblob()
+ handle_grasp() //It's possible to blob out before some key parts of the life loop. This results in things getting dropped at null. TODO: Fix the code so this can be done better.
+ remove_micros(src, src) //Living things don't fare well in roblobs.
if(buckled)
buckled.unbuckle_mob()
if(LAZYLEN(buckled_mobs))
for(var/buckledmob in buckled_mobs)
- unbuckle_mob(buckledmob, force = TRUE)
+ riding_datum.force_dismount(buckledmob)
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
@@ -256,6 +281,9 @@
blob.transform = matrix()*size_multiplier
blob.size_multiplier = size_multiplier
+ if(l_hand) blob.prev_left_hand = l_hand //Won't save them if dropped above, but necessary if handdrop is disabled.
+ if(r_hand) blob.prev_right_hand = r_hand
+
//Put our owner in it (don't transfer var/mind)
blob.ckey = ckey
temporary_form = blob
@@ -281,6 +309,13 @@
//Return our blob in case someone wants it
return blob
+//For some reason, there's no way to force drop all the mobs grabbed. This ought to fix that. And be moved elsewhere. Call with caution, doesn't handle cycles.
+/proc/remove_micros(var/src, var/mob/root)
+ for(var/obj/item/I in src)
+ remove_micros(I, root) //Recursion. I'm honestly depending on there being no containment loop, but at the cost of performance that can be fixed too.
+ if(istype(I, /obj/item/weapon/holder))
+ root.remove_from_mob(I)
+
/mob/living/carbon/human/proc/nano_outofblob(var/mob/living/simple_animal/protean_blob/blob)
if(!istype(blob))
return
@@ -288,7 +323,7 @@
buckled.unbuckle_mob()
if(LAZYLEN(buckled_mobs))
for(var/buckledmob in buckled_mobs)
- unbuckle_mob(buckledmob, force = TRUE)
+ riding_datum.force_dismount(buckledmob)
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
@@ -319,7 +354,6 @@
//Put our owner in it (don't transfer var/mind)
ckey = blob.ckey
temporary_form = null
- Life(1) //Fix my blindness right meow
//Transfer vore organs
vore_selected = blob.vore_selected
@@ -328,6 +362,11 @@
B.forceMove(src)
B.owner = src
+ if(blob.prev_left_hand) put_in_l_hand(blob.prev_left_hand) //The restore for when reforming.
+ if(blob.prev_right_hand) put_in_r_hand(blob.prev_right_hand)
+
+ Life(1) //Fix my blindness right meow //Has to be moved up here, there exists a circumstance where blob could be deleted without vore organs moving right.
+
//Get rid of friend blob
qdel(blob)
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
index 4b3b6891ad..d6f65e6f63 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
@@ -24,7 +24,7 @@
return
//Organ is missing, needs restoring
- if(!organs_by_name[choice])
+ if(!organs_by_name[choice] || istype(organs_by_name[choice], /obj/item/organ/external/stump)) //allows limb stumps to regenerate like removed limbs.
if(refactory.get_stored_material(DEFAULT_WALL_MATERIAL) < PER_LIMB_STEEL_COST)
to_chat(src,"You're missing that limb, and need to store at least [PER_LIMB_STEEL_COST] steel to regenerate it.")
return
@@ -33,6 +33,10 @@
return
if(!refactory.use_stored_material(DEFAULT_WALL_MATERIAL,PER_LIMB_STEEL_COST))
return
+ if(organs_by_name[choice])
+ var/obj/item/organ/external/oldlimb = organs_by_name[choice]
+ oldlimb.removed()
+ qdel(oldlimb)
var/mob/living/simple_animal/protean_blob/blob = nano_intoblob()
active_regen = TRUE
@@ -60,7 +64,7 @@
usable_manufacturers[company] = M
if(!usable_manufacturers.len)
return
- var/manu_choice = input(src, "Which manufacturer do you wish to mimmic for this limb?", "Manufacturer for [choice]") as null|anything in usable_manufacturers
+ var/manu_choice = input(src, "Which manufacturer do you wish to mimic for this limb?", "Manufacturer for [choice]") as null|anything in usable_manufacturers
if(!manu_choice)
return //Changed mind
@@ -70,13 +74,13 @@
return //Lost it meanwhile
eo.robotize(manu_choice)
- visible_message("[src]'s ")
+ visible_message("[src]'s [choice] loses its shape, then reforms.")
update_icons_body()
////
// Full Refactor
////
-/mob/living/carbon/human/proc/nano_regenerate()
+/mob/living/carbon/human/proc/nano_regenerate() //fixed the proc, it used to leave active_regen true.
set name = "Ref - Whole Body"
set desc = "Allows you to regrow limbs and replace organs, given you have enough materials."
set category = "Abilities"
@@ -97,7 +101,7 @@
to_chat(src, "You are already refactoring!")
return
- var/swap_not_rebuild = alert(src,"Do you want to rebuild, or reshape?","Rebuild or Reshape","Rebuild","Cancel","Reshape")
+ var/swap_not_rebuild = alert(src,"Do you want to rebuild, or reshape?","Rebuild or Reshape","Reshape","Cancel","Rebuild")
if(swap_not_rebuild == "Cancel")
return
if(swap_not_rebuild == "Reshape")
@@ -113,7 +117,7 @@
usable_manufacturers[company] = M
if(!usable_manufacturers.len)
return
- var/manu_choice = input(src, "Which manufacturer do you wish to mimmic?", "Manufacturer") as null|anything in usable_manufacturers
+ var/manu_choice = input(src, "Which manufacturer do you wish to mimic?", "Manufacturer") as null|anything in usable_manufacturers
if(!manu_choice)
return //Changed mind
@@ -123,7 +127,7 @@
var/obj/item/organ/external/torso = organs_by_name[BP_TORSO]
to_chat(src, "Remain still while the process takes place! It will take 5 seconds.")
visible_message("[src]'s form collapses into an amorphous blob of black ichor...")
-
+
var/mob/living/simple_animal/protean_blob/blob = nano_intoblob()
active_regen = TRUE
if(do_after(blob,5 SECONDS))
@@ -145,13 +149,13 @@
visible_message("[src]'s form begins to shift and ripple as if made of oil...")
active_regen = TRUE
- nano_intoblob()
- if(do_after(src,delay_length))
+ var/mob/living/simple_animal/protean_blob/blob = nano_intoblob()
+ if(do_after(blob, delay_length, null, 0))
if(stat != DEAD && refactory)
var/list/holder = refactory.materials
species.create_organs(src)
var/obj/item/organ/external/torso = organs_by_name[BP_TORSO]
- torso.robotize(synthetic.company)
+ torso.robotize() //synthetic wasn't defined here.
LAZYCLEARLIST(blood_DNA)
LAZYCLEARLIST(feet_blood_DNA)
blood_color = null
@@ -162,9 +166,15 @@
log_debug("[src] protean-regen'd but lacked a refactory when done.")
else
new_refactory.materials = holder
- to_chat(src, "Your refactoring is complete!")
+ to_chat(src, "Your refactoring is complete.") //Guarantees the message shows no matter how bad the timing.
+ to_chat(blob, "Your refactoring is complete!")
+ else
+ to_chat(src, "Your refactoring has failed.")
+ to_chat(blob, "Your refactoring has failed!")
else
- to_chat(src, "Your refactoring is interrupted!")
+ to_chat(src, "Your refactoring is interrupted.")
+ to_chat(blob, "Your refactoring is interrupted!")
+ active_regen = FALSE
nano_outofblob()
@@ -189,11 +199,19 @@
return
var/obj/item/stack/material/matstack = held
+ var/substance = matstack.material.name
+ var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones.
+ var allowed = FALSE
+ for(var/material in edible_materials)
+ if(material == substance) allowed = TRUE
+ if(!allowed)
+ to_chat(src,"You can't process [substance]!")
+ return //Only a few things matter, the rest are best not cluttering the lists.
+
var/howmuch = input(src,"How much do you want to store? (0-[matstack.amount])","Select amount") as null|num
if(!howmuch || matstack != get_active_hand() || howmuch > matstack.amount)
return //Quietly fail
- var/substance = matstack.material.name
var/actually_added = refactory.add_stored_material(substance,howmuch*matstack.perunit)
matstack.use(Ceiling(actually_added/matstack.perunit))
if(actually_added && actually_added < howmuch)
@@ -222,7 +240,7 @@
to_chat(temporary_form,"You can only do this while not stunned.")
else
nano_outofblob(temporary_form)
-
+
//Human form
else if(stat)
to_chat(src,"You can only do this while not stunned.")
@@ -241,7 +259,7 @@
if(stat)
to_chat(src,"You must be awake and standing to perform this action!")
return
-
+
var/new_species = input("Please select a species to emulate.", "Shapeshifter Body") as null|anything in playable_species
if(new_species)
impersonate_bodytype = new_species
@@ -269,7 +287,7 @@
return
var/size_factor = new_size/100
-
+
//Will be: -1.75 for 200->25, and 1.75 for 25->200
var/sizediff = size_factor - user.size_multiplier
@@ -361,7 +379,7 @@
desc = "Rebuild or replace a single limb, assuming you have 2000 steel."
icon_state = "limb"
to_call = /mob/living/carbon/human/proc/nano_partswap
-
+
/obj/effect/protean_ability/reform_body
ability_name = "Ref - Whole Body"
desc = "Rebuild your entire body into whatever design you want, assuming you have 10,000 metal."
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
index 05237f5742..52aad66fcc 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
@@ -21,6 +21,7 @@
health_hud_intensity = 2
num_alternate_languages = 3
species_language = LANGUAGE_SOL_COMMON
+ assisted_langs = list(LANGUAGE_EAL)
color_mult = TRUE
breath_type = null
@@ -115,7 +116,7 @@
/datum/species/protean/create_organs(var/mob/living/carbon/human/H)
var/obj/item/device/nif/saved_nif = H.nif
if(saved_nif)
- H.nif.unimplant()
+ H.nif.unimplant(H) //Needs reference to owner to unimplant right.
H.nif.forceMove(null)
..()
if(saved_nif)
@@ -162,13 +163,14 @@
/datum/species/protean/handle_death(var/mob/living/carbon/human/H)
to_chat(H,"You died as a Protean. Please sit out of the round for at least 30 minutes before respawning, to represent the time it would take to ship a new-you to the station.")
- spawn(1)
+ spawn(1) //This spawn is here so that if the protean_blob calls qdel, it doesn't try to gib the humanform.
if(H)
H.gib()
/datum/species/protean/handle_environment_special(var/mob/living/carbon/human/H)
if((H.getActualBruteLoss() + H.getActualFireLoss()) > H.maxHealth*0.5 && isturf(H.loc)) //So, only if we're not a blob (we're in nullspace) or in someone (or a locker, really, but whatever)
H.nano_intoblob()
+ return ..() //Any instakill shot runtimes since there are no organs after this. No point to not skip these checks, going to nullspace anyway.
var/obj/item/organ/internal/nano/refactory/refactory = locate() in H.internal_organs
if(refactory && !(refactory.status & ORGAN_DEAD))
diff --git a/code/modules/organs/subtypes/nano.dm b/code/modules/organs/subtypes/nano.dm
index 39398f5909..fe23f37f85 100644
--- a/code/modules/organs/subtypes/nano.dm
+++ b/code/modules/organs/subtypes/nano.dm
@@ -109,9 +109,9 @@
/obj/item/organ/internal/nano/refactory/proc/use_stored_material(var/material,var/amt)
if(status & ORGAN_DEAD)
return 0
-
+
var/available = materials[material]
-
+
//Success
if(available >= amt)
var/new_amt = available-amt
@@ -141,12 +141,13 @@
. = ..()
icon_state = "posi1"
+
/obj/item/organ/internal/mmi_holder/posibrain/nano/update_from_mmi()
. = ..()
icon = initial(icon)
icon_state = "posi1"
stored_mmi.icon_state = "posi1"
-
+
stored_mmi.brainmob.languages = owner.languages
// The 'out on the ground' object, not the organ holder
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 4b69151b2b..1241f036d4 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -28,6 +28,7 @@
var/tab = "home"
var/analyze_data[0]
flags = OPENCONTAINER
+ clicksound = "button"
/obj/machinery/chem_master/New()
..()
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
index e6bced87c4..a32f83f794 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
@@ -48,6 +48,12 @@
if(H.species.gets_food_nutrition == 0)
H.nutrition += removed
is_vampire = 1 //VOREStation Edit END
+ if(alien == IS_SLIME) // Treat it like nutriment for the jello, but not equivalent.
+ M.heal_organ_damage(0.2 * removed * volume_mod, 0) // More 'effective' blood means more usable material.
+ M.nutrition += 20 * removed * volume_mod
+ M.add_chemical_effect(CE_BLOODRESTORE, 4 * removed)
+ M.adjustToxLoss(removed / 2) // Still has some water in the form of plasma.
+ return
if(effective_dose > 5)
if(is_vampire == 0) //VOREStation Edit.
@@ -68,6 +74,9 @@
var/mob/living/carbon/human/H = M
if(H.isSynthetic())
return
+ if(alien == IS_SLIME)
+ affect_ingest(M, alien, removed)
+ return
if(data && data["virus2"])
var/list/vlist = data["virus2"]
if(vlist.len)
@@ -79,6 +88,9 @@
M.antibodies |= data["antibodies"]
/datum/reagent/blood/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_SLIME) //They don't have blood, so it seems weird that they would instantly 'process' the chemical like another species does.
+ affect_ingest(M, alien, removed)
+ return
M.inject_blood(src, volume * volume_mod)
remove_self(volume)
diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm
index e786751e5d..4c8e97850d 100644
--- a/code/modules/vore/appearance/sprite_accessories_vr.dm
+++ b/code/modules/vore/appearance/sprite_accessories_vr.dm
@@ -531,6 +531,13 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+/datum/sprite_accessory/wing/feathered_medium
+ name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys.
+ desc = ""
+ icon_state = "feathered3"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
/datum/sprite_accessory/wing/bat_black
name = "bat wings, black"
desc = ""
diff --git a/html/changelogs/Kates - Hedgetrimmers.yml b/html/changelogs/Kates - Hedgetrimmers.yml
new file mode 100644
index 0000000000..142f879e40
--- /dev/null
+++ b/html/changelogs/Kates - Hedgetrimmers.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: LBnesquik
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Remplaced the plant clippers with a reskinned pair of hedgetrimmers."
diff --git a/html/changelogs/Lbnesquik - Botany improvements #5662.yml b/html/changelogs/Lbnesquik - Botany improvements #5662.yml
new file mode 100644
index 0000000000..980a849850
--- /dev/null
+++ b/html/changelogs/Lbnesquik - Botany improvements #5662.yml
@@ -0,0 +1,44 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Lbnesquik
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "General biogenerator improvements:"
+ - rscadd: "Added feedback noise to the processing."
+ - rscadd: "Allow for cream dispensing."
+ - rscadd: "Allow for plant bag creation."
+ - rscadd: "Allow for 5 units of meat to be dispensed at once."
+ - rscadd: "Allow for 5 units of liquids to be dispensed at once totalling 50u."
+ - rscadd: "Add and allow the creation of larger plant bags for easier ferrying of plants.."
+ - rscadd: "Add a description to the machine itself."
+ - bugfix: "Fix a typo."
diff --git a/html/changelogs/Mechoid-PromBlud.yml b/html/changelogs/Mechoid-PromBlud.yml
new file mode 100644
index 0000000000..e08778ff4d
--- /dev/null
+++ b/html/changelogs/Mechoid-PromBlud.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Mechoid
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Prometheans are no longer murdered by blood, and instead process it like a weak nutrient. Will slow the regeneration of toxins due to water content."
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index c02abf60c8..41d2fbd305 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index 0e16db099e..d24841e6c1 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/mob/vore/wings_vr.dmi b/icons/mob/vore/wings_vr.dmi
index f4241e295c..42d2cf426d 100644
Binary files a/icons/mob/vore/wings_vr.dmi and b/icons/mob/vore/wings_vr.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index b25a6cbc56..a7d05818bf 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/sound/machines/biogenerator_end.ogg b/sound/machines/biogenerator_end.ogg
new file mode 100644
index 0000000000..91ec8313fe
Binary files /dev/null and b/sound/machines/biogenerator_end.ogg differ
diff --git a/sound/machines/button1.ogg b/sound/machines/button1.ogg
new file mode 100644
index 0000000000..3499e2d172
Binary files /dev/null and b/sound/machines/button1.ogg differ
diff --git a/sound/machines/button2.ogg b/sound/machines/button2.ogg
new file mode 100644
index 0000000000..83970986e3
Binary files /dev/null and b/sound/machines/button2.ogg differ
diff --git a/sound/machines/button3.ogg b/sound/machines/button3.ogg
new file mode 100644
index 0000000000..a28da269ad
Binary files /dev/null and b/sound/machines/button3.ogg differ
diff --git a/sound/machines/button4.ogg b/sound/machines/button4.ogg
new file mode 100644
index 0000000000..9fceed1611
Binary files /dev/null and b/sound/machines/button4.ogg differ
diff --git a/sound/machines/switch1.ogg b/sound/machines/switch1.ogg
new file mode 100644
index 0000000000..96f2a0e19c
Binary files /dev/null and b/sound/machines/switch1.ogg differ
diff --git a/sound/machines/switch2.ogg b/sound/machines/switch2.ogg
new file mode 100644
index 0000000000..346ab69a32
Binary files /dev/null and b/sound/machines/switch2.ogg differ
diff --git a/sound/machines/switch3.ogg b/sound/machines/switch3.ogg
new file mode 100644
index 0000000000..1529b0009a
Binary files /dev/null and b/sound/machines/switch3.ogg differ
diff --git a/sound/machines/switch4.ogg b/sound/machines/switch4.ogg
new file mode 100644
index 0000000000..cd51d4deb0
Binary files /dev/null and b/sound/machines/switch4.ogg differ