diff --git a/code/__DEFINES/icon_smoothing_defines.dm b/code/__DEFINES/icon_smoothing_defines.dm
index 0d2fdaf958a..882a2c4b2cc 100644
--- a/code/__DEFINES/icon_smoothing_defines.dm
+++ b/code/__DEFINES/icon_smoothing_defines.dm
@@ -57,11 +57,13 @@ DEFINE_BITFIELD(smoothing_flags, list(
#define SMOOTH_GROUP_CARPET_CYAN S_TURF(13)
#define SMOOTH_GROUP_CARPET_GREEN S_TURF(14)
#define SMOOTH_GROUP_CARPET_ROYALBLACK S_TURF(15)
-#define SMOOTH_GROUP_CARPET_ROYALBLUE S_TURF(17)
+#define SMOOTH_GROUP_CARPET_ROYALBLUE S_TURF(16)
#define SMOOTH_GROUP_CARPET_RED S_TURF(17)
#define SMOOTH_GROUP_CARPET_ORANGE S_TURF(18)
#define SMOOTH_GROUP_CARPET_PURPLE S_TURF(19)
+#define SMOOTH_GROUP_BAMBOO S_TURF(20) ///turf/simulated/floor/bamboo
+
#define SMOOTH_GROUP_SIMULATED_TURFS S_TURF(24) ///turf/simulated
#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(25) ///turf/simulated/wall/material
#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(26) ///turf/simulated/wall/r_wall/syndicate, /turf/simulated/indestructible/syndicate
@@ -91,6 +93,7 @@ DEFINE_BITFIELD(smoothing_flags, list(
#define SMOOTH_GROUP_IRON_WALLS S_OBJ(9) ///turf/simulated/wall/mineral/iron, /obj/structure/falsewall/iron
#define SMOOTH_GROUP_ABDUCTOR_WALLS S_OBJ(10) ///turf/simulated/wall/mineral/abductor, /obj/structure/falsewall/abductor
#define SMOOTH_GROUP_TITANIUM_WALLS S_OBJ(11) ///turf/simulated/wall/mineral/titanium, /obj/structure/falsewall/titanium
+#define SMOOTH_GROUP_ASTEROID_WALLS S_OBJ(12) ///turf/simulated/mineral, /obj/structure/falsewall/rock_ancient
#define SMOOTH_GROUP_PLASTITANIUM_WALLS S_OBJ(13) ///turf/simulated/wall/mineral/plastitanium, /obj/structure/falsewall/plastitanium
#define SMOOTH_GROUP_SURVIVAL_TIANIUM_POD S_OBJ(14) ///turf/simulated/wall/mineral/titanium/survival/pod, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod
#define SMOOTH_GROUP_HIERO_WALL S_OBJ(15) ///obj/effect/temp_visual/elite_tumor_wall, /obj/effect/temp_visual/hierophant/wall
@@ -98,7 +101,6 @@ DEFINE_BITFIELD(smoothing_flags, list(
#define SMOOTH_GROUP_REGULAR_WALLS S_OBJ(17) ///turf/simulated/wall, /obj/structure/falsewall
#define SMOOTH_GROUP_REINFORCED_WALLS S_OBJ(18) ///turf/simulated/wall/r_wall, /obj/structure/falsewall/reinforced
#define SMOOTH_GROUP_CULT_WALLS S_OBJ(19) ///turf/simulated/wall/cult
-#define SMOOTH_GROUP_ASTEROID_WALLS S_OBJ(12) ///turf/simulated/mineral, /obj/structure/falsewall/rock_ancient
#define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(21) ///turf/simulated/indestructible/fakeglass, /obj/structure/window/full/basic, /obj/structure/window/full/plasmabasic, /obj/structure/window/full/plasmareinforced, /obj/structure/window/full/reinforced
#define SMOOTH_GROUP_WINDOW_FULLTILE_BRASS S_OBJ(22) ///obj/structure/window/brass/fulltile
diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm
index 4446dde3a26..f9bd2931c64 100644
--- a/code/datums/components/caltrop.dm
+++ b/code/datums/components/caltrop.dm
@@ -1,18 +1,30 @@
/datum/component/caltrop
+ ///Minimum damage when crossed
var/min_damage
+
+ ///Maximum damage when crossed
var/max_damage
+
+ ///Probability of stunning and doing daamge
var/probability
+
+ ///Duration of weaken when crossed
+ var/weaken_duration
+
+ ///Shoebypassing, walking interaction, silence
var/flags
var/cooldown = 0
-/datum/component/caltrop/Initialize(_min_damage = 0, _max_damage = 0, _probability = 100, _flags = NONE)
- min_damage = _min_damage
- max_damage = max(_min_damage, _max_damage)
- probability = _probability
- flags = _flags
+/datum/component/caltrop/Initialize(_min_damage = 0, _max_damage = 0, _probability = 100, _weaken_duration = 6 SECONDS, _flags = NONE)
+ src.min_damage = _min_damage
+ src.max_damage = max(_min_damage, _max_damage)
+ src.probability = _probability
+ src.weaken_duration = _weaken_duration
+ src.flags = _flags
- RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED), PROC_REF(Crossed))
+/datum/component/caltrop/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, PROC_REF(Crossed))
/datum/component/caltrop/proc/Crossed(datum/source, atom/movable/AM)
var/atom/A = parent
@@ -22,41 +34,51 @@
if(!prob(probability))
return
- if(ishuman(AM))
- var/mob/living/carbon/human/H = AM
- if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE))
- return
+ if(!ishuman(AM))
+ return
- if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK)
- return
+ var/mob/living/carbon/human/H = AM
- var/picked_def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
- var/obj/item/organ/external/O = H.get_organ(picked_def_zone)
- if(!istype(O))
- return
- if(O.is_robotic())
- return
+ if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE))
+ return
- var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET))
+ if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK)
+ return
- if(!(flags & CALTROP_BYPASS_SHOES) && (H.shoes || feetCover))
- return
+ var/picked_def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+ var/obj/item/organ/external/O = H.get_organ(picked_def_zone)
- if(H.flying || H.floating || H.buckled)
- return
+ if(!istype(O))
+ return
- if(IS_HORIZONTAL(H) && HAS_TRAIT(H, TRAIT_CONTORTED_BODY))
- return TRUE
+ if(O.is_robotic())
+ return
- var/damage = rand(min_damage, max_damage)
+ var/feet_cover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET))
+ var/bypass_shoes = flags & CALTROP_BYPASS_SHOES
- H.apply_damage(damage, BRUTE, picked_def_zone)
+ // doesn't penetrate if feet are covered
+ if(!bypass_shoes && (H.shoes || feet_cover))
+ return
- if(cooldown < world.time - 10) //cooldown to avoid message spam.
- if(!H.incapacitated(ignore_restraints = TRUE))
- H.visible_message("[H] steps on [A].", "You step on [A]!")
- else
- H.visible_message("[H] slides on [A]!", "You slide on [A]!")
+ // doesn't penetrate shoes if feet are extra covered
+ if(bypass_shoes && (H.shoes && (H.shoes.flags & THICKMATERIAL)))
+ return
- cooldown = world.time
- H.Weaken(6 SECONDS)
+ if(H.flying || H.floating || H.buckled)
+ return
+
+ if(IS_HORIZONTAL(H) && HAS_TRAIT(H, TRAIT_CONTORTED_BODY))
+ return TRUE
+
+ var/damage = rand(min_damage, max_damage)
+ H.apply_damage(damage, BRUTE, picked_def_zone)
+
+ if(cooldown < world.time - 10) //cooldown to avoid message spam.
+ if(!H.incapacitated(ignore_restraints = TRUE))
+ H.visible_message("[H] steps on [A].", "You step on [A]!")
+ else
+ H.visible_message("[H] slides on [A]!", "You slide on [A]!")
+
+ cooldown = world.time
+ H.Weaken(weaken_duration)
diff --git a/code/game/machinery/vendors/departmental_vendors.dm b/code/game/machinery/vendors/departmental_vendors.dm
index 9da207c6d01..815fcce26c9 100644
--- a/code/game/machinery/vendors/departmental_vendors.dm
+++ b/code/game/machinery/vendors/departmental_vendors.dm
@@ -208,6 +208,7 @@
/obj/item/seeds/wheat/rice = 3,
/obj/item/seeds/soya = 3,
/obj/item/seeds/sugarcane = 3,
+ /obj/item/seeds/bamboo = 3,
/obj/item/seeds/sunflower = 3,
/obj/item/seeds/tea = 3,
/obj/item/seeds/tobacco = 3,
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index ba66cfd4ce4..8f15849d83f 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -233,11 +233,6 @@ GLOBAL_LIST_INIT(wood_recipes, list(
new /datum/stack_recipe("pew (left)", /obj/structure/chair/sofa/pew/left, 5, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("pew (right)", /obj/structure/chair/sofa/pew/right, 5, one_per_turf = TRUE, on_floor = TRUE),
)),
- new /datum/stack_recipe_list("bamboo benches", list(
- new /datum/stack_recipe("bamboo bench (middle)", /obj/structure/chair/sofa/bamboo, 2, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("bamboo bench (left)", /obj/structure/chair/sofa/bamboo/left, 2, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("bamboo bench (right)", /obj/structure/chair/sofa/bamboo/right, 2, one_per_turf = TRUE, on_floor = TRUE),
- )),
null,
new /datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 1.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 4 SECONDS),
@@ -270,6 +265,47 @@ GLOBAL_LIST_INIT(wood_recipes, list(
recipes = GLOB.wood_recipes
return ..()
+/*
+ * Bamboo
+ */
+GLOBAL_LIST_INIT(bamboo_recipes, list(
+ new /datum/stack_recipe("punji sticks trap", /obj/structure/punji_sticks, req_amount = 5, time = 3 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("bamboo spear", /obj/item/spear/bamboo, req_amount = 25, time = 9 SECONDS),
+ new /datum/stack_recipe("blow gun", /obj/item/gun/syringe/blowgun, req_amount = 10, time = 7 SECONDS),
+ new /datum/stack_recipe("rice hat", /obj/item/clothing/head/rice_hat, req_amount = 10, time = 7 SECONDS),
+ null,
+ new /datum/stack_recipe("bamboo mat piece", /obj/item/stack/tile/bamboo, req_amount = 1, res_amount = 4, max_res_amount = 20),
+ new /datum/stack_recipe_list("tatami mats", list(
+ new /datum/stack_recipe("green tatami", /obj/item/stack/tile/bamboo/tatami, req_amount = 1, res_amount = 4, max_res_amount = 20),
+ new /datum/stack_recipe("purple tatami", /obj/item/stack/tile/bamboo/tatami/purple, req_amount = 1, res_amount = 4, max_res_amount = 20),
+ new /datum/stack_recipe("black tatami", /obj/item/stack/tile/bamboo/tatami/black, req_amount = 1, res_amount = 4, max_res_amount = 20),
+ )),
+ null,
+ new /datum/stack_recipe_list("bamboo benches", list(
+ new /datum/stack_recipe("bamboo bench (middle)", /obj/structure/chair/sofa/bamboo, req_amount = 3, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("bamboo bench (left)", /obj/structure/chair/sofa/bamboo/left, req_amount = 3, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("bamboo bench (right)", /obj/structure/chair/sofa/bamboo/right, req_amount = 3, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE)
+ )),
+ ))
+
+/obj/item/stack/sheet/bamboo
+ name = "bamboo cuttings"
+ desc = "Finely cut bamboo sticks."
+ singular_name = "cut bamboo stick"
+ icon = 'icons/obj/stacks/organic.dmi'
+ icon_state = "sheet-bamboo"
+ item_state = "sheet-bamboo"
+ resistance_flags = FLAMMABLE
+ sheettype = "bamboo"
+ merge_type = /obj/item/stack/sheet/bamboo
+
+/obj/item/stack/sheet/bamboo/New(loc, amount=null)
+ recipes = GLOB.bamboo_recipes
+ return ..()
+
+/obj/item/stack/sheet/bamboo/fifty
+ amount = 50
+
/*
* Cloth
*/
diff --git a/code/game/objects/items/stacks/stack_recipe.dm b/code/game/objects/items/stacks/stack_recipe.dm
index 13acf7b06e4..2558b2dc017 100644
--- a/code/game/objects/items/stacks/stack_recipe.dm
+++ b/code/game/objects/items/stacks/stack_recipe.dm
@@ -3,19 +3,40 @@
* Recipe datum
*/
/datum/stack_recipe
+ /// Visible title of recipe
var/title = "ERROR"
+
+ /// Resulting typepath of crafted atom
var/result_type
+
+ /// Required stack amount to make
var/req_amount = 1
+
+ /// Amount of atoms made
var/res_amount = 1
+
+ /// Maximum amount of atoms made
var/max_res_amount = 1
+
+ /// Time to make
var/time = 0
- var/one_per_turf = 0
- var/on_floor = 0
- var/on_floor_or_lattice = 0
+
+ /// Only one resulting atom is allowed per turf
+ var/one_per_turf = FALSE
+
+ /// Requires a floor underneath to make
+ var/on_floor = FALSE
+
+ /// Requires a floor OR lattice underneath to make
+ var/on_floor_or_lattice = FALSE
+
+ /// Requires a valid window location to make
var/window_checks = FALSE
+
+ /// Resulting atom is a cult structure
var/cult_structure = FALSE
-/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, on_floor_or_lattice = 0, window_checks = FALSE, cult_structure = FALSE)
+/datum/stack_recipe/New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = FALSE, on_floor = FALSE, on_floor_or_lattice = FALSE, window_checks = FALSE, cult_structure = FALSE)
src.title = title
src.result_type = result_type
src.req_amount = req_amount
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index d299e7a0eb9..47adcccace0 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -68,6 +68,52 @@
energy_type = /datum/robot_storage/energy/wood_tile
is_cyborg = TRUE
+
+//Bamboo
+/obj/item/stack/tile/bamboo
+ name = "bamboo mat pieces"
+ singular_name = "bamboo mat piece"
+ gender = PLURAL
+ desc = "A piece of a bamboo mat with a decorative trim."
+ icon_state = "tile_bamboo"
+ turf_type = /turf/simulated/floor/bamboo
+ merge_type = /obj/item/stack/tile/bamboo
+ parent_stack = TRUE
+ resistance_flags = FLAMMABLE
+
+/obj/item/stack/tile/bamboo/twenty
+ amount = 20
+
+/obj/item/stack/tile/bamboo/tatami
+ name = "tatami with green rim"
+ singular_name = "green tatami floor tile"
+ icon_state = "tile_tatami_green"
+ turf_type = /turf/simulated/floor/bamboo/tatami
+ merge_type = /obj/item/stack/tile/bamboo/tatami
+
+/obj/item/stack/tile/bamboo/tatami/twenty
+ amount = 20
+
+/obj/item/stack/tile/bamboo/tatami/purple
+ name = "tatami with purple rim"
+ singular_name = "purple tatami floor tile"
+ icon_state = "tile_tatami_purple"
+ turf_type = /turf/simulated/floor/bamboo/tatami/purple
+ merge_type = /obj/item/stack/tile/bamboo/tatami/purple
+
+/obj/item/stack/tile/bamboo/tatami/purple/twenty
+ amount = 20
+
+/obj/item/stack/tile/bamboo/tatami/black
+ name = "tatami with black rim"
+ singular_name = "black tatami floor tile"
+ icon_state = "tile_tatami_black"
+ turf_type = /turf/simulated/floor/bamboo/tatami/black
+ merge_type = /obj/item/stack/tile/bamboo/tatami/black
+
+/obj/item/stack/tile/bamboo/tatami/black/twenty
+ amount = 20
+
//Carpets
/obj/item/stack/tile/carpet
name = "carpet"
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index d2f28de7e2a..fe099a83823 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -321,6 +321,13 @@
throwforce = 22
armour_penetration_percentage = 15 //Enhanced armor piercing
+//Blatant imitation of spear, but all natural. Also not valid for explosive modification.
+/obj/item/spear/bamboo
+ name = "bamboo spear"
+ desc = "A haphazardly-constructed bamboo stick with a sharpened tip, ready to poke holes into unsuspecting people."
+ base_icon_state = "bamboo_spear"
+ icon_state = "bamboo_spear0"
+ throwforce = 22
//GREY TIDE
/obj/item/spear/grey_tide
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index d38b69822c9..3bff273939c 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -86,6 +86,9 @@
if(istype(W, /obj/item/stack/sheet/runed_metal))
to_chat(user, "You can't seem to make the metal bend.")
return
+ if(istype(W, /obj/item/stack/sheet/bamboo)) // pending wall resprite(tm)
+ to_chat(user, "The bamboo doesn't seem to fit around the girder.")
+ return
if(istype(W,/obj/item/stack/rods))
var/obj/item/stack/rods/S = W
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 6f01518ae99..e472f9b19e7 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -424,7 +424,7 @@
resistance_flags = FLAMMABLE
max_integrity = 70
buildstackamount = 2
- buildstacktype = /obj/item/stack/sheet/wood
+ buildstacktype = /obj/item/stack/sheet/bamboo
/obj/structure/chair/sofa/bamboo/left
icon_state = "bamboo_sofaend_left"
@@ -453,7 +453,7 @@
resistance_flags = FLAMMABLE
max_integrity = 70
buildstackamount = 2
- buildstacktype = /obj/item/stack/sheet/wood
+ buildstacktype = /obj/item/stack/sheet/bamboo
/obj/item/chair
name = "chair"
@@ -497,8 +497,8 @@
/obj/item/chair/stool/bamboo
name = "bamboo stool"
desc = "Not the most comfortable, but vegan!"
- item_state = "bamboo_stool"
icon_state = "bamboo_stool_toppled"
+ item_state = "stool_bamboo"
origin_type = /obj/structure/chair/stool/bamboo
/obj/item/chair/attack_self(mob/user)
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 5f448fb6075..5a025355fa5 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -53,6 +53,7 @@
oxygen = 8
temperature = 500
+// Grass
/turf/simulated/floor/grass
name = "grass patch"
icon = 'icons/turf/floors/grass.dmi'
@@ -102,7 +103,6 @@
transform = null
//Carpets
-
/turf/simulated/floor/carpet
name = "carpet"
icon = 'icons/turf/floors/carpet.dmi'
@@ -204,9 +204,71 @@
oxygen = 0
nitrogen = 0
temperature = TCMB
-
//End of carpets
+// Bamboo mats
+/turf/simulated/floor/bamboo
+ name = "bamboo"
+ icon = 'icons/turf/floors/bamboo_mat.dmi'
+ icon_state = "mat-0"
+ base_icon_state = "mat"
+ floor_tile = /obj/item/stack/tile/bamboo
+ prying_tool_list = list(TOOL_SCREWDRIVER)
+ broken_states = list("bamboo-damaged")
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = list(SMOOTH_GROUP_TURF, SMOOTH_GROUP_BAMBOO)
+ canSmoothWith = list(SMOOTH_GROUP_BAMBOO)
+ footstep = FOOTSTEP_WOOD
+ barefootstep = FOOTSTEP_WOOD_BAREFOOT
+ clawfootstep = FOOTSTEP_WOOD_CLAW
+ heavyfootstep = FOOTSTEP_GENERIC_HEAVY
+
+/turf/simulated/floor/bamboo/Initialize(mapload)
+ . = ..()
+ update_icon()
+
+/turf/simulated/floor/bamboo/update_icon_state()
+ if(!broken && !burnt)
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ QUEUE_SMOOTH(src)
+ else
+ make_plating()
+ if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
+ QUEUE_SMOOTH_NEIGHBORS(src)
+
+/turf/simulated/floor/bamboo/break_tile()
+ broken = TRUE
+ update_icon()
+
+/turf/simulated/floor/bamboo/burn_tile()
+ burnt = TRUE
+ update_icon()
+
+/turf/simulated/floor/bamboo/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ return FALSE
+
+/turf/simulated/floor/bamboo/airless
+ oxygen = 0
+ nitrogen = 0
+ temperature = TCMB
+
+// Bamboo tatami mat
+/turf/simulated/floor/bamboo/tatami
+ desc = "A traditional Japanese floor mat."
+ icon_state = "bamboo-green"
+ broken_states = list("tatami-damaged")
+ floor_tile = /obj/item/stack/tile/bamboo/tatami
+ smoothing_flags = NONE
+
+/turf/simulated/floor/bamboo/tatami/purple
+ icon_state = "bamboo-purple"
+ floor_tile = /obj/item/stack/tile/bamboo/tatami/purple
+
+/turf/simulated/floor/bamboo/tatami/black
+ icon_state = "bamboo-black"
+ floor_tile = /obj/item/stack/tile/bamboo/tatami/black
+// End of bamboo
+
/turf/simulated/floor/fakespace
icon = 'icons/turf/space.dmi'
icon_state = "0"
diff --git a/code/modules/hydroponics/grown/misc_seeds.dm b/code/modules/hydroponics/grown/misc_seeds.dm
index 6e4bf03af16..30bf347ab55 100644
--- a/code/modules/hydroponics/grown/misc_seeds.dm
+++ b/code/modules/hydroponics/grown/misc_seeds.dm
@@ -83,6 +83,32 @@
tastes = list("sugarcane" = 1)
distill_reagent = "rum"
+/obj/item/seeds/bamboo
+ name = "pack of bamboo seeds"
+ desc = "A plant known for its flexible and resistant logs."
+ icon_state = "seed-bamboo"
+ species = "bamboo"
+ plantname = "Bamboo"
+ product = /obj/item/grown/log/bamboo
+ lifespan = 80
+ endurance = 70
+ maturation = 15
+ production = 2
+ yield = 5
+ potency = 50
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing.dmi'
+ icon_dead = "bamboo-dead"
+ genes = list(/datum/plant_gene/trait/repeated_harvest)
+ mutatelist = null
+
+/obj/item/grown/log/bamboo
+ seed = /obj/item/seeds/bamboo
+ name = "bamboo log"
+ desc = "A long and resistant bamboo log."
+ icon_state = "bamboo"
+ plank_type = /obj/item/stack/sheet/bamboo // this needs to get datumized :)
+ plank_name = "bamboo sticks"
// Gatfruit
/obj/item/seeds/gatfruit
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index aeed24e7541..6364f1629b0 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -102,6 +102,26 @@
/obj/item/grown/log/steel/CheckAccepted(obj/item/I)
return FALSE
+/*
+ * Punji sticks
+ */
+/obj/structure/punji_sticks
+ name = "punji sticks"
+ desc = "Don't step on this."
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "punji"
+ resistance_flags = FLAMMABLE
+ max_integrity = 30
+ anchored = TRUE
+
+/obj/structure/punji_sticks/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/caltrop, 20, 30, 100, 6 SECONDS, CALTROP_BYPASS_SHOES)
+
+/obj/structure/punji_sticks/spikes
+ name = "wooden spikes"
+ icon_state = "woodspike"
+
/////////BONFIRES//////////
/obj/structure/bonfire
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index c8f0a1e584e..cf5db27e82b 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -145,10 +145,8 @@
/obj/structure/flora/ash/cacti/Initialize(mapload)
. = ..()
- // min dmg 3, max dmg 6, prob(70)
AddComponent(/datum/component/caltrop, 3, 6, 70)
-
/*********
* Rocks *
*********/
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index 39a292da958..8095a203e9d 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -399,3 +399,17 @@
/obj/item/gun/syringe/rapidsyringe/preloaded/beaker_blaster/attack_self(mob/living/user)
// no printing infinite syringes.
return
+
+/// craftable bamboo syringe gun
+/obj/item/gun/syringe/blowgun
+ name = "blowgun"
+ desc = "Fire syringes at a short distance."
+ icon_state = "blowgun"
+ item_state = "gun"
+
+/obj/item/gun/syringe/blowgun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
+ visible_message("[user] shoots the blowgun!")
+
+ user.adjustStaminaLoss(20, FALSE)
+ user.adjustOxyLoss(20)
+ return ..()
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index b2ec803cffa..ff2a5af0b70 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -271,3 +271,4 @@
amount_per_transfer_from_this = 50
volume = 50
list_reagents = list("toxin" = 15, "pancuronium" = 10, "cyanide" = 5, "facid" = 10, "fluorine" = 10)
+
diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm
index e3d556355a9..8ceaabe419d 100644
--- a/code/modules/research/designs/biogenerator_designs.dm
+++ b/code/modules/research/designs/biogenerator_designs.dm
@@ -210,11 +210,3 @@
materials = list(MAT_BIOMASS = 400)
build_path = /obj/item/clothing/accessory/holster
category = list("initial","Leather and Cloth")
-
-/datum/design/rice_hat
- name = "Rice hat"
- id = "rice_hat"
- build_type = BIOGENERATOR
- materials = list(MAT_BIOMASS = 300)
- build_path = /obj/item/clothing/head/rice_hat
- category = list("initial","Leather and Cloth")
diff --git a/icons/mob/inhands/chairs_lefthand.dmi b/icons/mob/inhands/chairs_lefthand.dmi
index 7377787a63e..6744dd8fa30 100644
Binary files a/icons/mob/inhands/chairs_lefthand.dmi and b/icons/mob/inhands/chairs_lefthand.dmi differ
diff --git a/icons/mob/inhands/chairs_righthand.dmi b/icons/mob/inhands/chairs_righthand.dmi
index f04962de189..0809a7c0628 100644
Binary files a/icons/mob/inhands/chairs_righthand.dmi and b/icons/mob/inhands/chairs_righthand.dmi differ
diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi
index 7cb890d0548..53d11a4380b 100644
Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi
index bbbda0e17cd..6993a2881f0 100644
Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ
diff --git a/icons/mob/inhands/sheet_lefthand.dmi b/icons/mob/inhands/sheet_lefthand.dmi
index 54da11d53cd..3ef1e829bb2 100644
Binary files a/icons/mob/inhands/sheet_lefthand.dmi and b/icons/mob/inhands/sheet_lefthand.dmi differ
diff --git a/icons/mob/inhands/sheet_righthand.dmi b/icons/mob/inhands/sheet_righthand.dmi
index fcf36e763e6..a72bd9c24cc 100644
Binary files a/icons/mob/inhands/sheet_righthand.dmi and b/icons/mob/inhands/sheet_righthand.dmi differ
diff --git a/icons/mob/inhands/weapons_lefthand.dmi b/icons/mob/inhands/weapons_lefthand.dmi
index 807124c08e9..a5c22c4cef8 100644
Binary files a/icons/mob/inhands/weapons_lefthand.dmi and b/icons/mob/inhands/weapons_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons_righthand.dmi b/icons/mob/inhands/weapons_righthand.dmi
index d29e5e741ea..afcbe22ddcc 100644
Binary files a/icons/mob/inhands/weapons_righthand.dmi and b/icons/mob/inhands/weapons_righthand.dmi differ
diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi
index 05fa4847397..aa0095e0cef 100644
Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 1564d17b53b..de9e8b65028 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 7951f304894..aca66699d70 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi
index 0e399f9354d..f9a854620ab 100644
Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index cd11eb7b160..7ca0e6915c4 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/stacks/organic.dmi b/icons/obj/stacks/organic.dmi
index 76b414b3244..38b7f195571 100644
Binary files a/icons/obj/stacks/organic.dmi and b/icons/obj/stacks/organic.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 4168f09ab9b..0d1820c1352 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/obj/weapons/spears.dmi b/icons/obj/weapons/spears.dmi
index 725e5a9718a..e774da4e0bc 100644
Binary files a/icons/obj/weapons/spears.dmi and b/icons/obj/weapons/spears.dmi differ
diff --git a/icons/turf/floors/bamboo_mat.dmi b/icons/turf/floors/bamboo_mat.dmi
new file mode 100644
index 00000000000..1bc197d6a03
Binary files /dev/null and b/icons/turf/floors/bamboo_mat.dmi differ