diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index 85a6f8c9e40..ffef9d9206d 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -244,6 +244,7 @@
/turf/simulated/floor/lava,
/area/ruin/unpowered/ash_walkers)
"aK" = (
+/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck,
/obj/structure/stone_tile/block/cracked{
dir = 8
},
@@ -251,7 +252,6 @@
dir = 1
},
/obj/structure/stone_tile,
-/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck,
/turf/simulated/floor/indestructible/boss/indoors,
/area/ruin/unpowered/ash_walkers)
"aM" = (
@@ -277,6 +277,7 @@
/area/ruin/unpowered/ash_walkers)
"aP" = (
/obj/structure/stone_tile,
+/obj/item/healthanalyzer/gem_analyzer,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"aQ" = (
@@ -372,6 +373,7 @@
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"bc" = (
+/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen,
/obj/structure/stone_tile/block{
dir = 4
},
@@ -381,7 +383,6 @@
/obj/structure/stone_tile{
dir = 4
},
-/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen,
/turf/simulated/floor/indestructible/boss/indoors,
/area/ruin/unpowered/ash_walkers)
"bd" = (
@@ -485,7 +486,7 @@
/obj/structure/stone_tile/cracked{
dir = 4
},
-/obj/item/rcd/preloaded,
+/obj/item/stack/fireproof_rods/twentyfive,
/turf/simulated/floor/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
"bn" = (
@@ -1410,6 +1411,14 @@
/obj/effect/decal/cleanable/ashrune,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"wR" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/obj/machinery/smartfridge/drying_rack/ash,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"zz" = (
/obj/effect/mapping_helpers/no_lava,
/obj/structure/stone_tile{
@@ -1590,7 +1599,7 @@ ba
bn
bz
ak
-cb
+wR
df
bX
co
diff --git a/code/datums/mapgen/LavalandGenerator.dm b/code/datums/mapgen/LavalandGenerator.dm
index fec2ecf9b57..e8828241907 100644
--- a/code/datums/mapgen/LavalandGenerator.dm
+++ b/code/datums/mapgen/LavalandGenerator.dm
@@ -26,7 +26,8 @@
/obj/structure/flora/ash/stem_shroom = 2,
/obj/structure/flora/ash/cacti = 1,
/obj/structure/flora/ash/tall_shroom = 2,
- /obj/structure/flora/ash/fireblossom = 2
+ /obj/structure/flora/ash/fireblossom = 2,
+ /obj/structure/flora/ash/coaltree = 1
)
smoothing_iterations = 50
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index d3620082bb2..d0174fddcc4 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -713,6 +713,17 @@ REAGENT SCANNER
origin_tech = "magnets=2;biotech=2"
usesound = 'sound/items/deconstruct.ogg'
+/obj/item/healthanalyzer/gem_analyzer
+ name = "eye of health"
+ icon = 'icons/obj/device.dmi'
+ icon_state = "Gem_analyzer"
+ item_state = "gem_analyzer"
+ desc = "Необычный самоцвет в форме сердца."
+ origin_tech = null
+
+/obj/item/healthanalyzer/gem_analyzer/attackby(obj/item/I, mob/user, params)
+ return ATTACK_CHAIN_BLOCKED_ALL
+
/obj/item/reagent_scanner
name = "reagent scanner"
desc = "A hand-held reagent scanner which identifies chemical agents and blood types."
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 36d211ea34b..790f833a94c 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -286,7 +286,7 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
if(!do_after(user, 5 SECONDS * I.toolspeed, src, category = DA_CAT_TOOL))
return ATTACK_CHAIN_PROCEED
to_chat(user, span_notice("You cut the hair from [src]."))
- var/obj/item/stack/sheet/hairlesshide/hide = new(drop_location(), amount)
+ var/obj/item/stack/sheet/hairlesshide/hide = new(drop_location(), 3 * amount)
hide.add_fingerprint(user)
qdel(src)
return ATTACK_CHAIN_BLOCKED_ALL
diff --git a/code/game/objects/items/tent.dm b/code/game/objects/items/tent.dm
new file mode 100644
index 00000000000..b5bf7342363
--- /dev/null
+++ b/code/game/objects/items/tent.dm
@@ -0,0 +1,200 @@
+/obj/item/folded_tent
+ name = "primitive folded tent"
+ desc = "Сложенная палатка."
+ icon = 'icons/obj/tent.dmi'
+ icon_state = "tent_folded"
+ item_state = "tent_folded"
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ var/unfoldedtent_path = /obj/structure/tent
+
+/obj/item/folded_tent/attack_self(mob/user)
+ if(!do_after(user, 15 SECONDS, user))
+ return
+ if(loc == user)
+ deploy_tent(user, get_turf(user))
+ else
+ deploy_tent(user, get_turf(src))
+
+/obj/item/folded_tent/pickup(mob/user)
+ if(contains(user))
+ return FALSE
+ return ..()
+
+/obj/item/folded_tent/proc/deploy_tent(mob/user, atom/location)
+ var/obj/structure/tent/item_tent = new unfoldedtent_path(location)
+ item_tent.foldedtent_instance = src
+ user.drop_item_ground(src)
+ move_to_null_space()
+ return item_tent
+
+/obj/structure/tent
+ name = "Primitive tent"
+ desc = "Примитивная палатка, способная защитить от бури. Сделана из шкур голиафов."
+ icon = 'icons/obj/tent.dmi'
+ icon_state = "tent"
+ max_integrity = 50
+ density = TRUE
+ anchored = TRUE
+ var/foldedtent_path = /obj/item/folded_tent
+ var/obj/item/folded_tent/foldedtent_instance = null
+ var/mob/living/carbon/human/occupant = null
+
+/obj/structure/tent/proc/perform_fold(mob/living/carbon/human/the_folder)
+ var/folding_tent = new foldedtent_path(get_turf(src))
+ the_folder.put_in_hands(folding_tent)
+
+/obj/structure/tent/MouseDrop(atom/over_object, src_location, over_location, src_control, over_control, params)
+ if(!do_after(usr, 5 SECONDS, usr))
+ return
+
+ if(over_object == usr && ishuman(usr) && !usr.incapacitated() && !HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) && !length(contents) && usr.Adjacent(src))
+ usr.visible_message(
+ span_notice("[usr] folds up [src]."),
+ span_notice("You fold up [src]."),
+ )
+ perform_fold(usr)
+ qdel(src)
+ return FALSE
+
+ if(over_object == usr && ishuman(usr) && !usr.incapacitated() && usr.Adjacent(src))
+ if(attempt_fold(usr))
+ usr.visible_message(
+ span_notice("[usr] folds up [src]."),
+ span_notice("You fold up [src]."),
+ )
+ perform_fold(usr)
+ qdel(src)
+ return FALSE
+
+ return ..()
+
+/obj/structure/tent/proc/attempt_fold(mob/living/carbon/human/the_folder)
+ . = FALSE
+ if(!istype(the_folder))
+ return
+
+ if(LAZYLEN(contents))
+ return
+
+ return TRUE
+
+/obj/structure/tent/grab_attack(mob/living/grabber, atom/movable/grabbed_thing)
+ . = TRUE
+ if(grabber.grab_state < GRAB_AGGRESSIVE || !ismob(grabbed_thing))
+ return .
+
+ var/mob/target = grabbed_thing
+ if(occupant)
+ grabber.balloon_alert(grabber, "палатка занята!")
+ return .
+
+ visible_message(span_notice("[grabber] starts putting [target] into [src]."))
+ if(!do_after(grabber, 2 SECONDS, target) || !target || !grabber || grabber.pulling != target || !grabber.Adjacent(src))
+ return .
+
+ target.forceMove(src)
+ occupant = target
+
+/obj/structure/tent/MouseDrop_T(atom/movable/O, mob/user, params)
+ if(O.loc == user)
+ return
+
+ if(user.incapacitated() || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
+ return
+
+ if(get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src))
+ return
+
+ if(!ismob(O))
+ return
+
+ if(isanimal(O) || issilicon(O))
+ return
+
+ if(!isturf(user.loc) || !isturf(O.loc))
+ return
+
+ if(occupant)
+ usr.balloon_alert(usr, "палатка занята!")
+ return TRUE
+
+ var/mob/living/L = O
+ if(!istype(L) || L.buckled)
+ return
+
+ if(L == user)
+ visible_message(span_notice("[user] starts climbing into the tent."))
+ else
+ visible_message(span_notice("[user] starts putting [L.name] into the tent."))
+
+ . = TRUE
+ INVOKE_ASYNC(src, PROC_REF(put_in), L, user)
+
+/obj/structure/tent/Destroy()
+ for(var/mob/M in contents)
+ M.forceMove(get_turf(src))
+ REMOVE_TRAIT(M, TRAIT_ASHSTORM_IMMUNE, "ash")
+
+ return ..()
+
+/obj/structure/tent/proc/put_in(mob/living/L, mob/user)
+ if(!do_after(user, 2 SECONDS, L))
+ return
+
+ if(occupant)
+ user.balloon_alert(user, "палатка занята!")
+ return
+
+ if(!L)
+ return
+
+ L.forceMove(src)
+ occupant = L
+ ADD_TRAIT(L, TRAIT_ASHSTORM_IMMUNE, "ash")
+
+/obj/structure/tent/verb/move_inside()
+ set name = "Enter Tent"
+ set category = "Object"
+ set src in oview(1)
+ if(!ishuman(usr) || usr.incapacitated() || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED) || usr.buckled)
+ return
+
+ if(occupant)
+ usr.balloon_alert(usr, "палатка занята!")
+ return
+
+ visible_message(span_notice("[usr] starts climbing into the tent."))
+ put_in(usr, usr)
+
+/obj/structure/tent/verb/eject()
+ set name = "Eject Tent"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.default_can_use_topic(src) != UI_INTERACTIVE)
+ return
+
+ if(usr.incapacitated() || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED))
+ return
+
+ go_out()
+ add_fingerprint(usr)
+
+/obj/structure/tent/relaymove(mob/user as mob)
+ go_out()
+
+/obj/structure/tent/proc/go_out()
+ if(!occupant)
+ return
+
+ occupant.forceMove(loc)
+ if(!istype(occupant, /datum/species/unathi/draconid))
+ REMOVE_TRAIT(occupant, TRAIT_ASHSTORM_IMMUNE, "ash")
+ occupant = null
+
+/obj/structure/tent/force_eject_occupant(mob/target)
+ go_out()
+
+/obj/structure/tent/attack_ai(mob/user)
+ return attack_hand(user)
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index 9451a19cd47..50fbc1ddb6c 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -89,7 +89,7 @@
item_state = "goliath_shield"
materials = list()
origin_tech = "materials=1;combat=3;biotech=2"
- block_chance = 30
+ block_chance = 45
obj_integrity = 380
max_integrity = 380
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 2d9b7ef9f96..d67c45a9f79 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -450,3 +450,29 @@
w_class = WEIGHT_CLASS_BULKY
block_chance = 30
+/obj/item/kolotushka
+ name = "primitive kolotushka"
+ desc = "Простейшая дубина из кости, воплощает в себе силу природы и первобытную мощь."
+ icon_state = "kolotushka"
+ item_state = "kolotushka"
+ hitsound = 'sound/weapons/kolotushka_smash.ogg'
+ slot_flags = ITEM_SLOT_BELT
+ force = 3
+ throwforce = 3
+ w_class = WEIGHT_CLASS_NORMAL
+ var/stamina_damage = 22
+
+/obj/item/kolotushka/afterattack(atom/target, mob/user, proximity, params, status)
+ if(!isliving(target) || !proximity || user.incapacitated() || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
+ return
+
+ var/mob/living/victim = target
+ if(isrobot(victim))
+ if(prob(30))
+ victim.flash_eyes(3 SECONDS)
+ victim.Stun(3 SECONDS)
+
+ if(ishuman(victim))
+ victim.apply_damage(stamina_damage, STAMINA, blocked = victim.getarmor(user.zone_selected, MELEE))
+ if(prob(30))
+ victim.Knockdown(3 SECONDS)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index fd275dccef0..20461905d0c 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -702,6 +702,14 @@
can_rotate = 0
resistance_flags = UNACIDABLE
+/obj/structure/sink/puddle/Initialize(mapload)
+ . = ..()
+
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+
/obj/structure/sink/puddle/attack_hand(mob/user)
flick("puddle-splash", src)
@@ -731,6 +739,22 @@
return ..()
+/obj/structure/sink/puddle/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
+ SIGNAL_HANDLER
+ wash(arrived)
+
+/obj/structure/sink/puddle/proc/wash(atom/target)
+ if(isitem(target))
+ var/obj/item/item = target
+ item.extinguish()
+
+ if(isliving(target))
+ var/mob/living/l_target = target
+ l_target.ExtinguishMob()
+ l_target.adjust_fire_stacks(-20)
+ to_chat(l_target, span_warning("You've been drenched in water!"))
+
+ target.clean_blood()
//////////////////////////////////
// Bathroom Fixture Items //
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index ac3749345c2..4b33fb8c584 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -18,7 +18,36 @@
desc = "Grey gloves without fingertips made from the hide of a dead arachnid found on lavaland. Makes wearer stronger in disarming ability."
icon_state = "weaver_chitin"
item_state = "weaver_chitin"
- extra_knock_chance = 5
+ extra_knock_chance = 20
+ var/stamdamage_low = 10
+ var/stamdamage_high = 15
+
+/obj/item/clothing/gloves/fingerless/weaver/Touch(atom/A, proximity)
+ . = FALSE
+ if(!ishuman(loc))
+ return FALSE
+
+ var/mob/living/carbon/human/user = loc
+ if(!user.mind || user.mind.martial_art)
+ return FALSE
+
+ if(user.a_intent != INTENT_HARM || !proximity || isturf(A))
+ return FALSE
+
+ var/damage = rand(user.dna.species.punchdamagelow + user.physiology.punch_damage_low, user.dna.species.punchdamagehigh + user.physiology.punch_damage_high)
+ var/stamindamage = rand(stamdamage_low, stamdamage_high)
+ if(ishuman(A))
+ user.do_attack_animation(A, "kick")
+ playsound(get_turf(user), 'sound/effects/hit_punch.ogg', 50, 1, -1)
+ var/mob/living/carbon/human/target = A
+ var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_selected))
+ add_attack_logs(user, target, "Melee attacked with weaver gloves")
+
+ target.visible_message(span_danger("[user] smash [target] with weaver gloves!"))
+
+ target.apply_damage(damage, BRUTE, affecting)
+ target.apply_damage(stamindamage, STAMINA, affecting)
+ return TRUE
/obj/item/clothing/gloves/cyborg
desc = "beep boop borp"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 32abf1fb95c..85ba6092d50 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -639,7 +639,7 @@
item_state = "goliath_cloak"
desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits."
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/twohanded/spear, /obj/item/organ/internal/regenerative_core/legion, /obj/item/kitchen/knife/combat/survival, /obj/item/twohanded/kinetic_crusher, /obj/item/hierophant_club, /obj/item/twohanded/fireaxe/boneaxe)
- armor = list("melee" = 40, "bullet" = 15, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
+ armor = list("melee" = 40, "bullet" = 15, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
hoodtype = /obj/item/clothing/head/hooded/goliath
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
@@ -648,7 +648,7 @@
icon_state = "golhood"
item_state = "golhood"
desc = "A protective & concealing hood."
- armor = list("melee" = 40, "bullet" = 15, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
+ armor = list("melee" = 40, "bullet" = 15, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 60)
flags_inv = HIDEHAIR
flags_cover = HEADCOVERSEYES
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 4dcd10981ba..92fc4cc364f 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -675,6 +675,21 @@
result = /obj/item/stack/medical/splint/tribal
category = CAT_PRIMAL
+/datum/crafting_recipe/primitive_surgical_kit
+ name = "Primitive surgical kit"
+ time = 30
+ reqs = list(/obj/item/stack/sheet/bone = 6,
+ /obj/item/stack/sheet/sinew = 3)
+ result = list(/obj/item/retractor/primitive_retractor,
+ /obj/item/hemostat/primitive_hemostat,
+ /obj/item/cautery/primitive_cautery,
+ /obj/item/scalpel/primitive_scalpel,
+ /obj/item/primitive_saw,
+ /obj/item/bonegel/primitive_bonegel,
+ /obj/item/FixOVein/primitive_FixOVein,
+ /obj/item/bonesetter/primitive_bonesetter)
+ category = CAT_PRIMAL
+
/datum/crafting_recipe/bonedagger
name = "Bone Dagger"
result = /obj/item/kitchen/knife/combat/survival/bone
@@ -695,7 +710,7 @@
result = /obj/item/shield/riot/goliath
time = 6 SECONDS
reqs = list(/obj/item/stack/sheet/bone = 4,
- /obj/item/stack/sheet/animalhide/goliath_hide = 3)
+ /obj/item/stack/sheet/animalhide/goliath_hide = 2)
category = CAT_PRIMAL
/datum/crafting_recipe/bonespear
@@ -798,6 +813,10 @@
category = CAT_PRIMAL
alert_admins_on_craft = TRUE
+/datum/crafting_recipe/bonfire/coaltree
+ name = "Bonfire (coaltree)"
+ reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/coaltree_log = 5)
+
/datum/crafting_recipe/rake //Category resorting incoming
name = "Rake"
time = 30
@@ -1477,9 +1496,9 @@
time = 5 SECONDS
reqs = list(/obj/item/clothing/suit/hooded/goliath = 1,
/obj/item/stack/sheet/animalhide/goliath_hide = 2, //2 plates for the cloak plus 2 here plus 3 for plating the armor = 7 total
- /obj/item/stack/sheet/animalhide/weaver_chitin = 10,
- /obj/item/stack/sheet/bone = 8,
- /obj/item/stack/sheet/sinew = 10)
+ /obj/item/stack/sheet/animalhide/weaver_chitin = 6,
+ /obj/item/stack/sheet/bone = 5,
+ /obj/item/stack/sheet/sinew = 5)
category = CAT_PRIMAL
/datum/crafting_recipe/pathtreads
@@ -1551,7 +1570,7 @@
/obj/item/stack/sheet/mineral/diamond = 5
)
result = list(/obj/item/pickaxe/diamond)
-
+
/datum/crafting_recipe/drone
name = "Inactive Drone"
result = list(/obj/item/inactive_drone)
@@ -1611,3 +1630,28 @@
category = CAT_ROBOT
always_availible = FALSE
time = 1 SECONDS
+
+/datum/crafting_recipe/ashrack
+ name = "Primitive drying rack"
+ result = /obj/machinery/smartfridge/drying_rack/ash
+ time = 15 SECONDS
+ reqs = list(/obj/item/stack/sheet/wood = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/tent
+ name = "Primitive tent"
+ result = /obj/item/folded_tent
+ time = 15 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 2,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/kolotushka
+ name = "Primitive kolotushka"
+ result = /obj/item/kolotushka
+ time = 4 SECONDS
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/animalhide/weaver_chitin = 2)
+ category = CAT_PRIMAL
diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm
index 1d40095fe2e..306e0738fc9 100644
--- a/code/modules/food_and_drinks/food/foods/meat.dm
+++ b/code/modules/food_and_drinks/food/foods/meat.dm
@@ -57,6 +57,21 @@
cutlet.add_fingerprint(user)
qdel(src)
+/obj/item/reagent_containers/food/snacks/meat/burn()
+ visible_message(span_notice("[src] finishes cooking!"))
+ new /obj/item/reagent_containers/food/snacks/roasted_meat(loc)
+ qdel(src)
+
+/obj/item/reagent_containers/food/snacks/roasted_meat
+ name = "roasted meat"
+ desc = "Хорошо прожаренный стейк."
+ resistance_flags = LAVA_PROOF | FIRE_PROOF
+ icon_state = "roasted_meat"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+ list_reagents = list("protein" = 4, "vitamin" = 1)
+ tastes = list("meat" = 1)
+ foodtype = MEAT
/obj/item/reagent_containers/food/snacks/meat/syntiflesh
name = "synthetic meat"
@@ -420,6 +435,11 @@
list_reagents = list("protein" = 2, "toxin" = 2)
tastes = list("cobwebs" = 1, "creepy motion" = 1)
+/obj/item/reagent_containers/food/snacks/monstermeat/spiderleg/burn()
+ visible_message(span_notice("[src] finishes cooking!"))
+ new /obj/item/reagent_containers/food/snacks/roasted_spiderleg(loc)
+ qdel(src)
+
/obj/item/reagent_containers/food/snacks/raw_bacon
name = "raw bacon"
desc = "God's gift to man in uncooked form."
@@ -443,7 +463,7 @@
tastes = list("tough meat" = 1)
/obj/item/reagent_containers/food/snacks/monstermeat/goliath/burn()
- visible_message("[src] finishes cooking!")
+ visible_message(span_notice("[src] finishes cooking!"))
new /obj/item/reagent_containers/food/snacks/goliath_steak(loc)
qdel(src)
@@ -456,7 +476,7 @@
tastes = list("meat" = 1)
/obj/item/reagent_containers/food/snacks/monstermeat/goldgrub/burn()
- visible_message("[src] finishes cooking!")
+ visible_message(span_notice("[src] finishes cooking!"))
new /obj/item/reagent_containers/food/snacks/goldgrubmeat(loc)
qdel(src)
@@ -700,6 +720,17 @@
tastes = list("meat" = 1)
foodtype = MEAT
+/obj/item/reagent_containers/food/snacks/roasted_spiderleg
+ name = "roasted spider leg"
+ desc = "Жаренная лапка паука, теперь оно точно мертво."
+ resistance_flags = LAVA_PROOF | FIRE_PROOF
+ icon_state = "roasted_spiderleg"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+ list_reagents = list("protein" = 4, "vitamin" = 1)
+ tastes = list("cobwebs" = 1, "meat" = 1)
+ foodtype = MEAT
+
/obj/item/reagent_containers/food/snacks/goldgrubmeat
name= "goldgrub steak"
desc = "Cooked intestines with goldgrub skin, retrieved from a Goldgrub. Legends say it is valuable in traditional medicines."
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index b9efa4e202a..216456986c4 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -789,6 +789,8 @@
active_power_usage = 200
can_dry = TRUE
visible_contents = FALSE
+ var/primitive = FALSE //used for energy consuming stuff
+ var/drying_timer = 1
icon_lightmask = null
/obj/machinery/smartfridge/drying_rack/Initialize(mapload)
@@ -810,6 +812,9 @@
return
/obj/machinery/smartfridge/drying_rack/power_change(forced = FALSE)
+ if(primitive)
+ return
+
if(powered() && anchored)
stat &= ~NOPOWER
else
@@ -839,10 +844,10 @@
switch(action)
if("drying")
drying = !drying
- use_power = drying ? ACTIVE_POWER_USE : IDLE_POWER_USE
+ if(!primitive)
+ use_power = drying ? ACTIVE_POWER_USE : IDLE_POWER_USE
update_icon(UPDATE_OVERLAYS)
-
/obj/machinery/smartfridge/drying_rack/update_overlays()
. = list()
if(drying)
@@ -852,9 +857,14 @@
/obj/machinery/smartfridge/drying_rack/process()
- if(drying && rack_dry())//no need to update unless something got dried
- update_icon(UPDATE_OVERLAYS)
-
+ ..()
+ if(drying)//no need to update unless something got dried
+ if(drying_timer && length(contents))
+ drying_timer--
+ else
+ rack_dry()
+ drying_timer = initial(drying_timer)
+ update_icon(UPDATE_OVERLAYS)
/obj/machinery/smartfridge/drying_rack/accept_check(obj/item/O)
. = ..()
@@ -903,3 +913,25 @@
SStgui.update_uis(src)
return TRUE
return FALSE
+
+/obj/machinery/smartfridge/drying_rack/ash
+ name = "primitive drying rack"
+ desc = "Самодельная сушилка, используется для сушки кожи и еды."
+ icon_state = "primitive-drying-rack"
+ use_power = NO_POWER_USE
+ can_dry = FALSE //trust me
+ drying = TRUE
+ idle_power_usage = 0
+ active_power_usage = 0
+ drying_timer = 8
+ primitive = TRUE
+
+/obj/machinery/smartfridge/drying_rack/ash/update_overlays()
+ overlays.Cut()
+ if(length(contents))
+ overlays += "primitive-drying-rack_leather"
+
+/obj/machinery/smartfridge/drying_rack/ash/on_deconstruction()
+ new /obj/item/stack/sheet/wood(loc, 2)
+ new /obj/item/stack/sheet/sinew(loc, 1)
+ ..()
diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm
index ec3ba9b9d1c..8e275d62d2a 100644
--- a/code/modules/mining/lavaland/ash_flora.dm
+++ b/code/modules/mining/lavaland/ash_flora.dm
@@ -178,6 +178,21 @@
regrowth_time_low = 2500
regrowth_time_high = 4000
+/obj/structure/flora/ash/coaltree
+ icon_state = "coaltree"
+ name = "coaltree"
+ desc = "Небольшое мрачное дерево, растущее на просторах такой же мрачной планеты."
+ harvested_name = "coaltree stump"
+ harvested_desc = "Голый ствол дерева, оставшийся без своей уродливой кроны."
+ harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/coaltree_log
+ harvest_amount_high = 5
+ harvest_time = 40
+ harvest_message_low = "Вы обрезаете небольшое дерево."
+ harvest_message_med = "Вы обрезаете дерево среднего размера."
+ harvest_message_high = "Вы обрезаете большое дерево."
+ regrowth_time_low = 4000
+ regrowth_time_high = 6000
+
/obj/item/reagent_containers/food/snacks/grown/ash_flora
name = "mushroom shavings"
desc = "Some shavings from a tall mushroom. With enough, might serve as a bowl."
@@ -232,6 +247,35 @@
seed = /obj/item/seeds/lavaland/fireblossom
wine_power = 0.4
+/obj/item/reagent_containers/food/snacks/grown/ash_flora/coaltree_log
+ name = "coaltree log"
+ desc = "Бревно угледрева, на ощупь мягкое."
+ icon_state = "coaltree_log"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+ item_state = "coaltree_log"
+ seed = /obj/item/seeds/lavaland/coaltree
+ wine_power = 0.5
+ item_flags = NOBLUDGEON
+ w_class = WEIGHT_CLASS_NORMAL
+
+/obj/item/reagent_containers/food/snacks/grown/ash_flora/coaltree_log/attackby(obj/item/I, mob/user, params)
+ if(is_sharp(I))
+ if(!isturf(loc))
+ add_fingerprint(user)
+ to_chat(user, span_warning("You cannot chop [src] [ismob(loc) ? "in inventory" : "in [loc]"]."))
+ return ATTACK_CHAIN_PROCEED
+
+ to_chat(user, span_notice("You have chopped [src] into planks."))
+ var/seed_modifier = 0
+ if(seed)
+ seed_modifier = round(seed.potency / 25)
+ var/obj/item/stack/planks = new /obj/item/stack/sheet/wood(loc, 1 + seed_modifier)
+ transfer_fingerprints_to(planks)
+ planks.add_fingerprint(user)
+ qdel(src)
+ return ATTACK_CHAIN_BLOCKED_ALL
+
//SEEDS
/obj/item/seeds/lavaland
@@ -316,6 +360,18 @@
genes = list(/datum/plant_gene/trait/fire_resistance, /datum/plant_gene/trait/glow/yellow)
reagents_add = list("tinlux" = 0.04, "nutriment" = 0.03, "carbon" = 0.05)
+/obj/item/seeds/lavaland/coaltree
+ name = "pack of coaltree seeds"
+ desc = "These seeds grow into coaltree."
+ icon_state = "seed-coaltree"
+ species = "coaltree"
+ plantname = "Coaltree"
+ growthstages = 3
+ growing_icon = 'icons/obj/hydroponics/growing.dmi'
+ product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/coaltree_log
+ genes = list(/datum/plant_gene/trait/fire_resistance)
+ reagents_add = list("nutriment" = 0.04, "coaltree_extract" = 0.1)
+
//CRAFTING
//what you can craft with these things
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
index b9a6169ab4b..0fd7109c0b7 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
@@ -245,8 +245,7 @@
pre_attack_icon = "Goliath_preattack"
throw_message = "does nothing to the rocky hide of the"
crusher_loot = /obj/item/crusher_trophy/eyed_tentacle
- loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days
- butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/goliath = 2, /obj/item/stack/sheet/bone = 2)
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/monstermeat/goliath= 2, /obj/item/stack/sheet/animalhide/goliath_hide = 2, /obj/item/stack/sheet/bone = 2)
crusher_drop_mod = 30
wander = FALSE
var/list/cached_tentacle_turfs
diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm
index 1a4211d78f3..d9105d1aeb9 100644
--- a/code/modules/projectiles/guns/projectile/bow.dm
+++ b/code/modules/projectiles/guns/projectile/bow.dm
@@ -111,6 +111,23 @@
range = 10
damage = 25
damage_type = BRUTE
+ var/faction_bonus_damage = 13
+ var/nemesis_factions = list("mining", "boss")
+ var/nemesis_faction = FALSE
+
+/obj/item/projectile/bullet/reusable/arrow/prehit(atom/target)
+ var/mob/living/H = target
+
+ if(!ismob(H) || !LAZYLEN(nemesis_factions))
+ return
+
+ for(var/faction in H.faction)
+ if(faction in nemesis_factions)
+ nemesis_faction = TRUE
+ damage += faction_bonus_damage
+ break
+
+ . = ..()
/obj/item/projectile/bullet/reusable/arrow/bone //A fully upgraded normal arrow; it's got the stats to show. Still *less* damage than a slug, slower, and with negative AP. Only for bone bow!
name = "bone-tipped arrow"
@@ -119,11 +136,15 @@
range = 12
damage = 45
armour_penetration = -10
+ faction_bonus_damage = 23
/obj/item/ammo_casing/caseless/arrow
name = "arrow"
desc = "Stab, stab, stab."
icon_state = "arrow"
+ item_state = "arrow"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
force = 10
projectile_type = /obj/item/projectile/bullet/reusable/arrow
muzzle_flash_effect = null
@@ -133,6 +154,9 @@
name = "bone-tipped arrow"
desc = "An arrow made from bone, wood, and sinew. Sturdy and sharp."
icon_state = "bone_arrow"
+ item_state = "bone_arrow"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
force = 12
projectile_type = /obj/item/projectile/bullet/reusable/arrow/bone
caliber = "bone_arrow"
diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm
index a1afbe1724c..41abf5cdf89 100644
--- a/code/modules/projectiles/guns/throw/crossbow.dm
+++ b/code/modules/projectiles/guns/throw/crossbow.dm
@@ -192,6 +192,8 @@
desc = "It's got a tip for you - get the point?"
icon_state = "bolt"
item_state = "bolt"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
throwforce = 20
w_class = WEIGHT_CLASS_SMALL
sharp = TRUE
@@ -205,6 +207,9 @@
name = "makeshift bolt"
desc = "A sharpened metal rod that can be fired out of a crossbow."
icon_state = "metal-rod"
+ item_state = "metal-rod"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
throwforce = 10
/obj/item/arrow/proc/modify_arrow()
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index 6cd40966d6d..231e7a4216e 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -370,6 +370,27 @@
M.reagents.remove_reagent(R.id,1)
return ..() | update_flags
+/datum/reagent/medicine/coaltree_extract
+ name = "Coaltree extract"
+ id = "coaltree_extract"
+ description = "Экстракт полученный из угледрева, выводит из организма токсины ценой больших мучений."
+ reagent_state = LIQUID
+ metabolization_rate = 0.4 * REAGENTS_METABOLISM
+ color = "#000000"
+ taste_description = "ash"
+
+/datum/reagent/medicine/coaltree_extract/on_mob_life(mob/living/M)
+ var/update_flags = STATUS_UPDATE_NONE
+ update_flags |= M.adjustToxLoss(-3, FALSE)
+ update_flags |= M.adjustBruteLoss(1, FALSE)
+ if(prob(10))
+ to_chat(M, span_warning("Ваша кожа покрывается кровавыми волдырями."))
+ if(prob(50))
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ M.reagents.remove_reagent(R.id,1)
+ return ..() | update_flags
+
/datum/reagent/medicine/omnizine
name = "Omnizine"
id = "omnizine"
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index 77fd9e7a5f6..a0a4fb5bad5 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -10,12 +10,14 @@
name = "saw bone"
begin_sound = list(
TOOL_SAW = 'sound/surgery/saw1.ogg',
+ /obj/item/primitive_saw = 'sound/surgery/scalpel1.ogg',
TOOL_WIRECUTTER = 'sound/surgery/scalpel1.ogg',
/obj/item/hatchet = 'sound/surgery/scalpel1.ogg',
)
end_sound = 'sound/surgery/amputation.ogg'
allowed_tools = list(
TOOL_SAW = 100,
+ /obj/item/primitive_saw = 100,
/obj/item/hatchet = 90,
TOOL_WIRECUTTER = 70
)
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index d639b945111..a4c9bc53116 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -261,11 +261,13 @@
begin_sound = list(
TOOL_SAW = 'sound/surgery/saw1.ogg',
/obj/item/hatchet = 'sound/surgery/scalpel1.ogg',
+ /obj/item/primitive_saw = 'sound/surgery/scalpel1.ogg',
/obj/item/melee/arm_blade = 'sound/surgery/scalpel1.ogg',
)
end_sound = 'sound/surgery/amputation.ogg'
allowed_tools = list(
TOOL_SAW = 100,
+ /obj/item/primitive_saw = 100,
/obj/item/hatchet = 90,
/obj/item/melee/arm_blade = 75
)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 77a40efd088..58f09883216 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -812,6 +812,7 @@
allowed_tools = list(
TOOL_SAW = 100,
/obj/item/melee/energy/sword/cyborg/saw = 100,
+ /obj/item/primitive_saw = 100,
/obj/item/hatchet = 90,
/obj/item/wirecutters = 70
)
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 83b5c23b8f7..37be88b85f1 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -26,6 +26,15 @@
w_class = WEIGHT_CLASS_TINY
toolspeed = 0.5
+/obj/item/retractor/primitive_retractor
+ name = "primitive bone retractor"
+ desc = "Retracts stuff."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "primitive_retractor"
+ item_state = "primitive_retractor"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+
/obj/item/hemostat
name = "hemostat"
desc = "You think you have seen this before."
@@ -54,6 +63,15 @@
desc = "Tiny servos power a pair of pincers to stop bleeding."
toolspeed = 0.5
+/obj/item/hemostat/primitive_hemostat
+ name = "primitive hemostat"
+ desc = "You think you have seen this before."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "primitive_hemostat"
+ item_state = "primitive_hemostat"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+
/obj/item/cautery
name = "cautery"
desc = "This stops bleeding."
@@ -75,6 +93,15 @@
desc = "A heated element that cauterizes wounds."
toolspeed = 0.5
+/obj/item/cautery/primitive_cautery
+ name = "primitive cautery"
+ desc = "This stops bleeding."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "primitive_cautery"
+ item_state = "primitive_cautery"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+
/obj/item/surgicaldrill
name = "surgical drill"
desc = "You can drill using this item. You dig?"
@@ -152,6 +179,15 @@
desc = "Ultra-sharp blade attached directly to your bone for extra-accuracy."
toolspeed = 0.5
+/obj/item/scalpel/primitive_scalpel
+ name = "primitive scalpel"
+ desc = "Cut, cut, and once more cut."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "primitive_scalpel"
+ item_state = "primitive_scalpel"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+
/*
* Researchable Scalpels
*/
@@ -241,6 +277,31 @@
w_class = WEIGHT_CLASS_SMALL
toolspeed = 0.5
+/obj/item/primitive_saw
+ name = "primitive circular saw"
+ desc = "For heavy duty cutting."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "primitive_saw"
+ item_state = "primitive_saw"
+ hitsound = 'sound/weapons/slice.ogg'
+ mob_throw_hit_sound = 'sound/weapons/pierce.ogg'
+ flags = CONDUCT
+ force = 15.0
+ sharp = 1
+ w_class = WEIGHT_CLASS_NORMAL
+ throwforce = 9.0
+ throw_speed = 3
+ throw_range = 5
+ embed_chance = 20
+ embedded_ignore_throwspeed_threshold = TRUE
+ attack_verb = list("attacked", "slashed", "sawed", "cut")
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+
+/obj/item/primitive_saw/Initialize(mapload)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_SURGICAL, ROUNDSTART_TRAIT)
+
//misc, formerly from code/defines/weapons.dm
/obj/item/bonegel
name = "bone gel"
@@ -260,6 +321,14 @@
/obj/item/bonegel/augment
toolspeed = 0.5
+/obj/item/bonegel/primitive_bonegel
+ name = "primitive bone gel"
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "primitive_bonegel"
+ item_state = "primitive_bonegel"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+
/obj/item/FixOVein
name = "FixOVein"
icon = 'icons/obj/surgery.dmi'
@@ -278,6 +347,14 @@
/obj/item/FixOVein/augment
toolspeed = 0.5
+/obj/item/FixOVein/primitive_FixOVein
+ name = "primitive FixOVein"
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "primitive_fixovein"
+ item_state = "primitive_fixovein"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+
/obj/item/bonesetter
name = "bone setter"
icon = 'icons/obj/surgery.dmi'
@@ -306,6 +383,14 @@
/obj/item/bonesetter/augment
toolspeed = 0.5
+/obj/item/bonesetter/primitive_bonesetter
+ name = "primitive bone setter"
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "primitive_bonesetter"
+ item_state = "primitive_bonesetter"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+
/obj/item/surgical_drapes
name = "surgical drapes"
desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control."
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index 90f04c72f47..5ce2281f2e3 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi
index 47e1359325f..66073ee3f6c 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 005f11926b3..d4f0f999619 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/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 96176eec0f5..5c62a174116 100755
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 6a85c0bdcc6..947d58a8aaf 100755
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index de6221138cd..7c1ba685ad8 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index ac0fda9d2df..68813b20b64 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 134e92be60c..a69ff80dc10 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 bcaad08e1d7..d9a3c98d77c 100644
Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 4265aa70d3d..d857ca20d25 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index f5191611985..20e6d0ae8ce 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/lavaland/ash_flora.dmi b/icons/obj/lavaland/ash_flora.dmi
index 61c6155ca25..55f01878d2d 100644
Binary files a/icons/obj/lavaland/ash_flora.dmi and b/icons/obj/lavaland/ash_flora.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 91d3fe17d43..40337084c29 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/tent.dmi b/icons/obj/tent.dmi
new file mode 100644
index 00000000000..f74c1e71979
Binary files /dev/null and b/icons/obj/tent.dmi differ
diff --git a/icons/obj/weapons/ammo.dmi b/icons/obj/weapons/ammo.dmi
index 0e5c1545a30..f118d5aa100 100644
Binary files a/icons/obj/weapons/ammo.dmi and b/icons/obj/weapons/ammo.dmi differ
diff --git a/icons/obj/weapons/projectile.dmi b/icons/obj/weapons/projectile.dmi
index 4dd37d84e0f..08d60d81da1 100644
Binary files a/icons/obj/weapons/projectile.dmi and b/icons/obj/weapons/projectile.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 9b96ab95328..aee205beb68 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1153,6 +1153,7 @@
#include "code\game\objects\items\mixing_bowl.dm"
#include "code\game\objects\items\random_items.dm"
#include "code\game\objects\items\shooting_range.dm"
+#include "code\game\objects\items\tent.dm"
#include "code\game\objects\items\theft_items.dm"
#include "code\game\objects\items\toys.dm"
#include "code\game\objects\items\trash.dm"
diff --git a/sound/weapons/kolotushka_smash.ogg b/sound/weapons/kolotushka_smash.ogg
new file mode 100644
index 00000000000..43ba6e50b54
Binary files /dev/null and b/sound/weapons/kolotushka_smash.ogg differ