diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index 681defddba2..687cebfb786 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -64,7 +64,7 @@
#define DNA_FACIAL_HAIR_STYLE_BLOCK 6
#define DNA_HAIR_STYLE_BLOCK 7
-#define DNA_STRUC_ENZYMES_BLOCKS 24
+#define DNA_STRUC_ENZYMES_BLOCKS 20
#define DNA_UNIQUE_ENZYMES_LEN 32
//Transformation proc stuff
diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm
index 2e5145df3e4..d999bf7bc9a 100644
--- a/code/datums/mutations.dm
+++ b/code/datums/mutations.dm
@@ -461,6 +461,7 @@
/datum/mutation/human/smile
name = "Smile"
quality = MINOR_NEGATIVE
+ dna_block = NON_SCANNABLE
text_gain_indication = "You feel so happy. Nothing can be wrong with anything. :)"
text_lose_indication = "Everything is terrible again. :("
@@ -547,6 +548,7 @@
/datum/mutation/human/swedish
name = "Swedish"
quality = MINOR_NEGATIVE
+ dna_block = NON_SCANNABLE
text_gain_indication = "You feel Swedish, however that works."
text_lose_indication = "The feeling of Swedishness passes."
@@ -560,6 +562,7 @@
/datum/mutation/human/chav
name = "Chav"
quality = MINOR_NEGATIVE
+ dna_block = NON_SCANNABLE
text_gain_indication = "Ye feel like a reet prat like, innit?"
text_lose_indication = "You no longer feel like being rude and sassy."
@@ -592,6 +595,7 @@
/datum/mutation/human/elvis
name = "Elvis"
quality = MINOR_NEGATIVE
+ dna_block = NON_SCANNABLE
text_gain_indication = "You feel pretty good, honeydoll."
text_lose_indication = "You feel a little less conversation would be great."
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index 116b60905f8..252fff68d1d 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -120,7 +120,9 @@
/obj/item/weapon/razor/attack(mob/M, mob/user)
if(ishuman(M))
var/mob/living/carbon/human/H = M
-
+ if(H.dna.species.id != "human")
+ user << "There is nothing to shave!"
+ return
var/location = user.zone_sel.selecting
if(location == "mouth")
if(!get_location_accessible(H, location))
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index e94ac89b828..094faaffb86 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -373,4 +373,16 @@
name = "\improper DNA injector (Anti-Elvis)"
New()
..()
- remove_mutations.Add(mutations_list[ELVIS])
\ No newline at end of file
+ remove_mutations.Add(mutations_list[ELVIS])
+
+/obj/item/weapon/dnainjector/lasereyesmut
+ name = "\improper DNA injector (Laser Eyes)"
+ New()
+ ..()
+ add_mutations.Add(mutations_list[LASEREYES])
+
+/obj/item/weapon/dnainjector/antilasereyes
+ name = "\improper DNA injector (Anti-Laser Eyes)"
+ New()
+ ..()
+ remove_mutations.Add(mutations_list[LASEREYES])
\ No newline at end of file
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 337bb4b1ff1..34afa00a980 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -4,6 +4,7 @@
icon_state = "chair"
buckle_lying = 0 //you sit in a chair, not lay
burn_state = -1 //Not Burnable
+ buildstackamount = 1
/obj/structure/bed/chair/New()
..()
@@ -27,6 +28,7 @@
SK.loc = E
SK.master = E
qdel(src)
+
/obj/structure/bed/chair/attack_tk(mob/user)
if(buckled_mob)
..()
@@ -105,6 +107,7 @@
color = rgb(255,255,255)
burn_state = 0 //Burnable
burntime = 30
+ buildstackamount = 2
var/image/armrest = null
/obj/structure/bed/chair/comfy/New()
diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm
index 1e0b4a791a2..1e796de56c0 100644
--- a/code/modules/food&drinks/kitchen machinery/gibber.dm
+++ b/code/modules/food&drinks/kitchen machinery/gibber.dm
@@ -97,23 +97,26 @@
/obj/machinery/gibber/attackby(obj/item/P, mob/user, params)
if (istype(P, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = P
- if(!istype(G.affecting, /mob/living/carbon/))
+ if(!iscarbon(G.affecting))
user << "This item is not suitable for the gibber!"
return
- if(G.affecting.abiotic(1) && !ignore_clothing)
+ var/mob/living/carbon/C = G.affecting
+ if(C.buckled ||C.buckled_mob)
+ user << "[C] is attached to something!"
+ return
+ if(C.abiotic(1) && !ignore_clothing)
user << "Subject may not have abiotic items on."
return
user.visible_message("[user] starts to put [G.affecting] into the gibber!")
src.add_fingerprint(user)
- if(do_after(user, gibtime, target = src) && G && G.affecting && !occupant)
+ if(do_after(user, gibtime, target = src) && G && G.affecting && G.affecting == C && !C.buckled && !C.buckled_mob && !occupant)
user.visible_message("[user] stuffs [G.affecting] into the gibber!")
- var/mob/M = G.affecting
- if(M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
- M.loc = src
- src.occupant = M
+ if(C.client)
+ C.client.perspective = EYE_PERSPECTIVE
+ C.client.eye = src
+ C.loc = src
+ occupant = C
qdel(G)
update_icon()
@@ -138,7 +141,7 @@
set name = "empty gibber"
set src in oview(1)
- if(usr.stat || !usr.canmove || usr.restrained())
+ if(usr.incapacitated())
return
src.go_out()
add_fingerprint(usr)
diff --git a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
index 22e76bc14c8..77c1cbd695f 100644
--- a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
+++ b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
@@ -56,23 +56,26 @@
if(!user.Adjacent(G.affecting))
return
var/grabbed = G.affecting
- if(istype(grabbed, /mob/living/carbon/monkey))
+ if(ismonkey(grabbed))
var/mob/living/carbon/monkey/target = grabbed
if(target.stat == 0)
- user << "The monkey is struggling far too much to put it in the recycler."
- else
- if(!user.drop_item())
- return
- qdel(target)
- user << "You stuff the monkey into the machine."
- playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
- var/offset = prob(50) ? -2 : 2
- animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
- use_power(500)
- src.grinded++
- sleep(50)
- pixel_x = initial(pixel_x) //return to its spot after shaking
- user << "The machine now has [grinded] monkey\s worth of material stored."
+ user << "The monkey is struggling far too much to put it in the recycler."
+ return
+ if(target.buckled || target.buckled_mob)
+ user << "The monkey is attached to something."
+ return
+ if(!user.drop_item())
+ return
+ qdel(target)
+ user << "You stuff the monkey into the machine."
+ playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
+ use_power(500)
+ grinded++
+ sleep(50)
+ pixel_x = initial(pixel_x) //return to its spot after shaking
+ user << "The machine now has [grinded] monkey\s worth of material stored."
else
user << "The machine only accepts monkeys!"
diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm
index 5db38bbc970..331d1c29449 100644
--- a/code/modules/food&drinks/kitchen machinery/processor.dm
+++ b/code/modules/food&drinks/kitchen machinery/processor.dm
@@ -152,21 +152,25 @@
default_deconstruction_crowbar(O)
- var/what = O
- if (istype(O, /obj/item/weapon/grab))
+ var/atom/movable/what = O
+ if(istype(O, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
if(!user.Adjacent(G.affecting))
return
+ if(G.affecting.buckled || G.affecting.buckled_mob)
+ user << "[G.affecting] is attached to somthing!"
+ return
what = G.affecting
var/datum/food_processor_process/P = select_recipe(what)
if (!P)
user << "That probably won't blend!"
return 1
+
user.visible_message("[user] put [what] into [src].", \
"You put the [what] into [src].")
user.drop_item()
- what:loc = src
+ what.loc = src
return
/obj/machinery/processor/attack_hand(mob/user)
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index e016b244338..ddb7d17ac2e 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -310,6 +310,7 @@
return
/obj/item/weapon/grown/snapcorn
+ seed = /obj/item/seeds/snapcornseed
name = "snap corn"
desc = "A cob with snap pops"
icon_state = "snapcorn"
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index 1d74c380039..7036ebcba2e 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -18,6 +18,9 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/components/unary
if(buckled_mob)
src << "You can't vent crawl with [buckled_mob] on you!"
return
+ if(buckled)
+ src << "You can't vent crawl while buckled!"
+ return
var/obj/machinery/atmospherics/components/unary/vent_found
@@ -68,6 +71,12 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/components/unary
else
src << "This ventilation duct is not connected to anything!"
+/mob/living/simple_animal/slime/handle_ventcrawl(atom/A)
+ if(buckled)
+ src << "I can't vent crawl while feeding..."
+ return
+ ..()
+
/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/components/unary/starting_machine)
if(!istype(starting_machine) || !starting_machine.returnPipenet())
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 8b42b95134d..364caabeebf 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -73,7 +73,7 @@
*/
/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
if(stat & (BROKEN)) return
- if(user.stat || user.restrained()) return
+ if(user.incapacitated()) return
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "chem_dispenser.tmpl", "[uiname]", 490, 710, 0)
@@ -100,7 +100,7 @@
data["beakerMaxVolume"] = null
var chemicals[0]
- for (var/re in dispensable_reagents)
+ for(var/re in dispensable_reagents)
var/datum/reagent/temp = chemical_reagents_list[re]
if(temp)
chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list...
@@ -215,7 +215,8 @@
recharge_delay /= time/2 //delay between recharges, double the usual time on lowest 50% less than usual on highest
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
for(i=1, i<=M.rating, i++)
- dispensable_reagents = sortList(dispensable_reagents | special_reagents[i])
+ dispensable_reagents |= special_reagents[i]
+ dispensable_reagents = sortList(dispensable_reagents)
/obj/machinery/chem_dispenser/constructable/attackby(var/obj/item/I, var/mob/user, params)
..()
diff --git a/html/changelogs/phil235-BugFixBoogalooG.yml b/html/changelogs/phil235-BugFixBoogalooG.yml
new file mode 100644
index 00000000000..9cf7d8b07de
--- /dev/null
+++ b/html/changelogs/phil235-BugFixBoogalooG.yml
@@ -0,0 +1,37 @@
+################################
+# 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
+# spellcheck (typo fixes)
+# experiment
+# tgs (TG-ported fixes?)
+#################################
+
+# Your name.
+author: N3X15
+
+# 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, this gets changed to [] after reading. Just remove the brackets when you add new shit.
+# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added a changelog editing system that should cause fewer conflicts and more accurate timestamps."
+ - rscdel: "Killed innocent kittens."
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index f9f2ff23ed7..3d38396674c 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ