diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 68c74c614e9..6de12ac074b 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -45,7 +45,7 @@ var/global/list/skin_styles_female_list = list() //unused
var/global/list/underwear_m = list("White" = "m1", "Grey" = "m2", "Green" = "m3", "Blue" = "m4", "Black" = "m5", "Mankini" = "m6", "None") //Curse whoever made male/female underwear diffrent colours
var/global/list/underwear_f = list("Red" = "f1", "White" = "f2", "Yellow" = "f3", "Blue" = "f4", "Black" = "f5", "Thong" = "f6", "Black Sports" = "f7","White Sports" = "f8","None")
//undershirt
-var/global/list/undershirt_t = list("Black Tank top" = "u1", "White Tank top" = "u2", "Black shirt" = "u3", "White shirt" = "u4", "None")
+var/global/list/undershirt_t = list("White Tank top" = "u1", "Black Tank top" = "u2", "Black shirt" = "u3", "White shirt" = "u4", "None")
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index 6aa43c1b390..b7809c4460e 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -350,7 +350,12 @@ Auto Patrol: []"},
if(istype(src.target,/mob/living/carbon))
var/mob/living/carbon/C = target
- if(!C.handcuffed && !src.arrest_type)
+ var/wearing_hardsuit
+ if(istype(C,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = C
+ if(istype(H.back, /obj/item/weapon/rig) && istype(H.gloves,/obj/item/clothing/gloves/rig))
+ wearing_hardsuit = 1
+ if(!wearing_hardsuit && !C.handcuffed && !src.arrest_type)
playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2)
mode = SECBOT_ARREST
visible_message("\red [src] is trying to put handcuffs on [src.target]!")
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 246636890da..5ed83d086b3 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -28,7 +28,7 @@
if (C == user)
place_handcuffs(user, user)
return
-
+
//check for an aggressive grab
for (var/obj/item/weapon/grab/G in C.grabbed_by)
if (G.loc == user && G.state >= GRAB_AGGRESSIVE)
@@ -41,11 +41,15 @@
if (ishuman(target))
var/mob/living/carbon/human/H = target
-
+
if (!H.has_organ_for_slot(slot_handcuffed))
- user << "\red \The [H] needs at least two wrists before you can cuff them together!"
+ user << "\The [H] needs at least two wrists before you can cuff them together!"
return
-
+
+ if(istype(H.gloves,/obj/item/clothing/gloves/rig)) // Can't cuff someone who's in a deployed hardsuit.
+ user << "The cuffs won't fit around \the [H.gloves]!"
+ return
+
H.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [H.name] ([H.ckey])")
msg_admin_attack("[key_name(user)] attempted to handcuff [key_name(H)]")
@@ -62,7 +66,7 @@
feedback_add_details("handcuffs","H")
O.process()
return
-
+
if (ismonkey(target))
var/mob/living/carbon/monkey/M = target
var/obj/effect/equip_e/monkey/O = new /obj/effect/equip_e/monkey( )
@@ -155,13 +159,13 @@ var/last_chew = 0
var/turf/p_loc_m = C.loc
playsound(src.loc, cuff_sound, 30, 1, -2)
user.visible_message("\red [user] is trying to put handcuffs on [C]!")
-
+
if (ishuman(C))
var/mob/living/carbon/human/H = C
if (!H.has_organ_for_slot(slot_handcuffed))
user << "\red \The [H] needs at least two wrists before you can cuff them together!"
return
-
+
spawn(30)
if(!C) return
if(p_loc == user.loc && p_loc_m == C.loc)
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index b4281a6033a..ec55e6549e1 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -248,6 +248,10 @@
glass = 1
else if(istype(S, /obj/item/stack/sheet/mineral) && S.sheettype)
var/M = S.sheettype
+ // Ugly hack, will suffice for now. Need to fix it upstream as well, may rewrite mineral walls. ~Z
+ if(M in list("mhydrogen","osmium","tritium","platinum","iron"))
+ user << "You cannot make an airlock out of that material."
+ return
if(S.get_amount() >= 2)
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 0512b814b2c..85415cd1629 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -26,7 +26,7 @@
var/damage = Proj.damage
if(!istype(Proj, /obj/item/projectile/beam))
damage *= 0.4 //non beams do reduced damage
-
+
health -= damage
..()
if(health <= 0)
@@ -144,6 +144,10 @@
if(S.sheettype)
var/M = S.sheettype
+ // Ugly hack, will suffice for now. Need to fix it upstream as well, may rewrite mineral walls. ~Z
+ if(M in list("mhydrogen","osmium","tritium","platinum","iron"))
+ user << "You cannot plate the girder in that material."
+ return
if(!anchored)
if(S.amount < 2) return
S.use(2)
@@ -271,11 +275,11 @@
//Girders only provide partial cover. There's a chance that the projectiles will just pass through. (unless you are trying to shoot the girder)
if(Proj.original != src && !prob(cover))
return -1 //pass through
-
+
//Tasers and the like should not damage cultgirders.
if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN))
return
-
+
health -= Proj.damage
..()
if(health <= 0)
diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm
index e914ce7c3d5..84cbc727deb 100644
--- a/code/modules/hydroponics/seed_controller.dm
+++ b/code/modules/hydroponics/seed_controller.dm
@@ -2,7 +2,7 @@
// Processes vines/spreading plants.
#define PLANTS_PER_TICK 500 // Cap on number of plant segments processed.
-#define PLANT_TICK_TIME 25 // Number of ticks between the plant processor cycling.
+#define PLANT_TICK_TIME 75 // Number of ticks between the plant processor cycling.
// Debug for testing seed genes.
/client/proc/show_plant_genes()
diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm
index 561210537dd..d47a6582a96 100644
--- a/code/modules/hydroponics/seed_datums.dm
+++ b/code/modules/hydroponics/seed_datums.dm
@@ -685,7 +685,7 @@
name = "wheat"
seed_name = "wheat"
display_name = "wheat stalks"
- chems = list("nutriment" = list(1,25))
+ chems = list("nutriment" = list(1,25), "flour" = list(1,25))
kitchen_tag = "wheat"
/datum/seed/wheat/New()
@@ -916,7 +916,7 @@
set_trait(TRAIT_PRODUCTION,5)
set_trait(TRAIT_YIELD,3)
set_trait(TRAIT_POTENCY,10)
- set_trait(TRAIT_PRODUCT_ICON,"treefruit")
+ set_trait(TRAIT_PRODUCT_ICON,"cherry")
set_trait(TRAIT_PRODUCT_COLOUR,"#8C0101")
set_trait(TRAIT_PLANT_ICON,"tree2")
diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm
index 0729b2b3437..64ef1b55c6e 100644
--- a/code/modules/hydroponics/spreading/spreading_growth.dm
+++ b/code/modules/hydroponics/spreading/spreading_growth.dm
@@ -1,9 +1,17 @@
#define NEIGHBOR_REFRESH_TIME 100
+/obj/effect/plant/proc/get_cardinal_neighbors()
+ var/list/cardinal_neighbors = list()
+ for(var/check_dir in cardinal)
+ var/turf/simulated/T = get_step(get_turf(src), check_dir)
+ if(istype(T))
+ cardinal_neighbors |= T
+ return cardinal_neighbors
+
/obj/effect/plant/proc/update_neighbors()
// Update our list of valid neighboring turfs.
neighbors = list()
- for(var/turf/simulated/floor/floor in range(1,src))
+ for(var/turf/simulated/floor in get_cardinal_neighbors())
if(get_dist(parent, floor) > spread_distance)
continue
if((locate(/obj/effect/plant) in floor.contents) || (locate(/obj/effect/dead_plant) in floor.contents) )
@@ -80,10 +88,12 @@
// Kill off our plant.
if(plant) plant.die()
// This turf is clear now, let our buddies know.
- var/turf/T = get_turf(src)
- for(var/obj/effect/plant/neighbor in range(1,src))
- neighbor.neighbors |= T
- plant_controller.add_plant(neighbor)
+ for(var/turf/simulated/check_turf in get_cardinal_neighbors())
+ if(!istype(check_turf))
+ continue
+ for(var/obj/effect/plant/neighbor in check_turf.contents)
+ neighbor.neighbors |= check_turf
+ plant_controller.add_plant(neighbor)
spawn(1) if(src) del(src)
#undef NEIGHBOR_REFRESH_TIME
\ No newline at end of file
diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm
index ccf74e4ef71..1f8a0cc4688 100644
--- a/code/modules/hydroponics/spreading/spreading_response.dm
+++ b/code/modules/hydroponics/spreading/spreading_response.dm
@@ -63,8 +63,8 @@
victim.buckled = src
victim.update_canmove()
buckled_mob = victim
-
- if(victim.loc != src.loc)
+ var/turf/T = get_turf(src)
+ if(victim.loc != T && T.Enter(victim, get_turf(victim)))
src.visible_message("Tendrils lash out from \the [src] and drag \the [victim] in!")
victim.loc = src.loc
victim << "Tendrils [pick("wind", "tangle", "tighten")] around you!"
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index d915a116c58..19f181d03e7 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -592,15 +592,20 @@
if(!environment) //We're in a crate or nullspace, bail out.
return
- var/area/A = T.loc
- var/light_available
- if(A)
- if(A.lighting_use_dynamic)
- light_available = max(0,min(10,T.lighting_lumcount)-5)
- else
- light_available = 5
+ var/light_string
+ if(closed_system && mechanical)
+ light_string = "that the internal lights are set to [tray_light] lumens"
+ else
+ var/area/A = T.loc
+ var/light_available
+ if(A)
+ if(A.lighting_use_dynamic)
+ light_available = max(0,min(10,T.lighting_lumcount)-5)
+ else
+ light_available = 5
+ light_string = "a light level of [light_available] lumens"
- usr << "The tray's sensor suite is reporting a light level of [light_available] lumens and a temperature of [environment.temperature]K."
+ usr << "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K."
/obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb()
set name = "Toggle Tray Lid"
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 943f90bcca2..ea4f9f9d41d 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -35,8 +35,8 @@
/datum/unarmed_attack/bite
)
var/list/unarmed_attacks = null // For empty hand harm-intent attack
- var/brute_mod = null // Physical damage reduction/malus.
- var/burn_mod = null // Burn damage reduction/malus.
+ var/brute_mod = 1 // Physical damage multiplier.
+ var/burn_mod = 1 // Burn damage multiplier.
// Death vars.
var/gibber_type = /obj/effect/gibspawner/human
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index 10b11648d16..68df16d0204 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -69,7 +69,7 @@
wrapped = null
return
- src.loc << "\red You drop \the [wrapped]."
+ src.loc << "You drop \the [wrapped]."
wrapped.loc = get_turf(src)
wrapped = null
//update_icon()
@@ -79,6 +79,9 @@
/obj/item/weapon/gripper/afterattack(var/atom/target, var/mob/living/user, proximity, params)
+ if(!proximity)
+ return // This will prevent them using guns at range but adminbuse can add them directly to modules, so eh.
+
//There's some weirdness with items being lost inside the arm. Trying to fix all cases. ~Z
if(!wrapped)
for(var/obj/item/thing in src.contents)
@@ -123,7 +126,7 @@
wrapped = I
return
else
- user << "\red Your gripper cannot hold \the [target]."
+ user << "Your gripper cannot hold \the [target]."
else if(istype(target,/obj/machinery/power/apc))
var/obj/machinery/power/apc/A = target
@@ -140,7 +143,7 @@
A.charging = 0
A.update_icon()
- user.visible_message("\red [user] removes the power cell from [A]!", "You remove the power cell.")
+ user.visible_message("[user] removes the power cell from [A]!", "You remove the power cell.")
//TODO: Matter decompiler.
/obj/item/weapon/matter_decompiler
@@ -173,7 +176,7 @@
for(var/mob/M in T)
if(istype(M,/mob/living/simple_animal/lizard) || istype(M,/mob/living/simple_animal/mouse))
- src.loc.visible_message("\red [src.loc] sucks [M] into its decompiler. There's a horrible crunching noise.","\red It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.")
+ src.loc.visible_message("[src.loc] sucks [M] into its decompiler. There's a horrible crunching noise.","It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.")
new/obj/effect/decal/cleanable/blood/splatter(get_turf(src))
del(M)
if(wood)
@@ -270,16 +273,16 @@
grabbed_something = 1
if(grabbed_something)
- user << "\blue You deploy your decompiler and clear out the contents of \the [T]."
+ user << "You deploy your decompiler and clear out the contents of \the [T]."
else
- user << "\red Nothing on \the [T] is useful to you."
+ user << "Nothing on \the [T] is useful to you."
return
//PRETTIER TOOL LIST.
/mob/living/silicon/robot/drone/installed_modules()
if(weapon_lock)
- src << "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]"
+ src << "Weapon lock active, unable to use modules! Count:[weaponlock_time]"
return
if(!module)
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index df5a1f0dbfe..9ab669b4bba 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -481,14 +481,14 @@
user.drop_from_inventory(src)
del(src)
-/obj/item/weapon/reagent_containers/food/snacks/throw_impact(atom/hit_atom)
+/obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom)
..()
new/obj/effect/decal/cleanable/egg_smudge(src.loc)
src.reagents.reaction(hit_atom, TOUCH)
src.visible_message("\red [src.name] has been squashed.","\red You hear a smack.")
del(src)
-/obj/item/weapon/reagent_containers/food/snacks/attackby(obj/item/weapon/W as obj, mob/user as mob)
+/obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype( W, /obj/item/toy/crayon ))
var/obj/item/toy/crayon/C = W
var/clr = C.colourName
diff --git a/icons/obj/hydroponics_products.dmi b/icons/obj/hydroponics_products.dmi
index 4f9911debea..7708c4896aa 100644
Binary files a/icons/obj/hydroponics_products.dmi and b/icons/obj/hydroponics_products.dmi differ