diff --git a/_maps/map_files/Delta/Lavaland.dmm b/_maps/map_files/Delta/Lavaland.dmm index 4a4b3b47751..be9110b37f9 100644 --- a/_maps/map_files/Delta/Lavaland.dmm +++ b/_maps/map_files/Delta/Lavaland.dmm @@ -5280,6 +5280,10 @@ }, /turf/simulated/floor/plasteel, /area/mine/laborcamp) +"Ea" = ( +/obj/ash_walker_landmark, +/turf/template_noop, +/area/lavaland/surface/outdoors/necropolis) "Ef" = ( /obj/structure/stone_tile/block{ dir = 1 @@ -60973,9 +60977,9 @@ Ct Ct Ct aj -ab aj -ab +aj +aj ab ab ab @@ -62262,7 +62266,7 @@ aj aj aj aj -aj +ab ab ab ab @@ -63034,7 +63038,7 @@ aj aj aj aj -ab +aj ab ab Vh @@ -63276,13 +63280,14 @@ RD Ct Ct Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj aj aj aj @@ -63291,7 +63296,6 @@ aj aj aj aj -ab ab ab Vh @@ -63533,13 +63537,15 @@ RD Ct Ct Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -63548,8 +63554,6 @@ aj aj aj aj -ab -ab ab Vh Vh @@ -63790,13 +63794,15 @@ jK gU Ct Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -63805,8 +63811,6 @@ aj aj aj aj -ab -ab ab Vh Vh @@ -64047,13 +64051,15 @@ jK jK jK Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Ea +Zx +Zx +Zx +aj +aj aj aj aj @@ -64062,8 +64068,6 @@ aj aj aj aj -ab -ab ab Vh Vh @@ -64304,13 +64308,15 @@ jK jK jK jK -jK -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -64319,8 +64325,6 @@ aj aj aj aj -ab -ab ab Vh Vh @@ -64561,13 +64565,15 @@ jK jK jK jK -jK -jK -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -64576,8 +64582,6 @@ aj aj aj aj -ab -ab ab Vh Vh @@ -64818,13 +64822,14 @@ jK jK jK jK -jK -jK -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj aj aj aj @@ -64833,7 +64838,6 @@ aj aj aj aj -ab ab ab Vh @@ -65603,7 +65607,7 @@ aj aj aj aj -aj +ab ab ab ab @@ -66111,10 +66115,10 @@ Ct Ct Ct Ct -Ct +zW +aj aj aj -ab ab ab Vh diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker_new.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker_new.dmm new file mode 100644 index 00000000000..bbeae530967 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker_new.dmm @@ -0,0 +1,3259 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aq" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/table/wood, +/obj/item/seeds/reishi{ + pixel_x = -5; + pixel_y = -5 + }, +/obj/item/seeds/reishi{ + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/seeds/reishi{ + pixel_x = 8; + pixel_y = -5 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"au" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"aN" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/machinery/kitchen_machine/tribal_oven, +/obj/structure/torch_holder/mapping{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ba" = ( +/obj/structure/stone_tile/slab, +/obj/structure/torch_holder/mapping{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"bf" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/block, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"bx" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"bS" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/structure/table/wood, +/obj/item/hatchet/wooden, +/obj/item/scythe, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cx" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/item/twohanded/spear, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cB" = ( +/obj/structure/stone_tile/slab/cracked, +/mob/living/simple_animal/chicken, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cF" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"cG" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/item/twohanded/spear, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"da" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/burnt{ + dir = 1 + }, +/obj/structure/rack/wooden, +/obj/item/malf_upgrade, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"dB" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/curtain/open{ + color = "#222222"; + name = "black curtain"; + anchored = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"dM" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ec" = ( +/obj/structure/stone_tile/block/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"et" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"ew" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center/burnt, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"eK" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"eS" = ( +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"fC" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"fG" = ( +/obj/structure/stone_tile/slab, +/obj/structure/chair/stool/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"gd" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"gi" = ( +/obj/structure/stone_tile/slab, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom{ + pixel_y = 4; + pixel_x = -8 + }, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit{ + pixel_y = -5 + }, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit{ + pixel_y = 3; + pixel_x = 6 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"gn" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"gu" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/chair/stool/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"gv" = ( +/obj/structure/stone_tile/slab, +/obj/structure/ore_box, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"gx" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/template_noop, +/area/lavaland/surface/outdoors) +"gI" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"gV" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/effect/mob_spawn/human/corpse/damaged, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"he" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/burnt, +/obj/structure/stone_tile/block/burnt{ + dir = 1 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"hp" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/item/reagent_containers/glass/bucket/wooden, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"hM" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/torch_holder/mapping{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"hY" = ( +/obj/structure/stone_tile/surrounding, +/obj/structure/stone_tile/center/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ie" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"is" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/meat{ + pixel_x = -10; + pixel_y = -4 + }, +/obj/item/reagent_containers/food/snacks/meat{ + pixel_x = -7; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/snacks/monstermeat/goliath{ + pixel_x = 6; + pixel_y = 3 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"iu" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"iU" = ( +/obj/structure/closet/crate/radiation, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/flare, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"jb" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/necropolis_gate/ashwalker, +/obj/structure/fans/tiny/invisible, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"je" = ( +/turf/simulated/wall/mineral/wood, +/area/ruin/unpowered/ash_walkers) +"jq" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/obj/effect/rune_fluff_marks, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"jv" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"jC" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/lavaland_food/veggie_meal, +/obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_wing{ + pixel_x = 8; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_cacti{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_crunchie{ + pixel_y = 6 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"jL" = ( +/obj/structure/stone_tile/surrounding_tile, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"jO" = ( +/obj/item/reagent_containers/glass/bucket/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"jU" = ( +/obj/structure/stone_tile/slab, +/obj/structure/table/wood, +/obj/item/storage/toolbox/surgery/ashwalker{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/healthanalyzer/gem_analyzer{ + pixel_x = -10; + pixel_y = 7 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ks" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 1 + }, +/obj/structure/stone_tile/burnt, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"kQ" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"kS" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ld" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 1 + }, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/structure/closet/crate/miningcar, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"lm" = ( +/turf/template_noop, +/area/lavaland/surface/outdoors) +"ls" = ( +/obj/structure/stone_tile/block/burnt, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"lF" = ( +/obj/effect/mob_spawn/human/corpse/damaged, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"lT" = ( +/turf/simulated/wall/indestructible/boss, +/area/lavaland/surface/outdoors) +"mb" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/effect/rune_fluff_marks, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"mp" = ( +/obj/structure/stone_tile/block, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ms" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"mt" = ( +/obj/item/twohanded/spear, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"mx" = ( +/obj/structure/stone_tile/slab, +/obj/structure/rack/wooden, +/obj/item/reagent_containers/food/snacks/egg{ + pixel_x = 3; + pixel_y = -8 + }, +/obj/item/reagent_containers/food/snacks/egg{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/snacks/egg{ + pixel_y = -9; + pixel_x = -6 + }, +/obj/item/reagent_containers/food/snacks/egg{ + pixel_x = 3; + pixel_y = 5 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"mF" = ( +/obj/item/shovel/spade/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"mN" = ( +/obj/item/seeds/aloe, +/obj/structure/closet/crate/wooden, +/obj/item/seeds/aloe, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"mQ" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/meat{ + pixel_x = 8; + pixel_y = -2 + }, +/obj/item/reagent_containers/food/snacks/meat{ + pixel_x = 9; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/snacks/monstermeat/goliath{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/item/reagent_containers/food/snacks/monstermeat/goliath{ + pixel_x = -10; + pixel_y = -2 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"mV" = ( +/obj/structure/flora/ash/leaf_shroom, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"na" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"nc" = ( +/obj/item/seeds/aloe, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"nt" = ( +/obj/item/cultivator/rake, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"nv" = ( +/obj/structure/stone_tile/slab, +/obj/structure/rack/wooden, +/obj/item/reagent_containers/food/drinks/mushroom_bowl{ + pixel_x = 4; + pixel_y = -7 + }, +/obj/item/reagent_containers/food/drinks/mushroom_bowl{ + pixel_y = 5; + pixel_x = -2 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ny" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"nI" = ( +/obj/structure/flora/ash/cacti, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"oc" = ( +/obj/structure/stone_tile/block/burnt, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"oj" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/template_noop, +/area/lavaland/surface/outdoors) +"oz" = ( +/obj/structure/stone_tile/slab/burnt, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"oA" = ( +/obj/structure/table/reinforced/brass, +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/item/toy/plushie/ashwalkerplushie, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"oH" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"oS" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/obj/structure/rack/wooden, +/obj/item/stack/sheet/wood{ + amount = 15 + }, +/obj/item/ammo_casing/caseless/arrow, +/obj/item/ammo_casing/caseless/arrow, +/obj/item/ammo_casing/caseless/arrow, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"pc" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf{ + pixel_y = -6; + pixel_x = -9 + }, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf{ + pixel_y = -2; + pixel_x = -9 + }, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap{ + pixel_x = 2; + pixel_y = -5 + }, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings{ + pixel_x = 11; + pixel_y = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"pg" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"pm" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"pL" = ( +/obj/effect/decal/ash_rune_centre, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"pR" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/item/flashlight/lantern, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"pW" = ( +/obj/item/storage/bag/plants/portaseeder, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"pX" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"pZ" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"qb" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"qu" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/bed/leather, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"qy" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"qC" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/chair/stool/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"rd" = ( +/obj/structure/stone_tile/block/burnt, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"rl" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"rn" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 8 + }, +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/cloth/ten, +/obj/item/reagent_containers/iv_bag/blood/unathi, +/obj/item/reagent_containers/iv_bag/blood/unathi, +/obj/item/reagent_containers/iv_bag/blood/unathi, +/obj/item/stack/medical/splint/tribal, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"rB" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/burnt, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"rG" = ( +/obj/structure/stone_tile/slab, +/obj/structure/curtain/open{ + color = "#222222"; + name = "black curtain"; + anchored = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"rM" = ( +/obj/structure/stone_tile/slab, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/lavaland_food/fine_meal{ + pixel_x = 4; + pixel_y = 14 + }, +/obj/item/reagent_containers/food/snacks/lavaland_food/veggie_meal, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"sd" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/structure/closet/crate/wooden, +/obj/item/clothing/gloves/color/black/goliath, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"so" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4; + pixel_x = -16; + pixel_y = 16 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8; + pixel_y = -16; + pixel_x = -16 + }, +/obj/structure/torch_holder/mapping{ + dir = 8 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"sJ" = ( +/turf/simulated/wall/indestructible/boss, +/area/ruin/unpowered/ash_walkers) +"sK" = ( +/obj/structure/stone_tile/slab, +/obj/structure/bed/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"sW" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/effect/rune_animation_landmark, +/obj/effect/rune_fluff_marks, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"tm" = ( +/obj/structure/flora/ash/coaltree, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"to" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/closet/crate/wooden, +/obj/item/clothing/shoes/footwraps/goliath, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"tp" = ( +/obj/structure/stone_tile/center/burnt, +/obj/structure/stone_tile/surrounding/burnt, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"tw" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ty" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/template_noop, +/area/lavaland/surface/outdoors) +"tR" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 6 + }, +/obj/structure/stone_tile/center, +/obj/structure/table/wood, +/obj/item/twohanded/spear, +/obj/item/storage/belt/mining/primitive, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"tT" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ub" = ( +/obj/structure/lavaland/ash_walker, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"uw" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/curtain/black{ + anchored = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"uy" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"uH" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"uY" = ( +/obj/structure/stone_tile/slab, +/obj/structure/closet/crate/wooden, +/obj/item/storage/firstaid/adv, +/obj/item/stack/medical/bruise_pack/improvised, +/obj/item/stack/medical/splint/tribal, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"uZ" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"va" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"vb" = ( +/obj/machinery/hydroponics/soil, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"vx" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/chair/stool/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"vD" = ( +/obj/structure/stone_tile/block/cracked, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"vH" = ( +/obj/structure/table/wood, +/obj/item/twohanded/spear, +/obj/item/clothing/head/shamanash, +/obj/item/ammo_casing/caseless/arrow{ + pixel_y = 7; + pixel_x = -4 + }, +/obj/item/ammo_casing/caseless/arrow{ + pixel_x = 7 + }, +/obj/item/ammo_casing/caseless/arrow{ + pixel_y = 10; + pixel_x = -7 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"wb" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"wd" = ( +/obj/structure/torch_holder/mapping{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"wm" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"wL" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/burnt{ + dir = 8 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"xj" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/torch_holder/mapping{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"xq" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"xu" = ( +/obj/structure/stone_tile/slab, +/obj/structure/table/wood, +/obj/item/book/manual/lavaland_scroll, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"xy" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"xF" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"xG" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/item/shovel, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"xJ" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"xK" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"yv" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"yw" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"yV" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/template_noop, +/area/lavaland/surface/outdoors) +"za" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"zw" = ( +/obj/item/hatchet/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"zx" = ( +/obj/structure/flora/ash/tall_shroom, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"zD" = ( +/obj/item/pickaxe, +/obj/structure/closet/crate/miningcar, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"zI" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/block/burnt{ + dir = 1 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"zK" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/obj/item/seeds/cotton, +/obj/item/seeds/cotton, +/obj/item/seeds/cotton, +/obj/structure/closet/crate/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"zO" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/item/flashlight/lantern, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"Al" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"AL" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + pixel_x = 16; + pixel_y = -16 + }, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 1; + pixel_x = 16; + pixel_y = 15 + }, +/obj/structure/torch_holder/mapping{ + dir = 4 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"AM" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/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) +"AQ" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/mushroom_bowl, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap{ + pixel_x = -9; + pixel_y = -7 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"AS" = ( +/obj/structure/barricade/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Ba" = ( +/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center/burnt, +/obj/structure/torch_holder/mapping{ + dir = 1 + }, +/obj/machinery/optable, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Bf" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"BJ" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/statue/bone/rib, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"BK" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/item/cultivator/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"BR" = ( +/obj/structure/stone_tile/surrounding, +/obj/structure/stone_tile/center/burnt, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"BX" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/block/cracked, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"Ca" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + 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) +"Cd" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Cg" = ( +/obj/structure/stone_tile/slab, +/obj/structure/closet/crate/wooden, +/obj/item/weldingtool/experimental, +/obj/item/storage/toolbox/syndicate, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Ck" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/structure/chair/stool/wooden, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"CC" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/ore_box, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"CO" = ( +/obj/item/flashlight/lantern, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"CS" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/item/flashlight/lantern, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"CZ" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Da" = ( +/obj/structure/closet/crate/wooden, +/obj/item/seeds/comfrey, +/obj/item/seeds/comfrey, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"De" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block/burnt{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Dl" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Dn" = ( +/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit{ + pixel_x = -6; + pixel_y = -4 + }, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit{ + pixel_x = 4; + pixel_y = -1 + }, +/obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Dq" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"DA" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"DS" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Ep" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"EK" = ( +/obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/flora/ash/fireblossom, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"EP" = ( +/obj/structure/stone_tile/surrounding_tile/burnt, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ET" = ( +/obj/structure/stone_tile/burnt{ + dir = 1 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Fc" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Ff" = ( +/obj/structure/stone_tile/surrounding_tile, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"Fk" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/item/flashlight/lantern, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"Ft" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Fu" = ( +/obj/effect/rune_fluff_marks, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"FV" = ( +/obj/structure/stone_tile/surrounding/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Gh" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/effect/rune_fluff_marks, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Gs" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"Gw" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/item/flashlight/lantern, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"GD" = ( +/obj/structure/stone_tile/block/burnt, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"GK" = ( +/turf/template_noop, +/area/template_noop) +"GU" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"GZ" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"HL" = ( +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/burnt{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Ic" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/table/wood, +/obj/item/twohanded/spear, +/obj/item/clothing/head/helmet/roman/legionaire, +/obj/item/melee/nutcracker, +/obj/item/storage/belt/mining/primitive, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Il" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/closet/crate/wooden, +/obj/item/stack/sheet/wood{ + amount = 20 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"IB" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/flora/ash/fireblossom, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"IJ" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"IO" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"IV" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/burnt{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Jg" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"Ji" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Jk" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/burnt{ + dir = 8 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"Jl" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Jo" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"Jr" = ( +/obj/structure/stone_tile/slab, +/obj/machinery/the_singularitygen, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"JJ" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/structure/table/wood, +/obj/item/seeds/glowshroom, +/obj/item/seeds/glowshroom{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/seeds/glowshroom{ + pixel_x = 10; + pixel_y = -3 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"JM" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/center/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"JN" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"JY" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/turf/template_noop, +/area/lavaland/surface/outdoors) +"Kg" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Kl" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"Kv" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"KA" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"KC" = ( +/obj/structure/stone_tile/slab, +/obj/structure/closet/crate/wooden, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Lr" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/burnt, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"LJ" = ( +/obj/structure/sink/puddle, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Ms" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"Mz" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/torch_holder/mapping{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ME" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/statue/bone/rib{ + dir = 1 + }, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"MK" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 8 + }, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"Nu" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/lavaland_food/abu_ghosh{ + pixel_x = -6; + pixel_y = -5 + }, +/obj/item/reagent_containers/food/snacks/lavaland_food/grace_of_lazis{ + pixel_x = 6; + pixel_y = 9 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Ny" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"NC" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"NF" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"NG" = ( +/obj/structure/table/wood, +/obj/item/seeds/tower, +/obj/item/cultivator/wooden, +/obj/item/seeds/tower{ + pixel_y = -7; + pixel_x = -10 + }, +/obj/item/seeds/tower{ + pixel_x = 6; + pixel_y = 6 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Of" = ( +/obj/structure/table/wood, +/obj/item/seeds/wheat{ + pixel_x = 9; + pixel_y = 10 + }, +/obj/item/seeds/wheat{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/seeds/wheat{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/shovel/spade/wooden{ + pixel_y = 4; + pixel_x = -1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"OC" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/item/twohanded/spear, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Pq" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Pt" = ( +/obj/structure/flora/ash/cap_shroom, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"PD" = ( +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Qc" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Qk" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/curtain/open{ + color = "#222222"; + name = "black curtain"; + anchored = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Qy" = ( +/obj/structure/closet/crate/miningcar, +/obj/item/pickaxe, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"QT" = ( +/obj/structure/stone_tile/surrounding_tile/burnt{ + dir = 1 + }, +/turf/simulated/floor/lava, +/area/ruin/unpowered/ash_walkers) +"QW" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/torch_holder/mapping{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Rj" = ( +/obj/structure/flora/ash/stem_shroom, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Rz" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/burnt{ + dir = 1 + }, +/obj/structure/stone_tile/block/burnt, +/turf/simulated/floor/lava/lava_land_surface, +/area/lavaland/surface/outdoors) +"Se" = ( +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/structure/stone_tile/slab/cracked, +/obj/structure/closet/crate/miningcar, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Sp" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"Sw" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/bed/wicker, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"SV" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Te" = ( +/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/stone_tile/center/burnt, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Ti" = ( +/obj/structure/stone_tile/slab, +/obj/structure/table/wood, +/obj/item/gun/projectile/bow, +/obj/item/storage/backpack/quiver{ + pixel_x = -7; + pixel_y = 7 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Tl" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/rack/wooden, +/obj/item/grown/cotton, +/obj/item/grown/cotton, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"TB" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/curtain/black{ + anchored = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"TD" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"TP" = ( +/obj/structure/stone_tile/slab, +/obj/structure/bed/leather, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"TV" = ( +/obj/structure/stone_tile/block/burnt, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Uc" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/mob/living/simple_animal/cock, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Ue" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"UQ" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"Vh" = ( +/obj/structure/stone_tile/surrounding, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Vk" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/curtain/open{ + color = "#222222"; + name = "black curtain"; + anchored = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Vt" = ( +/obj/structure/fluff/ash_statue{ + special_name = "логово пеплоходцев" + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"VD" = ( +/obj/structure/stone_tile, +/turf/template_noop, +/area/lavaland/surface/outdoors) +"VM" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/rack/wooden, +/obj/structure/torch_holder/mapping{ + dir = 1 + }, +/obj/item/stack/rods/twentyfive, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Wh" = ( +/obj/structure/stone_tile/surrounding/burnt, +/obj/structure/stone_tile/center/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Wp" = ( +/obj/structure/torch_holder/mapping{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"WH" = ( +/obj/structure/stone_tile/surrounding, +/obj/structure/bonfire, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"WI" = ( +/obj/structure/ore_box, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"WT" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"WX" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Xs" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/machinery/smartfridge/drying_rack/ash, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"XK" = ( +/obj/structure/stone_tile/slab, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"XV" = ( +/obj/structure/stone_tile/surrounding_tile, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Yd" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/indestructible/boss/indoors, +/area/ruin/unpowered/ash_walkers) +"Ye" = ( +/obj/structure/necropolis_arch, +/obj/structure/necropolis_gate, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Yy" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"YC" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/structure/rack/wooden, +/obj/item/flashlight/lantern, +/obj/item/flashlight/lantern, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Zg" = ( +/obj/structure/stone_tile/slab, +/obj/machinery/iv_drip, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"Zt" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/template_noop, +/area/lavaland/surface/outdoors) +"ZA" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/bed/wicker, +/obj/structure/torch_holder/mapping{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) +"ZJ" = ( +/obj/structure/stone_tile/slab, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/mushroom_bowl{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/kitchen/knife/combat/survival/bone{ + pixel_y = 6; + pixel_x = -4 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/ash_walkers) + +(1,1,1) = {" +lT +lT +lT +sJ +je +je +sJ +je +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(2,1,1) = {" +lT +lT +je +sJ +je +uY +ZA +sd +je +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(3,1,1) = {" +lT +je +je +KC +sK +Kv +XV +qb +Sw +je +AS +AS +AS +GK +GK +GK +je +je +je +sJ +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(4,1,1) = {" +lT +je +jU +XV +rl +SV +XK +jv +to +sJ +WI +zD +AS +AS +je +sJ +je +rM +aN +jC +je +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(5,1,1) = {" +lT +sJ +Ba +PD +tw +XV +PD +OC +ls +TB +PD +PD +PD +je +je +ZJ +gi +ew +bx +cF +is +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(6,1,1) = {" +lT +je +Zg +DS +XK +PD +Vt +lF +WX +rG +WX +jv +Pt +je +mx +fG +Ck +GD +Jl +rl +xu +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(7,1,1) = {" +lT +je +je +rn +JN +pR +PD +rl +oc +TB +PD +XK +rl +sJ +Uc +bx +cG +XV +PD +cB +mQ +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(8,1,1) = {" +lT +lT +je +TP +Ue +GU +XK +Ft +qu +sJ +PD +NF +kQ +WX +PD +XK +rl +qC +ie +Pq +sJ +sJ +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(9,1,1) = {" +lT +lT +je +je +sJ +uw +Vk +uw +sJ +sJ +wd +WX +tT +oz +xJ +Jl +gu +WH +mp +mt +pc +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(10,1,1) = {" +lT +lT +lT +sJ +AS +ie +mV +PD +Pq +Mz +PD +na +PD +sJ +nv +ie +Pq +vx +XV +fG +AQ +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(11,1,1) = {" +lT +lT +lT +sJ +AS +AS +PD +PD +rl +ie +zx +Fc +PD +je +je +Nu +WX +HL +ny +uy +Dn +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(12,1,1) = {" +lT +lT +lT +sJ +sJ +AS +ie +Pt +sJ +XV +PD +IV +PD +PD +je +je +sJ +oz +BR +WX +je +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(13,1,1) = {" +lT +lT +sJ +sJ +sJ +sJ +sJ +Dq +NC +PD +PD +GU +TV +eK +PD +Wp +qb +TD +TD +Qc +sJ +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(14,1,1) = {" +lT +sJ +sJ +GZ +so +xq +sJ +sJ +XK +PD +nI +PD +PD +XK +PD +PD +Rj +PD +PD +sJ +sJ +GK +GK +GK +GK +GK +GK +GK +GK +JY +GK +GK +GK +"} +(15,1,1) = {" +sJ +sJ +Gw +Jg +yw +AM +CS +sJ +sJ +IB +PD +rl +ET +iu +jv +uZ +PD +PD +sJ +sJ +IJ +GK +GK +GK +GK +GK +GK +GK +lT +lT +yV +GK +GK +"} +(16,1,1) = {" +sJ +ME +Sp +pm +ms +IO +hp +sJ +sJ +XK +ie +Cd +mb +Fu +sW +rd +PD +rl +Te +sJ +KA +wb +dM +pZ +Rz +xK +DA +De +gn +lT +gx +lm +GK +"} +(17,1,1) = {" +sJ +oA +pX +vD +ub +pg +Ep +UQ +jb +yv +WX +BR +Fu +pL +Fu +Lr +kS +WX +CZ +Ye +wm +gn +Jk +oH +hY +gI +zI +MK +tp +Ji +oj +lm +GK +"} +(18,1,1) = {" +sJ +BJ +Jo +Gs +et +xF +Yd +sJ +sJ +fC +EP +ks +jq +Fu +Gh +Dl +PD +Pq +eS +sJ +he +wL +Yy +qy +BX +rB +xy +Kl +Kg +lT +ty +lm +GK +"} +(19,1,1) = {" +sJ +sJ +zO +Ca +za +Ms +Fk +sJ +sJ +EK +PD +qb +gd +WX +Ft +uH +PD +PD +sJ +sJ +jL +GK +GK +GK +GK +GK +GK +GK +lT +lT +VD +GK +GK +"} +(20,1,1) = {" +lT +sJ +sJ +QT +AL +Ff +sJ +sJ +WX +PD +Bf +uy +Dq +oz +uy +hM +Dq +tm +PD +sJ +sJ +GK +GK +GK +GK +GK +GK +GK +GK +Zt +GK +GK +GK +"} +(21,1,1) = {" +lT +lT +sJ +sJ +sJ +sJ +sJ +va +EP +PD +yv +sJ +sJ +PD +PD +sJ +sJ +PD +PD +lF +sJ +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(22,1,1) = {" +lT +lT +lT +lT +sJ +AS +Qy +PD +PD +PD +Al +sJ +YC +rl +NC +oS +cx +mp +PD +PD +je +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(23,1,1) = {" +lT +lT +lT +lT +sJ +AS +PD +PD +xj +mV +tT +CZ +WT +Pq +XV +Ny +JM +ec +PD +jO +LJ +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(24,1,1) = {" +lT +lT +lT +lT +je +sJ +Qk +Vk +sJ +QW +yv +bf +au +PD +PD +sJ +sJ +XV +tm +PD +mN +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(25,1,1) = {" +lT +lT +sJ +je +je +ld +PD +PD +dB +PD +tT +sJ +Ti +NC +FV +Ic +sJ +wd +zw +nI +vb +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(26,1,1) = {" +lT +je +je +gv +Jr +iU +uy +ie +dB +NC +Pq +sJ +sJ +vH +tR +sJ +sJ +Of +PD +nI +vb +sJ +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(27,1,1) = {" +lT +sJ +da +WT +PD +tT +Vh +mp +sJ +sJ +PD +PD +sJ +sJ +sJ +sJ +NG +CO +PD +pW +vb +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(28,1,1) = {" +lT +je +VM +PD +CO +Pq +TD +XV +CC +je +PD +PD +zx +Wp +Da +mF +PD +PD +PD +vb +je +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(29,1,1) = {" +lT +je +Tl +Wh +xJ +FV +Xs +ba +Se +je +xG +PD +PD +PD +PD +nI +PD +nc +nt +vb +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(30,1,1) = {" +lT +je +je +je +Il +Cg +je +sJ +je +je +sJ +gV +zK +Dq +BK +ny +vb +vb +vb +je +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(31,1,1) = {" +lT +lT +lT +je +sJ +je +je +lT +lT +lT +sJ +je +je +bS +aq +JJ +je +je +sJ +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(32,1,1) = {" +lT +lT +lT +lT +lT +lT +lT +lT +lT +lT +lT +lT +je +je +sJ +je +je +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} +(33,1,1) = {" +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +GK +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_lavalake.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_lavalake.dmm new file mode 100644 index 00000000000..048842c5851 --- /dev/null +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_lavalake.dmm @@ -0,0 +1,904 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bq" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"cc" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/flora/ausbushes/fullgrass/hell, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"cU" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dl" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ey" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"gQ" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/lava/lava_land_surface/lava_only, +/area/lavaland/surface/outdoors) +"gW" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/indestructible/boss, +/area/ruin/unpowered/safe_cave) +"hP" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/lava/lava_land_surface/lava_only, +/area/lavaland/surface/outdoors) +"im" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"kk" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/table/wood, +/obj/item/flashlight/lantern, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"kx" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/mineral/wood, +/area/lavaland/surface/outdoors) +"lN" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"mL" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/bonfire, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"mN" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/lava/lava_land_surface/lava_only, +/area/lavaland/surface/outdoors) +"mO" = ( +/obj/structure/stone_tile/slab, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"nt" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/lava/lava_land_surface/lava_only, +/area/lavaland/surface/outdoors) +"nA" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"nZ" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"oi" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"oB" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/lava/lava_land_surface/lava_only, +/area/lavaland/surface/outdoors) +"oK" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"pg" = ( +/turf/simulated/mineral/random/volcanic/hard, +/area/lavaland/surface/outdoors) +"pv" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"rj" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/table/wood, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"rO" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/fluff/ash_statue{ + special_name = "лавовое озеро" + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"tZ" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"uX" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"yi" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"yu" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"yv" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/lava/lava_land_surface/lava_only, +/area/lavaland/surface/outdoors) +"yY" = ( +/turf/simulated/wall/mineral/wood, +/area/lavaland/surface/outdoors) +"zO" = ( +/turf/simulated/wall/indestructible/boss, +/area/lavaland/surface/outdoors) +"BU" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/mineral/wood, +/area/ruin/unpowered/safe_cave) +"EO" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"Fn" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Ha" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Ir" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/flora/ausbushes/fullgrass/hell, +/obj/structure/flora/ausbushes/fullgrass/hell, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Jc" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/effect/mapping_helpers/no_lava, +/obj/item/shovel/spade/wooden{ + pixel_x = -2; + pixel_y = -8 + }, +/obj/item/shovel/spade/wooden{ + pixel_x = 6; + pixel_y = 1 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"KI" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/lava/lava_land_surface/lava_only, +/area/lavaland/surface/outdoors) +"Lg" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Lr" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Md" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"Mn" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/flora/ausbushes/grassybush/hell, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"OB" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/mineral/random/volcanic/hard, +/area/lavaland/surface/outdoors) +"PJ" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/effect/mapping_helpers/no_lava, +/obj/item/twohanded/fishing_rod/tribal, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"PL" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/wall/indestructible/boss, +/area/lavaland/surface/outdoors) +"Qx" = ( +/obj/structure/stone_tile/cracked, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Rn" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"Tl" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/flora/ausbushes/genericbush/hell, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"TK" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Un" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/safe_cave) +"Vd" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/flora/firebush, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"VU" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"WH" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/stone_tile/slab/cracked, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Xn" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"XU" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Yd" = ( +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/lava/lava_land_surface/lava_only, +/area/lavaland/surface/outdoors) +"Zg" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/lava/lava_land_surface/lava_only, +/area/lavaland/surface/outdoors) +"ZS" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 8 + }, +/obj/effect/mapping_helpers/no_lava, +/turf/simulated/floor/lava/lava_land_surface/lava_only, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +pg +pg +pg +pg +pg +pg +pg +pg +pg +pg +pg +pg +WH +yu +VU +pg +pg +pg +pg +pg +"} +(2,1,1) = {" +pg +tZ +tZ +tZ +tZ +tZ +tZ +tZ +tZ +kx +kx +PL +tZ +cc +tZ +pg +pg +pg +pg +pg +"} +(3,1,1) = {" +pg +tZ +tZ +tZ +Yd +Yd +tZ +Vd +tZ +tZ +rO +tZ +tZ +tZ +tZ +tZ +yY +zO +cc +pg +"} +(4,1,1) = {" +pg +tZ +Yd +Yd +Yd +Yd +Yd +tZ +gQ +tZ +tZ +tZ +Mn +Lr +tZ +tZ +tZ +tZ +tZ +pg +"} +(5,1,1) = {" +pg +tZ +tZ +Yd +Yd +Yd +Yd +Yd +ZS +Tl +tZ +TK +tZ +Yd +Yd +tZ +Tl +tZ +lN +pg +"} +(6,1,1) = {" +uX +Vd +tZ +tZ +Yd +oB +Yd +Yd +Yd +Yd +tZ +Ir +yv +Yd +Yd +Yd +tZ +tZ +tZ +pg +"} +(7,1,1) = {" +VU +tZ +cU +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +KI +tZ +tZ +dl +"} +(8,1,1) = {" +WH +tZ +tZ +yi +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +tZ +tZ +tZ +cU +"} +(9,1,1) = {" +pg +pg +cc +tZ +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +tZ +tZ +tZ +Ha +"} +(10,1,1) = {" +pg +pg +zO +tZ +tZ +hP +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +oK +tZ +Vd +pg +"} +(11,1,1) = {" +pg +pg +zO +zO +tZ +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +nt +Yd +Yd +tZ +tZ +tZ +pg +"} +(12,1,1) = {" +pg +pg +pg +tZ +tZ +Yd +Yd +Yd +Yd +Zg +Yd +Yd +Yd +Yd +Yd +tZ +tZ +tZ +cc +pg +"} +(13,1,1) = {" +pg +pg +pg +tZ +XU +Mn +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Yd +tZ +tZ +cc +gW +BU +BU +"} +(14,1,1) = {" +pg +tZ +zO +tZ +tZ +tZ +Yd +Yd +Yd +Yd +Yd +Yd +Yd +Lg +tZ +tZ +gW +BU +Jc +gW +"} +(15,1,1) = {" +pg +Vd +tZ +tZ +tZ +tZ +tZ +Yd +Yd +mN +Yd +Yd +Yd +Xn +tZ +nA +Md +bq +Un +BU +"} +(16,1,1) = {" +pg +tZ +tZ +tZ +tZ +tZ +lN +Mn +Yd +Yd +Yd +tZ +tZ +tZ +gW +gW +ey +oi +nZ +gW +"} +(17,1,1) = {" +pg +tZ +tZ +Qx +Tl +tZ +tZ +tZ +Ha +tZ +Qx +tZ +tZ +tZ +gW +Md +EO +mL +mO +gW +"} +(18,1,1) = {" +pg +pg +yY +tZ +tZ +tZ +tZ +tZ +tZ +Vd +tZ +tZ +XU +tZ +BU +BU +rj +im +Rn +BU +"} +(19,1,1) = {" +pg +pg +yY +yY +tZ +cc +pg +zO +tZ +tZ +tZ +yY +tZ +cc +OB +BU +gW +PJ +kk +BU +"} +(20,1,1) = {" +pg +pg +pg +pg +pg +pg +pg +pg +pv +Fn +WH +pg +pg +pg +pg +pg +gW +gW +BU +BU +"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_worldanvil.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_worldanvil.dmm index d3198765f31..833e4e2b611 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_worldanvil.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_worldanvil.dmm @@ -346,6 +346,13 @@ }, /turf/simulated/floor/lava/lava_land_surface, /area/ruin/unpowered/misc_lavaruin) +"QC" = ( +/obj/effect/mapping_helpers/no_lava, +/obj/structure/fluff/ash_statue{ + special_name = "мировая кузня" + }, +/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/misc_lavaruin) "Tw" = ( /obj/structure/stone_tile/slab, /obj/structure/world_anvil, @@ -521,7 +528,7 @@ Nd GD jC wO -Dp +QC FE Wc "} diff --git a/_maps/map_files/RandomZLevels/evil_santa.dmm b/_maps/map_files/RandomZLevels/evil_santa.dmm index e38b1bdfc2e..3a9ff0ff5e7 100644 --- a/_maps/map_files/RandomZLevels/evil_santa.dmm +++ b/_maps/map_files/RandomZLevels/evil_santa.dmm @@ -5641,7 +5641,7 @@ /turf/simulated/floor/plating/asteroid, /area/vision_change_area/awaymission/evil_santa/mine) "VA" = ( -/obj/item/twohanded/fishingrod, +/obj/item/twohanded/fishing_rod, /obj/item/stack/sheet/wood{ amount = 20 }, diff --git a/_maps/map_files/celestation/Lavaland.dmm b/_maps/map_files/celestation/Lavaland.dmm index 56538f05d96..c07d5b13700 100644 --- a/_maps/map_files/celestation/Lavaland.dmm +++ b/_maps/map_files/celestation/Lavaland.dmm @@ -7269,6 +7269,10 @@ /obj/structure/table/reinforced/brass, /turf/simulated/floor/indestructible/boss, /area/mine/necropolis) +"XS" = ( +/obj/ash_walker_landmark, +/turf/template_noop, +/area/lavaland/surface/outdoors/necropolis) "XT" = ( /obj/machinery/light/small{ dir = 1 @@ -60506,9 +60510,9 @@ Ct Ct Ct aj -ab aj -ab +aj +aj ab ab ab @@ -62567,7 +62571,7 @@ aj aj aj aj -ab +aj ab ab kh @@ -62809,13 +62813,14 @@ RD Ct Ct Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj aj aj aj @@ -62824,7 +62829,6 @@ aj aj aj aj -ab ab ab kh @@ -63066,13 +63070,15 @@ RD Ct Ct Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -63081,8 +63087,6 @@ aj aj aj aj -ab -ab ab kh kh @@ -63323,13 +63327,15 @@ WC gU Ct Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -63338,8 +63344,6 @@ aj aj aj aj -ab -ab ab kh kh @@ -63580,13 +63584,15 @@ WC WC WC Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +XS +Zx +Zx +Zx +aj +aj aj aj aj @@ -63595,8 +63601,6 @@ aj aj aj aj -ab -ab ab kh kh @@ -63837,13 +63841,15 @@ WC jK jK jK -jK -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -63852,8 +63858,6 @@ aj aj aj aj -ab -ab ab kh kh @@ -64094,13 +64098,15 @@ WC jK jK jK -jK -WC -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -64109,8 +64115,6 @@ aj aj aj aj -ab -ab ab kh kh @@ -64351,13 +64355,14 @@ WC jK jK jK -jK -WC -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj aj aj aj @@ -64366,7 +64371,6 @@ aj aj aj aj -ab ab ab kh @@ -64623,7 +64627,7 @@ aj aj aj aj -ab +aj ab ab kh @@ -65647,8 +65651,8 @@ Ct Ct aj aj -ab -ab +aj +aj ab kh kh diff --git a/_maps/map_files/cerestation/Lavaland.dmm b/_maps/map_files/cerestation/Lavaland.dmm index ce7bcd3bb9f..afb3a66a6e1 100644 --- a/_maps/map_files/cerestation/Lavaland.dmm +++ b/_maps/map_files/cerestation/Lavaland.dmm @@ -3572,6 +3572,10 @@ }, /turf/simulated/floor/lava/lava_land_surface, /area/lavaland/surface/outdoors/necropolis) +"sB" = ( +/obj/ash_walker_landmark, +/turf/template_noop, +/area/lavaland/surface/outdoors/necropolis) "sC" = ( /obj/structure/stone_tile/surrounding_tile{ dir = 4 @@ -60479,9 +60483,9 @@ Ct Ct Ct aj -ab aj -ab +aj +aj ab ab ab @@ -62283,7 +62287,7 @@ aj aj aj aj -ab +aj ab ab kh @@ -62540,7 +62544,7 @@ aj aj aj aj -ab +aj ab ab kh @@ -62782,13 +62786,14 @@ RD Ct Ct Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj aj aj aj @@ -62797,7 +62802,6 @@ aj aj aj aj -ab ab ab kh @@ -63039,13 +63043,15 @@ RD Ct Ct Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -63054,8 +63060,6 @@ aj aj aj aj -ab -ab ab kh kh @@ -63296,13 +63300,15 @@ WC gU Ct Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -63311,8 +63317,6 @@ aj aj aj aj -ab -ab ab kh kh @@ -63553,13 +63557,15 @@ WC WC WC Ct -Ct -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +sB +Zx +Zx +Zx +aj +aj aj aj aj @@ -63568,8 +63574,6 @@ aj aj aj aj -ab -ab ab kh kh @@ -63810,13 +63814,15 @@ WC jK jK jK -jK -Ct -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -63825,8 +63831,6 @@ aj aj aj aj -ab -ab ab kh kh @@ -64067,13 +64071,15 @@ WC jK jK jK -jK -WC -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj +aj aj aj aj @@ -64082,8 +64088,6 @@ aj aj aj aj -ab -ab ab kh kh @@ -64324,13 +64328,14 @@ WC jK jK jK -jK -WC -Ct -Ct -Ct -Ct -Ct +Zx +Zx +Zx +Zx +Zx +Zx +Zx +aj aj aj aj @@ -64339,7 +64344,6 @@ aj aj aj aj -ab ab ab kh @@ -64596,7 +64600,7 @@ aj aj aj aj -ab +aj ab ab kh @@ -64853,7 +64857,7 @@ aj aj aj aj -ab +aj ab ab kh @@ -65620,8 +65624,8 @@ Ct Ct aj aj -ab -ab +aj +aj ab kh kh @@ -66136,7 +66140,7 @@ aj aj aj aj -ab +aj ab ab ab diff --git a/_maps/map_files/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm index 94eda5b4b9a..c5456e29686 100644 --- a/_maps/map_files/generic/Lavaland.dmm +++ b/_maps/map_files/generic/Lavaland.dmm @@ -2136,6 +2136,10 @@ icon_state = "brown" }, /area/mine/production) +"fa" = ( +/obj/ash_walker_landmark, +/turf/template_noop, +/area/lavaland/surface/outdoors/necropolis) "fb" = ( /obj/machinery/alarm{ dir = 1; @@ -7153,6 +7157,9 @@ /obj/structure/window/reinforced/clockwork, /turf/simulated/floor/indestructible/boss, /area/lavaland/surface/outdoors/necropolis) +"YG" = ( +/turf/template_noop, +/area/lavaland/surface/outdoors/necropolis) "YJ" = ( /obj/machinery/door/airlock{ name = "Labor Camp Storage" @@ -60217,7 +60224,7 @@ xu aj aj aj -ab +aj ab ab ab @@ -62019,7 +62026,7 @@ aj aj aj aj -ab +aj ab ab mK @@ -62276,7 +62283,7 @@ aj aj aj aj -ab +aj ab ab mK @@ -62518,13 +62525,14 @@ oG xu xu xu -xu -xu -xu -xu -xu -xu -xu +YG +YG +YG +YG +YG +YG +YG +aj aj aj aj @@ -62533,7 +62541,6 @@ aj aj aj aj -ab ab ab mK @@ -62775,13 +62782,15 @@ oG xu xu xu -xu -xu -xu -xu -xu -xu -xu +YG +YG +YG +YG +YG +YG +YG +aj +aj aj aj aj @@ -62790,8 +62799,6 @@ aj aj aj aj -ab -ab ab mK mK @@ -63032,13 +63039,15 @@ Pm WP xu xu -xu -xu -xu -xu -xu -xu -xu +YG +YG +YG +YG +YG +YG +YG +aj +aj aj aj aj @@ -63047,8 +63056,6 @@ aj aj aj aj -ab -ab ab mK mK @@ -63289,13 +63296,15 @@ Pm Pm Pm xu -xu -xu -xu -xu -xu -xu -xu +YG +YG +YG +fa +YG +YG +YG +aj +aj aj aj aj @@ -63304,8 +63313,6 @@ aj aj aj aj -ab -ab ab mK mK @@ -63546,13 +63553,15 @@ Pm Le Le Le -Le -xu -xu -xu -xu -xu -xu +YG +YG +YG +YG +YG +YG +YG +aj +aj aj aj aj @@ -63561,8 +63570,6 @@ aj aj aj aj -ab -ab ab mK mK @@ -63803,13 +63810,15 @@ Pm Le Le Le -Le -Pm -xu -xu -xu -xu -xu +YG +YG +YG +YG +YG +YG +YG +aj +aj aj aj aj @@ -63818,8 +63827,6 @@ aj aj aj aj -ab -ab ab mK mK @@ -64060,13 +64067,14 @@ Pm Le Le Le -Le -Pm -xu -xu -xu -xu -xu +YG +YG +YG +YG +YG +YG +YG +aj aj aj aj @@ -64075,7 +64083,6 @@ aj aj aj aj -ab ab ab mK @@ -64332,7 +64339,7 @@ aj aj aj aj -ab +aj ab ab mK @@ -65357,7 +65364,7 @@ xu aj aj aj -ab +aj ab mK mK diff --git a/_maps/map_files/nova/Lavaland.dmm b/_maps/map_files/nova/Lavaland.dmm index 81202c52e80..468bd86c8f2 100644 --- a/_maps/map_files/nova/Lavaland.dmm +++ b/_maps/map_files/nova/Lavaland.dmm @@ -3735,6 +3735,10 @@ }, /turf/simulated/floor/indestructible/boss, /area/mine/necropolis) +"za" = ( +/obj/ash_walker_landmark, +/turf/template_noop, +/area/lavaland/surface/outdoors/necropolis) "zg" = ( /obj/structure/table, /obj/item/restraints/handcuffs{ @@ -60948,9 +60952,9 @@ Oy Oy Oy Ne -Cg Ne -Cg +Ne +Ne Cg Cg Cg @@ -62752,7 +62756,7 @@ Ne Ne Ne Ne -Cg +Ne Cg Cg Or @@ -63009,7 +63013,7 @@ Ne Ne Ne Ne -Cg +Ne Cg Cg Or @@ -63251,13 +63255,14 @@ yU Oy Oy Oy -Oy -Oy -Oy -Oy -Oy -Oy -Oy +vB +vB +vB +vB +vB +vB +vB +Ne Ne Ne Ne @@ -63266,7 +63271,6 @@ Ne Ne Ne Ne -Cg Cg Cg Or @@ -63508,13 +63512,15 @@ yU Oy Oy Oy -Oy -Oy -Oy -Oy -Oy -Oy -Oy +vB +vB +vB +vB +vB +vB +vB +Ne +Ne Ne Ne Ne @@ -63523,8 +63529,6 @@ Ne Ne Ne Ne -Cg -Cg Cg Or Or @@ -63765,13 +63769,15 @@ EW yh Oy Oy -Oy -Oy -Oy -Oy -Oy -Oy -Oy +vB +vB +vB +vB +vB +vB +vB +Ne +Ne Ne Ne Ne @@ -63780,8 +63786,6 @@ Ne Ne Ne Ne -Cg -Cg Cg Or Or @@ -64022,13 +64026,15 @@ EW EW EW Oy -Oy -Oy -Oy -Oy -Oy -Oy -Oy +vB +vB +vB +za +vB +vB +vB +Ne +Ne Ne Ne Ne @@ -64037,8 +64043,6 @@ Ne Ne Ne Ne -Cg -Cg Cg Or Or @@ -64279,13 +64283,15 @@ EW rJ rJ rJ -rJ -Oy -Oy -Oy -Oy -Oy -Oy +vB +vB +vB +vB +vB +vB +vB +Ne +Ne Ne Ne Ne @@ -64294,8 +64300,6 @@ Ne Ne Ne Ne -Cg -Cg Cg Or Or @@ -64536,13 +64540,15 @@ EW rJ rJ rJ -rJ -EW -Oy -Oy -Oy -Oy -Oy +vB +vB +vB +vB +vB +vB +vB +Ne +Ne Ne Ne Ne @@ -64551,8 +64557,6 @@ Ne Ne Ne Ne -Cg -Cg Cg Or Or @@ -64793,13 +64797,14 @@ EW rJ rJ rJ -rJ -EW -Oy -Oy -Oy -Oy -Oy +vB +vB +vB +vB +vB +vB +vB +Ne Ne Ne Ne @@ -64808,7 +64813,6 @@ Ne Ne Ne Ne -Cg Cg Cg Or @@ -65065,7 +65069,7 @@ Ne Ne Ne Ne -Cg +Ne Cg Cg Or @@ -65322,7 +65326,7 @@ Ne Ne Ne Ne -Cg +Ne Cg Cg Or @@ -66089,8 +66093,8 @@ Oy Oy Ne Ne -Cg -Cg +Ne +Ne Cg Or Or @@ -68403,7 +68407,7 @@ Ne Ne Ne Ne -Cg +Ne Ne Ne Ne @@ -68917,7 +68921,7 @@ Ne Ne Ne Ne -Cg +Ne Ne Ne Ne @@ -69173,7 +69177,7 @@ Ne Ne Ne Ne -Cg +Ne Cg Ne Ne @@ -69428,7 +69432,7 @@ Oy Oy Oy Ne -Cg +Ne Ne Cg Cg diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm index 33c80e970cf..06c71b37cf5 100644 --- a/code/__DEFINES/crafting.dm +++ b/code/__DEFINES/crafting.dm @@ -6,6 +6,9 @@ #define CAT_ROBOT "Robots" #define CAT_MISC "Misc" #define CAT_PRIMAL "Tribal" +#define CAT_ARMOR "Tribal Armor" +#define CAT_WEAPONS "Tribal Weaponry" +#define CAT_MISC2 "Tribal Misc" #define CAT_DECORATIONS "Decorations" #define CAT_DECORATION "Decorations" #define CAT_HOLIDAY "Holiday" @@ -32,5 +35,6 @@ #define RECIPE_OVEN "Oven" #define RECIPE_GRILL "Grill" #define RECIPE_CANDY "Candy" +#define RECIPE_TRIBAL_OVEN "tribal_oven" #define RECIPE_FAIL null diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 7e09eecd099..74cd4928cac 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -213,6 +213,8 @@ #define COMSIG_ATOM_HITBY "atom_hitby" /// Called when an atom is sharpened or dulled. #define COMSIG_ATOM_UPDATE_SHARPNESS "atom_update_sharpness" +/// generally called before temporary non-parallel animate()s on the atom (animation_duration) +#define COMSIG_ATOM_TEMPORARY_ANIMATION_START "atom_temp_animate_start" // Attack signals. These should share the returned flags, to standardize the attack chain. // The chain currently works like: @@ -1293,5 +1295,8 @@ /// Source: /proc/random_hair_style (mob/living/carbon/human/human, valid_hairstyles, robohead) #define COMSIG_RANDOM_HAIR_STYLE "random_hair_style" +/// Source: /datum/component/ritual_object/proc/pre_ritual_check (status_bitflag, mob/living/carbon/human, list/invokers, list/used_things) +#define COMSIG_RITUAL_ENDED "ritual_ended" + /// Source: /datum/component/object_possession/proc/on_move (mob/mob, new_loc, direct) #define COMSIG_POSSESSED_MOVEMENT "possessed_movement" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index f3729973265..79da7d55b9b 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -506,7 +506,10 @@ #define MECH_TYPE_OLD_DURAND (1<<12) #define MECH_TYPE_DARK_GYGAX (1<<13) - +/// Lavaland types +#define LAVALAND_TYPE_LAVA (1<<0) +#define LAVALAND_TYPE_PLASMA (1<<1) +#define LAVALAND_TYPE_CHASM (1<<2) // Deadchat control defines diff --git a/code/__DEFINES/rituals.dm b/code/__DEFINES/rituals.dm index 463623c9f72..c94d11d86f7 100644 --- a/code/__DEFINES/rituals.dm +++ b/code/__DEFINES/rituals.dm @@ -1,18 +1,21 @@ /// Used in ritual variables -#define DEFAULT_RITUAL_RANGE_FIND 1 +#define DEFAULT_RITUAL_RANGE_FIND 2 #define DEFAULT_RITUAL_COOLDOWN (100 SECONDS) #define DEFAULT_RITUAL_DISASTER_PROB 10 #define DEFAULT_RITUAL_FAIL_PROB 10 -/// Ritual object bitflags + +/// Stages of ritual. Used in ritual custom effects on every stage of ritual. #define RITUAL_STARTED (1<<0) #define RITUAL_ENDED (1<<1) #define RITUAL_FAILED (1<<2) -/// Ritual datum bitflags + +/// Tells, that ritual accomplished successfully #define RITUAL_SUCCESSFUL (1<<0) + /// Invocation checks, should not be used in extra checks. -#define RITUAL_FAILED_INVALID_SPECIES (1<<1) -#define RITUAL_FAILED_EXTRA_INVOKERS (1<<2) -#define RITUAL_FAILED_MISSED_REQUIREMENTS (1<<3) -#define RITUAL_FAILED_ON_PROCEED (1<<4) -#define RITUAL_FAILED_INVALID_SPECIAL_ROLE (1<<5) +#define RITUAL_FAILED_INVALID_SPECIES (1<<1) +#define RITUAL_FAILED_MISSED_INVOKER_REQUIREMENTS (1<<2) +#define RITUAL_FAILED_MISSED_REQUIREMENTS (1<<3) +#define RITUAL_FAILED_ON_PROCEED (1<<4) +#define RITUAL_FAILED_INVALID_SPECIAL_ROLE (1<<5) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index c22533ce055..159ca8bf528 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -30,6 +30,14 @@ #define STATUS_EFFECT_REGENERATIVE_CORE /datum/status_effect/regenerative_core +#define STATUS_EFFECT_LAVALAND_NO_PAIN /datum/status_effect/lavaland_no_pain + +#define STATUS_EFFECT_LAVALAND_ETERNAL_BLEEDING_FIX /datum/status_effect/lavaland_eternal_bleeding_fix + +#define STATUS_EFFECT_LAVALAND_NIGHT_VISION /datum/status_effect/lavaland_night_vision + +#define STATUS_EFFECT_LAVALAND_BLOOD_REGEN /datum/status_effect/lavaland_blood_regen + #define STATUS_EFFECT_DRASK_COMA /datum/status_effect/drask_coma #define STATUS_EFFECT_TERROR_REGEN /datum/status_effect/terror/regeneration //over time healing, 125 HP within 25~ seconds @@ -190,3 +198,11 @@ #define STATUS_EFFECT_STARING /datum/status_effect/staring //Used in ../human/examine() proc #define STATUS_EFFECT_RECENTLY_SUCCUMBED /datum/status_effect/recently_succumbed + +#define STATUS_EFFECT_FORCED_RUMBLE /datum/status_effect/forced_rumble + +#define STATUS_EFFECT_FORCED_SNEEZE /datum/status_effect/forced_sneeze + +#define STATUS_EFFECT_LAVALAND_VISION /datum/status_effect/lavaland_vision + +#define STATUS_EFFECT_TEMPERATURE_STABILIZE /datum/status_effect/temperature_stabilize diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 4cd2817a65d..53f1b6fa574 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -134,6 +134,8 @@ continue if(!(species in S.species_allowed)) // If the user's head is not of a species the marking style allows, skip it. Otherwise, add it to the list. continue + if(!S.pickable) //If our markings are unpickable in normal ways, skip it + continue if(location == "tail") if(!body_accessory) if(S.tails_allowed) diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm index 94ed2142887..a84156e30f2 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -66,11 +66,12 @@ GLOBAL_LIST_INIT(cooking_recipe_types, list( RECIPE_MICROWAVE = /datum/recipe/microwave, RECIPE_OVEN = /datum/recipe/oven, RECIPE_GRILL = /datum/recipe/grill, - RECIPE_CANDY = /datum/recipe/candy + RECIPE_CANDY = /datum/recipe/candy, + RECIPE_TRIBAL_OVEN = /datum/recipe/tribal_oven )) -GLOBAL_LIST_INIT(cooking_recipes, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) -GLOBAL_LIST_INIT(cooking_ingredients, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) -GLOBAL_LIST_INIT(cooking_reagents, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) +GLOBAL_LIST_INIT(cooking_recipes, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list(), RECIPE_TRIBAL_OVEN = list())) +GLOBAL_LIST_INIT(cooking_ingredients, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list(), RECIPE_TRIBAL_OVEN = list())) +GLOBAL_LIST_INIT(cooking_reagents, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list(), RECIPE_TRIBAL_OVEN = list())) #define EGG_LAYING_MESSAGES list("lays an egg.", "squats down and croons.", "begins making a huge racket.", "begins clucking raucously.") diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 727a99fcfb5..5bd64461b0f 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -48,7 +48,7 @@ GLOBAL_LIST_INIT(poi_list, list()) //list of points of interest for observe/ GLOBAL_LIST_INIT(active_jammers, list()) // List of active radio jammers GLOBAL_LIST_EMPTY(ladders) GLOBAL_LIST_EMPTY(mirrors) //list of all mirrors and mirror shields. -GLOBAL_LIST_EMPTY(anvils) //for use in founding world anvil +GLOBAL_LIST_EMPTY(lavaland_points_of_interest) //for use in founding world anvil and other stuff GLOBAL_LIST_INIT(active_diseases, list()) //List of Active disease in all mobs; purely for quick referencing. diff --git a/code/datums/components/riding/riding_vehicle.dm b/code/datums/components/riding/riding_vehicle.dm index ebd760ea3ac..93b0b0ce85f 100644 --- a/code/datums/components/riding/riding_vehicle.dm +++ b/code/datums/components/riding/riding_vehicle.dm @@ -180,21 +180,20 @@ /datum/component/riding/vehicle/lavaboat ride_check_flags = NONE // not sure + vehicle_move_delay = 3 keytype = /obj/item/oar var/allowed_turf = /turf/simulated/floor/lava /datum/component/riding/vehicle/lavaboat/handle_specials() . = ..() + set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(1, 2), TEXT_SOUTH = list(1, 2), TEXT_EAST = list(1, 2), TEXT_WEST = list( 1, 2))) + set_vehicle_dir_layer(NORTH, ABOVE_MOB_LAYER) allowed_turf_typecache = typecacheof(allowed_turf) /datum/component/riding/vehicle/lavaboat/dragonboat - vehicle_move_delay = 1 + vehicle_move_delay = 2 keytype = null -/datum/component/riding/vehicle/lavaboat/dragonboat/handle_specials() - . = ..() - set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(1, 2), TEXT_SOUTH = list(1, 2), TEXT_EAST = list(1, 2), TEXT_WEST = list( 1, 2))) - /datum/component/riding/vehicle/car vehicle_move_delay = 1.75 ride_check_flags = RIDER_NEEDS_LEGS | RIDER_NEEDS_ARMS | UNBUCKLE_DISABLED_RIDER diff --git a/code/datums/components/ritual_object.dm b/code/datums/components/ritual_object.dm index f67fbd8b9aa..24115b96532 100644 --- a/code/datums/components/ritual_object.dm +++ b/code/datums/components/ritual_object.dm @@ -9,6 +9,22 @@ var/list/allowed_special_role /// Prevents from multiple uses var/active_ui = FALSE + /// Temporary lists of invokers/Used things in rituals. + var/list/used_things + var/list/invokers + /// Cached selected ritual. + var/datum/ritual/ritual + +/datum/component/ritual_object/Destroy(force) + LAZYNULL(rituals) + LAZYNULL(allowed_categories) + LAZYNULL(allowed_species) + LAZYNULL(allowed_special_role) + LAZYNULL(invokers) + LAZYNULL(used_things) + ritual = null + + return ..() /datum/component/ritual_object/Initialize( allowed_categories = /datum/ritual, @@ -31,7 +47,7 @@ /datum/component/ritual_object/UnregisterFromParent() UnregisterSignal(parent, COMSIG_ATOM_ATTACK_HAND) -/datum/component/ritual_object/proc/get_rituals() // We'll get all rituals for flexibility. +/datum/component/ritual_object/proc/get_rituals() // We'll get all rituals for flexibility. LAZYCLEARLIST(rituals) for(var/datum/ritual/ritual as anything in typecacheof(allowed_categories)) @@ -39,27 +55,21 @@ continue rituals += new ritual - + for(var/datum/ritual/ritual as anything in rituals) ritual.ritual_object = parent return -/datum/component/ritual_object/Destroy(force) - LAZYNULL(rituals) - return ..() - -/datum/component/ritual_object/proc/attackby(datum/source, mob/user) +/datum/component/ritual_object/proc/attackby(datum/source, mob/living/carbon/human/human) SIGNAL_HANDLER - + if(active_ui) return - if(!ishuman(user)) + if(!istype(human)) return - var/mob/living/carbon/human/human = user - if(allowed_species && !is_type_in_list(human.dna.species, allowed_species)) return @@ -69,7 +79,7 @@ active_ui = TRUE INVOKE_ASYNC(src, PROC_REF(open_ritual_ui), human) - return COMPONENT_CANCEL_ATTACK_CHAIN + return COMPONENT_CANCEL_ATTACK_CHAIN /datum/component/ritual_object/proc/open_ritual_ui(mob/living/carbon/human/human) var/list/rituals_list = get_available_rituals(human) @@ -79,25 +89,239 @@ to_chat(human, "Не имеется доступных для выполнения ритуалов.") return - var/choosen_ritual = tgui_input_list(human, "Выберите ритуал", "Ритуалы", rituals_list) + ui_interact(human) + return + +/datum/component/ritual_object/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + // Open UI + ui = new(user, src, "RitualMenu") + ui.open() + +/datum/component/ritual_object/ui_data(mob/user) + var/list/data = list() + data["rituals"] = get_available_rituals(user) + data["selected_ritual"] = ritual?.name + if(ritual) + if(ritual.description) + data["description"] = ritual.description + var/list/params = ritual.get_ui_params() + if(params?.len) + data["params"] = params + var/list/things = ritual.get_ui_things() + if(things?.len) + data["things"] = things + data["ritual_available"] = COOLDOWN_FINISHED(ritual, ritual_cooldown) + data["time_left"] = round(COOLDOWN_TIMELEFT(ritual, ritual_cooldown) / (1 SECONDS)) + + return data + +/datum/component/ritual_object/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + switch(action) + if("select_ritual") + handle_ritual_selection(ui.user, params["selected_ritual"]) + . = TRUE + + if("start_ritual") + var/ritual_status = pre_ritual_check(ui.user) + if(ritual_status) + active_ui = FALSE + . = TRUE + +/datum/component/ritual_object/ui_close(mob/user) + . = ..() + active_ui = FALSE + +/datum/component/ritual_object/proc/handle_ritual_selection(mob/living/carbon/human/human, choosen_ritual) if(!choosen_ritual) active_ui = FALSE return - - var/ritual_status for(var/datum/ritual/ritual as anything in rituals) if(choosen_ritual != ritual.name) continue - - ritual_status = ritual.pre_ritual_check(human) + src.ritual = ritual break - if(ritual_status) - active_ui = FALSE + return TRUE + +/datum/component/ritual_object/proc/pre_ritual_check(mob/living/carbon/human/invoker) + var/failed = FALSE + var/cause_disaster = FALSE + var/del_things = FALSE + var/start_cooldown = FALSE + var/remove_charge = FALSE + var/message + + ritual.handle_ritual_object(RITUAL_STARTED) + + . = ritual_invoke_check(invoker) + SEND_SIGNAL(ritual, COMSIG_RITUAL_ENDED, ., invoker, invokers, used_things) + + if(!(. & RITUAL_SUCCESSFUL)) + failed = TRUE + message = "ритуал провален!" + + if(. & RITUAL_SUCCESSFUL) + message = "ритуал проведён успешно!" + addtimer(CALLBACK(ritual, TYPE_PROC_REF(/datum/ritual, handle_ritual_object), RITUAL_ENDED), 1 SECONDS) + remove_charge = TRUE + start_cooldown = TRUE + + if(. & RITUAL_FAILED_ON_PROCEED) + cause_disaster = TRUE + start_cooldown = TRUE + + if(start_cooldown) + COOLDOWN_START(ritual, ritual_cooldown, ritual.cooldown_after_cast) + + if(cause_disaster && prob(ritual.disaster_prob)) + ritual.disaster(invoker, invokers, used_things) + + if((. & RITUAL_SUCCESSFUL) && (ritual.ritual_should_del_things)) + del_things = TRUE + + if((. & RITUAL_FAILED_ON_PROCEED) && (ritual.ritual_should_del_things_on_fail)) + del_things = TRUE + + if(del_things) + ritual.del_things(used_things) + + if(remove_charge) + ritual.charges-- + + if(failed) + addtimer(CALLBACK(ritual, TYPE_PROC_REF(/datum/ritual, handle_ritual_object), RITUAL_FAILED), 2 SECONDS) + + if(message) + var/atom/atom = parent + atom.balloon_alert(invoker, message) + + for(var/atom/movable/atom as anything in used_things) + UnregisterSignal(atom, COMSIG_MOVABLE_MOVED) + + LAZYNULL(invokers) + LAZYNULL(used_things) + ritual = null + + return . + +/datum/component/ritual_object/proc/ritual_invoke_check(mob/living/carbon/human/invoker) + if(!check_invokers(invoker)) + return RITUAL_FAILED_MISSED_INVOKER_REQUIREMENTS + + if(!check_contents(invoker)) + return RITUAL_FAILED_MISSED_REQUIREMENTS + + if(prob(ritual.fail_chance)) + return RITUAL_FAILED_ON_PROCEED + + if(ritual.cast_time) + for(var/atom/movable/atom as anything in used_things) + RegisterSignal(atom, COMSIG_MOVABLE_MOVED, PROC_REF(track_atoms)) + + if(!cast()) + return RITUAL_FAILED_ON_PROCEED + + return ritual.do_ritual(invoker, invokers, used_things) + +/datum/component/ritual_object/proc/track_atoms( + atom/source, + atom/old_loc, + movement_dir, + forced, + atom/old_locs, + momentum_change +) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(cast)) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + +/datum/component/ritual_object/proc/check_invokers(mob/living/carbon/human/invoker) + if(!ritual.extra_invokers) + return ritual.check_invokers(invoker, list(invoker)) // remember about checks on invoker in rituals + + for(var/atom/atom in range(ritual.finding_range, parent)) + if(!ritual.is_valid_invoker(atom)) + continue + + LAZYADD(invokers, atom) + + if(LAZYLEN(invokers) < (ritual.extra_invokers + 1)) + var/atom/atom = parent + atom.balloon_alert(invoker, "требуется больше участников!") + return FALSE + + return ritual.check_invokers(invoker, invokers) + +/datum/component/ritual_object/proc/check_contents(mob/living/carbon/human/invoker) + if(!ritual.required_things) + return TRUE + + var/list/atom/movable/atoms = list() + + for(var/atom/movable/obj in range(ritual.finding_range, parent)) + if(isitem(obj)) + var/obj/item/close_item = obj + if(close_item.item_flags & ABSTRACT) + continue + + if(obj.invisibility) + continue + + if(obj == parent) + continue + + if(LAZYIN(invokers, obj)) + continue + + LAZYADD(atoms, obj) + + var/list/requirements = ritual.required_things.Copy() + for(var/atom/atom as anything in atoms) + for(var/req_type in requirements) + if(requirements[req_type] <= 0) + continue + + if(!istype(atom, req_type)) + continue + + LAZYADD(used_things, atom) + + if(isstack(atom)) + var/obj/item/stack/picked_stack = atom + requirements[req_type] -= picked_stack.amount + else + requirements[req_type]-- + + var/list/what_are_we_missing = list() + for(var/req_type in requirements) + var/number_of_things = requirements[req_type] + + if(number_of_things <= 0) + continue + + LAZYADD(what_are_we_missing, req_type) + + if(LAZYLEN(what_are_we_missing)) + var/atom/atom = parent + atom.balloon_alert(invoker, "требуется больше компонентов!") + return FALSE + + return ritual.check_contents(invoker, used_things) + +/datum/component/ritual_object/proc/cast() + for(var/mob/living/carbon/human/human in invokers) + if(!do_after(human, ritual.cast_time, parent, DA_IGNORE_HELD_ITEM, max_interact_count = 1)) + return FALSE - return FALSE + return TRUE /datum/component/ritual_object/proc/get_available_rituals(mob/living/carbon/human/human) var/list/rituals_list = list() diff --git a/code/datums/elements/ritual_dye_removal.dm b/code/datums/elements/ritual_dye_removal.dm new file mode 100644 index 00000000000..ae9fb9423c6 --- /dev/null +++ b/code/datums/elements/ritual_dye_removal.dm @@ -0,0 +1,37 @@ +// This simple element is used for rituals for removing dyes from peoples and ash totems. +/datum/element/dye_removal + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY + +/datum/element/dye_removal/Attach(datum/target) + . = ..() + RegisterSignal(target, COMSIG_RITUAL_ENDED, PROC_REF(remove_dyes)) + +/datum/element/dye_removal/Detach(datum/source, force) + . = ..() + + UnregisterSignal(source, COMSIG_RITUAL_ENDED) + +/datum/element/dye_removal/proc/remove_dyes(datum/ritual/ashwalker/ritual, status_bitflag, atom/invoker, list/invokers, list/used_things) + SIGNAL_HANDLER + + if(!HASBIT(status_bitflag, RITUAL_SUCCESSFUL)) + return + + if(ritual.needed_dye) + if(isnull(invokers) && invoker) //this sometimes happens. There is nothing we can do + var/mob/living/carbon/human/human = invoker + human.m_styles["body"] = "None" + to_chat(human, span_notice("Краска на вашем теле медленно испаряется.")) + human.update_markings() + return + + for(var/mob/living/carbon/human/human in invokers) + human.m_styles["body"] = "None" + to_chat(human, span_notice("Краска на вашем теле медленно испаряется.")) + human.update_markings() + for(var/obj/structure/ash_totem/totem in invokers) + totem.applied_dye = null + totem.applied_dye_fluff_name = null + totem.visible_message(span_notice("Краска медленно испаряется с поверхности тотема.")) + totem.update_icon(UPDATE_OVERLAYS) + diff --git a/code/datums/rituals.dm b/code/datums/rituals.dm index 954fdda83e5..e03f633a4f8 100644 --- a/code/datums/rituals.dm +++ b/code/datums/rituals.dm @@ -3,6 +3,10 @@ var/obj/ritual_object /// Name of our ritual var/name + /// Description of our ritual. Later be used in tgui + var/description + /// Our fluff tgui name for dyes + var/fluff_tgui_dye = "краска не нужна." /// If ritual requires more than one invoker var/extra_invokers = 0 /// If invoker species isn't in allowed - he won't do ritual. @@ -11,10 +15,6 @@ var/list/allowed_special_role /// Required to ritual invoke things are located here var/list/required_things - /// If true - only whitelisted species will be added as invokers - var/require_allowed_species = TRUE - /// Same as require_allowed_species, but requires special role to be counted as invoker. - var/require_allowed_special_role = FALSE /// We search for humans in that radius var/finding_range = DEFAULT_RITUAL_RANGE_FIND /// Amount of maximum ritual uses. @@ -31,230 +31,92 @@ var/ritual_should_del_things = TRUE /// After failed ritual proceed - we'll delete items. var/ritual_should_del_things_on_fail = FALSE - /// Temporary list of objects, which we will delete. Or use in transformations! Then clear list. - var/list/used_things = list() - /// Temporary list of invokers. - var/list/invokers = list() /// If defined - do_after will be added to your ritual var/cast_time + /// Generic list of ritual sounds + var/start_sounds = list( + 'sound/rituals/ritual_start1.ogg', + 'sound/rituals/ritual_start2.ogg', + 'sound/rituals/ritual_start3.ogg', + ) + /// Generic list of success sounds + var/success_sounds = list( + 'sound/rituals/ritual_success1.ogg', + 'sound/rituals/ritual_success2.ogg', + ) + /// Generic list of fail sounds + var/fail_sounds = list( + 'sound/rituals/ritual_fail1.ogg', + 'sound/rituals/ritual_fail2.ogg', + ) /datum/ritual/Destroy(force) ritual_object = null - LAZYNULL(used_things) LAZYNULL(required_things) - LAZYNULL(invokers) return ..() - -/datum/ritual/proc/pre_ritual_check(mob/living/carbon/human/invoker) - var/failed = FALSE - var/cause_disaster = FALSE - - var/del_things = FALSE - var/start_cooldown = FALSE - - handle_ritual_object(RITUAL_STARTED) - - . = ritual_invoke_check(invoker) - switch(.) - if(RITUAL_SUCCESSFUL) - start_cooldown = TRUE - addtimer(CALLBACK(src, PROC_REF(handle_ritual_object), RITUAL_ENDED), 1 SECONDS) - charges-- - if(RITUAL_FAILED_INVALID_SPECIES) - failed = TRUE - if(RITUAL_FAILED_EXTRA_INVOKERS) - failed = TRUE - if(RITUAL_FAILED_MISSED_REQUIREMENTS) - failed = TRUE - if(RITUAL_FAILED_INVALID_SPECIAL_ROLE) - failed = TRUE - if(RITUAL_FAILED_ON_PROCEED) - failed = TRUE - cause_disaster = TRUE - start_cooldown = TRUE - if(NONE) - failed = TRUE - - if(start_cooldown && cooldown_after_cast) - COOLDOWN_START(src, ritual_cooldown, cooldown_after_cast) - - if(cause_disaster && prob(disaster_prob)) - disaster(invoker) - - if((. & RITUAL_SUCCESSFUL) && (ritual_should_del_things)) - del_things = TRUE - - if((. & RITUAL_FAILED_ON_PROCEED) && (ritual_should_del_things_on_fail)) - del_things = TRUE - - if(del_things) - del_things() - - if(failed) - addtimer(CALLBACK(src, PROC_REF(handle_ritual_object), RITUAL_FAILED), 2 SECONDS) - - /// We use pre-defines - LAZYCLEARLIST(invokers) - LAZYCLEARLIST(used_things) - - return . - -/datum/ritual/proc/handle_ritual_object(bitflags, silent = FALSE) - switch(bitflags) - if(RITUAL_STARTED) - . = RITUAL_STARTED - if(!silent) - playsound(ritual_object.loc, 'sound/effects/ghost2.ogg', 50, TRUE) - if(RITUAL_ENDED) - . = RITUAL_ENDED - if(!silent) - playsound(ritual_object.loc, 'sound/effects/phasein.ogg', 50, TRUE) - if(RITUAL_FAILED) - . = RITUAL_FAILED - if(!silent) - playsound(ritual_object.loc, 'sound/effects/empulse.ogg', 50, TRUE) - - return . - -/datum/ritual/proc/del_things() // This is a neutral variant with item delete. Override it to change. - for(var/obj/item/thing in used_things) - qdel(thing) - - return - -/datum/ritual/proc/ritual_invoke_check(mob/living/carbon/human/invoker) - if(!COOLDOWN_FINISHED(src, ritual_cooldown)) - return NONE - - if(charges == 0) - return NONE - - if(allowed_special_role && !LAZYIN(allowed_special_role, invoker.mind?.special_role)) - return RITUAL_FAILED_INVALID_SPECIAL_ROLE - - if(allowed_species && !is_type_in_list(invoker.dna.species, allowed_species)) // double check to avoid funny situations - return RITUAL_FAILED_INVALID_SPECIES - - if(!check_invokers(invoker)) - return RITUAL_FAILED_EXTRA_INVOKERS - - if(required_things && !check_contents(invoker)) - return RITUAL_FAILED_MISSED_REQUIREMENTS - - if(prob(fail_chance)) - return RITUAL_FAILED_ON_PROCEED - - if(cast_time && !cast(invoker)) - return RITUAL_FAILED_ON_PROCEED - - return do_ritual(invoker) - -/datum/ritual/proc/cast(mob/living/carbon/human/invoker) - . = TRUE - - var/list/invokers_list = invokers.Copy() // create temp list to avoid funny situations - LAZYADD(invokers_list, invoker) - - for(var/mob/living/carbon/human/human as anything in invokers_list) - if(!do_after(human, cast_time, ritual_object, DA_IGNORE_HELD_ITEM, extra_checks = CALLBACK(src, PROC_REF(action_check_contents)))) - . = FALSE - return . - -/datum/ritual/proc/check_invokers(mob/living/carbon/human/invoker) - if(!extra_invokers) - return TRUE - - for(var/mob/living/carbon/human/human in range(finding_range, ritual_object)) - if(human == invoker) - continue - - if(require_allowed_species && !is_type_in_list(human.dna.species, allowed_species)) - continue - - if(require_allowed_special_role && !LAZYIN(allowed_special_role, human.mind?.special_role)) - continue +/datum/ritual/proc/get_ui_params() + var/list/params = list() + params["Необходимо участников:"] = extra_invokers + 1 + if(cast_time) + params["Время выполнения:"] = "[round(cast_time/ (1 SECONDS))]c" + params["Доступно использований:"] = charges == -1 ? "Не ограничено" : charges + params["Время ожидания между ритуалами:"] = "[round(cooldown_after_cast/ (1 SECONDS))]c" + params["Шанс катастрофы:"] = "[disaster_prob]%" + params["Шанс провала:"] = "[fail_chance]%" + params["Удаление предметов:"] = ritual_should_del_things? "Да" : (ritual_should_del_things_on_fail)? "При провале" : "Нет" + return params + + +/datum/ritual/proc/get_ui_things() + var/list/things = list() + for(var/atom/item as anything in required_things) + things[item.name] = required_things[item] + return things + +/datum/ritual/proc/is_valid_invoker(mob/living/carbon/human/human) + if(!istype(human)) + return FALSE - LAZYADD(invokers, human) + if(LAZYLEN(allowed_species) && !is_type_in_list(human.dna.species, allowed_species)) + return FALSE - if(LAZYLEN(invokers) >= extra_invokers) - break - - if(LAZYLEN(invokers) < extra_invokers) - ritual_object.balloon_alert(invoker, "требуется больше участников!") + if(LAZYLEN(allowed_special_role) && !LAZYIN(allowed_special_role, human.mind?.special_role)) return FALSE return TRUE -/datum/ritual/proc/check_contents(mob/living/carbon/human/invoker) - var/list/atom/movable/atoms = list() - - for(var/atom/obj as anything in range(finding_range, ritual_object)) - if(isitem(obj)) - var/obj/item/close_item = obj - if(close_item.item_flags & ABSTRACT) - continue - - if(obj.invisibility) - continue - - if(obj == invoker) - continue - - if(obj == ritual_object) - continue - - if(LAZYIN(invokers, obj)) - continue - - LAZYADD(atoms, obj) - - var/list/requirements = required_things.Copy() - for(var/atom/atom as anything in atoms) - for(var/req_type in requirements) - if(requirements[req_type] <= 0) - continue - - if(!istype(atom, req_type)) - continue - - LAZYADD(used_things, atom) - - if(isstack(atom)) - var/obj/item/stack/picked_stack = atom - requirements[req_type] -= picked_stack.amount - else - requirements[req_type]-- - - var/list/what_are_we_missing = list() - for(var/req_type in requirements) - var/number_of_things = requirements[req_type] - - if(number_of_things <= 0) - continue - - LAZYADD(what_are_we_missing, req_type) +/datum/ritual/proc/handle_ritual_object(stage, silent = FALSE) + switch(stage) + if(RITUAL_STARTED) + var/chosen_sound = start_sounds + if(islist(start_sounds) && length(start_sounds)) + chosen_sound = pick(start_sounds) + playsound(ritual_object.loc, chosen_sound, 50, TRUE) + if(RITUAL_ENDED) + var/chosen_sound = success_sounds + if(islist(success_sounds) && length(success_sounds)) + chosen_sound = pick(success_sounds) + playsound(ritual_object.loc, chosen_sound, 50, TRUE) + if(RITUAL_FAILED) + var/chosen_sound = fail_sounds + if(islist(fail_sounds) && length(fail_sounds)) + chosen_sound = pick(fail_sounds) + playsound(ritual_object.loc, chosen_sound, 50, TRUE) - if(LAZYLEN(what_are_we_missing)) - ritual_object.balloon_alert(invoker, "требуется больше компонентов!") - return FALSE +/datum/ritual/proc/del_things(list/used_things) + return +/datum/ritual/proc/check_invokers(mob/living/carbon/human/invoker, list/invokers) return TRUE -/datum/ritual/proc/action_check_contents() - for(var/atom/atom as anything in used_things) - if(QDELETED(atom)) - return FALSE - - if(!(atom in range(finding_range, ritual_object))) - return FALSE - +/datum/ritual/proc/check_contents(mob/living/carbon/human/invoker, list/used_things) return TRUE -/datum/ritual/proc/do_ritual(mob/living/carbon/human/invoker) // Do ritual stuff. +/datum/ritual/proc/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) // Do ritual stuff. return RITUAL_SUCCESSFUL -/datum/ritual/proc/disaster(mob/living/carbon/human/invoker) +/datum/ritual/proc/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) return /datum/ritual/ashwalker @@ -263,8 +125,27 @@ /// If ritual can be invoked only by shaman var/shaman_only = FALSE allowed_species = list(/datum/species/unathi/ashwalker, /datum/species/unathi/draconid) + /// If our ritual needed any dyes on the body. Use names from code/modules/mining/ash_walkers/lavaland_dye.dm + var/needed_dye = null + /// Same, but for totems. This should be made little better, but i have no frackin idea how. Use same file. + var/totem_dye = null + +/datum/ritual/ashwalker/New() + . = ..() + AddElement(/datum/element/dye_removal) + +/datum/ritual/ashwalker/get_ui_params() + . = list() + .["Необходимо участников-шаманов:"] = (shaman_only)? extra_shaman_invokers + 1 : "0" + .["Может выполнить только шаман:"] = (shaman_only)? "Да" : "Нет" + . += ..() + if(needed_dye) + .["Краска на участниках:"] = fluff_tgui_dye + +/datum/ritual/ashwalker/is_valid_invoker(atom/atom) + return istype(atom, /obj/structure/ash_totem) || ..() -/datum/ritual/ashwalker/check_invokers(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/check_invokers(atom/invoker, list/invokers) . = ..() if(!.) @@ -274,39 +155,51 @@ to_chat(invoker, span_warning("Только шаман может выполнить данный ритуал!")) return FALSE + if(needed_dye) + for(var/mob/living/carbon/human/human in invokers) + if(human.m_styles["body"] != needed_dye) + human.balloon_alert(invoker, "нет нужной краски!") + return FALSE + + for(var/obj/structure/ash_totem/totem in invokers) + if(totem.applied_dye != totem_dye) + totem.balloon_alert(invoker, "нет нужной краски!") + return FALSE + var/list/shaman_invokers = list() - + if(extra_shaman_invokers) - for(var/mob/living/carbon/human/human as anything in invokers) - if(human == invoker) + for(var/mob/living/carbon/human/human in invokers) + if(!isashwalkershaman(human)) continue - if(isashwalkershaman(human)) - LAZYADD(shaman_invokers, human) + LAZYADD(shaman_invokers, human) - if(LAZYLEN(shaman_invokers) >= extra_shaman_invokers) - break - - if(LAZYLEN(shaman_invokers) < extra_shaman_invokers) + if(LAZYLEN(shaman_invokers) < (extra_shaman_invokers + 1)) ritual_object.balloon_alert(invoker, "требуется больше шаманов!") return FALSE return TRUE /datum/ritual/ashwalker/summon_ashstorm - name = "Ash storm summon" + name = "Призыв Пепельной Бури" + description = "Проведение данного ритуала обрушивает на Лазис суровую пепельную бурю, значительно уменьшая видимость и затрудняя перемещение по Лазису на некоторое время. \ + Катастрофическая неудача приведёт к заражению трупной лихорадкой всех причастных к ритуалу." shaman_only = TRUE disaster_prob = 20 charges = 2 cooldown_after_cast = 1200 SECONDS - cast_time = 100 SECONDS + cast_time = 20 SECONDS fail_chance = 20 extra_invokers = 2 + fluff_tgui_dye = "Янтарная краска" + needed_dye = "Amber Dyes" + totem_dye = "amber" required_things = list( /mob/living/simple_animal/hostile/asteroid/goldgrub = 1 ) -/datum/ritual/ashwalker/summon_ashstorm/check_contents(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/summon_ashstorm/check_contents(mob/living/carbon/human/invoker, list/used_things) . = ..() if(!.) @@ -314,12 +207,12 @@ for(var/mob/living/living in used_things) if(living.stat != DEAD) - to_chat(invoker, "Существа должны быть мертвы") + invoker.balloon_alert(invoker, "существа должны быть мертвы!") return FALSE return TRUE -/datum/ritual/ashwalker/summon_ashstorm/del_things() +/datum/ritual/ashwalker/summon_ashstorm/del_things(list/used_things) . = ..() for(var/mob/living/living in used_things) @@ -327,35 +220,20 @@ return -/datum/ritual/ashwalker/summon_ashstorm/check_invokers(mob/living/carbon/human/invoker) - . = ..() - - if(!.) - return FALSE - - if(!invoker.fire_stacks) - to_chat(invoker, "Инициатор ритуала должнен быть в воспламеняемой субстанции.") - return FALSE - - for(var/mob/living/carbon/human/human as anything in invokers) - if(!human.fire_stacks) - to_chat(invoker, "Участники ритуала должны быть в воспламеняемой субстанции.") - return FALSE - - return TRUE - -/datum/ritual/ashwalker/summon_ashstorm/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/summon_ashstorm/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) SSweather.run_weather(/datum/weather/ash_storm) message_admins("[key_name(invoker)] accomplished ashstorm ritual and summoned ashstorm") return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/summon_ashstorm/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/summon_ashstorm/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/list/targets = list() for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) - if(isashwalker(human)) - LAZYADD(targets, human) + if(!isashwalker(human)) + continue + + LAZYADD(targets, human) if(!LAZYLEN(targets)) return @@ -366,48 +244,38 @@ return -/datum/ritual/ashwalker/summon_ashstorm/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) - if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/magic/fleshtostone.ogg', 50, TRUE) - if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/magic/invoke_general.ogg', 50, TRUE) - if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/magic/castsummon.ogg', 50, TRUE) - - return . - /datum/ritual/ashwalker/transformation - name = "Transformation ritual" + name = "Ритуал Превращения" + description = "Проведение данного ритуала обращает тело пленника в подобного нам. Выбранная жертва должна быть жива и иметь душу. \ + Катастрофическая неудача приведёт к освобождению пленника и его побегу." disaster_prob = 30 fail_chance = 50 extra_invokers = 1 cooldown_after_cast = 480 SECONDS cast_time = 30 SECONDS ritual_should_del_things_on_fail = TRUE + fluff_tgui_dye = "Киноварная краска" + needed_dye = "Cinnabar Dyes" + totem_dye = "cinnabar" required_things = list( - /obj/item/twohanded/spear = 3, - /obj/item/organ/internal/regenerative_core = 1, /mob/living/carbon/human = 1 ) -/datum/ritual/ashwalker/transformation/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/transformation/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/mob/living/carbon/human/human = locate() in used_things if(!human || !human.mind || !human.ckey) return RITUAL_FAILED_ON_PROCEED // Your punishment human.set_species(/datum/species/unathi/ashwalker) - human.mind.store_memory("Теперь вы пеплоходец, вы часть племени! Вы довольно смутно помните о прошлой жизни, и вы не помните, как пользоваться технологиями!") + human.mind.store_memory("Теперь вы пеплоходец, часть племени! Вы довольно смутно помните о своей прошлой жизни, и понятия не имеете, как пользоваться технологичными предметами!") return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/transformation/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/transformation/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) invoker.adjustBrainLoss(15) invoker.SetKnockdown(5 SECONDS) - + var/mob/living/carbon/human/human = locate() in used_things if(QDELETED(human)) @@ -419,30 +287,25 @@ LAZYADD(destinations, get_turf(beacon)) human.forceMove(safepick(destinations)) - playsound(get_turf(human), 'sound/magic/invoke_general.ogg', 50, TRUE) + playsound(get_turf(human), 'sound/rituals/ritual_fail2.ogg', 50, TRUE) return -/datum/ritual/ashwalker/transformation/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - if(. == RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/effects/clone_jutsu.ogg', 50, TRUE) - return - - . = ..(bitflags) - return . - /datum/ritual/ashwalker/summon - name = "Summoning ritual" + name = "Ритуал Призыва" + description = "Проведение данного ритуала позволяет шаману призвать к руне любого пеплоходца вне зависимости от его текущего состояния. \ + Катастрофическая неудача приведёт к насильственной потере конечностей." disaster_prob = 30 fail_chance = 30 shaman_only = TRUE + fluff_tgui_dye = "Кровавая краска" + needed_dye = "Crimson Dyes" + totem_dye = "crimson" cooldown_after_cast = 900 SECONDS cast_time = 30 SECONDS extra_invokers = 1 -/datum/ritual/ashwalker/summon/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/summon/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/list/ready_for_summoning = list() for(var/mob/living/carbon/human/human in GLOB.mob_list) @@ -457,7 +320,7 @@ if(!LAZYLEN(ready_for_summoning)) return RITUAL_FAILED_ON_PROCEED - var/mob/living/carbon/human/human = tgui_input_list(invoker, "Who will be summoned?", "Summon ritual", ready_for_summoning) + var/mob/living/carbon/human/human = tgui_input_list(invoker, "Кого вы хотите призвать?", "Ритуал Призыва", ready_for_summoning) if(!human) return RITUAL_FAILED_ON_PROCEED @@ -481,7 +344,7 @@ return TRUE -/datum/ritual/ashwalker/summon/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/summon/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) if(!prob(70)) return @@ -490,42 +353,49 @@ return -/datum/ritual/ashwalker/summon/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) +/datum/ritual/ashwalker/summon/handle_ritual_object(stage, silent = FALSE) + switch(stage) if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/weapons/zapbang.ogg', 50, TRUE) + var/chosen_sound = success_sounds + if(islist(success_sounds) && length(success_sounds)) + chosen_sound = pick(success_sounds) + playsound(ritual_object.loc, chosen_sound, 50, TRUE) var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(5, FALSE, ritual_object.loc) smoke.start() if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/magic/forcewall.ogg', 50, TRUE) + var/chosen_sound = start_sounds + if(islist(start_sounds) && length(start_sounds)) + chosen_sound = pick(start_sounds) + playsound(ritual_object.loc, chosen_sound, 50, TRUE) if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/magic/invoke_general.ogg', 50, TRUE) - - return . + var/chosen_sound = fail_sounds + if(islist(fail_sounds) && length(fail_sounds)) + chosen_sound = pick(fail_sounds) + playsound(ritual_object.loc, chosen_sound, 50, TRUE) /datum/ritual/ashwalker/curse - name = "Curse ritual" + name = "Ритуал Проклятия" + description = "Проведение данного ритуала приведёт к наложению страшной, почти неизлечимой болезни на случайного гуманоида, который не принадлежит нашему племени. \ + Катастрофическая неудача приведёт к генетической деградации одного из наших соплеменников." disaster_prob = 30 fail_chance = 30 cooldown_after_cast = 600 SECONDS cast_time = 30 SECONDS charges = 3 shaman_only = TRUE + fluff_tgui_dye = "Кровавая краска" + needed_dye = "Crimson Dyes" + totem_dye = "crimson" extra_invokers = 2 - required_things = list( - /mob/living/carbon/human = 3 - ) -/datum/ritual/ashwalker/curse/del_things() +/datum/ritual/ashwalker/curse/del_things(list/used_things) for(var/mob/living/carbon/human/human in used_things) human.gib() return -/datum/ritual/ashwalker/curse/check_contents(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/curse/check_contents(mob/living/carbon/human/invoker, list/used_things) . = ..() if(!.) @@ -533,18 +403,18 @@ for(var/mob/living/carbon/human/human in used_things) if(human.stat != DEAD) - to_chat(invoker, "Гуманоиды должны быть мертвы.") + invoker.balloon_alert(invoker, "гуманоиды должны быть мертвы!") return FALSE return TRUE -/datum/ritual/ashwalker/curse/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/curse/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/list/humans = list() for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) if(!isashwalker(human)) LAZYADD(humans, human) - + if(!LAZYLEN(humans)) return RITUAL_FAILED_ON_PROCEED @@ -556,12 +426,14 @@ return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/curse/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/curse/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/list/targets = list() for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) - if(isashwalker(human)) - LAZYADD(targets, human) + if(!isashwalker(human)) + continue + + LAZYADD(targets, human) if(!LAZYLEN(targets)) return @@ -572,26 +444,30 @@ return /datum/ritual/ashwalker/power - name = "Power ritual" + name = "Ритуал Силы" + description = "Проведение данного ритуала значительно увеличит силу и регенерацию здоровья у всех его участников, позволяя им таскать тяжести без замедления. \ + Катастрофическая неудача приведёт к случайной плохой мутации у всех участников ритуала." disaster_prob = 40 fail_chance = 40 - charges = 1 + charges = 2 cooldown_after_cast = 800 SECONDS - cast_time = 30 SECONDS + cast_time = 40 SECONDS shaman_only = TRUE - extra_invokers = 4 + extra_invokers = 2 + fluff_tgui_dye = "Тёмно-синяя краска" + needed_dye = "Indigo Dyes" + totem_dye = "indigo" required_things = list( - /mob/living/simple_animal/hostile/asteroid/goliath = 3, - /obj/item/organ/internal/regenerative_core = 3 + /obj/item/organ/internal/regenerative_core = 1 ) -/datum/ritual/ashwalker/power/del_things() +/datum/ritual/ashwalker/power/del_things(list/used_things) for(var/mob/living/living in used_things) living.gib() return -/datum/ritual/ashwalker/power/check_contents(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/power/check_contents(mob/living/carbon/human/invoker, list/used_things) . = ..() if(!.) @@ -599,34 +475,37 @@ for(var/mob/living/living in used_things) if(living.stat != DEAD) - to_chat(invoker, "Существа должны быть мертвы.") + invoker.balloon_alert(invoker, "существа должны быть мертвы!") return FALSE return TRUE -/datum/ritual/ashwalker/power/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/power/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) LAZYADD(invokers, invoker) - for(var/mob/living/carbon/human/human as anything in invokers) + for(var/mob/living/carbon/human/human in invokers) if(LAZYIN(human.dna?.default_blocks, GLOB.weakblock)) human.force_gene_block(GLOB.weakblock) human.force_gene_block(GLOB.strongblock, TRUE) + human.force_gene_block(GLOB.regenerateblock, TRUE) return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/power/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/power/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/list/targets = list() for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) - if(isashwalker(human)) - LAZYADD(targets, human) + if(!isashwalker(human)) + continue + + LAZYADD(targets, human) if(!LAZYLEN(targets)) return invoker.force_gene_block(pick(GLOB.bad_blocks), TRUE) - for(var/mob/living/carbon/human/human as anything in invokers) + for(var/mob/living/carbon/human/human in invokers) human.force_gene_block(pick(GLOB.bad_blocks), TRUE) var/mob/living/carbon/human/human = pick(targets) @@ -634,21 +513,10 @@ return -/datum/ritual/ashwalker/power/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) - if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/magic/castsummon.ogg', 50, TRUE) - if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/magic/smoke.ogg', 50, TRUE) - if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/magic/strings.ogg', 50, TRUE) - - return . - /datum/ritual/ashwalker/resurrection - name = "Resurrection ritual" + name = "Ритуал Воскрешения" + description = "Проведение данного ритуала позволит оживить погибшего гуманоида, находящегося на руне. \ + Катастрофическая неудача приведёт к сильнейшему повреждению мозга у всех, кто находится рядом с руной." charges = 3 extra_invokers = 2 cooldown_after_cast = 180 SECONDS @@ -656,14 +524,15 @@ shaman_only = TRUE disaster_prob = 25 fail_chance = 35 + fluff_tgui_dye = "Мятная краска" + needed_dye = "Mint Dyes" + totem_dye = "mint" required_things = list( - /obj/item/organ/internal/regenerative_core = 2, + /obj/item/organ/internal/regenerative_core = 1, /mob/living/carbon/human = 1, - /obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom = 4, - /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit = 1 ) -/datum/ritual/ashwalker/resurrection/check_contents(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/resurrection/check_contents(mob/living/carbon/human/invoker, list/used_things) . = ..() if(!.) @@ -671,7 +540,7 @@ for(var/mob/living/living in used_things) if(living.stat != DEAD) - to_chat(invoker, "Существа должны быть мертвы.") + invoker.balloon_alert(invoker, "существа должны быть мертвы!") return FALSE var/mob/living/carbon/human/human = locate() in used_things @@ -684,14 +553,14 @@ return TRUE -/datum/ritual/ashwalker/resurrection/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/resurrection/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/mob/living/carbon/human/human = locate() in used_things human.revive() human.adjustBrainLoss(20) return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/resurrection/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/resurrection/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) for(var/mob/living/carbon/human/human in range(10, ritual_object)) if(!isashwalker(human) || human.stat == DEAD) continue @@ -700,36 +569,25 @@ return -/datum/ritual/ashwalker/resurrection/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) - if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/magic/clockwork/reconstruct.ogg', 50, TRUE) - if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/magic/disable_tech.ogg', 50, TRUE) - if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/magic/invoke_general.ogg', 50, TRUE) - - return . - /datum/ritual/ashwalker/recharge - name = "Recharge rituals" + name = "Ритуал Восстановления" + description = "Проведение данного ритуала позволит восстановить заряды у ритуалов, имеющих ограниченное количество зарядов. \ + Катастрофическая неудача приведёт к заражению опухолью Легиона у случайного соплеменника." extra_invokers = 3 disaster_prob = 30 fail_chance = 50 cooldown_after_cast = 360 SECONDS cast_time = 30 SECONDS shaman_only = TRUE + fluff_tgui_dye = "Янтарная краска" + needed_dye = "Amber Dyes" + totem_dye = "amber" required_things = list( - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 1, - /mob/living/simple_animal/hostile/asteroid/goliath = 1, /obj/item/organ/internal/regenerative_core = 1, - /mob/living/simple_animal/hostile/asteroid/goldgrub = 1 ) var/list/blacklisted_rituals = list(/datum/ritual/ashwalker/power) -/datum/ritual/ashwalker/recharge/del_things() +/datum/ritual/ashwalker/recharge/del_things(list/used_things) . = ..() for(var/mob/living/living in used_things) @@ -737,7 +595,7 @@ return -/datum/ritual/ashwalker/recharge/check_contents(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/recharge/check_contents(mob/living/carbon/human/invoker, list/used_things) . = ..() if(!.) @@ -745,12 +603,12 @@ for(var/mob/living/living in used_things) if(living.stat != DEAD) - to_chat(invoker, "Существа должны быть мертвы.") + invoker.balloon_alert(invoker, "существа должны быть мертвы!") return FALSE return TRUE -/datum/ritual/ashwalker/recharge/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/recharge/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/datum/component/ritual_object/component = ritual_object.GetComponent(/datum/component/ritual_object) if(!component) @@ -767,12 +625,14 @@ return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/recharge/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/recharge/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/list/targets = list() for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) - if(isashwalker(human)) - LAZYADD(targets, human) + if(!isashwalker(human)) + continue + + LAZYADD(targets, human) if(!LAZYLEN(targets)) return @@ -782,36 +642,25 @@ return -/datum/ritual/ashwalker/recharge/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) - if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/magic/castsummon.ogg', 50, TRUE) - if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/magic/cult_spell.ogg', 50, TRUE) - if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/magic/invoke_general.ogg', 50, TRUE) - - return . - /datum/ritual/ashwalker/population - name = "Population ritual" + name = "Ритуал Населения" + description = "Проведение данного ритуала позволит племени пеплоходцев получить второго шамана. \ + Катастрофическая неудача приведёт к выпадению всех вещей на пол у случайных соплеменников." extra_invokers = 2 charges = 1 cooldown_after_cast = 120 SECONDS cast_time = 30 SECONDS ritual_should_del_things_on_fail = TRUE + fluff_tgui_dye = "Киноварная краска" + needed_dye = "Cinnabar Dyes" + totem_dye = "cinnabar" required_things = list( /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit = 1, /obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom = 1, - /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_stem = 1, /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf = 1, - /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap = 1, - /obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 1 ) -/datum/ritual/ashwalker/population/check_invokers(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/population/check_invokers(mob/living/carbon/human/invoker, list/invokers) . = ..() if(!.) @@ -823,13 +672,13 @@ return TRUE -/datum/ritual/ashwalker/population/del_things() +/datum/ritual/ashwalker/population/del_things(list/used_things) for(var/mob/living/living in used_things) living.gib() return -/datum/ritual/ashwalker/population/check_contents(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/population/check_contents(mob/living/carbon/human/invoker, list/used_things) . = ..() if(!.) @@ -837,17 +686,17 @@ for(var/mob/living/living in used_things) if(living.stat != DEAD) - to_chat(invoker, "Существа должны быть мертвы.") + invoker.balloon_alert(invoker, "существа должны быть мертвы!") return FALSE return TRUE -/datum/ritual/ashwalker/population/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/population/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) new /obj/effect/mob_spawn/human/ash_walker/shaman(ritual_object.loc) return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/population/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/population/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) if(!isashwalker(human) || !prob(disaster_prob)) continue @@ -864,33 +713,42 @@ return -/datum/ritual/ashwalker/population/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) +/datum/ritual/ashwalker/population/handle_ritual_object(stage, silent = FALSE) + switch(stage) if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/magic/demon_consume.ogg', 50, TRUE) + var/chosen_sound = success_sounds + if(islist(success_sounds) && length(success_sounds)) + chosen_sound = pick(success_sounds) + playsound(ritual_object.loc, chosen_sound, 50, TRUE) var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(5, FALSE, get_turf(ritual_object.loc)) smoke.start() if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/magic/cult_spell.ogg', 50, TRUE) + var/chosen_sound = success_sounds + if(islist(success_sounds) && length(success_sounds)) + chosen_sound = pick(success_sounds) + playsound(ritual_object.loc, chosen_sound, 50, TRUE) if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/magic/teleport_diss.ogg', 50, TRUE) - - return . + var/chosen_sound = fail_sounds + if(islist(fail_sounds) && length(fail_sounds)) + chosen_sound = pick(fail_sounds) + playsound(ritual_object.loc, chosen_sound, 50, TRUE) /datum/ritual/ashwalker/soul - name = "Soul ritual" + name = "Ритуал Души" + description = "Проведение данного ритуала позволяет призывающему возвыситься до драконида. \ + Катастрофическая неудача приведёт к ужасающим ожогам всем участникам ритуала." extra_invokers = 3 cooldown_after_cast = 1200 SECONDS cast_time = 30 SECONDS + fluff_tgui_dye = "Кровавая краска" + needed_dye = "Crimson Dyes" + totem_dye = "crimson" required_things = list( - /mob/living/carbon/human = 3, /obj/item/stack/sheet/animalhide/ashdrake = 1 ) -/datum/ritual/ashwalker/soul/check_invokers(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/soul/check_invokers(mob/living/carbon/human/invoker, list/invokers) . = ..() if(!.) @@ -902,7 +760,7 @@ return TRUE -/datum/ritual/ashwalker/population/del_things() +/datum/ritual/ashwalker/population/del_things(list/used_things) var/obj/item/stack/sheet/animalhide/ashdrake/stack = locate() in used_things stack.use(1) @@ -911,7 +769,7 @@ return -/datum/ritual/ashwalker/soul/check_contents(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/soul/check_contents(mob/living/carbon/human/invoker, list/used_things) . = ..() if(!.) @@ -919,12 +777,12 @@ for(var/mob/living/living in used_things) if(living.stat != DEAD) - to_chat(invoker, "Существа должны быть мертвы.") + invoker.balloon_alert(invoker, "существа должны быть мертвы!") return FALSE return TRUE -/datum/ritual/ashwalker/soul/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/soul/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(5, FALSE, get_turf(invoker.loc)) smoke.start() @@ -932,7 +790,7 @@ return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/soul/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/soul/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) if(!isashwalker(human) || !prob(disaster_prob)) continue @@ -947,28 +805,17 @@ return -/datum/ritual/ashwalker/soul/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) - if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/effects/whoosh.ogg', 50, TRUE) - if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/effects/bamf.ogg', 50, TRUE) - if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/effects/blobattack.ogg', 50, TRUE) - - return . - /datum/ritual/ashwalker/transmutation - name = "Transmutation ritual" - cooldown_after_cast = 120 SECONDS + name = "Ритуал Трансмутации" + description = "Проведение данного ритуала позволяет трансмутировать 10 единиц любой руды в другую случайную руду. \ + Катастрофическая неудача приведёт к расплавлению руды в руках и последующим ужасающим ожогам." + cooldown_after_cast = 20 SECONDS cast_time = 10 SECONDS required_things = list( /obj/item/stack/ore = 10 ) -/datum/ritual/ashwalker/transmutation/check_invokers(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/transmutation/check_invokers(mob/living/carbon/human/invoker, list/invokers) . = ..() if(!.) @@ -980,7 +827,7 @@ return TRUE -/datum/ritual/ashwalker/transmutation/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/transmutation/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/ore_type = pick(subtypesof(/obj/item/stack/ore)) var/obj/item/stack/ore/ore = new ore_type(get_turf(ritual_object)) @@ -988,7 +835,7 @@ return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/transmutation/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/transmutation/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) if(!isashwalker(human) || !prob(disaster_prob)) continue @@ -1003,21 +850,10 @@ return -/datum/ritual/ashwalker/transmutation/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) - if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/effects/bin_close.ogg', 50, TRUE) - if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/magic/cult_spell.ogg', 50, TRUE) - if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/magic/knock.ogg', 50, TRUE) - - return . - /datum/ritual/ashwalker/interrogation - name = "Interrogation ritual" + name = "Ритуал Допроса" + description = "Проведение данного ритуала позволяет получить информацию о чувствах и мыслях вашей жертвы. \ + Катастрофическая неудача приведёт к затуманиванию разума шамана и серьёзным повреждениям мозга." cooldown_after_cast = 50 SECONDS shaman_only = TRUE cast_time = 10 SECONDS @@ -1025,7 +861,7 @@ /mob/living/carbon/human = 1 ) -/datum/ritual/ashwalker/interrogation/check_invokers(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/interrogation/check_invokers(mob/living/carbon/human/invoker, list/invokers) . = ..() if(!.) @@ -1037,7 +873,7 @@ return TRUE -/datum/ritual/ashwalker/interrogation/check_contents(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/interrogation/check_contents(mob/living/carbon/human/invoker, list/used_things) . = ..() if(!.) @@ -1046,21 +882,21 @@ var/mob/living/carbon/human/human = locate() in used_things if(!human || QDELETED(human)) return RITUAL_FAILED_ON_PROCEED - + if(human.stat == DEAD || !human.mind) - to_chat(invoker, "Гуманоид должен быть жив и иметь разум.") + invoker.balloon_alert(invoker, "гуманоид мёртв или без души!") return FALSE return TRUE -/datum/ritual/ashwalker/interrogation/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/interrogation/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/obj/effect/proc_holder/spell/empath/empath = new if(!empath.cast(used_things, invoker)) return RITUAL_FAILED_ON_PROCEED return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/interrogation/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/interrogation/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) if(!isashwalker(human)) continue @@ -1069,7 +905,7 @@ continue var/turf/turf = human.loc - to_chat(human, "HONK") + to_chat(human, "ХОНК") SEND_SOUND(turf, sound('sound/items/airhorn.ogg')) human.AdjustHallucinate(150 SECONDS) human.EyeBlind(5 SECONDS) @@ -1079,67 +915,39 @@ return -/datum/ritual/ashwalker/interrogation/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) - if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/effects/anvil_start.ogg', 50, TRUE) - if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/effects/hulk_hit_airlock.ogg', 50, TRUE) - if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/effects/forge_destroy.ogg', 50, TRUE) - - return . - /datum/ritual/ashwalker/creation - name = "Creation ritual" + name = "Ритуал Создания" + description = "Проведение данного ритуала позволяет призвать двух случайных враждебных существ к руне. \ + Катастрофическая неудача приведёт к ужасающим ожогам всех участников ритуала." cooldown_after_cast = 150 SECONDS shaman_only = TRUE extra_invokers = 2 cast_time = 30 SECONDS - required_things = list( - /mob/living/carbon/human = 2 - ) + fluff_tgui_dye = "Тёмно-синяя краска" + needed_dye = "Indigo Dyes" + totem_dye = "indigo" -/datum/ritual/ashwalker/creation/check_invokers(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/creation/check_invokers(mob/living/carbon/human/invoker, list/invokers) . = ..() if(!.) return FALSE - for(var/mob/living/carbon/human/human as anything in invokers) + for(var/mob/living/carbon/human/human in invokers) if(human.stat != UNCONSCIOUS) disaster_prob += 20 fail_chance += 20 return TRUE -/datum/ritual/ashwalker/creation/check_contents(mob/living/carbon/human/invoker) - . = ..() - - if(!.) - return FALSE - - for(var/mob/living/carbon/human/human in used_things) - if(human.stat != DEAD) - to_chat(invoker, "Гуманоиды должны быть мертвы.") - return FALSE - - if(!isashwalker(human)) - to_chat(invoker, "Гуманоиды должны быть пеплоходцами.") - return FALSE - - return TRUE - -/datum/ritual/ashwalker/creation/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/creation/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) for(var/mob/living/mob as anything in subtypesof(/mob/living/simple_animal/hostile/asteroid)) if(prob(30)) mob = new(get_turf(ritual_object)) return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/creation/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/creation/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) if(!isashwalker(human) || !prob(disaster_prob)) continue @@ -1154,33 +962,23 @@ return -/datum/ritual/ashwalker/creation/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) - if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/magic/demon_consume.ogg', 50, TRUE) - if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/magic/blind.ogg', 50, TRUE) - if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/magic/castsummon.ogg', 50, TRUE) - - return . - /datum/ritual/ashwalker/command - name = "Command ritual" + name = "Ритуал Командования" + description = "Проведение данного ритуала позволяет получить в подчинение племени местную фауну. \ + Катастрофическая неудача приведёт к призыву агрессивного древнего голиафа." cooldown_after_cast = 150 SECONDS shaman_only = TRUE disaster_prob = 35 extra_invokers = 1 cast_time = 30 SECONDS + fluff_tgui_dye = "Мятная краска" + needed_dye = "Mint Dyes" + totem_dye = "mint" required_things = list( /mob/living/simple_animal = 1, - /obj/item/organ/internal/regenerative_core = 1, - /obj/item/reagent_containers/food/snacks/monstermeat/spiderleg = 1 ) -/datum/ritual/ashwalker/command/check_contents(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/command/check_contents(mob/living/carbon/human/invoker, list/used_things) . = ..() if(!.) @@ -1188,22 +986,22 @@ for(var/mob/living/simple_animal/living in used_things) if(living.client) - to_chat(invoker, "Существо должно быть бездушным.") + invoker.balloon_alert(invoker, "существо должно быть без души!") return FALSE if(living.sentience_type == SENTIENCE_BOSS) - to_chat(invoker, "Ритуал не может воздействовать на мегафауну.") + invoker.balloon_alert(invoker, "мегафауна не подходит!") return FALSE if(living.stat != DEAD) - to_chat(invoker, "Существа должны быть мертвы.") + invoker.balloon_alert(invoker, "существа должны быть мертвы!") return FALSE return TRUE -/datum/ritual/ashwalker/command/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/command/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/mob/living/simple_animal/animal = locate() in used_things - + if(QDELETED(animal)) return RITUAL_FAILED_ON_PROCEED @@ -1223,13 +1021,13 @@ animal.del_on_death = FALSE animal.master_commander = invoker - animal.mind.store_memory("Мой хозяин [invoker.name], выполню [genderize_ru(invoker.gender, "его", "её", "этого", "их")] цели любой ценой!") + animal.mind.store_memory("Мой хозяин - [invoker.name], выполню [genderize_ru(invoker.gender, "его", "её", "его", "их")] цели любой ценой!") to_chat(animal, chat_box_green("Вы - раб пеплоходцев. Всегда подчиняйтесь и помогайте им.")) add_game_logs("стал питомцем игрока [key_name(invoker)]", animal) return RITUAL_SUCCESSFUL -/datum/ritual/ashwalker/command/disaster(mob/living/carbon/human/invoker) +/datum/ritual/ashwalker/command/disaster(mob/living/carbon/human/invoker, list/invokers, list/used_things) for(var/mob/living/carbon/human/human in SSmobs.clients_by_zlevel[invoker.z]) if(!isashwalker(human) || !prob(disaster_prob)) continue @@ -1240,24 +1038,10 @@ var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(5, FALSE, get_turf(human.loc)) smoke.start() - + var/mob/living/simple_animal/mob = locate() in used_things qdel(mob) new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(get_turf(ritual_object)) return - -/datum/ritual/ashwalker/command/handle_ritual_object(bitflags, silent = FALSE) - . = ..(bitflags, TRUE) - - switch(.) - if(RITUAL_ENDED) - playsound(ritual_object.loc, 'sound/magic/demon_consume.ogg', 50, TRUE) - if(RITUAL_STARTED) - playsound(ritual_object.loc, 'sound/magic/invoke_general.ogg', 50, TRUE) - if(RITUAL_FAILED) - playsound(ritual_object.loc, 'sound/magic/castsummon.ogg', 50, TRUE) - - return . - diff --git a/code/datums/ruins.dm b/code/datums/ruins.dm index e4b561170c9..a3dabcee9e3 100644 --- a/code/datums/ruins.dm +++ b/code/datums/ruins.dm @@ -22,10 +22,14 @@ /datum/map_template/ruin/New() if(!name && id) name = id - + check_specials() mappath = prefix + suffix ..(path = mappath) + +/datum/map_template/ruin/proc/check_specials() + return + /datum/map_template/ruin/proc/try_to_place(z, allowed_areas) var/sanity = PLACEMENT_TRIES while(sanity > 0) diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 88bb4dadb78..808e3417828 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -48,8 +48,16 @@ description = "A race of unbreathing lizards live here, that run faster than a human can, worship a broken dead city, and are capable of reproducing by something involving tentacles? \ Probably best to stay clear." suffix = "lavaland_surface_ash_walker1.dmm" - always_place = TRUE allow_duplicates = FALSE + unpickable = TRUE + +/datum/map_template/ruin/lavaland/ash_walker_updated + name = "Ash Walker Village" + id = "ash-walker_updated" + description = "A race of unbreathing lizards live here, that run faster than a human can, worship a broken dead city, and are capable of reproducing by something involving tentacles? \ + Probably best to stay clear." + suffix = "lavaland_surface_ash_walker_new.dmm" + unpickable = TRUE /datum/map_template/ruin/lavaland/syndicate_base name = "Syndicate Lava Base" @@ -310,3 +318,16 @@ cost = 10 allow_duplicates = FALSE */ + +/datum/map_template/ruin/lavaland/lavalake + name = "Lavaland Lava Lake" + id = "lavalake" + description = "Огромное лавовое озеро, которое не подвержено стандартным изменениям лаваленда." + suffix = "lavaland_surface_lavalake.dmm" + allow_duplicates = FALSE + +/datum/map_template/ruin/lavaland/lavalake/check_specials() + if(SSmapping.lavaland_theme.lavaland_type != LAVALAND_TYPE_LAVA) + always_place = TRUE + else + unpickable = TRUE diff --git a/code/datums/spells/lavaland_spells/healtouch.dm b/code/datums/spells/lavaland_spells/healtouch.dm index 24e4bc3b873..8853435e147 100644 --- a/code/datums/spells/lavaland_spells/healtouch.dm +++ b/code/datums/spells/lavaland_spells/healtouch.dm @@ -1,7 +1,7 @@ //basic touch ability that heals basic damage types accessed by the ashwalker shaman /obj/effect/proc_holder/spell/touch/healtouch - name = "healing touch" - desc = "This spell charges your hand with the vile energy of the Necropolis, permitting you to undo some external injuries from a target." + name = "Прикосновение шамана" + desc = "Это заклинание заряжает вашу руку энергией Некрополя, позволяя вам лечить некоторые повреждения и взаимодействовать с некоторыми предметами." hand_path = /obj/item/melee/touch_attack/healtouch school = "evocation" @@ -12,8 +12,16 @@ /obj/item/melee/touch_attack/healtouch name = "\improper healing touch" - desc = "A blaze of life-granting energy from the hand. Heals minor to moderate injuries." - catchphrase = "BE REPLENISHED!!" + desc = "Целительная аура, вырывающаяся из вашей руки. При прикосновении к гуманоиду заживляет его раны." + ru_names = list( + NOMINATIVE = "целебное касание", + GENITIVE = "целебного касания", + DATIVE = "целебному касанию", + ACCUSATIVE = "целебное касание", + INSTRUMENTAL = "целебным касанием", + PREPOSITIONAL = "целебном касании" + ) + catchphrase = "ИСЦЕЛЕНИЕ!" on_use_sound = 'sound/magic/staff_healing.ogg' icon_state = "disintegrate" //ironic huh item_state = "disintegrate" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index f3da52eac80..5a1341508ac 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -381,7 +381,7 @@ update |= owner.heal_overall_damage(heal_amount, heal_amount, updating_health = FALSE) update |= owner.heal_damage_type(heal_amount, OXY, FALSE) - + if(update) owner.updatehealth("fleshmend") @@ -783,16 +783,93 @@ ..() owner.clear_fullscreen("payback") +/atom/movable/screen/alert/status_effect/lavaland_freaky_leg + name = "freaky legs" + desc = "Поедание человеческих конечностей себя оправдало!" + icon_state = "freaky_legs" + +/datum/status_effect/lavaland_no_pain + id = "Freaky Legs" + duration = 1 MINUTES + status_type = STATUS_EFFECT_REPLACE + alert_type = /atom/movable/screen/alert/status_effect/lavaland_freaky_leg + +/datum/status_effect/lavaland_no_pain/on_apply() + owner.ignore_slowdown(TRAIT_STATUS_EFFECT(id)) + return TRUE + +/datum/status_effect/lavaland_no_pain/on_remove() + owner.unignore_slowdown(TRAIT_STATUS_EFFECT(id)) + +/atom/movable/screen/alert/status_effect/lavaland_eternal_bleeding_fix + name = "thick red paste" + desc = "Вы чувствуете, как вам становится слегка лучше." + icon_state = "thick_red_paste" + +/datum/status_effect/lavaland_eternal_bleeding_fix + id = "Lavaland Eternal Bleeding" + status_type = STATUS_EFFECT_REPLACE + duration = 30 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/lavaland_eternal_bleeding_fix + +/datum/status_effect/lavaland_eternal_bleeding_fix/tick(seconds_between_ticks) + if(ishuman(owner)) + var/mob/living/carbon/human/hum = owner + for(var/obj/item/organ/external/bodypart as anything in hum.bodyparts) + if(bodypart.has_internal_bleeding() && prob(7)) + to_chat(hum, span_notice("Вы чувствуете сильное жжение в [bodypart.declent_ru(PREPOSITIONAL)], а затем облегчение. Судя по всему, ваши повреждённые кровеносные сосуды восстанавливаются!")) + bodypart.stop_internal_bleeding() + +/atom/movable/screen/alert/status_effect/lavaland_night_vision + name = "xeno sticks" + desc = "Вы начинаете лучше видеть в темноте." + icon_state = "xeno_sticks" + +/datum/status_effect/lavaland_night_vision + id = "Lavaland Night Vision" + status_type = STATUS_EFFECT_REFRESH + duration = 450 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/lavaland_night_vision + +/datum/status_effect/lavaland_night_vision/on_apply() + if(ishuman(owner)) + var/mob/living/carbon/human/human = owner + human.set_vision_override(/datum/vision_override/nightvision) + return TRUE + +/datum/status_effect/lavaland_night_vision/on_remove() + if(ishuman(owner)) + var/mob/living/carbon/human/human = owner + human.set_vision_override(null) + +/atom/movable/screen/alert/status_effect/lavaland_blood_regen + name = "abu ghosh" + desc = "Вы чувствуете, что ваша кровь начала регенерировать быстрее." + icon_state = "abu_ghosh" + +/datum/status_effect/lavaland_blood_regen + id = "Lavaland Blood Regeneration" + status_type = STATUS_EFFECT_REFRESH + duration = 5 MINUTES + alert_type = /atom/movable/screen/alert/status_effect/lavaland_blood_regen + + +/datum/status_effect/lavaland_blood_regen/tick(seconds_between_ticks) + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + if(!HAS_TRAIT(H, TRAIT_NO_BLOOD) && !HAS_TRAIT(H, TRAIT_NO_BLOOD_RESTORE) && H.blood_volume < BLOOD_VOLUME_NORMAL) + H.blood_volume += 0.4 + /datum/status_effect/drask_coma id = "drask_coma" tick_interval = 2 SECONDS - + var/temp_step var/cached_sleep_time - + /datum/status_effect/drask_coma/on_creation( - mob/living/new_owner, - duration = 300 SECONDS, + mob/living/new_owner, + duration = 300 SECONDS, temp_step = 10, ) src.duration = duration diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 6270c944008..c6da1f5d38e 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -300,3 +300,71 @@ alert_type = null duration = 1 MINUTES status_type = STATUS_EFFECT_REFRESH + +/datum/status_effect/forced_rumble + id = "forced_rumble" + alert_type = null + duration = 30 SECONDS + status_type = STATUS_EFFECT_REFRESH + +/datum/status_effect/forced_rumble/tick(seconds_between_ticks) + if(prob(20) && isunathi(owner)) + owner.emote("rumble") + +/datum/status_effect/forced_sneeze + id = "forced_sneeze" + alert_type = null + duration = 1 MINUTES + status_type = STATUS_EFFECT_REFRESH + +/datum/status_effect/forced_sneeze/tick(seconds_between_ticks) + if(prob(30)) + owner.emote("sneeze") + +/atom/movable/screen/alert/status_effect/lavaland_tail_o_dead + name = "tail'o'dead" + desc = "Поедание человеческих конечностей себя оправдало!" + icon_state = "tail_o_dead" + +/datum/status_effect/lavaland_vision + id = "lavaland vision" + duration = 5 MINUTES + status_type = STATUS_EFFECT_REFRESH + alert_type = /atom/movable/screen/alert/status_effect/lavaland_tail_o_dead + + +/datum/status_effect/lavaland_vision/on_apply() + if(ishuman(owner)) + var/mob/living/carbon/human/human = owner + human.force_gene_block(GLOB.colourblindblock, TRUE) + human.set_vision_override(/datum/vision_override/nightvision) + return TRUE + +/datum/status_effect/lavaland_vision/on_remove() + if(ishuman(owner)) + var/mob/living/carbon/human/human = owner + human.force_gene_block(GLOB.colourblindblock, FALSE) + human.set_vision_override(null) + +/atom/movable/screen/alert/status_effect/temperature_stabilize + name = "beer grub stew" + desc = "Температура вашего тела стабилизируется в разы быстрее." + icon_state = "beer_grub_stew" + +/datum/status_effect/temperature_stabilize + id = "temperature stabilisation" + duration = 5 MINUTES + status_type = STATUS_EFFECT_REFRESH + alert_type = /atom/movable/screen/alert/status_effect/temperature_stabilize + var/temp_effect + +/datum/status_effect/temperature_stabilize/tick(seconds_between_ticks) + var/normal_temperature = owner?.dna?.species.body_temperature + if(!normal_temperature) + normal_temperature = BODYTEMP_NORMAL + var/difference = owner.bodytemperature - normal_temperature + if(abs(difference) > temp_effect) + var/current_effect = difference > 0 ? -temp_effect : temp_effect + owner.adjust_bodytemperature(current_effect * TEMPERATURE_DAMAGE_COEFFICIENT) + + diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 556e752c990..ff56729ff66 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -211,6 +211,7 @@ icon_state = "gib2" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") no_clear = TRUE + scoop_reagents = list("liquidgibs" = 5) mergeable_decal = FALSE var/image/giblets var/fleshcolor = "#FFFFFF" @@ -267,7 +268,7 @@ /obj/effect/decal/cleanable/blood/gibs/core random_icon_states = list("gibmid1", "gibmid2", "gibmid3") - scoop_reagents = list("liquidgibs" = 5) + scoop_reagents = list("liquidgibs" = 15) /obj/effect/decal/cleanable/blood/gibs/cleangibs //most ironic name ever... diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 0dd92c3c845..4f2e41dc5cb 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -384,3 +384,25 @@ icon_state = "spacepod" result = list(/obj/spacepod/syndi = 1, /obj/spacepod/syndi/unlocked = 1) + +//random lavaland loot +/obj/effect/spawner/random_spawners/lavaland_random_loot //terraria fishing vibes + name = "33pc random lavaland minor loot" + result = list( + /datum/nothing = 40, //40-20 + /obj/item/stack/sheet/sinew/five = 4, + /obj/item/stack/sheet/animalhide/goliath_hide/five = 2, + /obj/item/stack/sheet/animalhide/ashdrake = 1, + /obj/item/stack/sheet/animalhide/weaver_chitin/five = 3, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit = 3, + /obj/item/kitchen/knife/combat/survival/bone = 1, + /obj/item/gem/random = 5, + /obj/item/clothing/accessory/necklace/gem = 1 + ) + +/obj/effect/spawner/random_spawners/forty_pc_skull + name = "40pc scorched_skull" + result = list( + /datum/nothing = 60, + /obj/item/clothing/head/scorched_skull = 40 + ) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index de88ec3e5e7..8fa6b399925 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -202,6 +202,8 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/g ///Datum used in item pixel shift TGUI var/datum/ui_module/item_pixel_shift/item_pixel_shift + /// Used in butchering of animals, set to TRUE for near instant butchering + var/has_speed_harvest = FALSE /obj/item/Initialize(mapload) . = ..() @@ -215,7 +217,6 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/g if(damtype == "brute") hitsound = "swing_hit" - for(var/path in actions_types) if(action_icon && action_icon_state) new path(src, action_icon[path], action_icon_state[path]) @@ -1302,6 +1303,7 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/g alpha = 0 transform = animation_matrix + SEND_SIGNAL(src, COMSIG_ATOM_TEMPORARY_ANIMATION_START, 3) // This is instant on byond's end, but to our clients this looks like a quick drop animate(src, alpha = old_alpha, pixel_x = old_x, pixel_y = old_y, transform = old_transform, time = 3, easing = CUBIC_EASING) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 2a31185bba6..9d0c73d5111 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/lighting.dmi' icon_state = "flashlight" item_state = "flashlight" + gender = MALE w_class = WEIGHT_CLASS_SMALL flags = CONDUCT slot_flags = ITEM_SLOT_BELT @@ -348,9 +349,17 @@ /obj/item/flashlight/flare/torch name = "torch" - desc = "A torch fashioned from some leaves and a log." + desc = "Простейший факел, сделанный из листьев, намотанных на древесину." + ru_names = list( + NOMINATIVE = "факел", + GENITIVE = "факела", + DATIVE = "факелу", + ACCUSATIVE = "факел", + INSTRUMENTAL = "факелом", + PREPOSITIONAL = "факеле", + ) w_class = WEIGHT_CLASS_BULKY - light_range = 7 + light_range = 6 icon_state = "torch" item_state = "torch" lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 8bb24af639c..26fa016e862 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -9,6 +9,7 @@ REAGENT SCANNER /obj/item/t_scanner name = "T-ray scanner" desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." + gender = MALE icon = 'icons/obj/device.dmi' icon_state = "t-ray0" base_icon_state = "t-ray" diff --git a/code/game/objects/items/gems.dm b/code/game/objects/items/gems.dm index 755134d7693..398714722a3 100644 --- a/code/game/objects/items/gems.dm +++ b/code/game/objects/items/gems.dm @@ -2,7 +2,16 @@ /obj/item/gem name = "\improper gem" - desc = "Oooh! Shiny!" + desc = "Ооо! Блестяшка!" + ru_names = list( + NOMINATIVE = "самоцвет", + GENITIVE = "самоцвета", + DATIVE = "самоцвету", + ACCUSATIVE = "самоцвет", + INSTRUMENTAL = "самоцветом", + PREPOSITIONAL = "самоцвете" + ) + gender = MALE icon = 'icons/obj/lavaland/gems.dmi' icon_state = "rupee" w_class = WEIGHT_CLASS_SMALL @@ -43,12 +52,12 @@ add_fingerprint(user) if(analysed) - to_chat(user, span_warning("This gem has been already analysed!")) + balloon_alert(user, "уже просканировано!") return ATTACK_CHAIN_PROCEED . = ATTACK_CHAIN_PROCEED_SUCCESS - to_chat(user, span_notice("You analyse the precious gemstone!")) + balloon_alert(user, "просканировано") if(analysed_message) to_chat(user, analysed_message) @@ -64,7 +73,7 @@ if(!card) return . - to_chat(user, span_notice("[point_value] mining points have been paid out!")) + to_chat(user, span_notice("Вам было выплачено [point_value] ОДР.")) card.mining_points += point_value playsound(loc, 'sound/machines/ping.ogg', 15, TRUE) @@ -73,16 +82,25 @@ if(I.use_tool(src, user, 0, volume=50)) if(src.sheet_type) new src.sheet_type(user.loc) - to_chat(user, span_notice("You carefully cut [src].")) + to_chat(user, span_notice("Вы осторожно разрезаете [declent_ru(ACCUSATIVE)].")) qdel(src) else - to_chat(user, span_notice("You can't seem to cut [src].")) + balloon_alert(user, "не получается разрезать!") return TRUE //goldgrub gem /obj/item/gem/rupee name = "\improper ruperium crystal" - desc = "A radioactive, crystalline compound rarely found in the goldgrubs. While able to be cut into sheets of uranium, the mineral's true value is in its resonating, humming properties." + desc = "Крайне радиоактивное кристаллическое соединение, которое можно найти во внутренностях златожора. Хоть вы и можете преобразовать кристалл в урановую руду, его истинная ценность заключается в его резонирующих свойствах." + ru_names = list( + NOMINATIVE = "кристалл рупериума", + GENITIVE = "кристалла рупериума", + DATIVE = "кристаллу рупериума", + ACCUSATIVE = "кристалл рупериума", + INSTRUMENTAL = "кристаллом рупериума", + PREPOSITIONAL = "кристалле рупериума" + ) + light_color = "#5ECC38" icon_state = "rupee" materials = list(MAT_URANIUM = 60000) sheet_type = /obj/item/stack/sheet/mineral/uranium{amount = 30} @@ -103,9 +121,9 @@ /obj/item/gem/rupee/examine(mob/user) . = ..() if(HAS_TRAIT(src, TRAIT_BLOCK_RADIATION)) - . += span_info("You could use something sharp to damage crystal.") + . += span_info("Вы можете использовать что-нибудь острое, чтобы распилить кристалл.") else - . += span_warning("The crystal glows strongly!") + . += span_warning("Кристалл ярко горит!") /obj/item/gem/rupee/update_icon_state() @@ -117,11 +135,11 @@ if(ATTACK_CHAIN_CANCEL_CHECK(.) || !is_sharp(I) || !HAS_TRAIT(src, TRAIT_BLOCK_RADIATION)) return . - to_chat(user, span_notice("You start damaging the crystal. You have the feeling that's it's not a good idea...")) - if(!do_after(user, 5 SECONDS, src, max_interact_count = 1, cancel_on_max = TRUE, cancel_message = span_notice("You decide not to die from the radiation."), category = DA_CAT_TOOL)) + to_chat(user, span_notice("Вы начали распиливать кристалл! Это явно плохая идея...")) + if(!do_after(user, 5 SECONDS, src, max_interact_count = 1, cancel_on_max = TRUE, cancel_message = span_notice("Вы решили не делать глупостей."), category = DA_CAT_TOOL)) return . . |= ATTACK_CHAIN_SUCCESS - to_chat(user, span_warning("You make a crack in the crystal! Your head hurts...")) + to_chat(user, span_warning("Вы разрушили внешнюю оболочку кристалла! Голова начинает болеть...")) user.apply_effect(50, IRRADIATE) REMOVE_TRAIT(src, TRAIT_BLOCK_RADIATION, INNATE_TRAIT) update_icon(UPDATE_ICON_STATE) @@ -130,7 +148,15 @@ //magmawing watcher gem /obj/item/gem/magma name = "\improper calcified auric" - desc = "A hot, lightly glowing mineral born from the inner workings of magmawing watchers. It is most commonly smelted down into deposits of pure gold." + desc = "Горячий на ощупь, слегка святящийся минерал, получаемый из потрохов магменных наблюдателей. Может быть переплавлен в чистое золото." + ru_names = list( + NOMINATIVE = "окаменелый аурит", + GENITIVE = "окаменелого аурита", + DATIVE = "окаменелому ауриту", + ACCUSATIVE = "окаменелый аурит", + INSTRUMENTAL = "окаменелым ауритом", + PREPOSITIONAL = "окаменелом аурите" + ) icon_state = "magma" materials = list(MAT_GOLD = 100000) sheet_type = /obj/item/stack/sheet/mineral/gold{amount = 50} @@ -145,17 +171,17 @@ /obj/item/gem/magma/examine(mob/user) . = ..() if(!hot) - . += "The diamond feels cold to the touch." + . += span_notice("Кристалл, кажется, комнатной температуры.") else - . += "The crystal is very hot to touch! It seems you can warm up if you squeeze it." + . += span_notice("Кристалл на ощупь очень горячий! Вы можете согреться, если приложите его к груди...") /obj/item/gem/magma/attack_self(mob/user) . = ..() var/mob/living/carbon/human/H = user if(!hot) - to_chat(H, span_notice("You are pressing [src] to your breast, but it's too cold for now..")) + to_chat(H, span_notice("Вы прикладываете [declent_ru(ACCUSATIVE)] к вашей груди, но он недостаточно теплый.")) return - to_chat(H, span_notice("You are pressing [src] to your breast and a strong heat passes through your body!")) + to_chat(H, span_notice("Вы прикладываете [declent_ru(ACCUSATIVE)] к вашей груди и чувствуете поток тепла по всему телу!")) H.custom_emote(1, "прижимает кристалл к груди.") //HRP style H.adjust_bodytemperature(60) set_light_on(FALSE) @@ -169,7 +195,15 @@ //icewing watcher gem /obj/item/gem/fdiamond name = "\improper frost diamond" - desc = "A unique diamond that is produced within icewing watchers. It looks like it can be cut into smaller sheets of diamond ore." + desc = "Уникальный алмаз, получаемый из морозных наблюдателей. Кажется его можно разрезать на маленькие алмазы." + ru_names = list( + NOMINATIVE = "морозный бриллиант", + GENITIVE = "морозного бриллианта", + DATIVE = "морозному бриллианту", + ACCUSATIVE = "морозный бриллиант", + INSTRUMENTAL = "морозным бриллиантом", + PREPOSITIONAL = "морозном бриллианте" + ) icon_state = "diamond" materials = list(MAT_DIAMOND = 60000) sheet_type = /obj/item/stack/sheet/mineral/diamond{amount = 30} @@ -184,17 +218,17 @@ /obj/item/gem/fdiamond/examine(mob/user) . = ..() if(!cold) - . += "The diamond feels warm to the touch." + . += span_notice("Кристалл, кажется, комнатной температуры.") else - . += "The crystal is very cold to touch! It seems you can cool if you squeeze it" + . += span_notice("Кристалл на ощупь очень холодный! Вы можете охладиться, если приложите его к груди...") /obj/item/gem/fdiamond/attack_self(mob/user) . = ..() var/mob/living/carbon/human/H = user if(!cold) - to_chat(H, span_notice("You are pressing [src] to your breast, but it's too warm for now..")) + to_chat(H, span_notice("Вы прикладываете [declent_ru(ACCUSATIVE)] к вашей груди, но он недостаточно холодный.")) return - to_chat(H, span_notice("You are pressing [src] to your breast and a strong cold passes through your body!")) + to_chat(H, span_notice("Вы прикладываете [declent_ru(ACCUSATIVE)] к вашей груди и чувствуете поток холода по всему телу!")) H.custom_emote(1, "прижимает алмаз к груди.") //HRP style H.adjust_bodytemperature(-60) set_light_on(FALSE) @@ -208,7 +242,15 @@ //blood-drunk miner gem /obj/item/gem/phoron name = "\improper stabilized baroxuldium" - desc = "A soft, glowing crystal only found in the deepest veins of plasma. It looks like it could be destructively analyzed to extract the condensed materials within." + desc = "Мягкий на ощупь кристалл, который можно найти исключительно в самых глупоких жилах плазмы. Судя по всему, ученые им явно заинтересуются." + ru_names = list( + NOMINATIVE = "стабилизированный бароксильдиум", + GENITIVE = "стабилизированного бароксильдиума", + DATIVE = "стабилизированному бароксильдиуму", + ACCUSATIVE = "стабилизированный бароксильдиум", + INSTRUMENTAL = "стабилизированным бароксильдиумом", + PREPOSITIONAL = "стабилизированном бароксильдиуме" + ) icon_state = "phoron" materials = list(MAT_PLASMA = 80000) sheet_type = /obj/item/stack/sheet/mineral/plasma{amount = 40} @@ -223,7 +265,15 @@ //hierophant gem /obj/item/gem/purple name = "\improper densified dilithium" - desc = "A strange mass of dilithium which pulses to a steady rhythm. Its strange surface exudes a unique radio signal detectable by GPS." + desc = "Крайне необычная форма дилитиума, пульсирующая в устойчивом ритме. Этот ритм достаточно легко улавливается большинством систем GPS." + ru_names = list( + NOMINATIVE = "уплотненный дилитиум", + GENITIVE = "уплотненного дилитиума", + DATIVE = "уплотненному дилитиуму", + ACCUSATIVE = "уплотненный дилитиум", + INSTRUMENTAL = "уплотненным дилитиумом", + PREPOSITIONAL = "уплотненном дилитиуме" + ) icon_state = "purple" point_value = 1200 sell_multiplier = 4 @@ -254,7 +304,15 @@ //drake gem /obj/item/gem/amber //all cool effects in the necklace, not here. Also this works as fuel for Anvil name = "\improper draconic amber" - desc = "A brittle, strange mineral that forms when an ash drake's blood hardens after death. Cherished by gemcutters for its faint glow and unique, soft warmth. Poacher tales whisper of the dragon's strength being bestowed to one that wears a necklace of this amber." + desc = "Крайне хрупкий минерал, формирующийся из загустевшей крови пепельного дракона. Крайне популярен среди браконьеров из-за его необычной формы и свечения. Среди охотников ходят истории о невероятной силе, даруемой носителю украшений из этого жемчуга." + ru_names = list( + NOMINATIVE = "Драконий жемчуг", + GENITIVE = "драконего жемчуга", + DATIVE = "драконьему жемчугу", + ACCUSATIVE = "драконий жемчуг", + INSTRUMENTAL = "драконим жемчугом", + PREPOSITIONAL = "драконем жемчуге" + ) icon_state = "amber" point_value = 1400 sell_multiplier = 5 @@ -266,7 +324,15 @@ //colossus gem /obj/item/gem/void name = "\improper null crystal" - desc = "A shard of stellar, crystallized energy. These strange objects occasionally appear spontaneously in areas where the bluespace fabric is largely unstable. Its surface gives a light jolt to those who touch it." + desc = "Осколок чистой, кристаллизированной энергии. Эти странные объекты изредка формируются там, где покров реальности крайне неустойчив. Он слегка бьётся током при прикосновении." + ru_names = list( + NOMINATIVE = "пустотный кристалл", + GENITIVE = "пустотного кристалла", + DATIVE = "пустотному кристаллу", + ACCUSATIVE = "пустотный кристалл", + INSTRUMENTAL = "пустотным кристаллом", + PREPOSITIONAL = "пустотном кристалле" + ) icon_state ="void" point_value = 1600 sell_multiplier = 6 @@ -284,22 +350,22 @@ /obj/item/gem/void/examine(mob/user) . = ..() if(!cooldown) - . += "The crystall is glowing!" + . += span_notice("Кристалл подрагивает и ярко светится.") /obj/item/gem/void/attack_self(mob/user) if(cooldown) - to_chat(user, span_warning("The crystal is still. Perhaps you should wait a little longer.")) + to_chat(user, span_warning("Кристалл неподвижен. Может стоит немного подождать?")) return var/mob/living/carbon/human/H = user teleport(H) - H.visible_message("[H] squeezes the crystal in [H.p_their()] hands!") + H.visible_message(span_notice("[H] сжима[pluralize_ru(H.gender, "ет", "ют")] [declent_ru(ACCUSATIVE)] в руках!")) cooldown = TRUE addtimer(CALLBACK(src, PROC_REF(reset_cooldown)),cooldown_time) /obj/item/gem/void/proc/teleport(mob/living/L) if(!is_teleport_allowed(L.z)) - src.visible_message("[src] begin rapidly vibrating.") + src.visible_message(span_warning("Кажется, [declent_ru(NOMINATIVE)] начинает дрожать!")) return do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg') @@ -309,7 +375,15 @@ //bubblegum gem. Can be used for antags to get some active blood or TK. /obj/item/gem/bloodstone name = "\improper ichorium" - desc = "A weird, sticky substance, known to coalesce in the presence of otherwordly phenomena. While shunned by most spiritual groups, this gemstone has unique ties to the occult which find it handsomely valued by mysterious patrons." + desc = "Странная, липкая субстанция, срастающаяся в единое целое в присутствии чего-то ужасающего и потустороннего. В то время, как большинство спиритических групп избегает использования этого кристалла, некоторые наиболее опасные секты высоко его ценят." + ru_names = list( + NOMINATIVE = "кровавый ихор", + GENITIVE = "кровавого ихора", + DATIVE = "кровавому ихору", + ACCUSATIVE = "кровавый ихор", + INSTRUMENTAL = "кровавым ихором", + PREPOSITIONAL = "кровавом ихоре" + ) icon_state = "red" point_value = 1800 sell_multiplier = 7 @@ -324,19 +398,19 @@ /obj/item/gem/bloodstone/examine(mob/user) . = ..() if(isvampire(user) && !used) - . += "You can smell human blood coming from the bloodstone." + . += span_warning("Вы чувствуете опьяняющий запах крови, исходящий от кристалла.") if(user.mind.has_antag_datum(/datum/antagonist/traitor)) - . += "You have a feeling, that you could you this gem to charge your uplink." + . += span_warning("Судя по всему, этот кристалл можно использовать, чтобы зарядить ваш аплинк.") /obj/item/gem/bloodstone/attack_self(mob/user) var/datum/antagonist/vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/vampire) if(vampire && !used) - user.visible_message(span_warning("[user] forcefully squeezes [src] in his hands!"), \ - span_notice("You squeeze [src] in your hands.")) - if(!do_after(user, 10 SECONDS, user, max_interact_count = 1, cancel_on_max = TRUE, cancel_message = span_warning("You relax your grip on [src]"))) + user.visible_message(span_warning("[user] начина[pluralize_ru(user.gender, "ет", "ют")] сжимать [declent_ru(ACCUSATIVE)] в своих руках!"), \ + span_notice("вы сжимаете [declent_ru(ACCUSATIVE)] в ваших руках.")) + if(!do_after(user, 10 SECONDS, user, max_interact_count = 1, cancel_on_max = TRUE, cancel_message = span_warning("Вы ослабили хватку."))) return - user.visible_message(span_warning("[user] begins to absorb the liquid contents of the crystal!"), \ - span_notice("You absorb the contents of [src]. The energy from the crystal saturates your body.")) + user.visible_message(span_warning("[user] начина[pluralize_ru(user.gender, "ет", "ют")] впитывать в себя содержимое [declent_ru(GENITIVE)]!"), \ + span_notice("Вы пожираете содержимое [declent_ru(GENITIVE)]. Энергия от кристалла насыщает вас.")) vampire.bloodusable += blood used = TRUE set_light_range_power_color(3, 2, "#ac2626") @@ -348,13 +422,21 @@ if(istype(I) && I.hidden_uplink && I.hidden_uplink.active) I.hidden_uplink.uses += charges qdel(src) - to_chat(user, "You slot [src] into [I] and charge its internal uplink.") + to_chat(user, span_notice("Вы вставляете [declent_ru(NOMINATIVE)] внутрь вашего апплинка, заряжая его.")) //vetus gem /obj/item/gem/data name = "\improper bluespace data crystal" - desc = "A large bluespace crystal, etched internally with nano-circuits, it seemingly draws power from nowhere." + desc = "Массивный блюспейс кристалл, на котором выгравированы наносхемы. Кажется, он черпает энергию из воздуха." + ru_names = list( + NOMINATIVE = "блюспейс кристалл данных", + GENITIVE = "блюспейс кристалла данных", + DATIVE = "блюспейс кристаллу данных", + ACCUSATIVE = "блюспейс кристалл данных", + INSTRUMENTAL = "блюспейс кристаллом данных", + PREPOSITIONAL = "блюспейс кристалле данных" + ) icon_state = "data" materials = list(MAT_BLUESPACE = 48000) sheet_type = /obj/item/stack/sheet/bluespace_crystal{amount = 24} @@ -383,28 +465,64 @@ /obj/item/gem/ruby name = "\improper ruby" + ru_names = list( + NOMINATIVE = "рубин", + GENITIVE = "рубина", + DATIVE = "рубину", + ACCUSATIVE = "рубин", + INSTRUMENTAL = "рубином", + PREPOSITIONAL = "рубине" + ) icon_state = "ruby" point_value = 100 simple = TRUE + light_color = "#C72414" sell_multiplier = 0.5 /obj/item/gem/sapphire name = "\improper sapphire" + ru_names = list( + NOMINATIVE = "сапфир", + GENITIVE = "сапфира", + DATIVE = "сапфиру", + ACCUSATIVE = "сапфир", + INSTRUMENTAL = "сапфиром", + PREPOSITIONAL = "сапфире" + ) icon_state = "sapphire" point_value = 100 simple = TRUE + light_color = "#1726BF" sell_multiplier = 0.5 /obj/item/gem/emerald name = "\improper emerald" + ru_names = list( + NOMINATIVE = "эмеральд", + GENITIVE = "эмеральда", + DATIVE = "эмеральду", + ACCUSATIVE = "эмеральд", + INSTRUMENTAL = "эмеральдом", + PREPOSITIONAL = "эмеральде" + ) icon_state = "emerald" point_value = 100 simple = TRUE + light_color = "#14A73C" sell_multiplier = 0.5 /obj/item/gem/topaz name = "\improper topaz" + ru_names = list( + NOMINATIVE = "топаз", + GENITIVE = "топаза", + DATIVE = "топазу", + ACCUSATIVE = "топаз", + INSTRUMENTAL = "топазом", + PREPOSITIONAL = "топазе" + ) icon_state = "topaz" point_value = 100 simple = TRUE + light_color = "#C73914" sell_multiplier = 0.5 diff --git a/code/game/objects/items/misc.dm b/code/game/objects/items/misc.dm index 04cc2dc637e..a59ef24f4d6 100644 --- a/code/game/objects/items/misc.dm +++ b/code/game/objects/items/misc.dm @@ -86,4 +86,3 @@ used = TRUE update_appearance(UPDATE_NAME|UPDATE_ICON_STATE) return TRUE - diff --git a/code/game/objects/items/mixing_bowl.dm b/code/game/objects/items/mixing_bowl.dm index 8bd1d702eef..36016b027c0 100644 --- a/code/game/objects/items/mixing_bowl.dm +++ b/code/game/objects/items/mixing_bowl.dm @@ -37,7 +37,7 @@ update_dialog(user) return ATTACK_CHAIN_PROCEED_SUCCESS - if(is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_MICROWAVE]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_GRILL]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_OVEN]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_CANDY])) + if(is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_MICROWAVE]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_GRILL]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_OVEN]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_CANDY]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_TRIBAL_OVEN])) add_fingerprint(user) if(dirty) to_chat(user, span_warning("You should clean [src] before you use it for food prep.")) @@ -77,7 +77,7 @@ to_chat(user, span_warning("The [I.name] is empty!")) return ATTACK_CHAIN_PROCEED for(var/datum/reagent/reagent as anything in I.reagents.reagent_list) - if(!(reagent.id in GLOB.cooking_reagents[RECIPE_MICROWAVE]) && !(reagent.id in GLOB.cooking_reagents[RECIPE_GRILL]) && !(reagent.id in GLOB.cooking_reagents[RECIPE_OVEN]) && !(reagent.id in GLOB.cooking_reagents[RECIPE_CANDY])) + if(!(reagent.id in GLOB.cooking_reagents[RECIPE_MICROWAVE]) && !(reagent.id in GLOB.cooking_reagents[RECIPE_GRILL]) && !(reagent.id in GLOB.cooking_reagents[RECIPE_OVEN]) && !(reagent.id in GLOB.cooking_reagents[RECIPE_CANDY]) && !(reagent.id in GLOB.cooking_reagents[RECIPE_TRIBAL_OVEN])) to_chat(user, span_warning("Your [I.name] contains components unsuitable for cookery.")) return ATTACK_CHAIN_PROCEED var/obj/item/reagent_containers/container = I diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 790f833a94c..e86b9821041 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -150,7 +150,9 @@ GLOBAL_LIST_INIT(leather_recipes, list ( new/datum/stack_recipe("leather overcoat", /obj/item/clothing/suit/jacket/leather/overcoat, 10), new/datum/stack_recipe("FireSuit", /obj/item/clothing/suit/fire/firefighter, 15), new/datum/stack_recipe("hide mantle", /obj/item/clothing/neck/mantle/unathi, 4), - new/datum/stack_recipe("gem satchel", /obj/item/storage/bag/gem, 1))) + new/datum/stack_recipe("leather bed", /obj/structure/bed/leather, 10, one_per_turf = TRUE, on_floor = TRUE, time = 5 SECONDS), + new/datum/stack_recipe("gem satchel", /obj/item/storage/bag/gem, 1), + )) /obj/item/stack/sheet/leather/Initialize(mapload, new_amount, merge = TRUE) . = ..() @@ -172,6 +174,9 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ . = ..() recipes = GLOB.sinew_recipes +/obj/item/stack/sheet/sinew/five + amount = 5 + /obj/item/stack/sheet/animalhide/goliath_hide name = "goliath hide plates" desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna." @@ -234,6 +239,9 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ else to_chat(user, "You can't improve [D] any further!") +/obj/item/stack/sheet/animalhide/goliath_hide/five + amount = 5 + /obj/item/stack/sheet/armour_plate name = "укрепленная броневая плита" // тут по причине того же механа что и шкура голиафа desc = "Сделанный на коленке из плит брони для мехов, этот кусок металла можно налепить на сам мех, усиливая его защитные характеристики. К сожалению, выемки под такую броню есть только у мехов рабочего класса." @@ -260,6 +268,28 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ else to_chat(user, "Вы больше не можете найти куда [name] пристраивается!") +/obj/item/stack/sheet/cartilage_plate + name = "thick cartilage plate" + desc = "Хрящевая пластина, снятая с тела лавового панцирника. Судя по всему, пластина начала терять свой характерный кроваво-красный цвет, однако она остаётся такой же крепкой, как и до этого." + + ru_names = list( + NOMINATIVE = "толстая хрящевая пластина", + GENITIVE = "толстой хрящевой пластины", + DATIVE = "толстой хрящевой пластине", + ACCUSATIVE = "толстую хрящевую пластину", + INSTRUMENTAL = "толстой хрящевой пластиной", + PREPOSITIONAL = "толстой хрящевой пластине" + ) + gender = FEMALE + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "thick_cartilage_plate" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "thick_cartilage_plate" + singular_name = "cartilage plate" + item_flags = NOBLUDGEON + w_class = WEIGHT_CLASS_NORMAL + layer = MOB_LAYER /obj/item/stack/sheet/animalhide/ashdrake name = "ash drake hide" diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 14cdfd12713..247a5019fc3 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ new/datum/stack_recipe("Sandstone Plate", /obj/structure/bed/sandstone, 15, one_per_turf = 1, on_floor = 1), \ null, \ new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = 0, on_floor = 1), \ + new/datum/stack_recipe("tribal oven", /obj/machinery/kitchen_machine/tribal_oven, 20, one_per_turf = 1, on_floor = 1), \ )) GLOBAL_LIST_INIT(silver_recipes, list ( \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 0ec0bdaa95f..0aa8a18d031 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -107,6 +107,7 @@ GLOBAL_LIST_INIT(metal_recipes, list( new /datum/stack_recipe("Intercom frame", /obj/item/mounted/frame/intercom, 2), new /datum/stack_recipe("Shower", /obj/item/mounted/shower, 5, time = 7, on_floor = TRUE), new /datum/stack_recipe("Stairs frame", /obj/structure/stairs_frame, 15, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("Torch holder", /obj/item/mounted/frame/torch_holder, 2, time = 3 SECONDS), )) /obj/item/stack/sheet/metal @@ -236,8 +237,13 @@ GLOBAL_LIST_INIT(wood_recipes, list( new /datum/stack_recipe("Wood table frame", /obj/structure/table_frame/wood, 2, time = 10), new /datum/stack_recipe("Wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("Wooden chair", /obj/structure/chair/wood, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("Wooden stool", /obj/structure/chair/stool/wooden, 2, time = 5, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("Wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("Notice Board", /obj/item/noticeboard, 5, time = 10), + new /datum/stack_recipe("Torch", /obj/item/flashlight/flare/torch, 5, time = 2 SECONDS), + new /datum/stack_recipe("Wooden crate", /obj/structure/closet/crate/wooden, 20, time = 10 SECONDS), + new /datum/stack_recipe("Wooden bed", /obj/structure/bed/wooden, 10, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("Wooden rack", /obj/structure/rack/wooden, 5, time = 4 SECONDS, one_per_turf = TRUE, on_floor = TRUE), )) /obj/item/stack/sheet/wood @@ -295,6 +301,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list( new /datum/stack_recipe("Empty sandbag", /obj/item/emptysandbag, 4), new /datum/stack_recipe("Improvised gauze", /obj/item/stack/medical/bruise_pack/improvised, res_amount = 2, max_res_amount = 6), new /datum/stack_recipe("Rag", /obj/item/reagent_containers/glass/rag), + new /datum/stack_recipe("Wicker Bed", /obj/structure/bed/wicker, 10, one_per_turf = TRUE, on_floor = TRUE, time = 5 SECONDS), new /datum/stack_recipe_list("Towels", list( new /datum/stack_recipe("Short towel", /obj/item/clothing/suit/towel/short, 2), new /datum/stack_recipe("Short towel alt", /obj/item/clothing/suit/towel/short/alt, 2), @@ -666,6 +673,30 @@ GLOBAL_LIST_INIT(fake_brass_recipes, list( throw_range = 3 origin_tech = "materials=2;biotech=2" +/obj/item/stack/sheet/razor_sharp_teeth + name = "razor sharp teeth" + desc = "Бритвенно-острые зубы, добытые из пасти лавового хищника. Прекрасно подходят для стрел." + ru_names = list( + NOMINATIVE = "бритвенно-острые зубы", + GENITIVE = "бритвенно-острых зубов", + DATIVE = "бритвенно-острым зубам", + ACCUSATIVE = "бритвенно-острые зубы", + INSTRUMENTAL = "бритвенно-острыми зубами", + PREPOSITIONAL = "бритвенно-острых зубах" + ) + gender = PLURAL + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "razor_sharp_teeth" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "razor_sharp_teeth" + singular_name = "razor sharp tooth" + w_class = WEIGHT_CLASS_NORMAL + throw_speed = 1 + throw_range = 7 + throwforce = 15 + origin_tech = "materials=4;biotech=5" + /* * Plastic */ diff --git a/code/game/objects/items/weapons/fishing_rod.dm b/code/game/objects/items/weapons/fishing_rod.dm new file mode 100644 index 00000000000..6a67e2bf02f --- /dev/null +++ b/code/game/objects/items/weapons/fishing_rod.dm @@ -0,0 +1,184 @@ +#define BAIT_AFFECT 70 + +//Fishing rode and related stuff + +/obj/item/twohanded/fishing_rod + name = "ol' reliable" + desc = "Старая, видавшая виды удочка. Если она прослужила так долго и ещё не развалилась - вам точно не следует волноваться о её надёжности." + ru_names = list( + NOMINATIVE = "удочка", + GENITIVE = "удочки", + DATIVE = "удочке", + ACCUSATIVE = "удочку", + INSTRUMENTAL = "удочкой", + PREPOSITIONAL = "удочке" + ) + gender = FEMALE + icon = 'icons/obj/lavaland/lava_fishing.dmi' + lefthand_file = 'icons/mob/inhands/lavaland/lava_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/lava_items_righthand.dmi' + icon_state = "fishing_rod" + item_state = "fishing_rod" + w_class = WEIGHT_CLASS_BULKY + /// Used in sanity checks in order to avoid bugs + var/fishing = FALSE + /// What type of bait do we use? + var/obj/item/reagent_containers/food/snacks/bait/bait = null + + var/static/mutable_appearance/bobber = mutable_appearance('icons/obj/fish_items.dmi',"bobber") + + var/turf/simulated/floor/lava/lava_land_surface/fishing_target + + var/mob/fisher + /// Actual fish that we catch + var/reward_fish = null + + var/throw_sound = 'sound/objects/fishing_rod_throw.ogg' + var/catch_sound = 'sound/objects/fishing_rod_catch.ogg' + +/obj/item/twohanded/fishing_rod/tribal + name = "fishing rod" + desc = "Примитивная костяная удочка, использующая сухожилия наблюдателя в качестве высокопрочной лески. Не совсем понятно, почему эта \"леска\" не плавится в лаве." + ru_names = list( + NOMINATIVE = "примитивная удочка", + GENITIVE = "примитивной удочки", + DATIVE = "примитивной удочке", + ACCUSATIVE = "примитивную удочку", + INSTRUMENTAL = "примитивной удочкой", + PREPOSITIONAL = "примитивной удочке" + ) + icon_state = "tribal_rod" + item_state = "tribal_rod" + +/obj/item/twohanded/fishing_rod/Destroy() + . = ..() + QDEL_NULL(bait) + +/obj/item/twohanded/fishing_rod/examine(mob/user) + . = ..() + if(bait) + . += span_notice("на крючке наход[pluralize_ru(bait.gender, "ит", "ят")]ся [bait.declent_ru(NOMINATIVE)].") + . += span_notice("Вы можете снять наживку, используя Alt + ЛКМ.") + +/obj/item/twohanded/fishing_rod/update_icon_state() + . = ..() + if(!bait) + cut_overlays() + +/obj/item/twohanded/fishing_rod/afterattack(atom/target, mob/user, proximity, params) + if(!proximity) + return + + if(!istype(target, /turf/simulated/floor/lava/lava_land_surface)) + return ..() + + var/turf/simulated/floor/lava/lava_land_surface/fishing_pool = target + + if(!fishing_pool.can_be_fished_on) + return ..() + + if(!fishing) + if(!HAS_TRAIT(src, TRAIT_WIELDED)) + balloon_alert(user, "необходим двуручный хват!") + return + fishing = TRUE + start_fishing(fishing_pool, user) + else + if(fishing_pool != target) + balloon_alert(user, "вы уже рыбачите!") + return + +/obj/item/twohanded/fishing_rod/proc/start_fishing(turf/simulated/floor/lava/lava_land_surface/fishing_pool, mob/user) + if(!bait) + balloon_alert(user, "вам нужна наживка!") + fishing = FALSE + return + + fishing_target = fishing_pool + fisher = user + fishing_target.add_overlay(bobber) + playsound(src, throw_sound, 30) + to_chat(user, span_notice("Вы начали рыбачить.")) + + if(do_after(fisher, 10 SECONDS, target = fishing_target, max_interact_count = 1)) + if(prob(20)) + to_chat(user, span_warning("Рыба сорвалась вместе с наживкой! Чёрт!")) + fishing = FALSE + fishing_target.cut_overlay(bobber) + bait = null + update_icon(UPDATE_OVERLAYS) + return + + catch_fish() + playsound(src, catch_sound, 30) + fishing = FALSE + fishing_target.cut_overlay(bobber) + else + balloon_alert(user, "вам нужна стоять на месте!") + fishing_target.cut_overlay(bobber) + fishing = FALSE + return + +/obj/item/twohanded/fishing_rod/proc/catch_fish() + if(!fisher) //uh oh + return + + if(!bait) //double check + return + + calculate_fishing_chance() + var/obj/item/fish = new reward_fish(loc) + to_chat(fisher, span_notice("Вы поймали [fish.declent_ru(ACCUSATIVE)]!")) + + fisher.put_in_hands(fish) + bait = null + update_icon(UPDATE_OVERLAYS) + +/obj/item/twohanded/fishing_rod/proc/calculate_fishing_chance() // I fucking hate it + var/list/fishable_list = fishing_target.get_fish() + var/list/bait_list = list() + + for(var/fish in fishable_list) //After this stage, bait_list will have 1-2 fish in bait_list + var/obj/item/lavaland_fish/cooler_fish = fish + if(bait.type == cooler_fish.favorite_bait) + bait_list += cooler_fish + if(isemptylist(bait_list)) //if something went wrong and list is empty + reward_fish = pick(fishable_list) + return + + if(prob(BAIT_AFFECT)) + reward_fish = pick(bait_list) + else + reward_fish = pick(fishable_list) + +/obj/item/twohanded/fishing_rod/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/reagent_containers/food/snacks/bait)) + return ATTACK_CHAIN_PROCEED + + if(bait) + balloon_alert(user, "наживка уже на удочке!") + return ATTACK_CHAIN_PROCEED + + var/obj/item/reagent_containers/food/snacks/bait/worm = I + if(!user.drop_transfer_item_to_loc(I, src)) + return ATTACK_CHAIN_PROCEED + bait = worm + to_chat(user, span_notice("Вы насадили [worm.declent_ru(ACCUSATIVE)] на крючок.")) + update_icon(UPDATE_OVERLAYS) + return ATTACK_CHAIN_PROCEED_SUCCESS + + +/obj/item/twohanded/fishing_rod/AltClick(mob/user) + if(bait) + user.put_in_hands(bait) + to_chat(user, span_notice("Вы сняли [bait.declent_ru(ACCUSATIVE)] с крючка.")) + bait = null + update_icon(UPDATE_OVERLAYS) + +/obj/item/twohanded/fishing_rod/update_overlays() + . = ..() + cut_overlays() + if(bait) + add_overlay(bait.rod_overlay) + +#undef BAIT_AFFECT diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 7c7708d58a9..24da34094ed 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -282,6 +282,23 @@ pickup_sound = 'sound/items/handling/bone_pickup.ogg' drop_sound = 'sound/items/handling/bone_drop.ogg' +/obj/item/kitchen/knife/combat/survival/bone/eel + name = "eel sharpened tail" + desc = "Бритвенно-острый хвост донного угля, аккуратно отделённый от основного тела рыбы. Из такого выйдет отличный нож или наконечник для копья." + ru_names = list( + NOMINATIVE = "хвост донного угря", + GENITIVE = "хвоста донного угря", + DATIVE = "хвосту донного угря", + ACCUSATIVE = "хвост донного угря", + INSTRUMENTAL = "хвостом донного угря", + PREPOSITIONAL = "хвосте донного угря" + ) + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "eel_sharpened_tail" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "eel_sharpened_tail" + /obj/item/kitchen/knife/combat/cyborg name = "cyborg knife" icon = 'icons/obj/items_cyborg.dmi' diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 29353c5c92b..fb3e3fc8504 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -621,4 +621,10 @@ desc = "A small pouch for holding plants, poultices, resin, and pestles." storage_slots = 40 max_combined_w_class = 200 - can_hold = list(/obj/item/reagent_containers/food/snacks/grown, /obj/item/stack/medical) + can_hold = list(/obj/item/reagent_containers/food/snacks/grown, + /obj/item/stack/medical, + /obj/item/reagent_containers/food/snacks/bait, + /obj/item/reagent_containers/food/snacks/charred_krill, + /obj/item/stack/sheet/cartilage_plate, + /obj/item/stack/sheet/razor_sharp_teeth, + ) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 750e9c5a95c..ba694440941 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -969,7 +969,23 @@ /obj/item/organ/internal/regenerative_core, /obj/item/stack/ore, /obj/item/reagent_containers/food/snacks/grown, - /obj/item/reagent_containers/applicator) + /obj/item/reagent_containers/applicator, + /obj/item/reagent_containers/food/snacks/bait, + /obj/item/reagent_containers/food/snacks/charred_krill, + /obj/item/whetstone, + /obj/item/reagent_containers/food/snacks/lavaland, + /obj/item/lavaland_dye, + /obj/item/conductive_organ, + /obj/item/stack/sheet/cartilage_plate, + /obj/item/stack/sheet/razor_sharp_teeth, + /obj/item/hivelordstabilizer, + /obj/item/circular_saw_blade, + /obj/item/t_scanner/adv_mining_scanner/bleary_eye, + /obj/item/acid_bladder, + /obj/item/shovel/spade/wooden, + /obj/item/hatchet/wooden, + /obj/item/cultivator/wooden, + ) /obj/item/storage/belt/chef name = "culinary tool apron" diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index a8d2feda447..d1373a8dbd3 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -261,3 +261,32 @@ /obj/item/storage/toolbox/surgery/alien/empty/populate_contents() return + +/obj/item/storage/toolbox/surgery/ashwalker + name = "surgery bag" + desc = "Небольшой кожанный футляр, хранящий в себе различные хирургические предметы. От него исходит едва заметный запах... пепла?" + ru_names = list( + NOMINATIVE = "хирургический саквояж", + GENITIVE = "хирургического саквояжа", + DATIVE = "хирургическому саквояжу", + ACCUSATIVE = "хирургический саквояж", + INSTRUMENTAL = "хирургическим саквояжем", + PREPOSITIONAL = "хирургическом саквояже" + ) + icon_state = "surgery_bag" + flags = NONE + force = 2 + throwforce = 4 + +/obj/item/storage/toolbox/surgery/ashwalker/populate_contents() + new /obj/item/scalpel/primitive_scalpel(src) + new /obj/item/hemostat/primitive_hemostat(src) + new /obj/item/retractor/primitive_retractor(src) + new /obj/item/primitive_saw(src) + new /obj/item/cautery/primitive_cautery(src) + new /obj/item/bonegel/primitive_bonegel(src) + new /obj/item/FixOVein/primitive_FixOVein(src) + new /obj/item/bonesetter/primitive_bonesetter(src) + +/obj/item/storage/toolbox/surgery/ashwalker/empty/populate_contents() + return diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 3aa6670186e..672c6f9d33a 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -100,6 +100,7 @@ icon_state = "fireaxe0" name = "fire axe" desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?" + gender = MALE force = 5 throwforce = 15 sharp = TRUE @@ -137,10 +138,33 @@ force_wielded = 23 needs_permit = TRUE - /obj/item/twohanded/fireaxe/boneaxe/update_icon_state() icon_state = "bone_axe[HAS_TRAIT(src, TRAIT_WIELDED)]" +/obj/item/twohanded/fireaxe/boneaxe/guillotine + name = "guillotine" + desc = "Массивный, грозно выглядящий пилотопор, созданный с использованием костяного нароста ослеплённого жнеца. Идеален для убийства и последующей разделки чудовищ." + ru_names = list( + NOMINATIVE = "гильотина", + GENITIVE = "гильотины", + DATIVE = "гильотине", + ACCUSATIVE = "гильотину", + INSTRUMENTAL = "гильотиной", + PREPOSITIONAL = "гильотине" + ) + icon_state = "guillotine0" + hitsound = 'sound/weapons/circsawhit.ogg' + force_unwielded = 7 + force_wielded = 25 + throwforce = 20 + armour_penetration = 30 + lefthand_file = 'icons/mob/inhands/lavaland/lava_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/lava_items_righthand.dmi' + has_speed_harvest = TRUE + +/obj/item/twohanded/fireaxe/boneaxe/guillotine/update_icon_state() + icon_state = "guillotine[HAS_TRAIT(src, TRAIT_WIELDED)]" + /obj/item/twohanded/fireaxe/energized desc = "Someone with a love for fire axes decided to turn this one into a high-powered energy weapon. Seems excessive." @@ -411,6 +435,35 @@ throwforce = 26 icon_prefix = "chitin_spear" +/obj/item/twohanded/spear/bonespear/her_biting_embrace + name = "her biting embrace" + desc = "Качественно созданное копьё, украшенное церемониальными узорами и использующее хвост донного угря в качестве наконечника. Настоящее произведение первобытного оружейного искусства." + ru_names = list( + NOMINATIVE = "копьё \"Её Обжигающие Объятия\"", + GENITIVE = "копья \"Её Обжигающие Объятия\"", + DATIVE = "копью \"Её Обжигающие Объятия\"", + ACCUSATIVE = "копьё \"Её Обжигающие Объятия\"", + INSTRUMENTAL = "копьём \"Её Обжигающие Объятия\"", + PREPOSITIONAL = "копьё \"Её Обжигающие Объятия\"" + ) //holy fuck + icon_state = "her_biting_embrace0" + icon_prefix = "her_biting_embrace" + lefthand_file = 'icons/mob/inhands/lavaland/lava_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/lava_items_righthand.dmi' + force = 16 + force_unwielded = 16 + force_wielded = 28 // I have no idea about balance too + throwforce = 45 + +/obj/item/twohanded/spear/bonespear/her_biting_embrace/attack(mob/living/target, mob/living/user, params, def_zone, skip_attack_anim) + . = ..() + if(!ATTACK_CHAIN_SUCCESS_CHECK(.) || !HAS_TRAIT(src, TRAIT_WIELDED)) + return . + var/datum/status_effect/saw_bleed/bloodletting/A = target.has_status_effect(STATUS_EFFECT_BLOODLETTING) + if(!A) + target.apply_status_effect(STATUS_EFFECT_BLOODLETTING) + else + A.add_bleed(6) /obj/item/twohanded/spear/plasma name = "plasma spear" @@ -1039,23 +1092,3 @@ used = FALSE REMOVE_TRAIT(src, TRAIT_NODROP, PYRO_CLAWS_TRAIT) atom_say("Internal plasma canisters recharged. Gloves sufficiently cooled") - -/obj/item/twohanded/fishingrod - name = "ol' reliable" - desc = "Hey! I caught a miner!" - icon_state = "fishing_rod0" - item_state = "" - w_class = WEIGHT_CLASS_SMALL - var/w_class_on = WEIGHT_CLASS_BULKY - -/obj/item/twohanded/fishingrod/wield() - w_class = w_class_on - item_state = "fishing_rod" - -/obj/item/twohanded/fishingrod/unwield() - w_class = initial(w_class) - item_state = "" - -/obj/item/twohanded/fishingrod/update_icon_state() - icon_state = "fishing_rod[HAS_TRAIT(src, TRAIT_WIELDED)]" - diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm index 7352d760077..5c09dc72db2 100644 --- a/code/game/objects/items/weapons/whetstone.dm +++ b/code/game/objects/items/weapons/whetstone.dm @@ -1,6 +1,7 @@ /obj/item/whetstone name = "whetstone" desc = "A block of stone used to sharpen things." + gender = MALE icon = 'icons/obj/kitchen.dmi' icon_state = "whetstone" w_class = WEIGHT_CLASS_SMALL @@ -99,3 +100,21 @@ requires_sharpness = FALSE claws_increment = 200 +/obj/item/whetstone/crab_shell + name = "sturdy crab shell" + desc = "Маленький панцирь пепельного рака, подходящий для заточки оружия или когтей. Достаточно крепкий для того, чтобы им можно пользоваться несколько раз." + ru_names = list( + NOMINATIVE = "панцирь пепельного рака", + GENITIVE = "панциря пепельного рака", + DATIVE = "панцирю пепельного рака", + ACCUSATIVE = "панцирь пепельного рака", + INSTRUMENTAL = "панцирем пепельного рака", + PREPOSITIONAL = "панцире пепельного рака" + ) + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "crab_shell" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "crab_shell" + increment = 2 + uses = 2 diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index fb068006c1c..0021f306b59 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -3,6 +3,7 @@ GLOBAL_LIST_EMPTY(closets) /obj/structure/closet name = "closet" desc = "It's a basic storage unit." + gender = MALE icon = 'icons/obj/closet.dmi' icon_state = "closed" density = TRUE diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index 4dff2175d22..5b6f383e7db 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -222,7 +222,7 @@ icon = 'icons/obj/closet.dmi' icon_state = "fishingrod" anchored = TRUE - var/obj/item/twohanded/fishingrod/olreliable //what the fuck? + var/obj/item/twohanded/fishing_rod/olreliable //what the fuck? /obj/structure/fishingrodcabinet/Initialize(mapload) @@ -241,8 +241,8 @@ if(user.a_intent == INTENT_HARM) return ..() - if(istype(I, /obj/item/twohanded/fishingrod)) - var/obj/item/twohanded/fishingrod/rod = I + if(istype(I, /obj/item/twohanded/fishing_rod)) + var/obj/item/twohanded/fishing_rod/rod = I if(HAS_TRAIT(rod, TRAIT_WIELDED)) to_chat(user, span_warning("Unwield [rod] first.")) return ATTACK_CHAIN_PROCEED diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 4f4d4be6fbe..9c8992df453 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -560,6 +560,19 @@ name = "vault crate" icon_state = "vaultcrate" +/obj/structure/closet/crate/wooden //i'm sure hope this won't be used as cheese strat to obtain cargo points + name = "wooden crate" + desc = "Ящик, сделанный из дерева." + ru_names = list( + NOMINATIVE = "деревянный ящик", + GENITIVE = "деревянного ящика", + DATIVE = "деревянному ящику", + ACCUSATIVE = "деревянный ящик", + INSTRUMENTAL = "деревянным ящиком", + PREPOSITIONAL = "деревянном ящике" + ) + icon_state = "wooden_crate" + /obj/structure/closet/crate/secure/screwdriver_act(mob/living/user, obj/item/I) . = ..() if(locked && broken == 0 && user.a_intent != INTENT_HARM) // Stage one diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 56c6dfdf39b..c894646c699 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -12,6 +12,7 @@ /obj/structure/bed name = "bed" desc = "This is used to lie in, sleep in or strap on." + gender = FEMALE icon = 'icons/obj/objects.dmi' icon_state = "bed" can_buckle = TRUE @@ -53,6 +54,54 @@ icon_state = "catwalkcouch1" comfort = 0 +/obj/structure/bed/wicker + name = "wicker bed" + desc = "Большая кровать, сотканная из чего-то, напоминающего ткань. Выглядит достаточно удобно." + ru_names = list( + NOMINATIVE = "плетёная кровать", + GENITIVE = "плетёной кровати", + DATIVE = "плетёной кровати", + ACCUSATIVE = "плетёную кровать", + INSTRUMENTAL = "плетёной кроватью", + PREPOSITIONAL = "плетёной кровати" + ) + icon_state = "wicker_bed" + comfort = 1.5 + buildstacktype = /obj/item/stack/sheet/cloth + buildstackamount = 5 + +/obj/structure/bed/leather + name = "leather bed" + desc = "Куски кожи, грубо сшитые друг с другом и прикреплённые к деревянной раме. Не самое удобное место для лежания." + ru_names = list( + NOMINATIVE = "кровать из кожи", + GENITIVE = "кровати из кожи", + DATIVE = "кровати из кожи", + ACCUSATIVE = "кровать из кожи", + INSTRUMENTAL = "кроватью из кожи", + PREPOSITIONAL = "кровати из кожи" + ) + icon_state = "leather_bed" + comfort = 1.2 + buildstacktype = /obj/item/stack/sheet/leather + buildstackamount = 2 + +/obj/structure/bed/wooden + name = "wooden bed" + desc = "Кровать, сделанная из качественной древесины. Выглядит очень мило и уютно." + ru_names = list( + NOMINATIVE = "деревянная кровать", + GENITIVE = "деревянной кровати", + DATIVE = "деревянной кровати", + ACCUSATIVE = "деревянную кровать", + INSTRUMENTAL = "деревянной кроватью", + PREPOSITIONAL = "деревянной кровати" + ) + icon_state = "wooden_bed" + comfort = 2.5 + buildstacktype = /obj/item/stack/sheet/wood + buildstackamount = 5 + /obj/structure/bed/proc/handle_rotation() return diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 52c4c242a19..2fa59026391 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -852,10 +852,12 @@ anchored = TRUE pass_flags_self = LETPASSTHROW //You can throw objects over this, despite it's density. max_integrity = 20 + var/wooden_version = FALSE /obj/structure/rack/examine(mob/user) . = ..() - . += "It's held together by a couple of bolts." + if(!wooden_version) + . += "It's held together by a couple of bolts." /obj/structure/rack/CanAllowThrough(atom/movable/mover, border_dir) @@ -902,6 +904,8 @@ deconstruct(TRUE) /obj/structure/rack/attack_hand(mob/living/user) + if(wooden_version) + return ..() if(user.incapacitated()) return add_fingerprint(user) diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm index d8ac7ee637d..f9199060cb8 100644 --- a/code/game/turfs/simulated/floor/asteroid.dm +++ b/code/game/turfs/simulated/floor/asteroid.dm @@ -2,8 +2,8 @@ /**********************Asteroid**************************/ /turf/simulated/floor/plating/asteroid - gender = PLURAL name = "asteroid sand" + gender = PLURAL baseturf = /turf/simulated/floor/plating/asteroid icon_state = "asteroid" icon_plating = "asteroid" @@ -16,6 +16,8 @@ var/floor_variance = 20 //probability floor has a different icon state var/obj/item/stack/digResult = /obj/item/stack/ore/glass/basalt var/dug + ///Chance to dig up a worm + var/worm_chance = 30 /turf/simulated/floor/plating/asteroid/Initialize(mapload) var/proper_name = name @@ -169,9 +171,22 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) /turf/simulated/floor/plating/asteroid/basalt/getDug() set_light_on(FALSE) + if(prob(worm_chance)) + spawn_random_worm() GLOB.dug_up_basalt |= src return ..() +/turf/simulated/floor/plating/asteroid/basalt/proc/spawn_random_worm() + switch(rand(0, 100)) + if(0 to 41) + new /obj/item/reagent_containers/food/snacks/bait/ash_eater(src) + if(42 to 74) + new /obj/item/reagent_containers/food/snacks/bait/bloody_leach(src) + if(75 to 98) + new /obj/item/reagent_containers/food/snacks/bait/goldgrub_larva(src) + if(99 to 100) + new /obj/item/reagent_containers/food/snacks/charred_krill(src) + /proc/set_basalt_light(turf/simulated/floor/B) switch(B.icon_state) if("basalt1", "basalt2", "basalt3") diff --git a/code/game/turfs/simulated/floor/chasm.dm b/code/game/turfs/simulated/floor/chasm.dm index 1ed13dfab30..825bfa7e107 100644 --- a/code/game/turfs/simulated/floor/chasm.dm +++ b/code/game/turfs/simulated/floor/chasm.dm @@ -91,8 +91,8 @@ new /obj/structure/lattice/catwalk/fireproof(src) return .|ATTACK_CHAIN_SUCCESS - if(istype(I, /obj/item/twohanded/fishingrod)) - var/obj/item/twohanded/fishingrod/rod = I + if(istype(I, /obj/item/twohanded/fishing_rod)) + var/obj/item/twohanded/fishing_rod/rod = I if(!HAS_TRAIT(rod, TRAIT_WIELDED)) to_chat(user, span_warning("Для того чтобы начать ловлю следует взять удочку в обе руки!")) return . @@ -121,7 +121,7 @@ return .|ATTACK_CHAIN_SUCCESS -/turf/simulated/floor/chasm/proc/rod_checks(obj/item/twohanded/fishingrod/rod) +/turf/simulated/floor/chasm/proc/rod_checks(obj/item/twohanded/fishing_rod/rod) return HAS_TRAIT(rod, TRAIT_WIELDED) diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm index 5e09252ceab..36c464581ad 100644 --- a/code/game/turfs/simulated/floor/lava.dm +++ b/code/game/turfs/simulated/floor/lava.dm @@ -27,6 +27,8 @@ var/immunity_trait = TRAIT_LAVA_IMMUNE /// Objects with these flags won't burn. var/immunity_resistance_flags = LAVA_PROOF + /// Is the lava close to the shore + var/deep_water = TRUE /turf/simulated/floor/lava/ex_act() return @@ -46,8 +48,14 @@ START_PROCESSING(SSprocessing, src) /turf/simulated/floor/lava/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - if(burn_stuff(AM)) - START_PROCESSING(SSprocessing, src) + if(istype(AM, /obj/item/reagent_containers/food/snacks/charred_krill)) + krill_act(AM) + else + if(burn_stuff(AM)) + START_PROCESSING(SSprocessing, src) + +/turf/simulated/floor/lava/proc/krill_act(atom/movable/AM) + return /turf/simulated/floor/lava/process() if(!burn_stuff()) @@ -224,6 +232,61 @@ nitrogen = 23 planetary_atmos = TRUE baseturf = /turf/simulated/floor/chasm/straight_down/lava_land_surface + /// Check for plasma river, subtype of lava, prevents simple fishing + var/can_be_fished_on = TRUE + +/turf/simulated/floor/lava/lava_land_surface/Initialize(mapload) + . = ..() + if(can_be_fished_on) + calculate_deep() + +/turf/simulated/floor/lava/lava_land_surface/proc/calculate_deep() + if(locate(/turf/simulated/floor/plating/asteroid/basalt) in range(3, src)) + deep_water = FALSE + +/turf/simulated/floor/lava/lava_land_surface/proc/get_fish() + if(deep_water) + return GLOB.deep_fish + else + return GLOB.shore_fish + +/turf/simulated/floor/lava/lava_land_surface/krill_act(atom/movable/AM) + var/obj/item/reagent_containers/food/snacks/charred_krill/krill = AM //yourself + krill.in_lava = TRUE + krill.anchored = TRUE //no closet kidnaping + visible_message(span_warning("[capitalize(krill.declent_ru(NOMINATIVE))] медленно тон[pluralize_ru(krill.gender, "ет", "ут")] в лаве!")) + sleep(5 SECONDS) + qdel(krill) + if(!can_be_fished_on) + visible_message(span_warning("И ничего не происходит...")) + return + visible_message(span_warning("Неожиданно, из лавы выныривают две рыбы и разрывают [krill.declent_ru(ACCUSATIVE)] на части!")) + var/list/fishable_list = get_fish() + for(var/i in 1 to 2) + var/fish = pick(fishable_list) + new fish(src) + +/turf/simulated/floor/lava/lava_land_surface/attackby(obj/item/I, mob/user, params) + . = ..() + + if(ATTACK_CHAIN_CANCEL_CHECK(.)) + return . + + if(istype(I, /obj/item/reagent_containers/food/snacks/charred_krill)) + to_chat(user, span_notice("Вы осторожно кладёте креветку на поверхность лавы...")) + if(do_after(user, 5 SECONDS, target = src)) + if(QDELETED(I)) + return . + if(!can_be_fished_on) + to_chat(user, span_warning("И ничего не происходит...")) + return . + to_chat(user, span_notice("Неожиданно, из лавы выныривают две рыбы и разрывают креветку на части!")) + var/list/fishable_list = get_fish() + for(var/i in 1 to 2) + var/fish = pick(fishable_list) + new fish(src) + qdel(I) + return .|ATTACK_CHAIN_SUCCESS /turf/simulated/floor/lava/airless temperature = TCMB @@ -236,7 +299,7 @@ base_icon_state = "liquidplasma" icon_state = "unsmooth" smooth = SMOOTH_BITMASK - + can_be_fished_on = FALSE // ~ Sin City's cold and empty, No one`s around to judge me ~ light_range = 3 light_power = 0.75 light_color = LIGHT_COLOR_PINK @@ -322,3 +385,5 @@ . = ..() if(SSmapping.lavaland_theme?.primary_turf_type) ChangeTurf(SSmapping.lavaland_theme.primary_turf_type, after_flags = CHANGETURF_IGNORE_AIR) + +/turf/simulated/floor/lava/lava_land_surface/lava_only //used to override reader.dm for lava only instead of adaptive type diff --git a/code/modules/antagonists/devil/devil_ritual.dm b/code/modules/antagonists/devil/devil_ritual.dm index 48171b71c07..d5e2ccf5e95 100644 --- a/code/modules/antagonists/devil/devil_ritual.dm +++ b/code/modules/antagonists/devil/devil_ritual.dm @@ -13,13 +13,13 @@ /obj/effect/decal/cleanable/vomit = 2 ) -/datum/ritual/devil/imp/del_things() +/datum/ritual/devil/imp/del_things(list/used_things) for(var/obj/obj in used_things) // no type ignore for future. qdel(obj) return -/datum/ritual/devil/imp/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/devil/imp/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/list/candidates = SSghost_spawns.poll_candidates("Вы хотите сыграть за беса?", SPECIAL_ROLE_DEVIL_PAWN, TRUE) if(!LAZYLEN(candidates)) @@ -51,7 +51,7 @@ /mob/living/carbon/human = 1 ) -/datum/ritual/devil/sacrifice/check_contents(mob/living/carbon/human/invoker) +/datum/ritual/devil/sacrifice/check_contents(mob/living/carbon/human/invoker, list/used_things) . = ..() if(!.) @@ -76,7 +76,7 @@ return TRUE -/datum/ritual/devil/sacrifice/do_ritual(mob/living/carbon/human/invoker) +/datum/ritual/devil/sacrifice/do_ritual(mob/living/carbon/human/invoker, list/invokers, list/used_things) var/mob/living/carbon/human/human = locate() in used_things var/datum/antagonist/devil/devil = invoker.mind?.has_antag_datum(/datum/antagonist/devil) diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 42d49cd5a79..6ae939f9b48 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -1896,7 +1896,8 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts continue if(M.marking_location != "body") continue - + if(!M.pickable) + continue valid_markings += markingstyle sortTim(valid_markings, cmp = /proc/cmp_text_asc) var/new_marking_style = tgui_input_list(user, "Choose the style of your character's body markings:", "Character Preference", valid_markings) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 25deaa488df..7d34343f099 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -596,6 +596,34 @@ icon_state = "shamskull" species_restricted = list(SPECIES_UNATHI, SPECIES_ASHWALKER_BASIC, SPECIES_ASHWALKER_SHAMAN, SPECIES_DRACONOID) +/obj/item/clothing/head/scorched_skull + name = "scorched skull" + desc = "Голова мёртвого всадника, очищенная от чешуи, крови и внутренних органов во время разделки. Вселяет страх в ваших врагов." + ru_names = list( + NOMINATIVE = "обожжённый череп", + GENITIVE = "обожжённого черепа", + DATIVE = "обожжённому черепу", + ACCUSATIVE = "обожжённый череп", + INSTRUMENTAL = "обожжённым черепом", + PREPOSITIONAL = "обожжённом черепе" + ) + icon_state = "scorched_skull" + item_state = "scorched_skull" + armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) + w_class = WEIGHT_CLASS_TINY + flags_cover = HEADCOVERSEYES + flags_inv = HIDENAME|HIDEHAIR + sprite_sheets = list( + SPECIES_VOX = 'icons/mob/clothing/species/vox/helmet.dmi', + SPECIES_DRASK = 'icons/mob/clothing/species/drask/head.dmi', + SPECIES_GREY = 'icons/mob/clothing/species/grey/head.dmi', + SPECIES_MONKEY = 'icons/mob/clothing/species/monkey/head.dmi', + SPECIES_FARWA = 'icons/mob/clothing/species/monkey/head.dmi', + SPECIES_WOLPIN = 'icons/mob/clothing/species/monkey/head.dmi', + SPECIES_NEARA = 'icons/mob/clothing/species/monkey/head.dmi', + SPECIES_STOK = 'icons/mob/clothing/species/monkey/head.dmi' + ) + /obj/item/clothing/head/roach name = "roach" desc = "Символ шамана племени, визуально отличающий его от соплеменников. Ценится как трофей среди шахтёров." diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index fa34eb84fe0..19f078df79b 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -325,7 +325,7 @@ /obj/item/clothing/suit/armor/laserproof/Initialize(mapload) . = ..() AddElement(/datum/element/high_value_item) - + /obj/item/clothing/suit/armor/laserproof/IsReflect() if(prob(hit_reflect_chance)) return 1 @@ -722,3 +722,95 @@ SPECIES_GREY = 'icons/mob/clothing/species/grey/suit.dmi', ) +/obj/item/clothing/suit/armor/cartilage //parent type, used in order not to copy-paste same lines in 3 same armors + name = "cartilage armor" + desc = "Полностью завершённая броня, сделанная из хрящевых пластин лавовой рыбы. Крепче своих костяных аналогов." + ru_names = list( + NOMINATIVE = "броня из хрящевых пластин", + GENITIVE = "брони из хрящевых пластин", + DATIVE = "броне из хрящевых пластин", + ACCUSATIVE = "броню из хрящевых пластин", + INSTRUMENTAL = "броней из хрящевых пластин", + PREPOSITIONAL = "броне из хрящевых пластин" + ) + gender = FEMALE + icon_state = "cartilage_set" + item_state = "cartilage_set" + blood_overlay_type = "armor" + 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 = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 0, RAD = 0, FIRE = 60, ACID = 60) + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + sprite_sheets = list( + SPECIES_UNATHI = 'icons/mob/clothing/species/unathi/suit.dmi', + SPECIES_ASHWALKER_BASIC = 'icons/mob/clothing/species/unathi/suit.dmi', + SPECIES_ASHWALKER_SHAMAN = 'icons/mob/clothing/species/unathi/suit.dmi', + SPECIES_DRACONOID = 'icons/mob/clothing/species/unathi/suit.dmi', + SPECIES_VOX = 'icons/mob/clothing/species/vox/suit.dmi', + SPECIES_GREY = 'icons/mob/clothing/species/grey/suit.dmi', + SPECIES_MONKEY = 'icons/mob/clothing/species/monkey/suit.dmi', + SPECIES_FARWA = 'icons/mob/clothing/species/monkey/suit.dmi', + SPECIES_WOLPIN = 'icons/mob/clothing/species/monkey/suit.dmi', + SPECIES_NEARA = 'icons/mob/clothing/species/monkey/suit.dmi', + SPECIES_STOK = 'icons/mob/clothing/species/monkey/suit.dmi' + ) + + +/obj/item/clothing/suit/armor/cartilage/cartilage_pads + name = "cartilage shoulder pads" + desc = "Достаточно крепкие наплечники, сделанные из хрящевых пластин. Защищают тело, но не предоставляют защиты для ног. Могут быть улучшены до полноценной брони в случае, если будут соединены с поножами, сделанными из того же материала." + ru_names = list( + NOMINATIVE = "наплечники из хрящевых пластин", + GENITIVE = "наплечников из хрящевых пластин", + DATIVE = "наплечникам из хрящевых пластин", + ACCUSATIVE = "наплечники из хрящевых пластин", + INSTRUMENTAL = "наплечниками из хрящевых пластин", + PREPOSITIONAL = "наплечниках из хрящевых пластин" + ) + gender = PLURAL + icon_state = "cartilage_shoulder_pads" + item_state = "cartilage_shoulder_pads" + body_parts_covered = UPPER_TORSO|ARMS + +/obj/item/clothing/suit/armor/cartilage/cartilage_pads/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/clothing/suit/armor/cartilage/cartilage_greaves)) + add_fingerprint(user) + to_chat(user, span_notice("Вы начинаете подвязывать части брони.")) + if(do_after(user, 4 SECONDS, src, max_interact_count = 1)) + to_chat(user, span_notice("Вы улучшили броню!")) + var/turf/user_turf = get_turf(user) + var/obj/item/clothing/suit/armor/cartilage/armor = new(user_turf) + user.put_in_inactive_hand(armor) + qdel(I) + qdel(src) + return ATTACK_CHAIN_BLOCKED_ALL + return ..() + +/obj/item/clothing/suit/armor/cartilage/cartilage_greaves + name = "cartilage greaves" + desc = "Достаточно крепкие поножи, сделанные из хрящевых пластин. Защищают ноги, но не предоставляют защиты для торса. Могут быть улучшены до полноценной брони в случае, если будут соединены с наплечниками, сделанными из того же материала." + ru_names = list( + NOMINATIVE = "поножи из хрящевых пластин", + GENITIVE = "поножей из хрящевых пластин", + DATIVE = "поножам из хрящевых пластин", + ACCUSATIVE = "поножи из хрящевых пластин", + INSTRUMENTAL = "поножами из хрящевых пластин", + PREPOSITIONAL = "поножах из хрящевых пластин" + ) //i actually have to google it + gender = PLURAL + icon_state = "cartilage_greaves" + item_state = "cartilage_greaves" + body_parts_covered = LOWER_TORSO|LEGS + +/obj/item/clothing/suit/armor/cartilage/cartilage_greaves/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/clothing/suit/armor/cartilage/cartilage_pads)) + add_fingerprint(user) + to_chat(user, span_notice("Вы начинаете подвязывать части брони.")) + if(do_after(user, 4 SECONDS, src, max_interact_count = 1)) + to_chat(user, span_notice("Вы улучшили броню!")) + var/turf/user_turf = get_turf(user) + var/obj/item/clothing/suit/armor/cartilage/armor = new(user_turf) + user.put_in_inactive_hand(armor) + qdel(I) + qdel(src) + return ATTACK_CHAIN_BLOCKED_ALL + return ..() diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 9050d863827..1058f47918b 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -16,7 +16,10 @@ CAT_AMMO), CAT_NONE, //Robot subcategories CAT_NONE, //Misc subcategories - CAT_NONE, //Tribal subcategories + list( //Tribal subcategories + CAT_ARMOR, + CAT_WEAPONS, + CAT_MISC2), list( //Food subcategories CAT_CAKE, CAT_SUSHI, diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 2aaed715ec5..56d2c24aa12 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -602,6 +602,7 @@ time = 30 reqs = list(/obj/item/stack/sheet/bone = 6) category = CAT_PRIMAL + subcategory = CAT_ARMOR /datum/crafting_recipe/bonetalisman name = "Bone Talisman" @@ -610,6 +611,7 @@ reqs = list(/obj/item/stack/sheet/bone = 2, /obj/item/stack/sheet/sinew = 1) category = CAT_PRIMAL + subcategory = CAT_ARMOR /datum/crafting_recipe/bonecodpiece name = "Skull Codpiece" @@ -618,6 +620,7 @@ reqs = list(/obj/item/stack/sheet/bone = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1) category = CAT_PRIMAL + subcategory = CAT_ARMOR /datum/crafting_recipe/bracers name = "Bone Bracers" @@ -626,6 +629,7 @@ reqs = list(/obj/item/stack/sheet/bone = 2, /obj/item/stack/sheet/sinew = 1) category = CAT_PRIMAL + subcategory = CAT_ARMOR /datum/crafting_recipe/skullhelm name = "Skull Helmet" @@ -633,6 +637,7 @@ time = 30 reqs = list(/obj/item/stack/sheet/bone = 4) category = CAT_PRIMAL + subcategory = CAT_ARMOR /datum/crafting_recipe/beltprimitive name = "Hunter's Belt" @@ -641,6 +646,7 @@ reqs = list(/obj/item/stack/sheet/sinew = 4, /obj/item/stack/sheet/animalhide/goliath_hide = 2) category = CAT_PRIMAL + subcategory = CAT_ARMOR /datum/crafting_recipe/goliathcloak name = "Goliath Cloak" @@ -650,6 +656,7 @@ /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 2) category = CAT_PRIMAL + subcategory = CAT_ARMOR /datum/crafting_recipe/drakecloak name = "Ash Drake Armour" @@ -659,6 +666,63 @@ /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/animalhide/ashdrake = 5) category = CAT_PRIMAL + subcategory = CAT_ARMOR + +/datum/crafting_recipe/cartilage_greaves + name = "Cartilage Greaves" + result = /obj/item/clothing/suit/armor/cartilage/cartilage_greaves + time = 4 SECONDS + reqs = list(/obj/item/stack/sheet/cartilage_plate = 2, + /obj/item/stack/sheet/cloth = 3, + /obj/item/stack/sheet/sinew = 2) + category = CAT_PRIMAL + subcategory = CAT_ARMOR + +/datum/crafting_recipe/cartilage_pads + name = "Cartilage Shoulder Pads" + result = /obj/item/clothing/suit/armor/cartilage/cartilage_pads + time = 4 SECONDS + reqs = list(/obj/item/stack/sheet/cartilage_plate = 2, + /obj/item/stack/sheet/cloth = 3, + /obj/item/stack/sheet/sinew = 1) + category = CAT_PRIMAL + subcategory = CAT_ARMOR + +/datum/crafting_recipe/footwrapsgoliath + name = "Goliath Hide Footwraps" + result = /obj/item/clothing/shoes/footwraps/goliath + reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1, + /obj/item/stack/sheet/leather = 1) + time = 6 SECONDS + category = CAT_PRIMAL + subcategory = CAT_ARMOR + +/datum/crafting_recipe/footwrapsdragon + name = "Ash Drake Hide Footwraps" + result = /obj/item/clothing/shoes/footwraps/dragon + reqs = list(/obj/item/stack/sheet/animalhide/ashdrake = 1, + /obj/item/stack/sheet/leather = 1) + time = 6 SECONDS + category = CAT_PRIMAL + subcategory = CAT_ARMOR + +/datum/crafting_recipe/goliathgloves + name = "Goliath Gloves" + result = /obj/item/clothing/gloves/color/black/goliath + time = 2 SECONDS + reqs = list(/obj/item/stack/sheet/leather = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 1) + category = CAT_PRIMAL + subcategory = CAT_ARMOR + +/datum/crafting_recipe/chitingloves + name = "Weaver Chitin Gloves" + result = /obj/item/clothing/gloves/fingerless/weaver + time = 2 SECONDS + reqs = list(/obj/item/stack/sheet/leather = 1, + /obj/item/stack/sheet/animalhide/weaver_chitin = 3) + category = CAT_PRIMAL + subcategory = CAT_ARMOR /datum/crafting_recipe/firebrand name = "Firebrand" @@ -666,6 +730,7 @@ time = 100 //Long construction time. Making fire is hard work. reqs = list(/obj/item/stack/sheet/wood = 2) category = CAT_PRIMAL + subcategory = CAT_MISC2 /datum/crafting_recipe/tribal_splint name = "Tribal Splint" @@ -674,21 +739,63 @@ /obj/item/stack/sheet/sinew = 1) result = /obj/item/stack/medical/splint/tribal category = CAT_PRIMAL + subcategory = CAT_MISC2 + +/datum/crafting_recipe/tribal_rod + name = "Tribal Fishing Rod" + time = 4 SECONDS + reqs = list(/obj/item/stack/sheet/bone = 2, + /obj/item/stack/sheet/sinew = 1) + result = /obj/item/twohanded/fishing_rod/tribal + category = CAT_PRIMAL + subcategory = CAT_MISC2 + +/datum/crafting_recipe/grace_of_lazis + name = "Grace Of Lazis" + time = 6 SECONDS + reqs = list(/obj/item/twohanded/spear/bonespear = 1, + /obj/item/reagent_containers/food/snacks/monstermeat/goliath = 18) + blacklist = list(/obj/item/twohanded/spear/bonespear/chitinspear, /obj/item/twohanded/spear/bonespear/her_biting_embrace) + result = /obj/structure/grace_of_lazis + category = CAT_PRIMAL + subcategory = CAT_MISC2 + +/datum/crafting_recipe/wooden_totem + name = "Wooden Totem" + time = 15 SECONDS + reqs = list(/obj/item/stack/sheet/wood = 30, + /obj/item/stack/sheet/animalhide/goliath_hide = 1) + result = /obj/structure/ash_totem/wooden + category = CAT_PRIMAL + subcategory = CAT_MISC2 + +/datum/crafting_recipe/stone_totem + name = "Stone Totem" + time = 15 SECONDS + reqs = list(/obj/item/stack/sheet/mineral/sandstone = 30, + /obj/item/stack/sheet/sinew = 2) + result = /obj/structure/ash_totem/stone + category = CAT_PRIMAL + subcategory = CAT_MISC2 + +/datum/crafting_recipe/bone_totem + name = "Bone Totem" + time = 15 SECONDS + reqs = list(/obj/item/stack/sheet/wood = 15, + /obj/item/stack/sheet/mineral/sandstone = 15, + /obj/item/stack/sheet/bone = 3) + result = /obj/structure/ash_totem/bone + category = CAT_PRIMAL + subcategory = CAT_MISC2 /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) + result = list(/obj/item/storage/toolbox/surgery/ashwalker) category = CAT_PRIMAL + subcategory = CAT_MISC2 /datum/crafting_recipe/bonedagger name = "Bone Dagger" @@ -696,6 +803,7 @@ time = 20 reqs = list(/obj/item/stack/sheet/bone = 2) category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/bonesword name = "Bone Sword" @@ -704,6 +812,7 @@ reqs = list(/obj/item/stack/sheet/bone = 3, /obj/item/stack/sheet/sinew = 2) category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/goliathshield name = "Goliath Shield" @@ -712,6 +821,7 @@ reqs = list(/obj/item/stack/sheet/bone = 4, /obj/item/stack/sheet/animalhide/goliath_hide = 2) category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/bonespear name = "Bone Spear" @@ -720,6 +830,7 @@ reqs = list(/obj/item/stack/sheet/bone = 4, /obj/item/stack/sheet/sinew = 1) category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/chitinspear name = "Chitin Spear" @@ -730,6 +841,19 @@ /obj/item/stack/sheet/animalhide/weaver_chitin = 8) blacklist = list(/obj/item/twohanded/spear/bonespear/chitinspear) category = CAT_PRIMAL + subcategory = CAT_WEAPONS + +/datum/crafting_recipe/upgraded_spear + name = "Her Biting Embrace" + result = /obj/item/twohanded/spear/bonespear/her_biting_embrace + time = 7.5 SECONDS + reqs = list(/obj/item/twohanded/spear/bonespear/chitinspear = 1, //tier 3 spear + /obj/item/stack/sheet/sinew = 1, + /obj/item/kitchen/knife/combat/survival/bone/eel = 1, + /obj/item/gem/ruby = 1) + blacklist = list(/obj/item/twohanded/spear/bonespear/her_biting_embrace) + category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/bow name = "Wooden Bow" @@ -739,6 +863,7 @@ /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1) category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/bone_bow name = "Bone Bow" @@ -750,6 +875,7 @@ /obj/item/stack/sheet/sinew = 2) blacklist = list(/obj/item/gun/projectile/bow/ashen) category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/arrow name = "Arrows" @@ -760,6 +886,7 @@ reqs = list(/obj/item/stack/sheet/bone = 1, /obj/item/stack/sheet/wood = 1) category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/ashen_arrow //the price is fully justified name = "Bone-tipped Arrows" @@ -773,6 +900,20 @@ /obj/item/stack/sheet/animalhide/weaver_chitin = 2) blacklist = list(/obj/item/ammo_casing/caseless/arrow/bone_tipped) category = CAT_PRIMAL + subcategory = CAT_WEAPONS + +/datum/crafting_recipe/jagged_arrow + name = "Jagged-tipped Arrows" + result = list(/obj/item/ammo_casing/caseless/arrow/jagged, + /obj/item/ammo_casing/caseless/arrow/jagged, + /obj/item/ammo_casing/caseless/arrow/jagged) + time = 4 SECONDS + reqs = list(/obj/item/ammo_casing/caseless/arrow = 3, + /obj/item/stack/sheet/razor_sharp_teeth = 1, + /obj/item/stack/sheet/animalhide/weaver_chitin = 1) + blacklist = list(/obj/item/ammo_casing/caseless/arrow/jagged) + category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/quiver name = "Quiver" @@ -781,6 +922,7 @@ reqs = list(/obj/item/stack/sheet/wood = 2, /obj/item/stack/sheet/sinew = 1) category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/chitinquiver name = "Chitin Quiver" @@ -788,6 +930,7 @@ time = 8 SECONDS reqs = list(/obj/item/stack/sheet/animalhide/weaver_chitin = 4) //Just one spider! category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/bola_s name = "Skull Bola" @@ -796,6 +939,7 @@ /obj/item/stack/sheet/bone = 3) time = 20 category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/boneaxe name = "Bone Axe" @@ -804,6 +948,18 @@ reqs = list(/obj/item/stack/sheet/bone = 6, /obj/item/stack/sheet/sinew = 3) category = CAT_PRIMAL + subcategory = CAT_WEAPONS + +/datum/crafting_recipe/upgraded_boneaxe + name = "Guillotine (Bone Axe)" + result = /obj/item/twohanded/fireaxe/boneaxe/guillotine + time = 5 SECONDS + reqs = list(/obj/item/twohanded/fireaxe/boneaxe = 1, + /obj/item/circular_saw_blade = 1, + /obj/item/stack/sheet/sinew = 2) + blacklist = list(/obj/item/twohanded/fireaxe/boneaxe/guillotine) + category = CAT_PRIMAL + subcategory = CAT_WEAPONS /datum/crafting_recipe/bonfire name = "Bonfire" @@ -811,6 +967,7 @@ reqs = list(/obj/item/grown/log = 5) result = /obj/structure/bonfire category = CAT_PRIMAL + subcategory = CAT_MISC2 alert_admins_on_craft = TRUE /datum/crafting_recipe/bonfire/coaltree @@ -823,6 +980,7 @@ reqs = list(/obj/item/stack/sheet/wood = 5) result = /obj/item/cultivator/rake category = CAT_PRIMAL + subcategory = CAT_MISC2 /datum/crafting_recipe/woodbucket name = "Wooden Bucket" @@ -830,6 +988,7 @@ reqs = list(/obj/item/stack/sheet/wood = 3) result = /obj/item/reagent_containers/glass/bucket/wooden category = CAT_PRIMAL + subcategory = CAT_MISC2 /datum/crafting_recipe/guillotine name = "Guillotine" @@ -1508,6 +1667,7 @@ /obj/item/stack/sheet/bone = 5, /obj/item/stack/sheet/sinew = 5) category = CAT_PRIMAL + subcategory = CAT_ARMOR /datum/crafting_recipe/pathtreads name = "Pathfinder Treads" @@ -1516,6 +1676,7 @@ reqs = list(/obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/animalhide/weaver_chitin = 2) category = CAT_PRIMAL + subcategory = CAT_ARMOR /datum/crafting_recipe/makeshift_speedloader name = "Makeshift Speedloader" @@ -1554,6 +1715,7 @@ ) result = list(/obj/item/pickaxe) category = CAT_PRIMAL + subcategory = CAT_MISC2 /datum/crafting_recipe/pickaxe/silver name = "Silver pickaxe" @@ -1594,7 +1756,6 @@ always_availible = FALSE time = 5 SECONDS - /datum/crafting_recipe/drone_circ name = "Combat drone Basic Control Module" result = list(/obj/item/drone_modules/drone_BCM) @@ -1646,6 +1807,7 @@ reqs = list(/obj/item/stack/sheet/wood = 2, /obj/item/stack/sheet/sinew = 1) category = CAT_PRIMAL + subcategory = CAT_MISC2 /datum/crafting_recipe/nutcracker name = "Nutcracker" //Колотушка @@ -1654,3 +1816,4 @@ reqs = list(/obj/item/stack/sheet/bone = 2, /obj/item/stack/sheet/animalhide/weaver_chitin = 2) category = CAT_PRIMAL + subcategory = CAT_WEAPONS diff --git a/code/modules/crafting/tailoring.dm b/code/modules/crafting/tailoring.dm index 59e0a69e5c7..096ace7dbe9 100644 --- a/code/modules/crafting/tailoring.dm +++ b/code/modules/crafting/tailoring.dm @@ -344,38 +344,6 @@ tools = list(TOOL_WIRECUTTER) category = CAT_CLOTHING -/datum/crafting_recipe/footwrapsgoliath - name = "Goliath Hide Footwraps" - result = /obj/item/clothing/shoes/footwraps/goliath - reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1, - /obj/item/stack/sheet/leather = 1) - time = 6 SECONDS - category = CAT_CLOTHING - -/datum/crafting_recipe/footwrapsdragon - name = "Ash Drake Hide Footwraps" - result = /obj/item/clothing/shoes/footwraps/dragon - reqs = list(/obj/item/stack/sheet/animalhide/ashdrake = 1, - /obj/item/stack/sheet/leather = 1) - time = 6 SECONDS - category = CAT_CLOTHING - -/datum/crafting_recipe/goliathgloves - name = "Goliath Gloves" - result = /obj/item/clothing/gloves/color/black/goliath - time = 2 SECONDS - reqs = list(/obj/item/stack/sheet/leather = 2, - /obj/item/stack/sheet/animalhide/goliath_hide = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/chitingloves - name = "Weaver Chitin Gloves" - result = /obj/item/clothing/gloves/fingerless/weaver - time = 2 SECONDS - reqs = list(/obj/item/stack/sheet/leather = 1, - /obj/item/stack/sheet/animalhide/weaver_chitin = 3) - category = CAT_CLOTHING - /datum/crafting_recipe/voice_modulator name = "Voice Modulator Mask" result = list(/obj/item/clothing/mask/gas/voice_modulator) diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 3e19d478f68..6a167b4a34d 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -15,6 +15,8 @@ var/filling_color = "#FFFFFF" //Used by sandwiches. var/junkiness = 0 //for junk food. used to lower human satiety. var/bitesize = 2 + var/has_special_eating_effects = FALSE + var/eat_time = 0 SECONDS var/consume_sound = 'sound/items/eatfood.ogg' var/apply_type = REAGENT_INGEST var/apply_method = "проглоти" @@ -108,6 +110,8 @@ var/with_a_species = replacetext(with_plural_species, "$ASPECIES", "[species.a] [species.name]") return replacetext(with_a_species, "$IS", plural) +/obj/item/reagent_containers/food/proc/on_mob_eating_effect(mob/user) + return /obj/item/reagent_containers/food/proc/matched_food_type(var/matching_flags) if(matching_flags & MEAT) diff --git a/code/modules/food_and_drinks/food/foods/lavaland_food.dm b/code/modules/food_and_drinks/food/foods/lavaland_food.dm new file mode 100644 index 00000000000..e7f811b995b --- /dev/null +++ b/code/modules/food_and_drinks/food/foods/lavaland_food.dm @@ -0,0 +1,667 @@ +/obj/item/reagent_containers/food/snacks/lavaland + gender = MALE + icon = 'icons/obj/lavaland/lava_fishing.dmi' + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "food" + var/overlay_sprite + list_reagents = list("nutriment" = 2, "vitamin" = 4, "protein" = 2) + +/obj/item/reagent_containers/food/snacks/lavaland/soft_meat + name = "soft meat cut" + desc = "Нежное филе лавовой рыбы. Сырое в текущем виде, однако с помощью правильных ингридиентов её можно будет превратить в прекрасное блюдо." + ru_names = list( + NOMINATIVE = "нежная мясная вырезка", + GENITIVE = "нежной мясной вырезки", + DATIVE = "нежной мясной вырезке", + ACCUSATIVE = "нежную мясную вырезку", + INSTRUMENTAL = "нежной мясной вырезкой", + PREPOSITIONAL = "нежной мясной вырезке", + ) + gender = FEMALE + icon_state = "soft_meat_cut" + item_state = "soft_meat_cut" + list_reagents = list("nutriment" = 1, "vitamin" = 3, "protein" = 3) + bitesize = 2 + filling_color = "#D49284" + tastes = list("сырого мяса" = 1) + foodtype = MEAT | RAW + +/obj/item/reagent_containers/food/snacks/lavaland/eel_filet + name = "eel filet" + desc = "Сырое филе донного угря. Хоть оно съедобно и в сыром виде, однако с помощью правильных ингридиентов её можно будет превратить в прекрасное блюдо." + ru_names = list( + NOMINATIVE = "филе угря", + GENITIVE = "филе угря", + DATIVE = "филе угря", + ACCUSATIVE = "филе угря", + INSTRUMENTAL = "филе угря", + PREPOSITIONAL = "филе угря", + ) + gender = NEUTER + icon_state = "eel_filet" + item_state = "eel_filet" + list_reagents = list("nutriment" = 2, "menthol" = 3, "protein" = 4) + bitesize = 2 + filling_color = "#414F71" + tastes = list("сырого мяса" = 1) + foodtype = MEAT | RAW + +/obj/item/reagent_containers/food/snacks/lavaland/predator_meat + name = "predatory fish slice" + desc = "Достаточно большой кусок мяса, добытый из хищной рыбы. Не рекомендуется к употреблению в сыром виде." + ru_names = list( + NOMINATIVE = "кусок мяса хищной рыбы", + GENITIVE = "куска мяса хищной рыбы", + DATIVE = "куску мяса хищной рыбы", + ACCUSATIVE = "кусок мяса хищной рыбы", + INSTRUMENTAL = "куском мяса хищной рыбы", + PREPOSITIONAL = "куске мяса хищной рыбы", + ) + icon_state = "predatory_fish_slice" + item_state = "predatory_fish_slice" + list_reagents = list("nutriment" = 2, "toxin" = 2, "protein" = 4) + bitesize = 3 + filling_color = "#BE7C64" + tastes = list("очень горького мяса" = 1) + foodtype = MEAT | TOXIC | RAW + +/obj/item/reagent_containers/food/snacks/lavaland/soft_meat_cubes + name = "soft meat cubes" + desc = "Филе рыбы, порезанное на маленькие кубики и обжаренное в печи. Выглядит аппетитно." + ru_names = list( + NOMINATIVE = "нежные мясные кубики", + GENITIVE = "нежных мясных кубиков", + DATIVE = "нежным мясным кубикам", + ACCUSATIVE = "нежные мясные кубики", + INSTRUMENTAL = "нежными мясными кубиками", + PREPOSITIONAL = "нежных мясных кубиках", + ) + gender = PLURAL + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "soft_meat_cubes" + list_reagents = list("nutriment" = 2, "vitamin" = 3, "protein" = 3) + bitesize = 3 + filling_color = "#BE7C64" + tastes = list("нежного мяса" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/lavaland/predatory_fish_slab + name = "cooked predatory fish slab" + desc = "Кусок мяса хищной рыбы, обжаренный в печи. Пригоден к употреблению." + ru_names = list( + NOMINATIVE = "жаренный кусок мяса хищной рыбы", + GENITIVE = "жаренного куска мяса хищной рыбы", + DATIVE = "жаренному куску мяса хищной рыбы", + ACCUSATIVE = "жаренный кусок мяса хищной рыбы", + INSTRUMENTAL = "жаренным куском мяса хищной рыбы", + PREPOSITIONAL = "жаренном куске мяса хищной рыбы", + ) + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "predatory_fish_slab" + list_reagents = list("nutriment" = 4, "protein" = 6) + bitesize = 3 + filling_color = "#BE7C64" + tastes = list("мяса" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/lavaland/eel_ringlets + name = "eel ringlets" + desc = "Обжаренное в печи филе донного угря. Невероятно вкусное." + ru_names = list( + NOMINATIVE = "колечки из угря", + GENITIVE = "колечек из угря", + DATIVE = "колечкам из угря", + ACCUSATIVE = "колечки из угря", + INSTRUMENTAL = "колечками из угря", + PREPOSITIONAL = "колечках из угря", + ) + gender = PLURAL + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "eel_ringlets" + list_reagents = list("nutriment" = 4, "protein" = 6) + bitesize = 3 + filling_color = "#BE7C64" + tastes = list("нежного мяса" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_bacon + name = "thali lazis bacon part" + desc = "Небольшая порция бекона, взятая из тарелки Тали Лазис." + ru_names = list( + NOMINATIVE = "кусочек бекона Тали Лазис", + GENITIVE = "кусочка бекона Тали Лазис", + DATIVE = "кусочку бекона Тали Лазис", + ACCUSATIVE = "кусочек бекона Тали Лазис", + INSTRUMENTAL = "кусочком бекона Тали Лазис", + PREPOSITIONAL = "кусочке бекона Тали Лазис", + ) + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "thali_lazis_bacon" + overlay_sprite = "thali_lazis_bacon_overlay" + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_cacti + name = "thali lazis cacti part" + desc = "Небольшой кактус, взятый из тарелки Тали Лазис." + ru_names = list( + NOMINATIVE = "кусочек кактуса Тали Лазис", + GENITIVE = "кусочка кактуса Тали Лазис", + DATIVE = "кусочку кактуса Тали Лазис", + ACCUSATIVE = "кусочек кактуса Тали Лазис", + INSTRUMENTAL = "кусочком кактуса Тали Лазис", + PREPOSITIONAL = "кусочке кактуса Тали Лазис", + ) + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "thali_lazis_cacti" + overlay_sprite = "thali_lazis_cacti_overlay" + foodtype = FRUIT + +/obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_wing + name = "thali lazis wing part" + desc = "Небольшое крыло, взятое из тарелки Тали Лазис." + ru_names = list( + NOMINATIVE = "кусочек крылышка Тали Лазис", + GENITIVE = "кусочка крылышка Тали Лазис", + DATIVE = "кусочку крылышка Тали Лазис", + ACCUSATIVE = "кусочек крылышка Тали Лазис", + INSTRUMENTAL = "кусочком крылышка Тали Лазис", + PREPOSITIONAL = "кусочке крылышка Тали Лазис", + ) + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "thali_lazis_wing" + overlay_sprite = "thali_lazis_wing_overlay" + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_fish + name = "thali lazis fish part" + desc = "Небольшая порция рыбы, взятая из тарелки Тали Лазис." + ru_names = list( + NOMINATIVE = "кусочек рыбы Тали Лазис", + GENITIVE = "кусочка рыбы Тали Лазис", + DATIVE = "кусочку рыбы Тали Лазис", + ACCUSATIVE = "кусочек рыбы Тали Лазис", + INSTRUMENTAL = "кусочком рыбы Тали Лазис", + PREPOSITIONAL = "кусочке рыбы Тали Лазис", + ) + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "thali_lazis_fish" + overlay_sprite = "thali_lazis_fish_overlay" + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_crunchie + name = "thali lazis crunchie part" + desc = "Небольшая хрустящая порция, взятая из тарелки Тали Лазис." + ru_names = list( + NOMINATIVE = "хрустящий кусочек Тали Лазис", + GENITIVE = "хрустящего кусочка Тали Лазис", + DATIVE = "хрустящему кусочку Тали Лазис", + ACCUSATIVE = "хрустящий кусочек Тали Лазис", + INSTRUMENTAL = "хрустящим кусочком Тали Лазис", + PREPOSITIONAL = "хрустящем кусочке Тали Лазис", + ) + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "thali_lazis_crunchie" + overlay_sprite = "thali_lazis_crunchie_overlay" + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_bungus + name = "thali lazis bungus part" + desc = "Небольшая порция грибов, взятая из тарелки Тали Лазис." + ru_names = list( + NOMINATIVE = "грибной кусочек Тали Лазис", + GENITIVE = "грибного кусочка Тали Лазис", + DATIVE = "грибному кусочку Тали Лазис", + ACCUSATIVE = "грибной кусочек Тали Лазис", + INSTRUMENTAL = "грибном кусочком Тали Лазис", + PREPOSITIONAL = "грибном кусочке Тали Лазис", + ) + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "thali_lazis_bungus" + overlay_sprite = "thali_lazis_bungus_overlay" + foodtype = VEGETABLES + +/obj/item/reagent_containers/food/snacks/lavaland_food + name = "generic lavaland food" + desc = "самое обычное блюдо. Если вы это видите, то Зюзя напортачил" + ru_names = list( + NOMINATIVE = "блюдо Лазиса", + GENITIVE = "блюда Лазиса", + DATIVE = "блюду Лазиса", + ACCUSATIVE = "блюдо Лазиса", + INSTRUMENTAL = "блюдом Лазиса", + PREPOSITIONAL = "блюде Лазиса", + ) + gender = NEUTER + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "fine_meal" + lefthand_file = 'icons/mob/inhands/lavaland/food_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/food_righthand.dmi' + item_state = "food" + bitesize = 100 //eat whole thing down + list_reagents = list("nutriment" = 6, "protein" = 6) + tastes = list("вкусной еды" = 1) + has_special_eating_effects = TRUE + eat_time = 5 SECONDS + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/lavaland_food/fine_meal + name = "fine meal" + desc = "Мясо Голиафа, обжаренное в соку кактусового фрукта. Невероятно вкусное и питательное." + ru_names = list( + NOMINATIVE = "изысканная еда Лазиса", + GENITIVE = "изысканной еды Лазиса", + DATIVE = "изысканной еде Лазиса", + ACCUSATIVE = "изысканную еду Лазиса", + INSTRUMENTAL = "изысканной едой Лазиса", + PREPOSITIONAL = "изысканное еде Лазиса", + ) + gender = FEMALE + icon_state = "fine_meal" + list_reagents = list("vitfro" = 6, "protein" = 7, "vitamin" = 3) + tastes = list("сбалансированной еды" = 1) + foodtype = MEAT|FRUIT + +/obj/item/reagent_containers/food/snacks/lavaland_food/fine_meal/on_mob_eating_effect(mob/user) + if(isliving(user)) + var/mob/living/living_user = user + living_user.apply_status_effect(STATUS_EFFECT_FORCED_RUMBLE) + +/obj/item/reagent_containers/food/snacks/lavaland_food/freaky_leg + name = "freaky leg" + desc = "Многие народы галактики расценивают поедание себе подобных как ужасающее преступление. Однако эти стопы вышли уж слишком питательными..." + ru_names = list( + NOMINATIVE = "блюдо \"Причудливые Ноги\"", + GENITIVE = "блюда \"Причудливые Ноги\"", + DATIVE = "блюду \"Причудливые Ноги\"", + ACCUSATIVE = "блюдо\"Причудливые Ноги\"", + INSTRUMENTAL = "блюдом \"Причудливые Ноги\"", + PREPOSITIONAL = "блюде \"Причудливые Ноги\"", + ) + icon_state = "freaky_leg" + tastes = list("тяжёлых времён" = 1) + foodtype = MEAT + +/obj/item/reagent_containers/food/snacks/lavaland_food/freaky_leg/on_mob_eating_effect(mob/user) + if(isliving(user)) + var/mob/living/living_user = user + living_user.apply_status_effect(STATUS_EFFECT_LAVALAND_NO_PAIN) + +/obj/item/reagent_containers/food/snacks/lavaland_food/veggie_meal + name = "veggie meal" + desc = "Обычно пеплоходцы питаются мясом местной фауны, однако, если правильно смешать нужные вещества, то получится крайне полезное растительное блюдо. Хотя на вкус оно так себе." + ru_names = list( + NOMINATIVE = "вегетарианское блюдо Лазиса", + GENITIVE = "вегетарианского блюда Лазиса", + DATIVE = "вегетарианскому блюду Лазиса", + ACCUSATIVE = "вегетарианское блюдо Лазиса", + INSTRUMENTAL = "вегетарианским блюдом Лазиса", + PREPOSITIONAL = "вегетарианском блюде Лазиса", + ) + icon_state = "veggie_meal" + list_reagents = list("spaceacillin" = 10, "lavaland_extract" = 2, "vitfro" = 20, "sal_acid" = 15) + tastes = list("трав" = 1) + foodtype = FRUIT|VEGETABLES + +/obj/item/reagent_containers/food/snacks/lavaland_food/veggie_meal/on_mob_eating_effect(mob/user) + if(isliving(user)) + var/mob/living/living_user = user + living_user.apply_status_effect(STATUS_EFFECT_FORCED_SNEEZE) + +/obj/item/reagent_containers/food/snacks/lavaland_food/hunters_treat + name = "hunter's treat" + desc = "Человеческое сердце, обжаренное в соку мяса Голиафа. Легенды говорят, что если сьесть сердце поверженного врага, то обретёшь невероятную силу." + ru_names = list( + NOMINATIVE = "блюдо \"Угощение Охотника\"", + GENITIVE = "блюда \"Угощение Охотника\"", + DATIVE = "блюду \"Угощение Охотника\"", + ACCUSATIVE = "блюдо\"Угощение Охотника\"", + INSTRUMENTAL = "блюдом \"Угощение Охотника\"", + PREPOSITIONAL = "блюде \"Угощение Охотника\"", + ) + icon_state = "hunters_treat" + +/obj/item/reagent_containers/food/snacks/lavaland_food/hunters_treat/on_mob_eating_effect(mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/human = user + human.force_gene_block(GLOB.strongblock, TRUE) + +/obj/item/reagent_containers/food/snacks/lavaland_food/yum_grub + name = "yum-grub" + desc = "Мясо златожора, обжаренное вместе с грибами. Говорят, что оно благотворно воздействует на здоровье нервной системы и сенсорных органов." + ru_names = list( + NOMINATIVE = "блюдо \"Ям-Граб\"", + GENITIVE = "блюда \"Ям-Граб\"", + DATIVE = "блюду \"Ям-Граб\"", + ACCUSATIVE = "блюдо\"Ям-Граб\"", + INSTRUMENTAL = "блюдом \"Ям-Граб\"", + PREPOSITIONAL = "блюде \"Ям-Граб\"", + ) + icon_state = "yum_grub" + list_reagents = list("oculine" = 12, "mannitol" = 12, "vitamin" = 3) + +/obj/item/reagent_containers/food/snacks/lavaland_food/ashie_kebab + name = "ashie-kebab" + desc = "Несколько жизненно-важных органов, грубо удаленных из тела и насаженных на железный стержень. Настолько же первобытно, насколько и вкусно!" + ru_names = list( + NOMINATIVE = "пепло-кебаб Лазиса", + GENITIVE = "пепло-кебаба Лазиса", + DATIVE = "пепло-кебАбу Газиса", + ACCUSATIVE = "пепло-кебаб Лазиса", + INSTRUMENTAL = "пепло-кебабом Лазиса", + PREPOSITIONAL = "пепло-кебабе Лазиса", + ) + icon_state = "ashie_kebab" + item_state = "ashie_kebab" + list_reagents = list("nutriment" = 6, "protein" = 6, "ephedrine" = 10) + +/obj/item/reagent_containers/food/snacks/lavaland_food/ashie_kebab/on_mob_eating_effect(mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/human = user + human.add_blood() + +/obj/item/reagent_containers/food/snacks/lavaland_food/tail_o_dead + name = "tail'o'dead" + desc = "Массивный хвост унатха, запечённый в соку фруктовых кактусов. Выглядит аппетитно!" + ru_names = list( + NOMINATIVE = "блюдо \"Отрезанный Хвост\"", + GENITIVE = "блюда \"Отрезанный Хвост\"", + DATIVE = "блюду \"Отрезанный Хвост\"", + ACCUSATIVE = "блюдо\"Отрезанный Хвост\"", + INSTRUMENTAL = "блюдом \"Отрезанный Хвост\"", + PREPOSITIONAL = "блюде \"Отрезанный Хвост\"", + ) + icon_state = "tail_o_dead" + +/obj/item/reagent_containers/food/snacks/lavaland_food/tail_o_dead/on_mob_eating_effect(mob/user) + if(isliving(user)) + var/mob/living/living_user = user + living_user.apply_status_effect(STATUS_EFFECT_LAVALAND_VISION) + +/obj/item/reagent_containers/food/snacks/lavaland_food/cure_curse + name = "cure curse" + desc = "Два проткнутых сердца, одно из которых проклято. Что может пойти не так?" + ru_names = list( + NOMINATIVE = "блюдо \"Проклятое Лечение\"", + GENITIVE = "блюда \"Проклятое Лечение\"", + DATIVE = "блюду \"Проклятое Лечение\"", + ACCUSATIVE = "блюдо\"Проклятое Лечение\"", + INSTRUMENTAL = "блюдом \"Проклятое Лечение\"", + PREPOSITIONAL = "блюде \"Проклятое Лечение\"", + ) + icon_state = "cure_curse" + var/active = FALSE + +/obj/item/reagent_containers/food/snacks/lavaland_food/cure_curse/examine(mob/user) + . = ..() + if(active) + . += span_notice("Проклятое сердце бьётся.") + else + . += span_danger("Проклятое сердце неподвижно.") + +/obj/item/reagent_containers/food/snacks/lavaland_food/cure_curse/attackby(obj/item/I, mob/user, params) + . = ..() + if(!istype(I, /obj/item/melee/touch_attack/healtouch)) + return ..() + if(active) + balloon_alert(user, "уже активно!") + return ..() + user.say("NWOC EGEVNER") + active = TRUE + qdel(I) + update_icon(UPDATE_ICON_STATE) + return ATTACK_CHAIN_PROCEED + +/obj/item/reagent_containers/food/snacks/lavaland_food/cure_curse/update_icon_state() + . = ..() + icon_state = "[initial(icon_state)][active ? "_active" : ""]" + +/obj/item/reagent_containers/food/snacks/lavaland_food/cure_curse/on_mob_eating_effect(mob/user) + if(!active) + return + if(isliving(user)) + var/mob/living/living_user = user + if(!living_user.get_int_organ(/obj/item/organ/internal/regenerative_core/legion)) + new /obj/item/organ/internal/regenerative_core/legion/pre_preserved(living_user) + +/obj/item/reagent_containers/food/snacks/lavaland_food/wings_n_fangs_n_tentacles + name = "wings'n'fangs'n'tentacles" + desc = "Одно из щупалец Голиафа, крыло наблюдателя и жвало ткача, запеченные вместе. На вкус оно так же ужасно, как и на вид." + ru_names = list( + NOMINATIVE = "блюдо \"Крылья, клыки и щупальца\"", + GENITIVE = "блюда \"Крылья, клыки и щупальца\"", + DATIVE = "блюду \"Крылья, клыки и щупальца\"", + ACCUSATIVE = "блюдо\"Крылья, клыки и щупальца\"", + INSTRUMENTAL = "блюдом \"Крылья, клыки и щупальца\"", + PREPOSITIONAL = "блюде \"Крылья, клыки и щупальца\"", + ) + icon_state = "wings_n_fangs_n_tentacles" + +/obj/item/reagent_containers/food/snacks/lavaland_food/wings_n_fangs_n_tentacles/on_mob_eating_effect(mob/user) + if(isunathi(user)) + var/mob/living/carbon/human/human_unathi = user + var/obj/item/organ/internal/cyberimp/tail/blade/organic_upgrade/tumour = human_unathi.get_organ_slot(INTERNAL_ORGAN_TAIL_DEVICE) + if(!tumour) + tumour = new + to_chat(human_unathi, span_warning("Вы чувствуете сильное покалывание в вашем хвосте.")) + tumour.insert(human_unathi) + +/obj/item/reagent_containers/food/snacks/lavaland_food/goli_kernels + name = "goli-kernels" + desc = "небольшой мясной шарик на \"подносе\" из грибной шляпки. Вкуснятина!" + ru_names = list( + NOMINATIVE = "блюдо \"Голи-кернельс\"", + GENITIVE = "блюда \"Голи-кернельс\"", + DATIVE = "блюду \"Голи-кернельс\"", + ACCUSATIVE = "блюдо\"Голи-кернельс\"", + INSTRUMENTAL = "блюдом \"Голи-кернельс\"", + PREPOSITIONAL = "блюде \"Голи-кернельс\"", + ) + icon_state = "goli_kernels" + list_reagents = list("nutriment" = 2, "protein" = 2) + eat_time = 0 SECONDS + +/obj/item/reagent_containers/food/snacks/lavaland_food/goli_kernels/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + + if(..() || !ishuman(hit_atom))//if it gets caught or the target aren't human + return TRUE //abort + + var/mob/living/carbon/human/target = hit_atom + target.eat(src, target) + qdel(src) + +/obj/item/reagent_containers/food/snacks/lavaland_food/grace_of_lazis + name = "grace of lazis portion" + desc = "Кусок мяса, срезанный с массивного постамента в честь славной охоты. Невероятно вкусно." + ru_names = list( + NOMINATIVE = "порция с постамента \"Благодать Лазис Ардакса\"", + GENITIVE = "порции с постамента \"Благодать Лазис Ардакса\"", + DATIVE = "порции с постамента \"Благодать Лазис Ардакса\"", + ACCUSATIVE = "порцию с постамента \"Благодать Лазис Ардакса\"", + INSTRUMENTAL = "порцией с постамента \"Благодать Лазис Ардакса\"", + PREPOSITIONAL = "порции с постамента \"Благодать Лазис Ардакса\"", + ) + gender = FEMALE + icon_state = "grace_of_lazis" + list_reagents = list("protein" = 4, "vitamin" = 2) + eat_time = 0 SECONDS + +/obj/item/reagent_containers/food/snacks/lavaland_food/beer_grub_stew + name = "beer grub stew" + desc = "Алкогольное рагу, приготовленное с использованием мяса златожора. Питательно!" + ru_names = list( + NOMINATIVE = "тушёное рагу", + GENITIVE = "тушёного рагу", + DATIVE = "тушёному рагу", + ACCUSATIVE = "тушёное рагу", + INSTRUMENTAL = "тушёным рагу", + PREPOSITIONAL = "тушёном рагу", + ) + icon_state = "beer_grub_stew" + list_reagents = list("nutriment" = 4, "protein" = 6, "beer" = 7) + +/obj/item/reagent_containers/food/snacks/lavaland_food/beer_grub_stew/on_mob_eating_effect(mob/user) + if(isliving(user)) + var/mob/living/living_user = user + living_user.apply_status_effect(STATUS_EFFECT_TEMPERATURE_STABILIZE) + +/obj/item/reagent_containers/food/snacks/lavaland_food/thick_red_paste + name = "thick red paste" + desc = "Отвратительно выглядящая на вид вязкая красная паста, сделанная из ошмётков тел. На вкус невероятно омерзительно." + ru_names = list( + NOMINATIVE = "густая красная паста", + GENITIVE = "густой красной пасты", + DATIVE = "густой красной пасте", + ACCUSATIVE = "густую красную пасту", + INSTRUMENTAL = "густой красной пастой", + PREPOSITIONAL = "густой красной пасте", + ) + gender = FEMALE + icon_state = "thick_red_paste" + list_reagents = list("protein" = 2) + +/obj/item/reagent_containers/food/snacks/lavaland_food/thick_red_paste/on_mob_eating_effect(mob/user) + if(isliving(user)) + var/mob/living/living_user = user + living_user.apply_status_effect(STATUS_EFFECT_LAVALAND_ETERNAL_BLEEDING_FIX) + +/obj/item/reagent_containers/food/snacks/lavaland_food/black_blood_sausage + name = "black blood sausage" + desc = "Небольшая кровяная колбаска, сделанная из мяса Голиафа и... настоящей крови. Крайне полезно, если вы в критическом состоянии." + ru_names = list( + NOMINATIVE = "черная кровяная колбаска", + GENITIVE = "черной кровяной колбаски", + DATIVE = "черной кровяной колбаске", + ACCUSATIVE = "черную кровяную колбаску", + INSTRUMENTAL = "черной кровяной колбаской", + PREPOSITIONAL = "черной кровяной колбаске", + ) + gender = FEMALE + icon_state = "black_blood_sausage" + item_state = "black_blood_sausage" + list_reagents = list("nutriment" = 4, "protein" = 3, "ashiezine" = 6) + +/obj/item/reagent_containers/food/snacks/lavaland_food/xeno_sticks + name = "xeno sticks" + desc = "Мясо ксеноморфа на палочках, украшенное грибами рейши. На удивление довольно вкусное!" + ru_names = list( + NOMINATIVE = "ксено-палочки", + GENITIVE = "ксено-палочек", + DATIVE = "ксено-палочкам", + ACCUSATIVE = "ксено-палочки", + INSTRUMENTAL = "ксено-палочками", + PREPOSITIONAL = "ксено-палочках", + ) + gender = PLURAL + icon_state = "xeno_sticks" + item_state = "xeno_sticks" + +/obj/item/reagent_containers/food/snacks/lavaland_food/xeno_sticks/on_mob_eating_effect(mob/user) + if(isliving(user)) + var/mob/living/living_user = user + living_user.apply_status_effect(STATUS_EFFECT_LAVALAND_NIGHT_VISION) + +/obj/item/reagent_containers/food/snacks/lavaland_food/filet_madras + name = "filet madras" + desc = "Нежное филе рыбы, обжаренное вместе с грибами. Невероятно вкусно." + ru_names = list( + NOMINATIVE = "блюдо \"Филе Мадрас\"", + GENITIVE = "блюда \"Филе Мадрас\"", + DATIVE = "блюду \"Филе Мадрас\"", + ACCUSATIVE = "блюдо\"Филе Мадрас\"", + INSTRUMENTAL = "блюдом \"Филе Мадрас\"", + PREPOSITIONAL = "блюде \"Филе Мадрас\"", + ) + icon_state = "filet_madras" + list_reagents = list("nutriment" = 3, "protein" = 2, "pen_acid" = 4) + +/obj/item/reagent_containers/food/snacks/lavaland_food/eel_katigo + name = "eel katigo" + desc = "Филе донного угря с травяными приправами и \"соусом\" в виде собранных кусков мяса. Питательно!" + ru_names = list( + NOMINATIVE = "блюдо \"Угорь Катиго\"", + GENITIVE = "блюда \"Угорь Катиго\"", + DATIVE = "блюду \"Угорь Катиго\"", + ACCUSATIVE = "блюдо\"Угорь Катиго\"", + INSTRUMENTAL = "блюдом \"Угорь Катиго\"", + PREPOSITIONAL = "блюде \"Угорь Катиго\"", + ) + icon_state = "eel_katigo" + list_reagents = list("nutriment" = 3, "protein" = 2, "nicotine" = 6, "menthol" = 15) + +/obj/item/reagent_containers/food/snacks/lavaland_food/predatory_chowder + name = "predatory chowder" + desc = "Суп, приготовленный с использованием рыбного мяса, приправ и человеческих органов. Вкусно!" + ru_names = list( + NOMINATIVE = "блюдо \"Похлёбка Хищника\"", + GENITIVE = "блюда \"Похлёбка Хищника\"", + DATIVE = "блюду \"Похлёбка Хищника\"", + ACCUSATIVE = "блюдо\"Похлёбка Хищника\"", + INSTRUMENTAL = "блюдом \"Похлёбка Хищника\"", + PREPOSITIONAL = "блюде \"Похлёбка Хищника\"", + ) + icon_state = "predatory_chowder" + list_reagents = list("nutriment" = 3, "protein" = 2, "godblood" = 20) + +/obj/item/reagent_containers/food/snacks/lavaland_food/abu_ghosh + name = "abu ghosh" + desc = "Суп, приготовленный с использованием молока гатланчей и местных ингридиентов. Вкуснятина!" + ru_names = list( + NOMINATIVE = "блюдо \"Абу Гош\"", + GENITIVE = "блюда \"Абу Гош\"", + DATIVE = "блюду \"Абу Гош\"", + ACCUSATIVE = "блюдо\"Абу Гош\"", + INSTRUMENTAL = "блюдом \"Абу Гош\"", + PREPOSITIONAL = "блюде \"Абу Гош\"", + ) + icon_state = "abu_ghosh" + +/obj/item/reagent_containers/food/snacks/lavaland_food/abu_ghosh/on_mob_eating_effect(mob/user) + if(isliving(user)) + var/mob/living/living_user = user + living_user.apply_status_effect(STATUS_EFFECT_LAVALAND_BLOOD_REGEN) + +/obj/item/storage/lava_tray + name = "thali lazis plate" + desc = "Большой поднос, сделанный из дерева. Предназначен для хранения огромного количества съестного." + ru_names = list( + NOMINATIVE = "поднос \"Тали Лазис\"", + GENITIVE = "подноса \"Тали Лазис\"", + DATIVE = "подносу \"Тали Лазис\"", + ACCUSATIVE = "поднос \"Тали Лазис\"", + INSTRUMENTAL = "подносом \"Тали Лазис\"", + PREPOSITIONAL = "подносе \"Тали Лазис\"", + ) + gender = MALE + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "thali_lazis_plate" + flags = NONE + materials = null + can_hold = list( + /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_bacon, + /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_cacti, + /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_wing, + /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_fish, + /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_crunchie, + /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_bungus, + ) + display_contents_with_number = TRUE + storage_slots = 12 + max_combined_w_class = 30 + slot_flags = NONE + +/obj/item/storage/lava_tray/update_overlays() + . = ..() + for(var/obj/item/reagent_containers/food/snacks/lavaland/snack in contents) + . += mutable_appearance(icon = snack.icon, icon_state = snack.overlay_sprite) + +/obj/item/storage/lava_tray/full/populate_contents() + for(var/i in 1 to 2) + new /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_bacon(src) + new /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_cacti(src) + new /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_wing(src) + new /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_fish(src) + new /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_crunchie(src) + new /obj/item/reagent_containers/food/snacks/lavaland/thali_lazis_bungus(src) + update_icon(UPDATE_OVERLAYS) diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm index 81a2184ae92..7a57fccb10c 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm @@ -15,9 +15,17 @@ idle_power_usage = 5 active_power_usage = 100 container_type = OPENCONTAINER - var/operating = FALSE // Is it on? - var/dirty = NO_DIRT // = {0..100} Does it need cleaning? - var/broken = BROKEN_NONE // How broken is it??? + /// Is it on? + var/operating = FALSE + /// = {0..100} Does it need cleaning? + var/dirty = NO_DIRT + /// Can our machine be dirty? + var/can_be_dirty = TRUE + /// How broken is it??? + var/broken = BROKEN_NONE + /// Can our machine be broken? + var/can_broke = TRUE + var/transfer_reagents_from_ingredients = TRUE var/efficiency = 0 var/list/cook_verbs = list("Cooking") //Recipe & Item vars @@ -197,7 +205,8 @@ ) if(!I.use_tool(src, user, 2 SECONDS, volume = I.tool_volume) || operating || broken != BROKEN_NEEDS_SCREWDRIVER) return . - broken = BROKEN_NEEDS_WRENCH // Fix it a bit + if(can_broke) + broken = BROKEN_NEEDS_WRENCH // Fix it a bit update_icon(UPDATE_ICON_STATE) user.visible_message( span_notice("[user] fixes the internal parts of [src]."), @@ -353,7 +362,7 @@ ************************************/ /obj/machinery/kitchen_machine/proc/cook() - if(stat & (NOPOWER|BROKEN)) + if(use_power != NO_POWER_USE && stat & (NOPOWER|BROKEN)) return start() if(reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run @@ -368,7 +377,8 @@ if(recipes_to_make.len == 1 && recipes_to_make[1][2] == RECIPE_FAIL) //This only runs if there is a single recipe source to be made and it is a failure (the machine was loaded with only 1 mixing bowl that results in failure OR was directly loaded with ingredients that results in failure). //If there are multiple sources, this bit gets skipped. - dirty += 1 + if(can_be_dirty) + dirty += 1 if(prob(max(10,dirty*5))) //chance to get so dirty we require cleaning before next use if(!wzhzhzh(4)) abort() @@ -444,7 +454,8 @@ source.reagents.clear_reagents() for(var/e=1 to efficiency) //upgraded machine? make additional servings and split the ingredient reagents among each serving equally. var/obj/cooked = new recipe.result() - temp_reagents.trans_to(cooked, temp_reagents.total_volume/efficiency, no_react = TRUE) // Don't react with the abstract holder please + if(transfer_reagents_from_ingredients) + temp_reagents.trans_to(cooked, temp_reagents.total_volume/efficiency, no_react = TRUE) // Don't react with the abstract holder please cooked.forceMove(loc) temp_reagents.clear_reagents() var/obj/byproduct = recipe.get_byproduct() //if the recipe has a byproduct, handle returning that (such as re-usable candy moulds) @@ -459,6 +470,9 @@ /obj/machinery/kitchen_machine/proc/wzhzhzh(seconds) for(var/i=1 to seconds) + if(use_power == NO_POWER_USE) + sleep(10) + continue if(stat & (NOPOWER|BROKEN)) return 0 use_power(500) @@ -492,7 +506,7 @@ for(var/obj/O in contents) O.forceMove(loc) - if(reagents.total_volume) + if(reagents.total_volume && can_be_dirty) dirty++ reagents.clear_reagents() @@ -506,7 +520,8 @@ /obj/machinery/kitchen_machine/proc/muck_finish() playsound(loc, 'sound/machines/ding.ogg', 50, 1) visible_message("\The [src] gets covered in muck!") - dirty = MAX_DIRT // Make it dirty so it can't be used util cleaned + if(can_be_dirty) //this vars are much more easy than copy-paste all that code to tribal oven + dirty = MAX_DIRT // Make it dirty so it can't be used util cleaned container_type = NONE operating = FALSE // Turn it off again afterwards update_icon(UPDATE_ICON_STATE) @@ -515,7 +530,8 @@ /obj/machinery/kitchen_machine/proc/broke() do_sparks(2, 1, src) visible_message("The [src] breaks!") //Let them know they're stupid - broken = BROKEN_NEEDS_SCREWDRIVER // Make it broken so it can't be used util fixed + if(can_broke) + broken = BROKEN_NEEDS_SCREWDRIVER // Make it broken so it can't be used util fixed container_type = NONE operating = FALSE // Turn it off again aferwards update_icon(UPDATE_ICON_STATE) diff --git a/code/modules/food_and_drinks/kitchen_machinery/tribal_oven.dm b/code/modules/food_and_drinks/kitchen_machinery/tribal_oven.dm new file mode 100644 index 00000000000..19af063728d --- /dev/null +++ b/code/modules/food_and_drinks/kitchen_machinery/tribal_oven.dm @@ -0,0 +1,33 @@ +/obj/machinery/kitchen_machine/tribal_oven + name = "stone oven" + desc = "Огромная примитивная каменная печь, используемая для приготовления пищи." + ru_names = list( + NOMINATIVE = "каменная печь", + GENITIVE = "каменной печи", + DATIVE = "каменной печи", + ACCUSATIVE = "каменную печь", + INSTRUMENTAL = "каменной печью", + PREPOSITIONAL = "каменной печи" + ) + gender = FEMALE + icon = 'icons/obj/lavaland/ashie_food.dmi' + icon_state = "oven_off" + use_power = NO_POWER_USE + idle_power_usage = 0 + active_power_usage = 0 + recipe_type = RECIPE_TRIBAL_OVEN + off_icon = "oven_off" + on_icon = "oven_on" + can_be_dirty = FALSE + can_broke = FALSE + efficiency = 1 //we don't have parts, soo + transfer_reagents_from_ingredients = FALSE + +/obj/machinery/kitchen_machine/tribal_oven/screwdriver_act() + return FALSE + +/obj/machinery/kitchen_machine/tribal_oven/wrench_act() + return FALSE + +/obj/machinery/kitchen_machine/crowbar_act() + return FALSE diff --git a/code/modules/food_and_drinks/recipes/recipes_tribal.dm b/code/modules/food_and_drinks/recipes/recipes_tribal.dm new file mode 100644 index 00000000000..39c1cbd3797 --- /dev/null +++ b/code/modules/food_and_drinks/recipes/recipes_tribal.dm @@ -0,0 +1,230 @@ +/datum/recipe/tribal_oven/fine_meal + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/monstermeat/goliath, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/fine_meal + +/datum/recipe/tribal_oven/freaky_leg + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/monstermeat/spiderleg, + /obj/item/reagent_containers/food/snacks/monstermeat/spiderleg, + /obj/item/organ/external/foot + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/freaky_leg + +/datum/recipe/tribal_oven/veggie_meal + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/coaltree_log, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/coaltree_log, + /obj/item/reagent_containers/food/snacks/grown/mushroom/reishi + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/veggie_meal + +/datum/recipe/tribal_oven/hunters_treat + reagents = list() + items = list( + /obj/item/organ/internal/heart, + /obj/item/reagent_containers/food/snacks/monstermeat/goliath, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf, + /obj/item/stack/sheet/animalhide/goliath_hide, + /obj/item/reagent_containers/food/snacks/grown/mushroom/reishi, + /obj/item/reagent_containers/food/snacks/grown/mushroom/reishi + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/hunters_treat + +/datum/recipe/tribal_oven/yum_grub + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/monstermeat/goldgrub, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/yum_grub + +/datum/recipe/tribal_oven/ashie_kebab + reagents = list() + items = list( + /obj/item/stack/rods, + /obj/item/organ/internal/liver, + /obj/item/organ/internal/heart, + /obj/item/organ/internal/kidneys, + /obj/item/reagent_containers/food/snacks/monstermeat/spiderleg + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/ashie_kebab + +/datum/recipe/tribal_oven/tail_o_dead + reagents = list() + items = list( + /obj/item/organ/external/tail/unathi, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/tail_o_dead + +/datum/recipe/tribal_oven/cure_curse + reagents = list() + items = list( + /obj/item/kitchen/knife/combat/survival/bone, + /obj/item/organ/internal/heart, + /obj/item/organ/internal/heart/unathi, + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/cure_curse + +/datum/recipe/tribal_oven/wings_n_fangs_n_tentacles + reagents = list() + items = list( + /obj/item/crusher_trophy/goliath_tentacle, + /obj/item/crusher_trophy/watcher_wing, + /obj/item/crusher_trophy/fang, + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/wings_n_fangs_n_tentacles + +/datum/recipe/tribal_oven/goli_kernels + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/monstermeat/goliath, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/goli_kernels + byproduct = /obj/item/reagent_containers/food/snacks/lavaland_food/goli_kernels + +/datum/recipe/tribal_oven/beer_grub_stew + reagents = list( + "beer" = 15 + ) + items = list( + /obj/item/reagent_containers/food/snacks/monstermeat/goldgrub, + /obj/item/reagent_containers/food/snacks/grown/mushroom/reishi, + /obj/item/reagent_containers/food/snacks/grown/mushroom/reishi, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit, + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/beer_grub_stew + byproduct = /obj/item/reagent_containers/food/snacks/lavaland_food/beer_grub_stew + +/datum/recipe/tribal_oven/thick_red_paste + reagents = list( + "liquidgibs" = 15 + ) + items = list( + /obj/item/reagent_containers/food/snacks/grown/wheat, + /obj/item/reagent_containers/food/snacks/grown/wheat, + /obj/item/reagent_containers/food/snacks/grown/wheat, + /obj/item/reagent_containers/food/snacks/grown/wheat, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf, + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/thick_red_paste + byproduct = /obj/item/reagent_containers/food/snacks/lavaland_food/thick_red_paste + +/datum/recipe/tribal_oven/black_blood_sausage + reagents = list( + "liquidgibs" = 15, + "blood" = 10 + ) + items = list( + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap, + /obj/item/reagent_containers/food/snacks/monstermeat/goliath + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/black_blood_sausage + byproduct = /obj/item/reagent_containers/food/snacks/lavaland_food/black_blood_sausage + +/datum/recipe/tribal_oven/xeno_sticks + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/monstermeat/xenomeat, + /obj/item/reagent_containers/food/snacks/grown/mushroom/reishi + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/xeno_sticks + +/datum/recipe/tribal_oven/soft_meat_cubes + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/lavaland/soft_meat + ) + result = /obj/item/reagent_containers/food/snacks/lavaland/soft_meat_cubes + +/datum/recipe/tribal_oven/predatory_fish_slab + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/lavaland/predator_meat + ) + result = /obj/item/reagent_containers/food/snacks/lavaland/predatory_fish_slab + +/datum/recipe/tribal_oven/eel_ringlets + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/lavaland/eel_filet + ) + result = /obj/item/reagent_containers/food/snacks/lavaland/eel_ringlets + +/datum/recipe/tribal_oven/filet_madras + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/lavaland/soft_meat, + /obj/item/reagent_containers/food/snacks/grown/comfrey, + /obj/item/reagent_containers/food/snacks/grown/mushroom/reishi + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/filet_madras + +/datum/recipe/tribal_oven/eel_katigo + reagents = list( + "liquidgibs" = 10 + ) + items = list( + /obj/item/reagent_containers/food/snacks/lavaland/eel_filet, + /obj/item/reagent_containers/food/snacks/grown/wheat + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/eel_katigo + byproduct = /obj/item/reagent_containers/food/snacks/lavaland_food/eel_katigo + +/datum/recipe/tribal_oven/predatory_chowder + reagents = list( + "water" = 15 + ) + items = list( + /obj/item/reagent_containers/food/snacks/lavaland/predator_meat, + /obj/item/organ/internal/liver, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/predatory_chowder + byproduct = /obj/item/reagent_containers/food/snacks/lavaland_food/predatory_chowder + +/datum/recipe/tribal_oven/abu_ghosh + reagents = list( + "bugmilk" = 30 + ) + items = list( + /obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom, + /obj/item/reagent_containers/food/snacks/monstermeat/goliath, + /obj/item/reagent_containers/food/snacks/grown/wheat + ) + result = /obj/item/reagent_containers/food/snacks/lavaland_food/abu_ghosh + byproduct = /obj/item/reagent_containers/food/snacks/lavaland_food/abu_ghosh + +/datum/recipe/tribal_oven/thali_lazis + reagents = list() + items = list( + /obj/item/reagent_containers/food/snacks/grown/mushroom/reishi, + /obj/item/crusher_trophy/watcher_wing, + /obj/item/reagent_containers/food/snacks/lavaland/soft_meat, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf, + /obj/item/reagent_containers/food/snacks/monstermeat/spiderleg, + /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit, + /obj/item/reagent_containers/food/snacks/monstermeat/goliath + ) + result = /obj/item/storage/lava_tray/full diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 8dbf541e0d1..28137907f7f 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -99,3 +99,4 @@ reqs = list(/obj/item/stack/sheet/wood = 30) time = 50 category = CAT_PRIMAL + subcategory = CAT_MISC2 diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 22071d3c2dd..1cc3fe0afcb 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -81,6 +81,16 @@ flags = NONE resistance_flags = FLAMMABLE +/obj/item/cultivator/wooden + icon_state = "cultivator_wooden" + hitsound = null + materials = null + flags = NONE + lefthand_file = 'icons/mob/inhands/lavaland/misc_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/misc_righthand.dmi' + item_state = "cultivator" + + /obj/item/hatchet name = "hatchet" desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood." @@ -121,6 +131,9 @@ belt_icon = "wooden_hatchet" materials = null flags = NONE + lefthand_file = 'icons/mob/inhands/lavaland/misc_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/misc_righthand.dmi' + item_state = "small_shovel" /obj/item/scythe icon_state = "scythe0" @@ -340,3 +353,23 @@ icon = 'icons/obj/chemical.dmi' icon_state = "plastic_jug_pk" list_reagents = list("pestkiller" = 80) + +/obj/item/conductive_organ + name = "conductive organ" + desc = "небольшой желтоватый мешочек, добываемый из лавового панцирника. Является мощным удобрением, значительно повышающим урожай и уровень нутриментов растения." + ru_names = list( + NOMINATIVE = "проводящий орган", + GENITIVE = "проводящего органа", + DATIVE = "проводящему органу", + ACCUSATIVE = "проводящий орган", + INSTRUMENTAL = "проводящим органом", + PREPOSITIONAL = "проводящем органе", + ) + gender = MALE + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "conductive_organ" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "acid_bladder" //yeah + w_class = WEIGHT_CLASS_TINY + origin_tech = "biotech=6" diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 54dfff3fd4e..5aaefacfddf 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -953,6 +953,24 @@ myseed.variant_prompt(user, src) return ATTACK_CHAIN_PROCEED_SUCCESS + if(istype(I, /obj/item/conductive_organ)) + add_fingerprint(user) + if(!myseed) + balloon_alert(user, "внутри нет семян!") + return ATTACK_CHAIN_PROCEED + if(!user.drop_transfer_item_to_loc(I, src)) + return ..() + user.visible_message( + span_notice("[user] аккуратно втира[pluralize_ru(user.gender, "ет", "ют")] [I.declent_ru(ACCUSATIVE)] в [declent_ru(ACCUSATIVE)]."), + span_notice("Вы аккуратно втираете [I.declent_ru(ACCUSATIVE)] в [declent_ru(ACCUSATIVE)]."), + ) + yieldmod = 1.7 + waterlevel = maxwater + nutrilevel = maxnutri + plant_hud_set_nutrient() + plant_hud_set_water() + return ATTACK_CHAIN_PROCEED_SUCCESS + return ..() diff --git a/code/modules/lavaland/lavaland_theme.dm b/code/modules/lavaland/lavaland_theme.dm index 9d3e35e69a1..aab4e58657c 100644 --- a/code/modules/lavaland/lavaland_theme.dm +++ b/code/modules/lavaland/lavaland_theme.dm @@ -1,10 +1,12 @@ /datum/lavaland_theme /// Name of lavaland theme var/name = "Not Specified" - /// Typepath of turf the `/turf/simulated/floor/lava/mapping_lava` will be changed to on Late Initialization + /// Typepath of turf the `/turf/simulated/floor/lava` will be changed to on Late Initialization var/primary_turf_type /// Icon state of planet present on background of station Z-level var/planet_icon_state + /// Defines, used for actual planet type + var/lavaland_type /datum/lavaland_theme/New() @@ -25,6 +27,7 @@ name = "lava" primary_turf_type = /turf/simulated/floor/lava/lava_land_surface planet_icon_state = "planet" + lavaland_type = LAVALAND_TYPE_LAVA /datum/lavaland_theme/lava/setup() var/datum/river_spawner/lava_spawner = new(level_name_to_num(MINING)) @@ -34,6 +37,7 @@ name = "plasma" primary_turf_type = /turf/simulated/floor/lava/lava_land_surface/plasma planet_icon_state = "planet_plasma" + lavaland_type = LAVALAND_TYPE_PLASMA /datum/lavaland_theme/plasma/setup() var/datum/river_spawner/spawner = new(level_name_to_num(MINING)) @@ -44,6 +48,7 @@ name = "chasm" primary_turf_type = /turf/simulated/floor/chasm/straight_down/lava_land_surface planet_icon_state = "planet_canyon" + lavaland_type = LAVALAND_TYPE_CHASM /datum/lavaland_theme/chasm/setup() var/datum/river_spawner/spawner = new(level_name_to_num(MINING), spread_prob_ = 10, spread_prob_loss_ = 5) diff --git a/code/modules/mining/ash_walkers/ash_rune.dm b/code/modules/mining/ash_walkers/ash_rune.dm new file mode 100644 index 00000000000..f006e0f3086 --- /dev/null +++ b/code/modules/mining/ash_walkers/ash_rune.dm @@ -0,0 +1,120 @@ +/obj/effect/decal/ash_rune_centre + name = "ash sigil" + desc = "Незаконченная руна, нарисованная на пепле." + ru_names = list( + NOMINATIVE = "пепельный сигил", + GENITIVE = "пепельного сигила", + DATIVE = "пепельному сигилу", + ACCUSATIVE = "пепельный сигил", + INSTRUMENTAL = "пепельным сигилом", + PREPOSITIONAL = "пепельном сигиле" + ) + gender = MALE + icon = 'icons/effects/ash_runes.dmi' + icon_state = "runaash_1" + + ///Is our rune being transformed right now? Sanity check + var/transforming = FALSE + ///Is our rune activated? Another sanity check, love it + var/activated = FALSE + +/obj/effect/decal/ash_rune_centre/Initialize(mapload) + . = ..() + var/number = rand(1, 36) + icon_state = "runaash_[number]" + +/obj/effect/decal/ash_rune_centre/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/melee/touch_attack/healtouch)) + return ..() + if(transforming) + return ..() + visible_message(span_notice("[user] прикаса[pluralize_ru(user.gender)]ся рукой к руне.")) + transforming = TRUE + var/obj/effect/rune_animation_landmark/our_landmark = locate() in orange(3, src) + if(!our_landmark) + visible_message(span_warning("Но ничего не происходит...")) + if(!activated) + our_landmark.activate() + for(var/obj/effect/rune_fluff_marks/runes in orange(3, src)) + runes.activate() + activate_rune() + qdel(I) + return ATTACK_CHAIN_PROCEED + +/obj/effect/decal/ash_rune_centre/proc/activate_rune() + if(activated) + return + activated = TRUE + name = "ash rune" + desc = "Полностью функционирующая руна, готовая для ритуальных действий." + ru_names = list( + NOMINATIVE = "пепельная руна", + GENITIVE = "пепельной руны", + DATIVE = "пепельной руне", + ACCUSATIVE = "пепельную руну", + INSTRUMENTAL = "пепельной руной", + PREPOSITIONAL = "пепельной руне" + ) + AddComponent( \ + /datum/component/ritual_object, \ + /datum/ritual/ashwalker, \ + ) + + +// Our little cheat in order to make first rune activation unforgetable +/obj/effect/rune_fluff_marks + name = "ash rune" + ru_names = list( + NOMINATIVE = "пепельная руна", + GENITIVE = "пепельной руны", + DATIVE = "пепельной руне", + ACCUSATIVE = "пепельную руну", + INSTRUMENTAL = "пепельной руной", + PREPOSITIONAL = "пепельной руне" + ) + gender = FEMALE + icon = 'icons/effects/ash_runes.dmi' + icon_state = "runaash_2" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + anchored = TRUE + plane = FLOOR_PLANE + layer = TURF_DECAL_LAYER + +/obj/effect/rune_fluff_marks/Initialize(mapload) + . = ..() + icon_state = "" + invisibility = INVISIBILITY_MAXIMUM + +/obj/effect/rune_fluff_marks/proc/activate() + invisibility = 0 + var/number = rand(1, 36) + icon_state = "runaash_[number]" + +/obj/effect/rune_animation_landmark + name = "ash rune" + ru_names = list( + NOMINATIVE = "пепельная руна", + GENITIVE = "пепельной руны", + DATIVE = "пепельной руне", + ACCUSATIVE = "пепельную руну", + INSTRUMENTAL = "пепельной руной", + PREPOSITIONAL = "пепельной руне" + ) + gender = FEMALE + icon = 'icons/effects/ashwalker_rune.dmi' + icon_state = "AshRun" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + anchored = TRUE + plane = FLOOR_PLANE + layer = TURF_DECAL_LAYER + +/obj/effect/rune_animation_landmark/Initialize(mapload) + . = ..() + icon_state = "" + invisibility = INVISIBILITY_MAXIMUM + +/obj/effect/rune_animation_landmark/proc/activate() + invisibility = 0 + flick("3", src) + icon_state = "AshRun" + visible_message(span_notice("Руна полностью готова к использованию!")) diff --git a/code/modules/mining/ash_walkers/bait.dm b/code/modules/mining/ash_walkers/bait.dm new file mode 100644 index 00000000000..cb814845568 --- /dev/null +++ b/code/modules/mining/ash_walkers/bait.dm @@ -0,0 +1,128 @@ +/obj/item/reagent_containers/food/snacks/bait + name = "worm" + desc = "Тестовая наживка, если вы это видите, пингуйте Зюзю." + ru_names = list( + NOMINATIVE = "червяк", + GENITIVE = "червяков", + DATIVE = "червяку", + ACCUSATIVE = "червяка", + INSTRUMENTAL = "червяком", + PREPOSITIONAL = "червякам", + ) + gender = MALE + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "ash_eater" + lefthand_file = 'icons/mob/inhands/lavaland/bait_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/bait_righthand.dmi' + item_state = "ash_eater" + list_reagents = list("protein" = 1) //mmmm tasty + tastes = list("пепла" = 5, "безнадёжности" = 1) + bitesize = 1 + foodtype = MEAT + antable = FALSE + /// This will be visually shown on fishing rod. + var/rod_overlay = "ash_eater_rod" + +/obj/item/reagent_containers/food/snacks/bait/examine(mob/user) + . = ..() + . += span_notice("Вы можете использовать [declent_ru(ACCUSATIVE)] в качестве наживки.") + +/obj/item/reagent_containers/food/snacks/bait/random/Initialize(mapload) + . = ..() + if(prob(40)) //60pc chance to nothing + var/bait = pick(subtypesof(/obj/item/reagent_containers/food/snacks/bait)) + new bait(loc) + return INITIALIZE_HINT_QDEL + +/obj/item/reagent_containers/food/snacks/bait/ash_eater + name = "ash eater" + desc = "Маленький червячок со множеством невероятно острых зубов, покрывающих его ротовую полость. Ходят слухи, что эти крохи способны вырастать до размеров целого города. Пепел должен течь рекой." + ru_names = list( + NOMINATIVE = "пожиратель пепла", + GENITIVE = "пожирателя пепла", + DATIVE = "пожирателю пепла", + ACCUSATIVE = "пожирателя пепла", + INSTRUMENTAL = "пожирателем пепла", + PREPOSITIONAL = "пожирателе пепла", + ) + icon_state = "ash_eater" + rod_overlay = "ash_eater_rod" + +/obj/item/reagent_containers/food/snacks/bait/bloody_leach + name = "bloody leach" + desc = "Паразитическая форма жизни Лазис Ардакса, которая цепляется к оголённым участкам кожи и питается своими жертвами. Её брюшко краснеет от количества выпитой ею крови." + ru_names = list( + NOMINATIVE = "кровавая пиявка", + GENITIVE = "кровавой пиявки", + DATIVE = "кровавой пиявке", + ACCUSATIVE = "кровавую пиявку", + INSTRUMENTAL = "кровавой пиявкой", + PREPOSITIONAL = "кровавой пиявке", + ) + gender = FEMALE + icon_state = "bloody_leach" + item_state = "bloody_leach" + rod_overlay = "bloody_leach_rod" + +/obj/item/reagent_containers/food/snacks/bait/goldgrub_larva + name = "goldgrub larva" + desc = "Небольшой червячок, который питается минералами, закопанными в пепле. Он так же пуглив, как и его более старшие сородичи." + ru_names = list( + NOMINATIVE = "личинка златожора", + GENITIVE = "личинки златожора", + DATIVE = "личинке златожора", + ACCUSATIVE = "личинку златожора", + INSTRUMENTAL = "личинкой златожора", + PREPOSITIONAL = "личинке златожора", + ) + gender = FEMALE + icon_state = "goldgrub_larva" + item_state = "goldgrub_larva" + rod_overlay = "goldgrub_larva_rod" + +/obj/item/reagent_containers/food/snacks/charred_krill + name = "charred krill" + desc = "Одна из самых редких обитателей Лазис Ардакса, множество лет признанная вымершей. Эта креветка - одно из самых любимых угощений для местной \"подводной\" фауны." + ru_names = list( + NOMINATIVE = "обугленная креветка", + GENITIVE = "обугленной креветки", + DATIVE = "обугленной креветке", + ACCUSATIVE = "обугленную креветку", + INSTRUMENTAL = "обугленной креветкой", + PREPOSITIONAL = "обугленной креветке", + ) + gender = FEMALE + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "charred_krill" + item_state = "charred_krill" + list_reagents = list("protein" = 1) + bitesize = 1 + antable = FALSE + tastes = list("пепла" = 5, "упущенных возможностей" = 1) + var/in_lava = FALSE + +/obj/item/reagent_containers/food/snacks/charred_krill/examine(mob/user) + . = ..() + . += span_notice("Вы можете бросить [declent_ru(ACCUSATIVE)] в лаву, чтобы привлечь рыбу к поверхности.") + +/obj/item/reagent_containers/food/snacks/charred_krill/can_be_pulled(atom/movable/user, force, show_message) + if(in_lava) + if(show_message) + to_chat(user, span_warning("[capitalize(declent_ru(NOMINATIVE))] почти утонула в лаве!")) + return + +/obj/item/reagent_containers/food/snacks/charred_krill/attack_hand(mob/user, pickupfireoverride) + if(in_lava) + return + else + return ..() + +//Zuza blyat +/obj/item/reagent_containers/food/snacks/charred_krill/suicide_act(mob/user) //I forbid you to translate it. + user.visible_message(span_suicide("[user] is going to krill himself! Oh god...")) + user.say("goodbye krill world...") + sleep(20) + var/obj/item/reagent_containers/food/snacks/charred_krill/krill = new /obj/item/reagent_containers/food/snacks/charred_krill(drop_location()) + krill.desc += " Look's like someone KRILLED himself." + qdel(user) + return OBLITERATION diff --git a/code/modules/mining/ash_walkers/fish.dm b/code/modules/mining/ash_walkers/fish.dm new file mode 100644 index 00000000000..a494f624290 --- /dev/null +++ b/code/modules/mining/ash_walkers/fish.dm @@ -0,0 +1,357 @@ +// Fish flopping + +#define PAUSE_BETWEEN_PHASES 15 +#define PAUSE_BETWEEN_FLOPS 2 +#define FLOP_COUNT 2 +#define FLOP_DEGREE 20 +#define FLOP_SINGLE_MOVE_TIME 1.5 +#define JUMP_X_DISTANCE 5 +#define JUMP_Y_DISTANCE 6 +/// This animation should be applied to actual parent atom instead of vc_object. +/proc/flop_animation(atom/movable/animation_target) + var/pause_between = PAUSE_BETWEEN_PHASES + rand(1, 5) //randomized a bit so fish are not in sync + animate(animation_target, time = pause_between, loop = -1) + //move nose down and up + for(var/_ in 1 to FLOP_COUNT) + var/matrix/up_matrix = matrix() + up_matrix.Turn(FLOP_DEGREE) + var/matrix/down_matrix = matrix() + down_matrix.Turn(-FLOP_DEGREE) + animate(transform = down_matrix, time = FLOP_SINGLE_MOVE_TIME, loop = -1) + animate(transform = up_matrix, time = FLOP_SINGLE_MOVE_TIME, loop = -1) + animate(transform = matrix(), time = FLOP_SINGLE_MOVE_TIME, loop = -1, easing = BOUNCE_EASING | EASE_IN) + animate(time = PAUSE_BETWEEN_FLOPS, loop = -1) + //bounce up and down + animate(time = pause_between, loop = -1, flags = ANIMATION_PARALLEL) + var/jumping_right = FALSE + var/up_time = 3 * FLOP_SINGLE_MOVE_TIME / 2 + for(var/_ in 1 to FLOP_COUNT) + jumping_right = !jumping_right + var/x_step = jumping_right ? JUMP_X_DISTANCE/2 : -JUMP_X_DISTANCE/2 + animate(time = up_time, pixel_y = JUMP_Y_DISTANCE , pixel_x=x_step, loop = -1, flags= ANIMATION_RELATIVE, easing = BOUNCE_EASING | EASE_IN) + animate(time = up_time, pixel_y = -JUMP_Y_DISTANCE, pixel_x=x_step, loop = -1, flags= ANIMATION_RELATIVE, easing = BOUNCE_EASING | EASE_OUT) + animate(time = PAUSE_BETWEEN_FLOPS, loop = -1) +#undef PAUSE_BETWEEN_PHASES +#undef PAUSE_BETWEEN_FLOPS +#undef FLOP_COUNT +#undef FLOP_DEGREE +#undef FLOP_SINGLE_MOVE_TIME +#undef JUMP_X_DISTANCE +#undef JUMP_Y_DISTANCE + +// actual fish + +GLOBAL_LIST_INIT(deep_fish, subtypesof(/obj/item/lavaland_fish/deep_water)) + +GLOBAL_LIST_INIT(shore_fish, subtypesof(/obj/item/lavaland_fish/shoreline)) + +/obj/item/lavaland_fish + name = "generic lavaland fish" + desc = "Вау, она такая... невпечатляющая!" + ru_names = list( + NOMINATIVE = "рыба", + GENITIVE = "рыбы", + DATIVE = "рыбе", + ACCUSATIVE = "рыбу", + INSTRUMENTAL = "рыбой", + PREPOSITIONAL = "рыбе", + ) + gender = MALE + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "ash_crab" + + lefthand_file = 'icons/mob/inhands/lavaland/fish_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_righthand.dmi' + item_state = "ash_crab" + + resistance_flags = LAVA_PROOF | FIRE_PROOF + throwforce = 5 + force = 10 + attack_verb = list("охлестал", "ударил", "стукнул", "опозорил") + hitsound = 'sound/weapons/bite.ogg' + + /// If this fish should do the flopping animation + var/do_flop_animation = TRUE + var/flopping = FALSE + + /// Favourite bait. Using this will add more chance to catch this fish + var/favorite_bait = null + + /// List of items you get after butchering it + var/list/butcher_loot = list() + +/obj/item/lavaland_fish/shoreline // all this subtypes used in actual fishing + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/lavaland_fish/deep_water + w_class = WEIGHT_CLASS_BULKY + +/obj/item/lavaland_fish/Initialize(mapload) + . = ..() + if(do_flop_animation) + RegisterSignal(src, COMSIG_ATOM_TEMPORARY_ANIMATION_START, PROC_REF(on_temp_animation)) + START_PROCESSING(SSobj, src) + +/obj/item/lavaland_fish/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/lavaland_fish/proc/fucking_dies() + do_flop_animation = FALSE + STOP_PROCESSING(SSobj, src) + UnregisterSignal(src, COMSIG_ATOM_TEMPORARY_ANIMATION_START) + stop_flopping() + +/obj/item/lavaland_fish/attackby(obj/item/I, mob/living/user, params) + user.changeNext_move(CLICK_CD_MELEE) + var/sharpness = is_sharp(I) + if(sharpness && user.a_intent == INTENT_HELP && do_flop_animation) + fucking_dies() + playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) + to_chat(user, span_warning("[capitalize(declent_ru(NOMINATIVE))] больше не двигается..")) + if(sharpness && user.a_intent == INTENT_HARM) + to_chat(user, span_notice("Вы начинаете разделывать [declent_ru(ACCUSATIVE)]...")) + playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1) + if(do_after(user, I.has_speed_harvest ? 1 SECONDS : 6 SECONDS, src,) && Adjacent(I)) + check_special_harvest() + harvest(user) + return ..() + +/obj/item/lavaland_fish/proc/harvest(mob/user) + if(QDELETED(src)) + return + for(var/path in butcher_loot) + for(var/i in 1 to butcher_loot[path]) + new path(loc) + butcher_loot.Remove(path) + visible_message(span_notice("[user] успешно разделыва[pluralize_ru(user.gender, "ет", "ют")] [declent_ru(ACCUSATIVE)].")) + playsound(src.loc, 'sound/goonstation/effects/gib.ogg', 50, 1) + gibs(loc) + qdel(src) + +/// Starts flopping animation +/obj/item/lavaland_fish/proc/start_flopping() + if(flopping) //Requires update_transform/animate_wrappers to be less restrictive. + return + flopping = TRUE + flop_animation(src) + +/// Stops flopping animation +/obj/item/lavaland_fish/proc/stop_flopping() + if(flopping) + flopping = FALSE + animate(src, transform = matrix()) //stop animation + +/// Refreshes flopping animation after temporary animation finishes +/obj/item/lavaland_fish/proc/on_temp_animation(datum/source, animation_duration) + if(animation_duration > 0) + addtimer(CALLBACK(src, PROC_REF(refresh_flopping)), animation_duration) + +/obj/item/lavaland_fish/proc/refresh_flopping() + if(flopping) + flop_animation(src) + +/obj/item/lavaland_fish/proc/check_special_harvest() + return + +/obj/item/lavaland_fish/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + . = ..() + if(do_flop_animation) + start_flopping() + +/obj/item/lavaland_fish/shoreline/ash_crab + name = "ash crab" + desc = "Небольшое всеядное ракообразное, обладающее на удивление крепким панцирем. Данный вид имеет интересную привычку поедать мелкие предметы, которые они находят. Лавовые крабы наиболее часто являются объектом охоты как для другой \"морской\" фауны, так и для местных племён в связи с крепким панцирем, используемым в качестве заточки, съедобным мясом и интересными находками в его желудке." + ru_names = list( + NOMINATIVE = "пепельный рак", + GENITIVE = "пепельного рака", + DATIVE = "пепельному раку", + ACCUSATIVE = "пепельного рака", + INSTRUMENTAL = "пепельным раком", + PREPOSITIONAL = "пепельном раке", + ) + icon_state = "ash_crab" + item_state = "ash_crab" + favorite_bait = /obj/item/reagent_containers/food/snacks/bait/ash_eater + butcher_loot = list( + /obj/item/whetstone/crab_shell = 1, + /obj/item/reagent_containers/food/snacks/lavaland/soft_meat = 1, + /obj/effect/spawner/random_spawners/lavaland_random_loot = 1, + ) + +/obj/item/lavaland_fish/shoreline/dead_horseman + name = "dead horseman" + desc = "Небольших размеров рыба, питающаяся преимущественно кровавыми пиявками, зарытыми в пепле. Получила своё название из-за своего характерного внешнего вида - голова всадника внешне напоминает гуманоидный череп. Ценится местными племенами в первую очередь из-за селезёнки, содержащей в себе частицы киновари и используемой для создания коричневого красителя." + ru_names = list( + NOMINATIVE = "мёртвый всадник", + GENITIVE = "мёртвого всадника", + DATIVE = "мёртвому всаднику", + ACCUSATIVE = "мёртвого всадника", + INSTRUMENTAL = "мёртвым всадником", + PREPOSITIONAL = "мёртвом всаднике", + ) + icon_state = "dead_horseman" + item_state = "dead_horseman" + favorite_bait = /obj/item/reagent_containers/food/snacks/bait/bloody_leach + butcher_loot = list( + /obj/effect/spawner/random_spawners/forty_pc_skull = 1, + /obj/item/reagent_containers/food/snacks/lavaland/soft_meat = 1, + /obj/item/lavaland_dye/cinnabar = 1, + ) + +/obj/item/lavaland_fish/shoreline/shellfish + name = "shellfish" + desc = "Одна из самых больших рыб, встречающихся у берегов Лазис Ардакса. Практически всё её тело, включая голову, покрыто багряными хрящевыми пластинами, достаточно крепкими, чтобы защищаться от большинства хищников. Внутри самой рыбы, рядом с сердцем, находится специализированный орган, собираемый местными племенами для ведения сельского хозяйства." + ru_names = list( + NOMINATIVE = "лавовый панцирник", //there is actual fish - панцирник, so our little different + GENITIVE = "лавового панцирника", + DATIVE = "лавовому панцирнику", + ACCUSATIVE = "лавового панцирника", + INSTRUMENTAL = "лавовым панцирником", + PREPOSITIONAL = "лавовом панцирнике", + ) + icon_state = "shellfish" + item_state = "shellfish" + favorite_bait = /obj/item/reagent_containers/food/snacks/bait/goldgrub_larva + butcher_loot = list( + /obj/item/stack/sheet/cartilage_plate = 2, + /obj/item/conductive_organ = 1, + /obj/item/lavaland_dye/crimson = 1, + ) + +/obj/item/lavaland_fish/deep_water/bottom_eel + name = "bottom eel" + desc = "Эта длинная склизская рыба обитает на огромной глубине, питаясь преимущественно личинками и другой мелкой рыбой. Для защиты от других хищников, эта рыба имеет бритвенно-острый хвост, который местные племена приспосабливают в качестве наконечника для копья." + ru_names = list( + NOMINATIVE = "донный угорь", + GENITIVE = "донного угря", + DATIVE = "донному угрю", + ACCUSATIVE = "донного угря", + INSTRUMENTAL = "донным угрём", + PREPOSITIONAL = "донном угре", + ) + icon_state = "bottom_eel" + item_state = "bottom_eel" + favorite_bait = /obj/item/reagent_containers/food/snacks/bait/ash_eater + butcher_loot = list( + /obj/item/reagent_containers/food/snacks/lavaland/eel_filet = 1, + /obj/item/kitchen/knife/combat/survival/bone/eel = 1, + /obj/item/lavaland_dye/indigo = 1, + ) + +/obj/item/lavaland_fish/deep_water/red_devourer + name = "red devourer" + desc = "Массивная рыба кроваво-красного окраса со множеством острых зубов внутри её пасти. Данная рыба печально известна среди племён своей агрессивностью, от чего погибло множество молодых охотников. В желудках этих рыб можно частенько найти останки менее удачливых рыбаков." + ru_names = list( + NOMINATIVE = "красный пожиратель", + GENITIVE = "красного пожирателя", + DATIVE = "красному пожирателю", + ACCUSATIVE = "красного пожирателя", + INSTRUMENTAL = "красным пожирателем", + PREPOSITIONAL = "красном пожирателе", + ) + icon_state = "red_devourer" + item_state = "red_devourer" + favorite_bait = /obj/item/reagent_containers/food/snacks/bait/bloody_leach + butcher_loot = list( + /obj/item/stack/sheet/razor_sharp_teeth = 1, + /obj/item/stack/sheet/bone = 1, + /obj/item/reagent_containers/food/snacks/bait/random = 2, + /obj/effect/spawner/random_spawners/lavaland_random_loot = 2, + /obj/item/lavaland_dye/crimson = 1, + ) + +/obj/item/lavaland_fish/deep_water/magma_hammerhead + name = "magma hammerhead" + desc = "Огромная глубоководная рыба тёмного окраса с характерной головой, отдалённо напоминающей молот. Несмотря на угрожающий внешний вид, данный тип рыб преимущественно охотится на мелких ракообразных, придавливая их своем \"молотом\" ко дну и раздавливая их панцирь. По краям их головы находятся странноватые сгустки, синергирующие с регенеративными ядрами." + ru_names = list( + NOMINATIVE = "магмовая акула-молот", + GENITIVE = "магмовой акулы-молота", + DATIVE = "магмовой акуле-молоту", + ACCUSATIVE = "магмовую акулу-молот", + INSTRUMENTAL = "магмовой акулой-молотом", + PREPOSITIONAL = "магмовой акуле-молоте", + ) + gender = FEMALE + icon_state = "magma_hammerhead" + item_state = "magma_hammerhead" + favorite_bait = /obj/item/reagent_containers/food/snacks/bait/goldgrub_larva + butcher_loot = list( + /obj/item/hivelordstabilizer/molten_mass = 2, + /obj/item/lavaland_dye/cinnabar = 1, + ) + +/obj/item/lavaland_fish/deep_water/blind_reaper + name = "blind reaper" + desc = "Самая маленькая представительница глубоководных рыб Лазис Ардакса, она привлекает к себе внимание не только небольшим размером, но и огромным костным наростом на голове, напоминающем лезвие циркулярной пилы. Данный вид, будучи лишённым зрения, использует своё лезвие в качестве биологического сонара, что помогает ей ориентироваться на огромных лавовых глубинах." + ru_names = list( + NOMINATIVE = "ослеплённый жнец", + GENITIVE = "ослеплённого жнеца", + DATIVE = "ослеплённому жнецу", + ACCUSATIVE = "ослеплённого жнеца", + INSTRUMENTAL = "ослеплённым жнецом", + PREPOSITIONAL = "ослеплённом жнеце", + ) + icon_state = "blind_reaper" + item_state = "blind_reaper" + throwforce = 20 + force = 10 + hitsound = 'sound/weapons/circsawhit.ogg' + favorite_bait = /obj/item/reagent_containers/food/snacks/bait/ash_eater + butcher_loot = list( + /obj/item/circular_saw_blade = 1, + /obj/item/reagent_containers/food/snacks/lavaland/predator_meat = 1, + /obj/item/lavaland_dye/indigo = 1, + ) + + +/obj/item/lavaland_fish/deep_water/herald_of_carnage + name = "herald of carnage" + desc = "Эта массивная рыба, имеющая в своей пасти сотни бритвенно острых зубов, признана высшим хищником среди всего подводного мира Лазис Ардакса. Её массивные зелёные глаза используются в качестве украшения для самых прославленных охотников среди местных племён. В её желудке достаточно часто находят останки других рыб. И не только рыб." + ru_names = list( + NOMINATIVE = "вестник резни", + GENITIVE = "вестника резни", + DATIVE = "вестнику резни", + ACCUSATIVE = "вестника резни", + INSTRUMENTAL = "вестником резни", + PREPOSITIONAL = "вестнике резни", + ) + icon_state = "herald_of_carnage" + item_state = "herald_of_carnage" + favorite_bait = /obj/item/reagent_containers/food/snacks/bait/bloody_leach + butcher_loot = list( + /obj/item/stack/sheet/razor_sharp_teeth = 2, + /obj/item/stack/sheet/bone = 2, + /obj/item/reagent_containers/food/snacks/lavaland/predator_meat = 1, + /obj/effect/spawner/random_spawners/lavaland_random_loot = 3, + /obj/item/lavaland_dye/mint = 1, + ) + +/obj/item/lavaland_fish/deep_water/sulfuric_tramp + name = "sulfuric tramp" + desc = "Данный вид рыб никогда не был зафиксирован ни в одной исследовательской работе по изучению фауны Лазис Ардакса - это инвазивный вид, попавший в лавовые реки в результате крушения контрабандистского судна, перевозившего фауну с неизвестной кислотной планеты. Судя по всему, эти рыбы нашли свою нишу в пищевой цепи." + ru_names = list( + NOMINATIVE = "сернистый странник", + GENITIVE = "сернистого странника", + DATIVE = "сернистому страннику", + ACCUSATIVE = "сернистого странника", + INSTRUMENTAL = "сернистым странником", + PREPOSITIONAL = "сернистом страннике", + ) + icon_state = "sulfuric_tramp" + item_state = "sulfuric_tramp" + favorite_bait = /obj/item/reagent_containers/food/snacks/bait/goldgrub_larva + butcher_loot = list( + /obj/item/t_scanner/adv_mining_scanner/bleary_eye = 1, + /obj/item/acid_bladder = 1, + /obj/item/lavaland_dye/amber = 1, + ) + +/obj/item/lavaland_fish/deep_water/sulfuric_tramp/check_special_harvest() + var/location = get_turf(src) + var/datum/reagents/reagents_list = new (500) + reagents_list.add_reagent("sacid", 2450) + + var/datum/effect_system/smoke_spread/chem/smoke = new + smoke.set_up(reagents_list, location, TRUE) + smoke.start(2) diff --git a/code/modules/mining/ash_walkers/lavaland_dye.dm b/code/modules/mining/ash_walkers/lavaland_dye.dm new file mode 100644 index 00000000000..dab5c15a87d --- /dev/null +++ b/code/modules/mining/ash_walkers/lavaland_dye.dm @@ -0,0 +1,208 @@ +/obj/item/lavaland_dye + name = "generic dye" + desc = "Если вы это видите, то Зюзя дебил конечно." + gender = FEMALE + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "cinnabar_spleen" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "spleen" + w_class = WEIGHT_CLASS_TINY + /// Name of body marking, that applies to human + var/picked_dye = "Cinnabar Dyes" + /// Name of overlay, that applies to totem + var/totem_dye = "сinnabar" + /// Fluff russian name for examine + var/fluff_name = "киноварная" + +/obj/item/lavaland_dye/cinnabar + name = "cinnabar-colored spleen" + desc = "Селезёнка, добытая из тела лавовой рыбы. Содержит в себе частицы киновари и обладает характерным коричневато-красным цветом." + ru_names = list( + NOMINATIVE = "селезёнка киноварного цвета", + GENITIVE = "селезёнки киноварного цвета", + DATIVE = "селезёнке киноварного цвета", + ACCUSATIVE = "селезёнку киноварного цвета", + INSTRUMENTAL = "селезёнкой киноварного цвета", + PREPOSITIONAL = "селезёнке киноварного цвета", + ) + icon_state = "cinnabar_spleen" + picked_dye = "Cinnabar Dyes" + totem_dye = "cinnabar" + fluff_name = "киноварная" + +/obj/item/lavaland_dye/crimson + name = "crimson-colored spleen" + desc = "Селезёнка, добытая из тела лавовой рыбы. Содержит в себе частицы неизвестной жидкости, похожей на кровь, и обладает характерным кроваво-красным цветом." + ru_names = list( + NOMINATIVE = "селезёнка кровавого цвета", + GENITIVE = "селезёнки кровавого цвета", + DATIVE = "селезёнке кровавого цвета", + ACCUSATIVE = "селезёнку кровавого цвета", + INSTRUMENTAL = "селезёнкой кровавого цвета", + PREPOSITIONAL = "селезёнке кровавого цвета", + ) + icon_state = "crimson_spleen" + picked_dye = "Crimson Dyes" + totem_dye = "crimson" + fluff_name = "кровавая" + +/obj/item/lavaland_dye/indigo + name = "indigo-colored spleen" + desc = "Селезёнка, добытая из тела лавовой рыбы. Содержит в себе вещество, похожее на чернила, и обладает характерным тёмно-синим цветом." + ru_names = list( + NOMINATIVE = "селезёнка тёмно-синего цвета", + GENITIVE = "селезёнки тёмно-синего цвета", + DATIVE = "селезёнке тёмно-синего цвета", + ACCUSATIVE = "селезёнку тёмно-синего цвета", + INSTRUMENTAL = "селезёнкой тёмно-синего цвета", + PREPOSITIONAL = "селезёнке тёмно-синего цвета", + ) + icon_state = "indigo_spleen" + picked_dye = "Indigo Dyes" + totem_dye = "indigo" + fluff_name = "тёмно-синяя" + +/obj/item/lavaland_dye/mint + name = "mint-colored spleen" + desc = "Селезёнка, добытая из тела лавовой рыбы. Содержит в себе частицы минералов и обладает характерным мятно-зелёным цветом." + ru_names = list( + NOMINATIVE = "селезёнка мятного цвета", + GENITIVE = "селезёнки мятного цвета", + DATIVE = "селезёнке мятного цвета", + ACCUSATIVE = "селезёнку мятного цвета", + INSTRUMENTAL = "селезёнкой мятного цвета", + PREPOSITIONAL = "селезёнке мятного цвета", + ) + icon_state = "mint_spleen" + picked_dye = "Mint Dyes" + totem_dye = "mint" + fluff_name = "мятная" + +/obj/item/lavaland_dye/amber + name = "amber-colored spleen" + desc = "Селезёнка, добытая из тела лавовой рыбы. Содержит в себе частицы природного янтаря и обладает характерным янтарно-желтым цветом." + ru_names = list( + NOMINATIVE = "селезёнка янтарного цвета", + GENITIVE = "селезёнки янтарного цвета", + DATIVE = "селезёнке янтарного цвета", + ACCUSATIVE = "селезёнку янтарного цвета", + INSTRUMENTAL = "селезёнкой янтарного цвета", + PREPOSITIONAL = "селезёнке янтарного цвета", + ) + icon_state = "amber_spleen" + picked_dye = "Amber Dyes" + totem_dye = "amber" + fluff_name = "янтарная" + +/obj/item/lavaland_mortar + name = "wooden mortar" + desc = "Небольшая ступка с находящейся в ней растолочённой селезёнкой. Используется для нанесения красок на тело." + ru_names = list( + NOMINATIVE = "деревянная ступка", + GENITIVE = "деревянной ступки", + DATIVE = "деревянной ступке", + ACCUSATIVE = "деревянную ступку", + INSTRUMENTAL = "деревянной ступкой", + PREPOSITIONAL = "деревянной ступке", + ) + gender = FEMALE + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "amber_dyes" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "paint" + w_class = WEIGHT_CLASS_TINY + /// Name of body marking, that applies to human + var/picked_dye = "Cinnabar Dyes" + /// Name of overlay, that applies to totem, also used in icon_states + var/totem_dye = "сinnabar" + /// Fluff russian name for examine + var/fluff_name = "киноварная" + /// How many times you can use it + var/uses = 5 + +/obj/item/lavaland_mortar/examine(mob/user) + . = ..() + . += span_notice("В ступке находится [fluff_name] краска.") + if(uses > 0) //what if someone makes -1 uses for testing or smth + . += span_notice("Краски в ступке осталось на [uses] использовани[declension_ru(uses, "е", "я", "й")].") + +/obj/item/lavaland_mortar/cinnabar_dyes + icon_state = "cinnabar_dyes" + picked_dye = "Cinnabar Dyes" + totem_dye = "cinnabar" + fluff_name = "киноварная" + +/obj/item/lavaland_mortar/crimson_dyes + icon_state = "crimson_dyes" + picked_dye = "Crimson Dyes" + totem_dye = "crimson" + fluff_name = "кровавая" + +/obj/item/lavaland_mortar/indigo_dyes + icon_state = "indigo_dyes" + picked_dye = "Indigo Dyes" + totem_dye = "indigo" + fluff_name = "тёмно-синяя" + +/obj/item/lavaland_mortar/mint_dyes + icon_state = "mint_dyes" + picked_dye = "Mint Dyes" + totem_dye = "mint" + fluff_name = "мятная" + +/obj/item/lavaland_mortar/amber_dyes + icon_state = "amber_dyes" + picked_dye = "Amber Dyes" + totem_dye = "amber" + fluff_name = "янтарная" + +/obj/item/lavaland_mortar/update_icon_state() + . = ..() + icon_state = "[totem_dye]_dyes" + +/obj/item/lavaland_mortar/attack(mob/living/carbon/human/target, mob/living/user, params, def_zone, skip_attack_anim) + if(!isunathi(target)) + balloon_alert(user, "цель неподходящей расы!") + return ..() + + if(user.a_intent != INTENT_HELP) + return ..() + + . = ATTACK_CHAIN_PROCEED + + to_chat(user, span_notice("Вы начинаете наносить краску на [target].")) + if(!do_after(user, 5 SECONDS, target, max_interact_count = 1, cancel_on_max = TRUE, cancel_message = span_warning("Вы прекращаете наносить краску на тело."))) + return ..() + + target.change_markings(picked_dye, location = "body") + uses-- + if(!uses) + balloon_alert(user, "краска закончилась!") + qdel(src) + var/obj/item/reagent_containers/food/drinks/mushroom_bowl/bowl = new(loc) + user.put_in_hands(bowl) + +/obj/item/lavaland_mortar/attack_obj(obj/object, mob/living/user, params) + if(!istype(object, /obj/structure/ash_totem)) + return ..() + + . = ATTACK_CHAIN_PROCEED_SUCCESS + + var/obj/structure/ash_totem/totem = object + to_chat(user, span_notice("Вы начинаете наносить краску на [totem.declent_ru(ACCUSATIVE)].")) + + if(!do_after(user, 5 SECONDS, totem, max_interact_count = 1, cancel_on_max = TRUE, cancel_message = span_warning("Вы прекращаете наносить краску на [totem.declent_ru(ACCUSATIVE)]."))) + return ..() + + totem.applied_dye = totem_dye + totem.applied_dye_fluff_name = fluff_name + totem.update_icon(UPDATE_OVERLAYS) + + uses-- + if(!uses) + balloon_alert(user, "краска закончилась!") + qdel(src) + var/obj/item/reagent_containers/food/drinks/mushroom_bowl/bowl = new(loc) + user.put_in_hands(bowl) diff --git a/code/modules/mining/ash_walkers/misc.dm b/code/modules/mining/ash_walkers/misc.dm new file mode 100644 index 00000000000..a3d77d92d6a --- /dev/null +++ b/code/modules/mining/ash_walkers/misc.dm @@ -0,0 +1,295 @@ +//********** Acid Bladder **********// +/obj/item/acid_bladder + name = "acid bladder" + desc = "Небольшой кислотный мешочек, добытый с тела сернистого странника. Оболочка данного пузыря достаточно слабая и вероятнее всего разорвётся при броске во что-то. Или в кого-то." + ru_names = list( + NOMINATIVE = "кислотный мешочек", + GENITIVE = "кислотного мешочка", + DATIVE = "кислотному мешочку", + ACCUSATIVE = "кислотный мешочек", + INSTRUMENTAL = "кислотным мешочком", + PREPOSITIONAL = "кислотном мешочке" + ) + gender = MALE + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "acid_bladder" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "acid_bladder" + w_class = WEIGHT_CLASS_TINY + +/obj/item/acid_bladder/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(isliving(hit_atom)) + var/mob/living/living = hit_atom + var/datum/reagents/reagents_list = new (50) + reagents_list.add_reagent("facid", 40) + living.visible_message(span_danger("Кислотный пузырек разрывается при попадании на [living], разбрызгивая кислоту по [genderize_ru(living.gender, "его", "её", "его", "их")] телу!")) + reagents_list.reaction(living, REAGENT_TOUCH) + reagents_list.clear_reagents() + else if(iswallturf(hit_atom)) + var/turf/simulated/wall/wall_target = hit_atom + hit_atom.visible_message(span_danger("Кислотный пузырек разрывается при попадании на стену, медленно её расплавляя!")) + wall_target.rot() + else + var/datum/reagents/reagents_list = new (100) + reagents_list.add_reagent("facid", 80) + reagents_list.reaction(hit_atom, REAGENT_TOUCH) + qdel(src) + +//********** Saw Blade **********// +/obj/item/circular_saw_blade + name = "circular saw blade" + desc = "Костный нарост, похожий на лезвие циркулярной пилы, вырванный из черепа ослеплённого жнеца. Может быть использован для улучшения костяного топора." + ru_names = list( + NOMINATIVE = "лезвие дисковой пилы", + GENITIVE = "лезвия дисковой пилы", + DATIVE = "лезвию дисковой пилы", + ACCUSATIVE = "лезвие дисковой пилы", + INSTRUMENTAL = "лезвием дисковой пилы", + PREPOSITIONAL = "лезвии дисковой пилы" + ) + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "circular_saw_blade" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "circular_saw_blade" + w_class = WEIGHT_CLASS_TINY + +//**********Grace of Lazis **********// +/obj/structure/grace_of_lazis + name = "grace of lazis" + desc = "Огромное количество мяса, насаженного на костяное копье. Символ невероятно удачного сезона охоты." + ru_names = list( + NOMINATIVE = "благодать Лазис Ардакса", + GENITIVE = "благодати Лазис Ардакса", + DATIVE = "благодати Лазис Ардакса", + ACCUSATIVE = "благодать Лазис Ардакса", + INSTRUMENTAL = "благодатью Лазис Ардакса", + PREPOSITIONAL = "благодати Лазис Ардакса" + ) + gender = FEMALE + icon = 'icons/obj/lavaland/grace_of_lazis.dmi' + icon_state = "grace_of_lazis4" + anchored = TRUE + density = TRUE + max_integrity = 1000 + var/meat_parts = 40 + +/obj/structure/grace_of_lazis/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/kitchen/knife)) + return ..() + + to_chat(user, span_notice("Вы начинаете отрезать порцию мяса от постамента.")) + + if(!do_after(user, 3 SECONDS, src, max_interact_count = 1)) + return ..() + + meat_parts-- + update_icon(UPDATE_ICON_STATE) + to_chat(user, span_notice("Вы отрезаете порцию мяса с постамента.")) + var/obj/item/reagent_containers/food/snacks/lavaland_food/grace_of_lazis/food = new() + user.put_in_hands(food) + if(meat_parts == 0) + visible_message(span_warning("От постамента остаётся лишь одно копье!")) + new /obj/item/twohanded/spear/bonespear(src.loc) + qdel(src) + return ATTACK_CHAIN_PROCEED + return ATTACK_CHAIN_BLOCKED + +/obj/structure/grace_of_lazis/update_icon_state() + switch(meat_parts) + if(1 to 10) + icon_state = "grace_of_lazis1" + if(11 to 20) + icon_state = "grace_of_lazis2" + if(21 to 30) + icon_state = "grace_of_lazis3" + if(31 to INFINITY) + icon_state = "grace_of_lazis4" + +//**********Food Scroll**********// +/obj/item/book/manual/lavaland_scroll + name = "cooking scroll" + desc = "Пергамент, изготовленный из человеческой кожи. На нём нанесена информация о том, как прокормить голодное племя." + ru_names = list( + NOMINATIVE = "свиток готовки", + GENITIVE = "свитка готовки", + DATIVE = "свитку готовки", + ACCUSATIVE = "свиток готовки", + INSTRUMENTAL = "свитком готовки", + PREPOSITIONAL = "свитке готовки" + ) + gender = MALE + icon_state = "food_scroll" + item_state = "food_scroll" + author = "Шаман голодного племени" + title = "Руководство по Готовке" + wiki_title = "Еда_пеплоходцев" + +/obj/structure/fluff/ash_statue //used to mark point of interest + name = "тотем" + desc = "Массивный каменный столб с прикреплённым к нему черепом убитого зверя. Кажется, вы зашли в охотничьи угодья пеплоходцев." + ru_names = list( + NOMINATIVE = "пепельный тотем", + GENITIVE = "пепельного тотема", + DATIVE = "пепельному тотему", + ACCUSATIVE = "пепельный тотем", + INSTRUMENTAL = "пепельным тотемом", + PREPOSITIONAL = "пепельном тотеме" + ) + icon = 'icons/obj/lavaland/grace_of_lazis.dmi' + icon_state = "totem_stone" + anchored = TRUE + density = TRUE + deconstructible = FALSE + /// Used in shaman spell. Perfect for finding stuff ic + var/special_name = "точка интереса" + +/obj/structure/fluff/ash_statue/Initialize(mapload) + name = "тотем - [special_name]" + GLOB.lavaland_points_of_interest += src + . = ..() + +/obj/structure/fluff/ash_statue/Destroy(force) + GLOB.lavaland_points_of_interest -= src + . = ..() + + +/obj/structure/ash_totem + name = "totem" + desc = "Совершенно обычный тотем! Выглядит прикольно. Вы не должны видеть это." + ru_names = list( + NOMINATIVE = "тотем", + GENITIVE = "тотема", + DATIVE = "тотему", + ACCUSATIVE = "тотем", + INSTRUMENTAL = "тотемом", + PREPOSITIONAL = "тотеме" + ) + gender = MALE + icon = 'icons/obj/lavaland/grace_of_lazis.dmi' + icon_state = "totem_wooden" + max_integrity = 1000 + anchored = TRUE + density = TRUE + var/applied_dye = null + var/applied_dye_fluff_name = null + +/obj/structure/ash_totem/examine(mob/user) + . = ..() + . += span_notice("Эта статуя может использоваться вместо полноценного пеплоходца, если будет построена у ритуальной руны.") + + if(applied_dye && applied_dye_fluff_name) //jeez this is so hard to make it in russian holy fuck + . += span_notice("На эту статую нанесена [applied_dye_fluff_name] краска.") + +/obj/structure/ash_totem/update_overlays() + . = ..() + if(applied_dye) + . += "[icon_state]_[applied_dye]" + + +/obj/structure/ash_totem/wooden + name = "wooden totem" + desc = "Массивная статуя, сделанная из цельного куска древесины. Рисунок на статуе отдалённо напоминает человеческое лицо, искаженное в гримасе ужаса." + ru_names = list( + NOMINATIVE = "деревянный тотем", + GENITIVE = "деревянного тотема", + DATIVE = "деревянному тотему", + ACCUSATIVE = "деревянный тотем", + INSTRUMENTAL = "деревянным тотемом", + PREPOSITIONAL = "деревянном тотеме" + ) + icon_state = "totem_wooden" + +/obj/structure/ash_totem/stone + name = "stone totem" + desc = "Массивная каменная статуя с прикреплённым к ней черепом убитого животного. Сухожилия, держащие череп на месте, медленно покачиваются на ветру." + ru_names = list( + NOMINATIVE = "каменный тотем", + GENITIVE = "каменного тотема", + DATIVE = "каменному тотему", + ACCUSATIVE = "каменный тотем", + INSTRUMENTAL = "каменным тотемом", + PREPOSITIONAL = "каменном тотеме" + ) + icon_state = "totem_stone" + +/obj/structure/ash_totem/bone + name = "bone totem" + desc = "Массивная статуя, сделанная из огромной кости. Вы не знаете, какому именно животному принадлежит эта кость, и вы явно не хотите это узнавать." + ru_names = list( + NOMINATIVE = "костяной тотем", + GENITIVE = "костяного тотема", + DATIVE = "костяному тотему", + ACCUSATIVE = "костяной тотем", + INSTRUMENTAL = "костяным тотемом", + PREPOSITIONAL = "костяном тотеме" + ) + icon_state = "totem_bone" + +/obj/structure/chair/stool/wooden + name = "wooden stool" + desc = "Деревянная табуретка. Достаточно удобная, чтобы на ней сидеть." + ru_names = list( + NOMINATIVE = "деревянная табуретка", + GENITIVE = "деревянной табуретки", + DATIVE = "деревянной табуретке", + ACCUSATIVE = "деревянную табуретку", + INSTRUMENTAL = "деревянной табуреткой", + PREPOSITIONAL = "деревянной табуретке" + ) + gender = FEMALE + icon_state = "wooden_stool" + item_chair = /obj/item/chair/stool/wooden + +/obj/item/chair/stool/wooden + name = "wooden stool" + desc = "Деревянная табуретка. Достаточно удобная, чтобы держать её в руках." + ru_names = list( + NOMINATIVE = "деревянная табуретка", + GENITIVE = "деревянной табуретки", + DATIVE = "деревянной табуретке", + ACCUSATIVE = "деревянную табуретку", + INSTRUMENTAL = "деревянной табуреткой", + PREPOSITIONAL = "деревянной табуретке" + ) + gender = FEMALE + icon = 'icons/obj/chairs.dmi' + icon_state = "wooden_stool_toppled" + lefthand_file = 'icons/mob/inhands/lavaland/misc_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/misc_righthand.dmi' + item_state = "wooden_stool" + force = 8 + origin_type = /obj/structure/chair/stool/wooden + break_chance = 10 + +/obj/structure/rack/wooden + name = "wooden rack" + desc = "Небольшой стеллаж, сделанный из дерева. Вы можете хранить на нём вещи!" + ru_names = list( + NOMINATIVE = "деревянный стеллаж", + GENITIVE = "деревянного стеллажа", + DATIVE = "деревянному стеллажу", + ACCUSATIVE = "деревянный стеллаж", + INSTRUMENTAL = "деревянным стеллажом", + PREPOSITIONAL = "деревянном стеллаже" + ) + icon_state = "wooden_rack" + wooden_version = TRUE + obj_flags = NODECONSTRUCT + +/obj/structure/rack/wooden/Initialize(mapload) + . = ..() + update_overlays() + +/obj/structure/rack/wooden/wrench_act(mob/user, obj/item/I) + return + +/obj/structure/rack/wooden/MouseDrop_T(obj/item/dropping, mob/user, params) + . = ..() + update_icon(UPDATE_OVERLAYS) + +/obj/structure/rack/wooden/update_overlays() + overlays.Cut() + overlays += image('icons/obj/objects.dmi', src, "wooden_rack_overlay", ABOVE_OBJ_LAYER) diff --git a/code/modules/mining/ash_walkers/torch_holder.dm b/code/modules/mining/ash_walkers/torch_holder.dm new file mode 100644 index 00000000000..be1c05352c6 --- /dev/null +++ b/code/modules/mining/ash_walkers/torch_holder.dm @@ -0,0 +1,279 @@ +//special torch lamps + +#define TORCH_OK 0 +#define TORCH_EMPTY 1 +#define TORCH_OFF 2 +#define TORCH_BURNED 3 + +/obj/item/mounted/frame/torch_holder + name = "torch holder" + desc = "Один из самых популярных способов осветить пространство в средневековых замках." + ru_names = list( + NOMINATIVE = "крепление для факела", + GENITIVE = "крепления для факела", + DATIVE = "креплению для факела", + ACCUSATIVE = "крепление для факела", + INSTRUMENTAL = "креплением для факела", + PREPOSITIONAL = "креплении для факела", + ) + icon = 'icons/obj/lighting.dmi' + icon_state = "torch_holder_item" + mount_reqs = list("simfloor", "nospace") + +/obj/item/mounted/frame/torch_holder/do_build(turf/on_wall, mob/user) + to_chat(user, span_notice("Вы начинаете устанавливать [declent_ru(ACCUSATIVE)] на [on_wall.declent_ru(ACCUSATIVE)].")) + playsound(get_turf(src), 'sound/machines/click.ogg', 75, 1) + + var/constrdir = user.dir + var/constrloc = get_turf(user) + if(!do_after(user, 4 SECONDS, on_wall, max_interact_count = 1, cancel_on_max = TRUE, cancel_message = span_notice("Вы прекращаете устанавливать [declent_ru(ACCUSATIVE)]."))) + return + + var/obj/structure/torch_holder/built/torch = new(constrloc) + torch.dir = constrdir + torch.fingerprints = src.fingerprints + torch.fingerprintshidden = src.fingerprintshidden + torch.fingerprintslast = src.fingerprintslast + user.visible_message(span_notice("[user] устанавлива[pluralize_ru(user.gender, "ет", "ют")] [declent_ru(ACCUSATIVE)] на [on_wall.declent_ru(ACCUSATIVE)]"), \ + span_notice("вы устанавливаете [declent_ru(ACCUSATIVE)] на [on_wall.declent_ru(ACCUSATIVE)].")) + qdel(src) + +/obj/structure/torch_holder + name = "torch holder" + desc = "Красиво выглядящее крепление для факела." + ru_names = list( + NOMINATIVE = "крепление для факела", + GENITIVE = "крепления для факела", + DATIVE = "креплению для факела", + ACCUSATIVE = "крепление для факела", + INSTRUMENTAL = "креплением для факела", + PREPOSITIONAL = "креплении для факела", + ) + icon = 'icons/obj/lighting.dmi' + icon_state = "torch_holder" + /// Our torch, that stored in holder + var/obj/item/flashlight/flare/torch/fakel + /// For mapping. Ancient torches can't be taken away and they are infinite + var/ancient = FALSE + /// Light range when on. Standart torch is brighter, this is for mapping reason. + var/brightness_range = 5 + /// Light colour when on + var/brightness_color = "#dc8a38" + /// Light power when on + var/brightness_power = 1 + /// Torch holder status (TORCH_OK | TORCH_EMPTY | TORCH_OFF | TORCH_BURNED) + var/status = TORCH_OK + /// Fuel consumption + var/fuel = 0 + /// New torch related stuff + var/fuel_lower = 0 + var/fuel_upp = 0 + /// Timer for our torch. + var/timer = null + +/obj/structure/torch_holder/Initialize(mapload) //mapping version, preloaded with torch + . = ..() + fakel = new(src) + fuel = fakel.fuel + update_icon(UPDATE_OVERLAYS) + update_light_state() + if(TORCH_OK && !ancient) + timer = addtimer(CALLBACK(src, PROC_REF(burnout)), fuel SECONDS, TIMER_STOPPABLE|TIMER_UNIQUE) //hope this works + +/obj/structure/torch_holder/Destroy() + . = ..() + QDEL_NULL(fakel) + deltimer(timer) + +/obj/structure/torch_holder/examine(mob/user) + . = ..() + switch(status) + if(TORCH_OK) + . += span_notice("[capitalize(fakel.declent_ru(NOMINATIVE))] ярко горит.") + if(TORCH_EMPTY) + . += span_notice("Внутри нет факела.") + if(TORCH_OFF) + . += span_notice("[capitalize(fakel.declent_ru(NOMINATIVE))] не подожжён.") + if(TORCH_BURNED) + . += span_notice("[capitalize(fakel.declent_ru(NOMINATIVE))] выгорел.") + +/obj/structure/torch_holder/proc/update_light_state() //I can't make it better.. + switch(status) + if(TORCH_OFF, TORCH_BURNED, TORCH_EMPTY) + set_light(0) + return + else + light_range = brightness_range + light_power = brightness_power + light_color = brightness_color + update_light() + +/obj/structure/torch_holder/proc/burnout() + if(ancient) + return + fuel = 0 //if someone will take our fakel + status = TORCH_BURNED + update_light_state() + update_icon(UPDATE_OVERLAYS) + deltimer(timer) + +/obj/structure/torch_holder/update_overlays() + . = ..() + if(ancient) + return + overlays.Cut() + switch(status) // set overlays + if(TORCH_OK) + overlays += "torch_overlay" + if(TORCH_OFF, TORCH_BURNED) + overlays += "torch_overlay_not_light" + if(TORCH_EMPTY) + overlays += "" + +/obj/structure/torch_holder/attackby(obj/item/item, mob/user, params) + if(user.a_intent == INTENT_HARM) + return ..() + + if(ancient) + return ..() + + if(istype(item, /obj/item/flashlight/flare/torch)) + var/obj/item/flashlight/flare/torch/torch = item + + if(status != TORCH_EMPTY) + if(status == TORCH_OFF && torch.on) + balloon_alert(user, "факел подожжён!") + status = TORCH_OK + update_icon(UPDATE_OVERLAYS) + + brightness_range = torch.light_range + brightness_power = torch.light_power + brightness_color = torch.light_color + + update_light_state() + timer = addtimer(CALLBACK(src, PROC_REF(burnout)), fuel SECONDS, TIMER_STOPPABLE|TIMER_UNIQUE) + return ATTACK_CHAIN_BLOCKED_ALL + else + balloon_alert(user, "уже есть!") + return ATTACK_CHAIN_PROCEED + else + add_fingerprint(user) + + if(!torch.fuel) + balloon_alert(user, "ваш факел выгорел!") + return ATTACK_CHAIN_PROCEED + balloon_alert(user, "факел установлен") + if(!torch.on) + status = TORCH_OFF + else + status = TORCH_OK + + set_light_range_power_color(torch.light_range, torch.light_power, torch.light_color) + + fuel = torch.fuel + fuel_lower = torch.fuel_lower + fuel_upp = torch.fuel_upp + update_icon(UPDATE_OVERLAYS) + update_light_state() + if(status == TORCH_OK) + timer = addtimer(CALLBACK(src, PROC_REF(burnout)), fuel SECONDS, TIMER_STOPPABLE|TIMER_UNIQUE) + user.drop_transfer_item_to_loc(torch, src) //drop the item to update overlays and such + qdel(torch) + return ATTACK_CHAIN_BLOCKED_ALL + +/obj/structure/torch_holder/attack_hand(mob/user) + if(ancient) + balloon_alert(user, "невозможно вынуть!") + return FALSE + + user.changeNext_move(CLICK_CD_MELEE) + add_fingerprint(user) + + if(status == TORCH_EMPTY) + balloon_alert(user, "внутри пусто!") + return FALSE + + // make it burn hands if not wearing fire-insulated gloves + if(status == TORCH_OK) + var/prot = 0 + var/mob/living/carbon/human/H = user + if(istype(H)) + if(H.gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(G.max_heat_protection_temperature) + prot = (G.max_heat_protection_temperature > fakel.get_heat()) + else + prot = 1 + + if(prot > 0 || HAS_TRAIT(user, TRAIT_RESIST_HEAT)) + to_chat(user, span_notice("Вы вытаскиваете [fakel.declent_ru(ACCUSATIVE)].")) + else if(HAS_TRAIT(user, TRAIT_TELEKINESIS)) + to_chat(user, span_notice("Вы вытаскиваете [fakel.declent_ru(ACCUSATIVE)] с помощью телекинеза.")) + else + if(user.a_intent == INTENT_DISARM || user.a_intent == INTENT_GRAB) + to_chat(user, span_warning("Вы пытаетесь вытащить [fakel.declent_ru(ACCUSATIVE)], но обжигаетесь в процессе!")) + H.apply_damage(5, BURN, def_zone = H.hand ? BODY_ZONE_PRECISE_L_HAND : BODY_ZONE_PRECISE_R_HAND) + return FALSE + else + to_chat(user, span_warning("Вы пытаетесь вытащить [fakel.declent_ru(ACCUSATIVE)], но он слишком горячий!")) + return FALSE + else + balloon_alert(user, "факел вынут") + + drop_fakel(user) + +/obj/structure/torch_holder/proc/drop_fakel(mob/user) + var/obj/item/flashlight/flare/torch/torch = new(src) + if(status == TORCH_OK) + torch.attack_self(user)//forcing it to light up and start processing + var/our_fuel = timeleft(timer) / 10 + torch.fuel = our_fuel + + torch.set_light_range_power_color(brightness_range, brightness_power, brightness_color) + + torch.update_brightness() + + torch.forceMove(loc) + if(user) //puts it in our active hand + torch.add_fingerprint(user) + user.put_in_active_hand(torch, ignore_anim = FALSE) + + status = TORCH_EMPTY + update_icon(UPDATE_OVERLAYS) + update_light_state() + deltimer(timer) + return torch + +/obj/structure/torch_holder/mapping //infinite mapping version + name = "ancient torch holder" + desc = "Красиво выглядящее крепление для факела. Поверхность проржавела от времени, а сам факел практически прирос к креплению." + ru_names = list( + NOMINATIVE = "древнее крепление для факела", + GENITIVE = "древнего крепления для факела", + DATIVE = "древнему креплению для факела", + ACCUSATIVE = "древнее крепление для факела", + INSTRUMENTAL = "древним креплением для факела", + PREPOSITIONAL = "древнем креплении для факела", + ) + icon_state = "torch_holder_complete" + ancient = TRUE + +/obj/structure/torch_holder/mapping/Initialize(mapload) + . = ..() + fuel = INFINITY + +/obj/structure/torch_holder/built/Initialize(mapload) + status = TORCH_EMPTY + ..() + +/obj/structure/torch_holder/extinguish_light(force = FALSE) + if(force) + burnout() + visible_message(span_danger("[capitalize(fakel.declent_ru(NOMINATIVE))] быстро выгорает!")) + else + visible_message(span_notice("[capitalize(fakel.declent_ru(NOMINATIVE))] ненадолго меркнет, после чего снова начинает освещать пространство вокруг.")) + +#undef TORCH_OK +#undef TORCH_EMPTY +#undef TORCH_OFF +#undef TORCH_BURNED diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index d19ac21d4f6..43e2b6876e9 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -741,23 +741,3 @@ else forcedodge = 0 ..() - -//almost ready magmite crusher -/obj/item/twohanded/kinetic_crusher/almost - icon_state = "magmite_crusher" - item_state = "magmite_crusher0" - name = "unfinished proto-kinetic crusher" - desc = "Ранний дизайн прото-кинетического акселератора, теперь являющийся кучей различных шахтёрских иструментов приваренных друг к другу плазменным магмитом. Судя по всему, магмитовых деталей на улучшение его дестабилизатора было недостаточно." - ru_names = list( - NOMINATIVE = "незавершенный прото-кинетический крушитель", - GENITIVE = "незавершенного прото-кинетического крушителя", - DATIVE = "незавершенному прото-кинетическому крушителю", - ACCUSATIVE = "незавершенный прото-кинетический крушитель", - INSTRUMENTAL = "незавершенным прото-кинетическим крушителем", - PREPOSITIONAL = "незавершенном прото-кинетическом крушителе" - ) - upgraded = TRUE - -/obj/item/twohanded/kinetic_crusher/almost/examine(mob/living/user) - . = ..() - . += span_notice("Возможно, вы можете применить ещё немного магмитовых деталей, чтобы полностью улучшить ваш крушитель.") diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index 562ca3ba0f0..1c0fb75be78 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -127,3 +127,39 @@ /obj/effect/temp_visual/mining_overlay/Initialize(mapload) . = ..() animate(src, alpha = 0, time = duration, easing = EASE_IN) + +/obj/item/t_scanner/adv_mining_scanner/bleary_eye + name = "bleary eye" + desc = "Глаз, вырванный из тела массивного сернистого странника. Даже спустя долгое время, он всё ещё движется и внимательно осматривает местность в поисках руды." + ru_names = list( + NOMINATIVE = "затуманенный глаз", + GENITIVE = "затуманенного глаза", + DATIVE = "затуманенному глазу", + ACCUSATIVE = "затуманенный глаз", + INSTRUMENTAL = "затуманенным глазом", + PREPOSITIONAL = "затуманенном глазе" + ) + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "bleary_eye" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "bleary_eye" + flags = NONE + materials = null + origin_tech = "magnets=6;biotech=6" + speaker = FALSE + range = 4 + cooldown = 3 SECONDS + +/obj/item/t_scanner/adv_mining_scanner/bleary_eye/Initialize(mapload) + . = ..() + toggle_mode() + +/obj/item/t_scanner/adv_mining_scanner/bleary_eye/update_icon_state() + return + +/obj/item/t_scanner/adv_mining_scanner/bleary_eye/attack_self(mob/user) + return + +/obj/item/t_scanner/adv_mining_scanner/bleary_eye/AltClick(mob/user) + return diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 6aec9222ea5..f92a59a7791 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -1,6 +1,16 @@ /*****************Pickaxes & Drills & Shovels****************/ /obj/item/pickaxe name = "pickaxe" + desc = "Стандартная кирка, предназначенная для разрушения камней." + ru_names = list( + NOMINATIVE = "кирка", + GENITIVE = "кирки", + DATIVE = "кирке", + ACCUSATIVE = "кирку", + INSTRUMENTAL = "киркой", + PREPOSITIONAL = "кирке" + ) + gender = FEMALE icon = 'icons/obj/items.dmi' icon_state = "pickaxe" flags = CONDUCT @@ -11,7 +21,7 @@ w_class = WEIGHT_CLASS_BULKY materials = list(MAT_METAL=2000) //one sheet, but where can you make them? origin_tech = "materials=2;engineering=3" - attack_verb = list("ударил", "проколол", "атаковал") + attack_verb = list("ударил", "уколол", "атаковал") var/drill_verb = "picking" sharp = 1 embed_chance = 15 @@ -23,19 +33,49 @@ /obj/item/pickaxe/emergency name = "emergency disembarkation tool" - desc = "For extracting yourself from rough landings." + desc = "Кирка, предназначенная для спасения из затруднительных ситуаций." + ru_names = list( + NOMINATIVE = "инструмент для экстренной раскопки", + GENITIVE = "инструмента для экстренной раскопки", + DATIVE = "инструменту для экстренной раскопки", + ACCUSATIVE = "инструмент для экстренной раскопки", + INSTRUMENTAL = "инструментом для экстренной раскопки", + PREPOSITIONAL = "инструменте для экстренной раскопки" + ) + gender = MALE + icon_state = "emergency_disembarkation_tool" + item_state = "emergency_disembarkation_tool" /obj/item/pickaxe/safety name = "safety pickaxe" - desc = "A pickaxe designed to be only effective at digging rock and ore, very ineffective as a weapon." + desc = "Кирка, специально спроектированная исключительно для добычи ресурсов. Крайне неэффективна в качестве оружия." + ru_names = list( + NOMINATIVE = "безопасная кирка", + GENITIVE = "безопасной кирки", + DATIVE = "безопасной кирке", + ACCUSATIVE = "безопасную кирку", + INSTRUMENTAL = "безопасной киркой", + PREPOSITIONAL = "безопасной кирке" + ) + icon_state = "safety_pickaxe" + item_state = "safety_pickaxe" force = 1 throwforce = 1 attack_verb = list("неэффективно ударил") /obj/item/pickaxe/mini name = "compact pickaxe" - desc = "A smaller, compact version of the standard pickaxe." - icon_state = "minipick" + desc = "Сильно уменьшенная версия стандартной кирки." + ru_names = list( + NOMINATIVE = "компактная кирка", + GENITIVE = "компактной кирки", + DATIVE = "компактной кирке", + ACCUSATIVE = "компактую кирку", + INSTRUMENTAL = "компактной киркой", + PREPOSITIONAL = "компактной кирке" + ) + icon_state = "compact_pickaxe" + item_state = "compact_pickaxe" force = 10 throwforce = 7 w_class = WEIGHT_CLASS_NORMAL @@ -43,47 +83,87 @@ /obj/item/pickaxe/silver name = "silver-plated pickaxe" + desc = "Кирка, сделанная из серебра. Она показывает себя слегка лучше в добыче ресурсов, чем стандартная." + ru_names = list( + NOMINATIVE = "кирка с серебрянным наконечником", + GENITIVE = "кирки с серебрянным наконечником", + DATIVE = "кирке с серебрянным наконечником", + ACCUSATIVE = "кирку с серебрянным наконечником", + INSTRUMENTAL = "киркой с серебрянным наконечником", + PREPOSITIONAL = "кирке с серебрянным наконечником" + ) icon_state = "spickaxe" item_state = "spickaxe" belt_icon = "silver-plated pickaxe" origin_tech = "materials=3;engineering=4" toolspeed = 0.4 //mines faster than a normal pickaxe, bought from mining vendor - desc = "A silver-plated pickaxe that mines slightly faster than standard-issue." force = 17 /obj/item/pickaxe/gold - name = "golden pickaxe" + name = "gold-tipped pickaxe" + desc = "Кирка, сделанная из золота. Она показывает себя значительно лучше в добыче ресурсов, чем стандартная." + ru_names = list( + NOMINATIVE = "кирка с золотым наконечником", + GENITIVE = "кирки с золотым наконечником", + DATIVE = "кирке с золотым наконечником", + ACCUSATIVE = "кирку с золотым наконечником", + INSTRUMENTAL = "киркой с золотым наконечником", + PREPOSITIONAL = "кирке с золотым наконечником" + ) icon_state = "gpickaxe" item_state = "gpickaxe" belt_icon = "golden pickaxe" origin_tech = "materials=4;engineering=4" toolspeed = 0.3 - desc = "A gold-plated pickaxe that mines faster than standard-issue." force = 18 /obj/item/pickaxe/diamond name = "diamond-tipped pickaxe" + desc = "Кирка с алмазным наконечником. Крайне эффективна в добыче камня и вскапывании земли." + ru_names = list( + NOMINATIVE = "кирка с алмазным наконечником", + GENITIVE = "кирки с алмазным наконечником", + DATIVE = "кирке с алмазным наконечником", + ACCUSATIVE = "кирку с алмазным наконечником", + INSTRUMENTAL = "киркой с алмазным наконечником", + PREPOSITIONAL = "кирке с алмазным наконечником" + ) icon_state = "dpickaxe" item_state = "dpickaxe" belt_icon = "diamond-tipped pickaxe" origin_tech = "materials=5;engineering=4" toolspeed = 0.2 - desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt." force = 19 /obj/item/pickaxe/drill name = "mining drill" + desc = "Электрическая буровая дрелль, используемая теми, для кого кирка слишком тяжела в обращении." + ru_names = list( + NOMINATIVE = "шахтёрская дрель", + GENITIVE = "шахтёрской дрели", + DATIVE = "шахтёрской дрели", + ACCUSATIVE = "шахтёрскую дрель", + INSTRUMENTAL = "шахтёрской дрелью", + PREPOSITIONAL = "шахтёрской дрели" + ) icon_state = "handdrill" item_state = "jackhammer" toolspeed = 0.4 //available from roundstart, faster than a pickaxe. hitsound = 'sound/weapons/drill.ogg' usesound = 'sound/weapons/drill.ogg' origin_tech = "materials=2;powerstorage=2;engineering=3" - desc = "An electric mining drill for the especially scrawny." /obj/item/pickaxe/drill/cyborg name = "cyborg mining drill" - desc = "An integrated electric mining drill." + desc = "Встроенная электрическая буровая дрелль." + ru_names = list( + NOMINATIVE = "шахтёрская дрель робота", + GENITIVE = "шахтёрской дрели робота", + DATIVE = "шахтёрской дрели робота", + ACCUSATIVE = "шахтёрскую дрель робота", + INSTRUMENTAL = "шахтёрской дрелью робота", + PREPOSITIONAL = "шахтёрской дрели робота" + ) /obj/item/pickaxe/drill/cyborg/Initialize(mapload) @@ -93,30 +173,63 @@ /obj/item/pickaxe/drill/diamonddrill name = "diamond-tipped mining drill" + desc = "У тебя есть дрель, которая пронзит небеса!" + ru_names = list( + NOMINATIVE = "алмазная шахтёрская дрель", + GENITIVE = "алмазной шахтёрской дрели", + DATIVE = "алмазной шахтёрской дрели", + ACCUSATIVE = "алмазную шахтёрскую дрель", + INSTRUMENTAL = "алмазной шахтёрской дрелью", + PREPOSITIONAL = "алмазной шахтёрской дрели" + ) icon_state = "diamonddrill" origin_tech = "materials=6;powerstorage=4;engineering=4" - desc = "Yours is the drill that will pierce the heavens!" toolspeed = 0.1 /obj/item/pickaxe/drill/cyborg/diamond //This is the BORG version! name = "diamond-tipped cyborg mining drill" //To inherit the NODROP trait, and easier to change borg specific drill mechanics. + ru_names = list( + NOMINATIVE = "алмазная шахтёрская дрель робота", + GENITIVE = "алмазной шахтёрской дрели робота", + DATIVE = "алмазной шахтёрской дрели робота", + ACCUSATIVE = "алмазную шахтёрскую дрель робота", + INSTRUMENTAL = "алмазной шахтёрской дрелью робота", + PREPOSITIONAL = "алмазной шахтёрской дрели робота" + ) icon_state = "diamonddrill" toolspeed = 0.1 /obj/item/pickaxe/drill/jackhammer name = "sonic jackhammer" + desc = "Уничтожает камни с использованием звука, может использоваться как инструмент для сноса стен." + ru_names = list( + NOMINATIVE = "звуковой отбойный молот", + GENITIVE = "звукового отбойного молота", + DATIVE = "звуковому отбойному молоту", + ACCUSATIVE = "звуковой отбойный молот", + INSTRUMENTAL = "звуковым отбойным молотом", + PREPOSITIONAL = "звуковом отбойным молоте" + ) icon_state = "jackhammer" item_state = "jackhammer" origin_tech = "materials=6;powerstorage=4;engineering=5;magnets=4" hitsound = 'sound/weapons/sonic_jackhammer.ogg' usesound = 'sound/weapons/sonic_jackhammer.ogg' - desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls." toolspeed = 0.0 //the epitome of powertools, literally instant var/wall_toolspeed = 0.1 //instant wall breaking is bad. /obj/item/shovel name = "shovel" - desc = "A large tool for digging and moving dirt." + desc = "Массивный инструмент для вскапывания и перемещения земли." + ru_names = list( + NOMINATIVE = "лопата", + GENITIVE = "лопаты", + DATIVE = "лопате", + ACCUSATIVE = "лопату", + INSTRUMENTAL = "лопатой", + PREPOSITIONAL = "лопате" + ) + gender = FEMALE icon = 'icons/obj/items.dmi' icon_state = "shovel" flags = CONDUCT @@ -134,7 +247,15 @@ /obj/item/shovel/spade name = "spade" - desc = "A small tool for digging and moving dirt." + desc = "Маленький инструмент для вскапывания и перемещения земли." + ru_names = list( + NOMINATIVE = "лопатка", + GENITIVE = "лопатки", + DATIVE = "лопатке", + ACCUSATIVE = "лопатку", + INSTRUMENTAL = "лопаткой", + PREPOSITIONAL = "лопатке" + ) icon_state = "spade" item_state = "spade" belt_icon = "spade" @@ -142,9 +263,35 @@ throwforce = 7 w_class = WEIGHT_CLASS_SMALL +/obj/item/shovel/spade/wooden + name = "wooden spade" + desc = "Маленький инструмент для вскапывания и перемещения земли. Эта модель сделана из древесины." + ru_names = list( + NOMINATIVE = "деревянная лопатка", + GENITIVE = "деревянной лопатки", + DATIVE = "деревянной лопатке", + ACCUSATIVE = "деревянную лопатку", + INSTRUMENTAL = "деревянной лопаткой", + PREPOSITIONAL = "деревянной лопатке" + ) + icon_state = "wooden_spade" + lefthand_file = 'icons/mob/inhands/lavaland/misc_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/misc_righthand.dmi' + item_state = "small_shovel" + /obj/item/shovel/safety name = "safety shovel" - desc = "A large tool for digging and moving dirt. Was modified with extra safety, making it ineffective as a weapon." + desc = "Массивный инструмент для вскапывания и перемещения земли. Данная версия была модифицирована для большей безопасности и крайне неэффективна в качестве оружия." + ru_names = list( + NOMINATIVE = "безопасная лопата", + GENITIVE = "безопасной лопаты", + DATIVE = "безопасной лопате", + ACCUSATIVE = "безопасную лопату", + INSTRUMENTAL = "безопасной лопатой", + PREPOSITIONAL = "безопасной лопате" + ) + icon_state = "safety_shovel" + item_state = "safety_shovel" force = 1 throwforce = 1 attack_verb = list("неэффективно ударил") diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index f5e4e53df4b..18139590fcc 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -1,12 +1,36 @@ /*********************Hivelord stabilizer****************/ /obj/item/hivelordstabilizer name = "hivelord stabilizer" + desc = "Inject a hivelord core with this stabilizer to preserve its healing powers indefinitely." + gender = MALE icon = 'icons/obj/chemical.dmi' icon_state = "bottle19" - desc = "Inject a hivelord core with this stabilizer to preserve its healing powers indefinitely." w_class = WEIGHT_CLASS_TINY origin_tech = "biotech=3" +/obj/item/hivelordstabilizer/molten_mass + name = "gooey molten mass" + desc = "Странноватые сгустки, снятые с головы магмового рыбы-молота. Являются природным аналогом стабилизатора регенеративных ядер." + ru_names = list( + NOMINATIVE = "сплавленный сгусток", + GENITIVE = "сплавленного сгустка", + DATIVE = "сплавленному сгустку", + ACCUSATIVE = "сплавленный сгусток", + INSTRUMENTAL = "сплавленным сгустком", + PREPOSITIONAL = "сплавленном сгустке" + ) + icon = 'icons/obj/lavaland/lava_fishing.dmi' + icon_state = "gooey_molten_mass" + lefthand_file = 'icons/mob/inhands/lavaland/fish_items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/lavaland/fish_items_righthand.dmi' + item_state = "acid_bladder" + w_class = WEIGHT_CLASS_TINY + origin_tech = "biotech=5" + light_range = 2 + light_power = 3 + light_color = "#FFBF00" + light_system = MOVABLE_LIGHT + /obj/item/hivelordstabilizer/afterattack(obj/item/organ/internal/M, mob/user, proximity, params) . = ..() if(!proximity) @@ -118,6 +142,9 @@ desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness." icon_state = "legion_soul" +/obj/item/organ/internal/regenerative_core/legion/pre_preserved + preserved = TRUE + /obj/item/organ/internal/regenerative_core/legion/Initialize(mapload) . = ..() update_icon() diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 6a17a2eb1c4..bb19132794f 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -312,6 +312,9 @@ if(empty) return + var/obj/item/pickaxe/emergency/pickaxe = new(src) + load(pickaxe) + for(var/i in 1 to 5) var/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak/W = new(src) load(W) diff --git a/code/modules/mining/equipment/upgrades.dm b/code/modules/mining/equipment/upgrades.dm index 83848be2009..f2ae8d38233 100644 --- a/code/modules/mining/equipment/upgrades.dm +++ b/code/modules/mining/equipment/upgrades.dm @@ -92,16 +92,6 @@ var/obj/item/crusher_trophy/T = t T.remove_from(gun, user) qdel(gun) - var/obj/item/twohanded/kinetic_crusher/almost/newgun = new(get_turf(user)) - user.put_in_hands(newgun) - to_chat(user,span_notice("Harsh tendrils wraps around the kinetic crusher, but there is not enough magmite to fully upgrade it! You need more magmite")) - qdel(src) - if(/obj/item/twohanded/kinetic_crusher/almost) - var/obj/item/twohanded/kinetic_crusher/almost/gun = target - for(var/t in gun.trophies) - var/obj/item/crusher_trophy/T = t - T.remove_from(gun, user) - qdel(gun) var/obj/item/twohanded/kinetic_crusher/mega/newgun = new(get_turf(user)) user.put_in_hands(newgun) to_chat(user,span_notice("Harsh tendrils wraps around the kinetic crusher, merging the parts and crusher to form a mega kinetic crusher.")) diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm index 167f6e878ea..cfe769833a2 100644 --- a/code/modules/mining/lavaland/ash_flora.dm +++ b/code/modules/mining/lavaland/ash_flora.dm @@ -2,7 +2,8 @@ gender = PLURAL layer = PROJECTILE_HIT_THRESHHOLD_LAYER //sporangiums up don't shoot icon = 'icons/obj/lavaland/ash_flora.dmi' - icon_state = "l_mushroom" + icon_state = "l_mushroom1" + base_icon_state = "l_mushroom" name = "large mushrooms" desc = "A number of large mushrooms, covered in a faint layer of ash and what can only be spores." anchored = TRUE @@ -24,7 +25,7 @@ /obj/structure/flora/ash/Initialize(mapload) . = ..() - base_icon = "[icon_state][rand(1, 4)]" + base_icon = "[base_icon_state][rand(1, 4)]" icon_state = base_icon /obj/structure/flora/ash/proc/harvest(user) @@ -91,9 +92,10 @@ regrowth_time_low = 4200 /obj/structure/flora/ash/leaf_shroom - icon_state = "s_mushroom" name = "leafy mushrooms" desc = "A number of mushrooms, each of which surrounds a greenish sporangium with a number of leaf-like structures." + icon_state = "s_mushroom1" + base_icon_state = "s_mushroom" harvested_name = "leafless mushrooms" harvested_desc = "A bunch of formerly-leafed mushrooms, with their sporangiums exposed. Scandalous?" harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_leaf @@ -107,9 +109,10 @@ regrowth_time_high = 6000 /obj/structure/flora/ash/cap_shroom - icon_state = "r_mushroom" name = "tall mushrooms" desc = "Several mushrooms, the larger of which have a ring of conks at the midpoint of their stems." + icon_state = "r_mushroom1" + base_icon_state = "r_mushroom" harvested_name = "small mushrooms" harvested_desc = "Several small mushrooms near the stumps of what likely were larger mushrooms." harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/mushroom_cap @@ -122,9 +125,11 @@ regrowth_time_high = 5400 /obj/structure/flora/ash/stem_shroom - icon_state = "t_mushroom" + name = "numerous mushrooms" desc = "A large number of mushrooms, some of which have long, fleshy stems. They're radiating light!" + icon_state = "t_mushroom1" + base_icon_state = "t_mushroom" light_range = 1.5 light_power = 2.1 harvested_name = "tiny mushrooms" @@ -139,9 +144,10 @@ regrowth_time_high = 6000 /obj/structure/flora/ash/cacti - icon_state = "cactus" name = "fruiting cacti" desc = "Several prickly cacti, brimming with ripe fruit and covered in a thin layer of ash." + icon_state = "cactus1" + base_icon_state = "cactus" harvested_name = "cacti" harvested_desc = "A bunch of prickly cacti. You can see fruits slowly growing beneath the covering of ash." harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit @@ -160,9 +166,10 @@ AddComponent(/datum/component/caltrop, 3, 6, 70) /obj/structure/flora/ash/fireblossom - icon_state = "fireblossom" name = "fire blossom" desc = "An odd flower that grows commonly near bodies of lava." + icon_state = "fireblossom" + base_icon_state = "fireblossom" harvested_name = "fire blossom stems" harvested_desc = "A few fire blossom stems, missing their flowers." harvest = /obj/item/reagent_containers/food/snacks/grown/ash_flora/fireblossom @@ -179,7 +186,8 @@ regrowth_time_high = 4000 /obj/structure/flora/ash/coaltree - icon_state = "coaltree" + icon_state = "coaltree1" + base_icon_state = "coaltree" name = "coaltree" desc = "Небольшое мрачное дерево, растущее на просторах такой же мрачной планеты." ru_names = list( @@ -408,6 +416,7 @@ reqs = list(/obj/item/reagent_containers/food/snacks/grown/ash_flora/shavings = 5) time = 30 category = CAT_PRIMAL + subcategory = CAT_MISC2 /obj/item/reagent_containers/food/drinks/mushroom_bowl name = "mushroom bowl" @@ -416,6 +425,26 @@ icon_state = "mushroom_bowl" w_class = WEIGHT_CLASS_SMALL +/obj/item/reagent_containers/food/drinks/mushroom_bowl/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/lavaland_dye)) + return ..() + + var/obj/item/lavaland_dye/dye = I + to_chat(user, span_notice("Вы начали толочь селезёнку в ступке.")) + if(!do_after(user, 5 SECONDS, src, max_interact_count = 1, cancel_on_max = TRUE)) + return ..() + + var/obj/item/lavaland_mortar/new_item = new(loc) + new_item.picked_dye = dye.picked_dye + new_item.totem_dye = dye.totem_dye + new_item.fluff_name = dye.fluff_name + new_item.update_icon(UPDATE_ICON_STATE) + + user.put_in_hands(new_item) + + qdel(dye) + qdel(src) + return ATTACK_CHAIN_BLOCKED_ALL /********* * Rocks * diff --git a/code/modules/mining/lavaland/world_anvil.dm b/code/modules/mining/lavaland/world_anvil.dm index 556638fdf82..2dd5b9f9b07 100644 --- a/code/modules/mining/lavaland/world_anvil.dm +++ b/code/modules/mining/lavaland/world_anvil.dm @@ -22,12 +22,10 @@ /obj/structure/world_anvil/Initialize() . = ..() - GLOB.anvils += src internal = new /obj/item/gps/internal/world_anvil(src) /obj/structure/world_anvil/Destroy() QDEL_NULL(internal) - GLOB.anvils -= src . = ..() /obj/structure/world_anvil/update_icon_state() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index fcf73653179..4498cb3300c 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -70,21 +70,101 @@ /obj/item/flashlight/lantern name = "lantern" + desc = "Шахтёрская лампа." + ru_names = list( + NOMINATIVE = "лампа", + GENITIVE = "лампы", + DATIVE = "лампе", + ACCUSATIVE = "лампу", + INSTRUMENTAL = "лампой", + PREPOSITIONAL = "лампе" + ) + gender = FEMALE icon_state = "lantern" item_state = "lantern" belt_icon = "lantern" - desc = "A mining lantern." - light_range = 6 // luminosity when on + light_range = 6 // luminosity when on light_color = LIGHT_COLOR_YELLOW light_system = MOVABLE_LIGHT + var/obj/item/gem/inserted_gem = null + var/mutable_appearance/lantern_light_overlay +/obj/item/flashlight/lantern/Initialize(mapload) + . = ..() + lantern_light_overlay = mutable_appearance('icons/obj/lighting.dmi',"lantern_light", color = light_color) + +/obj/item/flashlight/lantern/examine(mob/user) + . = ..() + if(!inserted_gem) + . += span_notice("Внутри лампы есть небольшое отверстие под самоцвет.") + else + . += span_notice("Внутри лампы находится [inserted_gem.declent_ru(NOMINATIVE)]. Его можно извлечь с помощью лома.") + +/obj/item/flashlight/lantern/update_icon_state() + cut_overlay(lantern_light_overlay) + if(on) + add_overlay(lantern_light_overlay) + +/obj/item/flashlight/lantern/crowbar_act(mob/living/user, obj/item/I) + if(on) + balloon_alert(user, "лампа включена!") + return + if(!inserted_gem) + balloon_alert(user, "самоцвет отсутствует!") + return + to_chat(user, span_notice("Вы осторожно вынимаете [inserted_gem.declent_ru(ACCUSATIVE)] из лампы.")) + inserted_gem.set_light_on(TRUE) + inserted_gem.forceMove(get_turf(user)) + inserted_gem = null + refresh_lantern_lights() + return TRUE + +/obj/item/flashlight/lantern/proc/refresh_lantern_lights() + if(on) + on = !on + cut_overlay(lantern_light_overlay) + if(!inserted_gem) + set_light_color(LIGHT_COLOR_YELLOW) + lantern_light_overlay = mutable_appearance('icons/obj/lighting.dmi',"lantern_light", color = light_color) + else + set_light_color(inserted_gem.light_color) + lantern_light_overlay = mutable_appearance('icons/obj/lighting.dmi',"lantern_light", color = light_color) + +/obj/item/flashlight/lantern/attackby(obj/item/I, mob/user, params) + . = ..() + + if(ATTACK_CHAIN_CANCEL_CHECK(.) || !istype(I, /obj/item/gem)) + return . + + if(on) + balloon_alert(user, "лампа включена!") + return . + + add_fingerprint(user) + var/obj/item/gem/new_gem = I + if(inserted_gem) + balloon_alert(user, "уже вставлено!") + return . + if(!user.drop_transfer_item_to_loc(new_gem, src)) + return . + . |= ATTACK_CHAIN_BLOCKED_ALL + to_chat(user, span_notice("вы осторожно устанавливаете [new_gem.declent_ru(NOMINATIVE)] в лампу.")) + inserted_gem = new_gem + inserted_gem.set_light_on(FALSE) + refresh_lantern_lights() /**********************Mining car (Crate like thing, not the rail car)**************************/ /obj/structure/closet/crate/miningcar - desc = "A mining car. This one doesn't work on rails, but has to be dragged." - name = "mining car (not for rails)" + name = "mining car" + desc = "Шахтёрская вагонетка. К сожалению, рельсов на Лазисе нет. Зато её можно тащить." + ru_names = list( + NOMINATIVE = "вагонетка", + GENITIVE = "вагонетки", + DATIVE = "вагонетке", + ACCUSATIVE = "вагонетку", + INSTRUMENTAL = "вагонеткой", + PREPOSITIONAL = "вагонетке" + ) + gender = FEMALE icon_state = "miningcar" - density = TRUE - icon_opened = "miningcaropen" - icon_closed = "miningcar" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a5ecfe6cb8b..7e8eaadf978 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -699,10 +699,13 @@ if(!istype(toEat)) return FALSE var/fullness = nutrition + 10 + var/time_to_eat = toEat.eat_time if(istype(toEat, /obj/item/reagent_containers/food/snacks)) for(var/datum/reagent/consumable/C in reagents.reagent_list) //we add the nutrition value of what we're currently digesting fullness += C.nutriment_factor * C.volume / (C.metabolization_rate * metabolism_efficiency * digestion_ratio) if(user == src) + if(time_to_eat > 0 && !do_after(user, time_to_eat, max_interact_count = 1)) + return FALSE if(istype(toEat, /obj/item/reagent_containers/food/drinks)) if(!selfDrink(toEat)) return FALSE @@ -771,6 +774,8 @@ so that different stomachs can handle things in different ways VB*/ satiety -= toEat.junkiness if(toEat.consume_sound) playsound(loc, toEat.consume_sound, rand(10,50), 1) + if(toEat.has_special_eating_effects) + toEat.on_mob_eating_effect(src) if(toEat.reagents.total_volume) var/fraction = min(this_bite/toEat.reagents.total_volume, 1) if(fraction) diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index e94f2d3a65f..b1673a6b9c8 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -463,6 +463,8 @@ continue if(!(dna.species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list. continue + if(!S.pickable) //If our markings are unpickable in normal ways, skip it + continue if(location == "tail") if(!(bodypart_tail.dna.species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list. continue diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 991efc6613c..ace85752853 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -355,7 +355,7 @@ var/obj/item/organ/internal/cyberimp/tail/blade/implant = get_organ_slot(INTERNAL_ORGAN_TAIL_DEVICE) if(istype(implant) && implant.activated) - msg += "You can see a strange glint on [p_their()] tail.\n" + msg += "Вы замечаете странный [implant.biological ? "нарост" : "блеск"] на [genderize_ru(gender, "его", "её", "его", "их")] хвосте.\n" if(decaylevel == 1) msg += "[p_they(TRUE)] [p_are()] starting to smell.\n" diff --git a/code/modules/mob/living/carbon/human/human_emote.dm b/code/modules/mob/living/carbon/human/human_emote.dm index d28d47e79f8..a1bb24132e4 100644 --- a/code/modules/mob/living/carbon/human/human_emote.dm +++ b/code/modules/mob/living/carbon/human/human_emote.dm @@ -1333,3 +1333,21 @@ message = "хруст%(ит,ят)% [translated]!" return ..() + +//fucking rumble +/datum/emote/living/carbon/human/unathi/rumble + key = "rumble" + key_third_person = "rumble" + message = "урч%(ит,ат)%." + message_mime = "тихо урч%(ит,ат)%." + message_postfix = " на %t." + message_param = EMOTE_PARAM_USE_POSTFIX + emote_type = EMOTE_AUDIBLE|EMOTE_MOUTH + muzzled_noises = list("урчащие", "гортанные") + audio_cooldown = 30 SECONDS + age_based = TRUE + volume = 65 + sound = list( + 'sound/voice/unathi/rumble.ogg', + 'sound/voice/unathi/rumble2.ogg', + ) diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm index d59fde6447f..0b1a69e94fc 100644 --- a/code/modules/mob/living/carbon/human/species/unathi.dm +++ b/code/modules/mob/living/carbon/human/species/unathi.dm @@ -246,7 +246,7 @@ var/obj/effect/proc_holder/spell/touch/healtouch/healtouch = locate() in owner.mob_spell_list if(!healtouch) owner.AddSpell(new /obj/effect/proc_holder/spell/touch/healtouch) - var/datum/action/innate/anvil_finder/finder = locate() in owner.actions + var/datum/action/innate/shaman_gps/finder = locate() in owner.actions if(!finder) finder = new finder.Grant(owner) @@ -259,10 +259,10 @@ /datum/species/unathi/ashwalker/shaman/on_species_loss(mob/living/carbon/human/owner) . = ..() owner.RemoveSpell(/obj/effect/proc_holder/spell/touch/healtouch) - var/datum/action/innate/anvil_finder/finder = locate() in owner.actions + var/datum/action/innate/shaman_gps/finder = locate() in owner.actions if(finder) finder.Remove(owner) - var/datum/action/innate/ignite_unathi/fire = locate() in owner.actions + var/datum/action/innate/shaman_gps/fire = locate() in owner.actions if(fire) fire.Remove(owner) @@ -327,8 +327,8 @@ They're basically just lizards with all-around marginally better stats and fire //igniter. only for ashwalkers and drakonids because of """lore""" /datum/action/innate/ignite_unathi - name = "Ignite" - desc = "You form a fire in your mouth, fierce enough to... light a cigarette." + name = "поджог" + desc = "Вы формируете небольшой сгусток пламени в вашей пасти, достаточный для... розжига костра." icon_icon = 'icons/obj/cigarettes.dmi' button_icon_state = "match_unathi" var/cooldown = 0 @@ -338,38 +338,42 @@ They're basically just lizards with all-around marginally better stats and fire /datum/action/innate/ignite_unathi/Activate() var/mob/living/carbon/human/user = owner if(world.time <= cooldown) - to_chat(user, span_warning("Your throat hurts too much to do it right now. Wait [round((cooldown - world.time) / 10)] seconds and try again.")) + to_chat(user, span_warning("Ваша пасть болит из-за прошлой попытки. Подождите [round((cooldown - world.time) / 10)] секунд[declension_ru(round((cooldown - world.time) / 10), "у", "ы", "")] и попробуйте ещё раз")) return if((user.head?.flags_cover & HEADCOVERSMOUTH) || (user.wear_mask?.flags_cover & MASKCOVERSMOUTH) && !user.wear_mask?.up) - to_chat(user, span_warning("Your mouth is covered.")) + user.balloon_alert(user, "ваша пасть закрыта!") return var/obj/item/match/unathi/fire = new(user.loc, src) if(user.put_in_hands(fire)) - to_chat(user, span_notice("You ignite a small flame in your mouth.")) + to_chat(user, span_notice("Вы формируете огонь в вашей пасти.")) cooldown = world.time + cooldown_duration else qdel(fire) - to_chat(user, span_warning("You don't have any free hands.")) + user.balloon_alert(user, "ваши руки заняты!") -/datum/action/innate/anvil_finder - name = "Find World Anvil" - desc = "You call the Necropolis in order to find The World Anvil." +/datum/action/innate/shaman_gps + name = "Помощь некрополя" + desc = "Вы используете силу Некрополя, чтобы узнать примерное местоположение точек интереса." icon_icon = 'icons/mob/actions/actions_clockwork.dmi' button_icon_state = "stun" //better than nothing -/datum/action/innate/anvil_finder/Activate() - addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, owner, \ - span_warning("Я чувствую, что Мировая Кузница [get_direction()]")), 2 SECONDS) - -/datum/action/innate/anvil_finder/proc/get_direction() - for(var/obj/structure/world_anvil/Anvil in GLOB.anvils) - if(!Anvil) - . = "уничтожена." - return - var/turf/T = get_turf(Anvil) - if(owner.z == T.z) //"кузница находится где-то на северо-востоке" or whatever - . = "находится где-то на " - . += dir2rustext(get_dir(owner.loc, Anvil.loc)) - . += "e." - else - . = "находится где-то далеко отсюда." +/datum/action/innate/shaman_gps/Activate() + var/list/list_of_points = GLOB.lavaland_points_of_interest + if(list_of_points) + var/selected_poi = tgui_input_list(owner, "Выберите точку интереса", "точки интереса", list_of_points) + addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, owner, \ + span_warning("Я чувствую, что [selected_poi] [get_direction(selected_poi)]")), 2 SECONDS) + else + to_chat(owner, "Все церемониальные тотемы уничтожены.") + +/datum/action/innate/shaman_gps/proc/get_direction(obj/structure/selected_poi) + if(!selected_poi) + . = "уничтожен." + return + var/turf/T = get_turf(selected_poi) + if(owner.z == T.z) //"кузница находится где-то на северо-востоке" or whatever + . = "находится где-то на " + . += dir2rustext(get_dir(owner.loc, selected_poi.loc)) + . += "e." + else + . = "находится где-то далеко отсюда." diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 50d50476a21..518bad7d313 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1401,7 +1401,7 @@ . = TRUE to_chat(user, span_notice("You begin to butcher [src]...")) playsound(loc, 'sound/weapons/slice.ogg', 50, TRUE, -1) - if(!do_after(user, 4 SECONDS * mob_size, src, NONE, max_interact_count = 1, cancel_on_max = TRUE) || !Adjacent(user)) + if(!do_after(user, I.has_speed_harvest ? 1 SECONDS : (4 SECONDS * mob_size), src, NONE, max_interact_count = 1, cancel_on_max = TRUE) || !Adjacent(user)) return . harvest(user) diff --git a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm index 8d9e7c0023f..fa464b5381c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/gutlunch.dm @@ -45,6 +45,11 @@ udder = new() . = ..() +/mob/living/simple_animal/hostile/asteroid/gutlunch/examine(mob/user) + . = ..() + if(udder) + . += span_notice("В его [udder.declent_ru(ACCUSATIVE)] содержится [udder.reagents.total_volume] единиц[declension_ru(udder.reagents.total_volume, "а", "ы", "")] молока.") + /mob/living/simple_animal/hostile/asteroid/gutlunch/Destroy() QDEL_NULL(udder) return ..() @@ -71,6 +76,12 @@ return ..() +/mob/living/simple_animal/hostile/asteroid/gutlunch/ListTargetsLazy(check_z)//override to include wanted_objects as valid targets + . = ..() + for(var/atom/movable/movable as anything in view(vision_range, loc)) + if(wanted_objects[movable.type]) + if(isturf(movable.loc)) + . += movable /mob/living/simple_animal/hostile/asteroid/gutlunch/CanAttack(atom/the_target) // Gutlunch-specific version of CanAttack to handle stupid stat_exclusive = true crap so we don't have to do it for literally every single simple_animal/hostile except the two that spawn in lavaland if(isturf(the_target) || !the_target || the_target.type == /atom/movable/lighting_object) // bail out on invalids @@ -100,6 +111,7 @@ regenerate_icons() visible_message("[src] slurps up [target].") qdel(target) + return return ..() /obj/item/udder/gutlunch @@ -111,11 +123,7 @@ reagents.my_atom = src /obj/item/udder/gutlunch/generateMilk() - if(prob(60)) - reagents.add_reagent("cream", rand(2, 5)) - if(prob(45)) - reagents.add_reagent("salglu_solution", rand(2,5)) - + reagents.add_reagent("bugmilk", rand(2, 5)) //Male gutlunch. They're smaller and more colorful! /mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck diff --git a/code/modules/mob/living/simple_animal/hostile/mining/marrow_weaver.dm b/code/modules/mob/living/simple_animal/hostile/mining/marrow_weaver.dm index 2fd8b9fe08b..9bc7da1a503 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/marrow_weaver.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/marrow_weaver.dm @@ -116,6 +116,9 @@ icon_state = "chitin" singular_name = "chitin chunk" +/obj/item/stack/sheet/animalhide/weaver_chitin/five + amount = 5 + //better and dangerous subtype for regular lavaland. Slightly faster and NO MORE XRAY. /mob/living/simple_animal/hostile/asteroid/marrowweaver/dangerous diff --git a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm index 1861bdeaded..e63e77f06c7 100644 --- a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm @@ -60,6 +60,8 @@ var/fluff = 0 // Whether or not the accessory can be affected by colouration var/do_colouration = 1 + /// If our accessory is can be pickable? Used in "proc/generate_valid_markings" + var/pickable = TRUE /* HAIR */ diff --git a/code/modules/mob/new_player/sprite_accessories/unathi/unathi_body_markings.dm b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_body_markings.dm index 348ed7abba8..3f735626bfe 100644 --- a/code/modules/mob/new_player/sprite_accessories/unathi/unathi_body_markings.dm +++ b/code/modules/mob/new_player/sprite_accessories/unathi/unathi_body_markings.dm @@ -17,3 +17,26 @@ /datum/sprite_accessory/body_markings/unathi/points_una name = "Unathi Points" icon_state = "points" + +/datum/sprite_accessory/body_markings/unathi/dyes + pickable = FALSE + +/datum/sprite_accessory/body_markings/unathi/dyes/indigo + name = "Indigo Dyes" + icon_state = "indigo_dyes" + +/datum/sprite_accessory/body_markings/unathi/dyes/cinnabar + name = "Cinnabar Dyes" + icon_state = "cinnabar_dyes" + +/datum/sprite_accessory/body_markings/unathi/dyes/mint + name = "Mint Dyes" + icon_state = "mint_dyes" + +/datum/sprite_accessory/body_markings/unathi/dyes/amber + name = "Amber Dyes" + icon_state = "amber_dyes" + +/datum/sprite_accessory/body_markings/unathi/dyes/crimson + name = "Crimson Dyes" + icon_state = "crimson_dyes" diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index a255cd29a15..1a346198c1c 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -200,7 +200,10 @@ stored_ammo += new_casing if(new_casing.loc != src) new_casing.forceMove(src) - playsound(loc, insert_sound, 50, TRUE) + var/chosen_sound = insert_sound + if(islist(insert_sound) && length(insert_sound)) + chosen_sound = pick(insert_sound) + playsound(loc, chosen_sound, 50, TRUE) update_mat_value() return TRUE @@ -221,7 +224,10 @@ stored_ammo += new_casing if(new_casing.loc != src) new_casing.forceMove(src) - playsound(loc, replacing_sound, 50, TRUE) + var/chosen_sound = replacing_sound + if(islist(replacing_sound) && length(replacing_sound)) + chosen_sound = pick(replacing_sound) + playsound(loc, chosen_sound, 50, TRUE) update_mat_value() return TRUE @@ -268,7 +274,10 @@ return . if(!silent && user) balloon_alert(user, "[declension_ru(., "заряжен [.] патрон", "заряжено [.] патрона", "заряжено [.] патронов")]") - playsound(loc, load_sound, 50, TRUE) + var/chosen_sound = load_sound + if(islist(load_sound) && length(load_sound)) + chosen_sound = pick(load_sound) + playsound(loc, chosen_sound, 50, TRUE) I.update_appearance() I.update_equipped_item() update_appearance() @@ -287,7 +296,10 @@ var/obj/item/ammo_casing/casing = get_round() if(casing) casing.forceMove(drop_location()) - playsound(loc, remove_sound, 50, TRUE) + var/chosen_sound = remove_sound + if(islist(remove_sound) && length(remove_sound)) + chosen_sound = pick(remove_sound) + playsound(loc, chosen_sound, 50, TRUE) to_chat(user, span_notice("You have removed a round from [src]!")) update_appearance(UPDATE_ICON|UPDATE_DESC) user.put_in_hands(casing) diff --git a/code/modules/projectiles/guns/projectile/bow.dm b/code/modules/projectiles/guns/projectile/bow.dm index cdff56f2834..dc0d17589c1 100644 --- a/code/modules/projectiles/guns/projectile/bow.dm +++ b/code/modules/projectiles/guns/projectile/bow.dm @@ -12,19 +12,25 @@ gender = MALE icon_state = "bow" item_state = "bow" - fire_sound = 'sound/weapons/grenadelaunch.ogg' + + fire_sound = 'sound/weapons/bows/bow_fire.ogg' + pickup_sound = 'sound/weapons/bows/bow_pickup.ogg' + drop_sound = 'sound/weapons/bows/bow_drop.ogg' + equip_sound = 'sound/weapons/bows/bow_equip.ogg' + mag_type = /obj/item/ammo_box/magazine/internal/bow item_flags = SLOWS_WHILE_IN_HAND slot_flags = ITEM_SLOT_BACK weapon_weight = WEAPON_HEAVY trigger_guard = TRIGGER_GUARD_NONE - var/draw_sound = 'sound/weapons/draw_bow.ogg' + + var/draw_sound = 'sound/weapons/bows/bow_pull.ogg' var/ready_to_fire = FALSE var/slowdown_when_ready = 2 /obj/item/gun/projectile/bow/ashen //better than wooden name = "bone bow" - desc = "Примитивный лук с тетивой, сделанной из жилы. Обычно используется племенными охотниками и воинами. Из-за специфической конструкции лука из него можно стрелять только костяными стрелами." + desc = "Примитивный лук с тетивой, сделанной из жилы. Обычно используется племенными охотниками и воинами." ru_names = list( NOMINATIVE = "костяной лук", GENITIVE = "костяного лука", @@ -35,12 +41,16 @@ ) icon_state = "ashenbow" item_state = "ashenbow" - mag_type = /obj/item/ammo_box/magazine/internal/bow/ashen //you can't shoot wooden arrows from bone bow! + + fire_sound = 'sound/weapons/bows/bonebow_fire.ogg' + drop_sound = 'sound/weapons/bows/bonebow_drop.ogg' + draw_sound = 'sound/weapons/bows/bonebow_pull.ogg' + + item_flags = NONE flags = NONE force = 10 slowdown_when_ready = 1 - /obj/item/gun/projectile/bow/proc/update_state() update_slowdown() update_icon(UPDATE_ICON_STATE) @@ -115,11 +125,22 @@ caliber = "arrow" max_ammo = 1 start_empty = TRUE - -/obj/item/ammo_box/magazine/internal/bow/ashen - name = "ashen bow internal magazine" - ammo_type = /obj/item/ammo_casing/caseless/arrow/bone_tipped - caliber = "bone_arrow" + replacing_sound = list( + 'sound/weapons/bows/arrow_insert1.ogg', + 'sound/weapons/bows/arrow_insert2.ogg' + ) + remove_sound = list( + 'sound/weapons/bows/arrow_remove1.ogg', + 'sound/weapons/bows/arrow_remove2.ogg' + ) + insert_sound = list( + 'sound/weapons/bows/arrow_insert1.ogg', + 'sound/weapons/bows/arrow_insert2.ogg' + ) + load_sound = list( + 'sound/weapons/bows/arrow_remove1.ogg', + 'sound/weapons/bows/arrow_remove2.ogg' + ) //all these sounds are too good to be true /obj/item/projectile/bullet/reusable/arrow //only for wooden bow! name = "arrow" @@ -155,6 +176,15 @@ armour_penetration = -10 faction_bonus_damage = 23 +/obj/item/projectile/bullet/reusable/arrow/jagged //alternative arrow, made from fishing + name = "jagged-tipped arrow" + icon_state = "jagged_arrow" + ammo_type = /obj/item/ammo_casing/caseless/arrow/jagged + range = 12 + damage = 60 + armour_penetration = -10 + faction_bonus_damage = 27 + /obj/item/ammo_casing/caseless/arrow name = "arrow" desc = "Послушай, ты не мог бы положить это яблоко себе на голову?" @@ -193,7 +223,23 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' force = 12 projectile_type = /obj/item/projectile/bullet/reusable/arrow/bone - caliber = "bone_arrow" + caliber = "arrow" + +/obj/item/ammo_casing/caseless/arrow/jagged + name = "jagged-tipped arrow" + desc = "Стрела, сделанная из зубов хищной рыбы. Невероятно острая и крепкая." + ru_names = list( + NOMINATIVE = "зазубренная стрела", + GENITIVE = "зазубренной стрелы", + DATIVE = "зазубренной стреле", + ACCUSATIVE = "зазубренную стрелу", + INSTRUMENTAL = "зазубренной стрелой", + PREPOSITIONAL = "зазубренной стреле", + ) + icon_state = "jagged_arrow" + force = 16 + projectile_type = /obj/item/projectile/bullet/reusable/arrow/jagged + caliber = "arrow" //quiver /obj/item/storage/backpack/quiver diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 5eddd7bb46b..3e12150565e 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -1640,3 +1640,19 @@ /datum/reagent/medicine/adv_lava_extract/on_mob_delete(mob/living/carbon/human/user) . = ..() user.clear_alert("penthrite") + +/datum/reagent/medicine/ashiezine + name = "Сироп Лаваленда" + id = "ashiezine" + description = "Странный реагент, найденный на Лазис Ардаксе. Судя по всему, он работает только на пеплоходцев." + reagent_state = LIQUID + color = "#f45555" + harmless = FALSE + taste_description = "потрохов" + can_synth = FALSE + +/datum/reagent/medicine/ashiezine/on_mob_life(mob/living/M) + if(isashwalker(M)) + M.reagents.add_reagent("epinephrine", 0.2) + M.reagents.add_reagent("heparin", 0,4) + return ..() diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm index 65b58cc6e0c..23db34f5d0c 100644 --- a/code/modules/reagents/chemistry/reagents/misc.dm +++ b/code/modules/reagents/chemistry/reagents/misc.dm @@ -716,6 +716,20 @@ M.add_language(LANGUAGE_MONKEY_HUMAN) return ..() +/datum/reagent/bugmilk + name = "Пепельное молоко" + id = "bugmilk" + description = "Молочная субстанция, вырабатываемая некоторыми видами на Лазис Ардакс. Весьма вкусное." + reagent_state = LIQUID + color = "#e4dac5" + taste_description = "густого молока" + metabolization_rate = 2 * REAGENTS_METABOLISM + +/datum/reagent/bugmilk/on_mob_life(mob/living/M) + M.reagents.add_reagent("cream", 0.4) + M.reagents.add_reagent("salglu_solution", 0,4) + return ..() + /datum/reagent/admin_cleaner name = "WD-2381" color = "#da9eda" diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm index e4c4cd22b39..9f5950509df 100644 --- a/code/modules/research/designs/mining_designs.dm +++ b/code/modules/research/designs/mining_designs.dm @@ -116,8 +116,8 @@ name = "Fishing Rod" desc = "Hey! I caught a miner!" id = "fishingrod" - req_tech = list("materials" = 5, "engineering" = 4, "plasmatech" = 6, "biotech" = 6) + req_tech = list("materials" = 5, "engineering" = 4, "plasmatech" = 5, "biotech" = 4) build_type = PROTOLATHE - materials = list(MAT_METAL = 10000, MAT_TITANIUM = 15000, MAT_SILVER = 2500, MAT_DIAMOND = 2500) - build_path = /obj/item/twohanded/fishingrod + materials = list(MAT_METAL = 4000, MAT_TITANIUM = 6000) + build_path = /obj/item/twohanded/fishing_rod category = list("Mining") diff --git a/code/modules/ruins/lavalandruin_code/ash_walker_den.dm b/code/modules/ruins/lavalandruin_code/ash_walker_den.dm index 7286237a81a..c73e74c4d3d 100644 --- a/code/modules/ruins/lavalandruin_code/ash_walker_den.dm +++ b/code/modules/ruins/lavalandruin_code/ash_walker_den.dm @@ -2,7 +2,15 @@ //The ash walker den consumes corpses or unconscious mobs to create ash walker eggs. For more info on those, check ghost_role_spawners.dm /obj/structure/lavaland/ash_walker name = "necropolis tendril nest" - desc = "Щупальце искажённой злобы. Вокруг него обустроено гнездо, полное быстро растущих яиц…" + desc = "Щупальце искажённой злобы. Вокруг него обустроено гнездо, полное быстро растущих яиц..." + ru_names = list( + NOMINATIVE = "гнездо некрополя", + GENITIVE = "гнезда некрополя", + DATIVE = "гнезду некрополя", + ACCUSATIVE = "гнездо некрополя", + INSTRUMENTAL = "гнездом некрополя", + PREPOSITIONAL = "гнезде некрополя" + ) icon = 'icons/mob/nest.dmi' icon_state = "ash_walker_nest" @@ -50,7 +58,7 @@ /obj/structure/lavaland/ash_walker/proc/consume() for(var/mob/living/H in view(src, 1)) //Only for corpse right next to/on same tile if(H.stat) - visible_message("Шипастые усики жадно подтаскивают тело [H] и разрывают его на куски, окропляя кровью растущие яйца.") + visible_message(span_warning("Шипастые усики жадно подтаскивают тело [H] и разрывают его на куски, окропляя кровью растущие яйца.")) playsound(get_turf(src),'sound/magic/demon_consume.ogg', 100, 1) for(var/obj/item/W in H) if(!H.drop_item_ground(W)) @@ -84,10 +92,18 @@ /obj/effect/mob_spawn/human/ash_walker name = "ash walker egg" - desc = "Жёлтое яйцо размером с человека, порождённое каким-то непостижимым существом. Внутри проглядывает гуманоидный силуэт." + ru_names = list( + NOMINATIVE = "яйцо пеплоходца", + GENITIVE = "яйца пеплоходца", + DATIVE = "яйцу пеплоходца", + ACCUSATIVE = "яйцо пеплоходца", + INSTRUMENTAL = "яйцом пеплоходца", + PREPOSITIONAL = "яйце пеплоходца" + ) + desc = "Жёлтое яйцо размером с человека, порождённое каким-то непостижимым существом. Внутри проглядывает гуманоидный силуэт." mob_name = "an ash walker" icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "large_egg" + icon_state = "ashwalker_egg" mob_species = /datum/species/unathi/ashwalker outfit = /datum/outfit/ashwalker mob_gender = MALE @@ -96,10 +112,10 @@ anchored = FALSE move_resist = MOVE_FORCE_NORMAL density = FALSE - important_info = "Не покидайте Лаваленд без разрешения администратора. Нападать на шахтёрский аванпост можно только в ответ на агрессию." - description = "Вы — пеплоходец, дикарь из племени коренных обитателей Лаваленда. Выживайте, охотьтесь и защищайте своё гнездо. Пользуйтесь примитивными племенными технологиями. Скармливайте трупы щупальцу в гнезде, дабы оно порождало яйца новых пеплоходцев. Вам разрешено атаковать шахтёров и других чужаков." - flavour_text = "Ваше племя поклоняется Некрополю. Пустоши для вас — священные земли, а местные чудища — их щедрые дары умелым охотникам. \ - Вы видели вдали огни… Они предвещают прибытие чужаков, желающих разорить ваши земли и даже сам Некрополь. Но для вас они — лишь очередные подношения для гнезда." + important_info = "Не покидайте Лаваленд без разрешения администратора. Нападать на шахтёрский аванпост можно только в ответ на агрессию." + description = "Вы — пеплоходец, дикарь из племени коренных обитателей Лаваленда. Выживайте, охотьтесь и защищайте своё гнездо. Пользуйтесь примитивными племенными технологиями. Скармливайте трупы щупальцу в гнезде, дабы оно порождало яйца новых пеплоходцев. Вам разрешено атаковать шахтёров и других чужаков." + flavour_text = "Ваше племя поклоняется Некрополю. Пустоши для вас — священные земли, а местные чудища — их щедрые дары умелым охотникам. \ + Вы видели вдали огни… Они предвещают прибытие чужаков, желающих разорить ваши земли и даже сам Некрополь. Но для вас они — лишь очередные подношения для гнезда." assignedrole = "Ash Walker" respawn_cooldown = 10 MINUTES var/eggtype = "пеплоходца" @@ -107,19 +123,28 @@ /obj/effect/mob_spawn/human/ash_walker/special(mob/living/carbon/human/new_spawn) new_spawn.rename_character(new_spawn.real_name, new_spawn.dna.species.get_random_name(new_spawn.gender)) new_spawn.faction += "ashwalker" - to_chat(new_spawn, "Добывайте для гнезда трупы гуманоидов и зверей. Щупальце поглотит их, порождая яйца новых пеплоходцев. Слава Некрополю!") + to_chat(new_spawn, "Добывайте для гнезда трупы гуманоидов и зверей. Щупальце поглотит их, порождая яйца новых пеплоходцев. Слава Некрополю!") /obj/effect/mob_spawn/human/ash_walker/New() . = ..() var/area/A = get_area(src) if(A) - notify_ghosts("Яйцо [eggtype] готово вылупиться в [A.name].", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) + notify_ghosts("Яйцо [eggtype] готово вылупиться в [A.name].", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) //Ash walker shaman eggs: Spawns in ash walker dens in lavaland. Only one can exist at a time, they are squishier than regular ashwalkers, and have the sole purpose of keeping other ashwalkers alive. /obj/effect/mob_spawn/human/ash_walker/shaman name = "ash walker shaman egg" - desc = "Янтарное яйцо размером с человека, порождённое каким-то непостижимым существом. Внутри проглядывает гуманоидный силуэт." + ru_names = list( + NOMINATIVE = "яйцо шамана пеплоходцев", + GENITIVE = "яйца шамана пеплоходцев", + DATIVE = "яйцу шамана пеплоходцев", + ACCUSATIVE = "яйцо шамана пеплоходцев", + INSTRUMENTAL = "яйцом шамана пеплоходцев", + PREPOSITIONAL = "яйце шамана пеплоходцев" + ) + desc = "Янтарное яйцо размером с человека, порождённое каким-то непостижимым существом. Внутри проглядывает гуманоидный силуэт." + icon_state = "shaman_egg" mob_name = "an ash walker shaman" mob_species = /datum/species/unathi/ashwalker/shaman outfit = /datum/outfit/ashwalker/shaman //might be OP, but the flavour is there @@ -138,3 +163,29 @@ neck = /obj/item/clothing/neck/mantle/unathi belt = /obj/item/storage/bag/medpouch gloves = /obj/item/clothing/gloves/color/black/goliath + +/* +This landmark is capable of spawning our updated ash walkers den. +In order of working properly, if you make a new lavaland.dmm map, spawn it always in north-east or north-west. +Preferable coordinates - x:218, y:236. +Use about 3 tiles before lava river and 9 to 10 lava river tiles under this landmark. Watch 'delta/lavaland.dmm' for example. +*/ +/obj/ash_walker_landmark + name = "ash_walker" + icon = 'icons/misc/Testing/turf_analysis.dmi' + icon_state = "ash_landmark" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + anchored = TRUE + +/obj/ash_walker_landmark/Initialize(mapload) + . = ..() + INVOKE_ASYNC(src, PROC_REF(load_map)) + +/obj/ash_walker_landmark/proc/load_map() + var/turf/spawn_area = get_turf(src) + + var/datum/map_template/ruin/lavaland/ash_walker_updated/map = new() + + map.load(spawn_area, TRUE) + + qdel(src, force=TRUE) diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index a0a4fb5bad5..a6a15458053 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -11,6 +11,7 @@ begin_sound = list( TOOL_SAW = 'sound/surgery/saw1.ogg', /obj/item/primitive_saw = 'sound/surgery/scalpel1.ogg', + /obj/item/circular_saw_blade = 'sound/surgery/scalpel1.ogg', TOOL_WIRECUTTER = 'sound/surgery/scalpel1.ogg', /obj/item/hatchet = 'sound/surgery/scalpel1.ogg', ) @@ -19,6 +20,7 @@ TOOL_SAW = 100, /obj/item/primitive_saw = 100, /obj/item/hatchet = 90, + /obj/item/circular_saw_blade = 80, TOOL_WIRECUTTER = 70 ) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index e2cf0afc000..5e8c2011d1e 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -262,6 +262,7 @@ TOOL_SAW = 'sound/surgery/saw1.ogg', /obj/item/hatchet = 'sound/surgery/scalpel1.ogg', /obj/item/primitive_saw = 'sound/surgery/scalpel1.ogg', + /obj/item/circular_saw_blade = 'sound/surgery/scalpel1.ogg', /obj/item/melee/arm_blade = 'sound/surgery/scalpel1.ogg', ) end_sound = 'sound/surgery/amputation.ogg' @@ -269,6 +270,7 @@ TOOL_SAW = 100, /obj/item/primitive_saw = 100, /obj/item/hatchet = 90, + /obj/item/circular_saw_blade = 80, /obj/item/melee/arm_blade = 75 ) diff --git a/code/modules/surgery/organs/augments_tail.dm b/code/modules/surgery/organs/augments_tail.dm index 02784193c9e..4131f2be402 100644 --- a/code/modules/surgery/organs/augments_tail.dm +++ b/code/modules/surgery/organs/augments_tail.dm @@ -16,7 +16,7 @@ name = "tail razorblade implant" desc = "Razor sharp blade designed to be hidden inside the tail. Traditional design of House Eshie'Ssharahss, sold at every corner of the Empire." var/datum/action/innate/tail_cut/implant_ability = new - + var/biological = FALSE // Used in examine var/activated = FALSE var/slash_strength = 35 // Implant damage var/stamina_damage = 0 // Stamina damage to others @@ -120,6 +120,29 @@ else icon_state = "[initial(icon_state)]" +//organic buff +/obj/item/organ/internal/cyberimp/tail/blade/organic_upgrade + name = "tail tumour" + desc = "Небольшая странноватая опухоль, находящаяся в хвосте. На удивление, не делает ничего страшного, но значительно увеличивает мощность удара хвостом." + ru_names = list( + NOMINATIVE = "хвостовая опухоль", + GENITIVE = "хвостовой опухоли", + DATIVE = "хвостовой опухоли", + ACCUSATIVE = "хвостовую опухоль", + INSTRUMENTAL = "хвостовой опухолью", + PREPOSITIONAL = "хвостовом сгустке" + ) + icon_state = "roro core" + slash_strength = 0 + stamina_damage = 24 + activated = TRUE + actions_types = null + emp_proof = TRUE + slash_sound = 'sound/weapons/slash.ogg' + biological = TRUE + +/obj/item/organ/internal/cyberimp/tail/blade/organic_upgrade/update_icon_state() + return /datum/action/innate/tail_cut name = "Взмах хвостом" diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 117daacc36e..fca357391bf 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -990,6 +990,7 @@ /obj/item/melee/energy/sword/cyborg/saw = 100, /obj/item/primitive_saw = 100, /obj/item/hatchet = 90, + /obj/item/circular_saw_blade = 80, /obj/item/wirecutters = 70 ) diff --git a/code/modules/vehicle/lavaboat.dm b/code/modules/vehicle/lavaboat.dm index d562bb38dba..4e4db3288a8 100644 --- a/code/modules/vehicle/lavaboat.dm +++ b/code/modules/vehicle/lavaboat.dm @@ -53,6 +53,7 @@ reqs = list(/obj/item/stack/sheet/bone = 2) time = 15 category = CAT_PRIMAL + subcategory = CAT_MISC2 /datum/crafting_recipe/boat name = "goliath hide boat" @@ -60,4 +61,4 @@ reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 3) time = 50 category = CAT_PRIMAL - + subcategory = CAT_MISC2 diff --git a/icons/effects/ash_runes.dmi b/icons/effects/ash_runes.dmi new file mode 100644 index 00000000000..711db361d61 Binary files /dev/null and b/icons/effects/ash_runes.dmi differ diff --git a/icons/misc/Testing/turf_analysis.dmi b/icons/misc/Testing/turf_analysis.dmi index d733d8a928f..7fbfbe5dc2b 100644 Binary files a/icons/misc/Testing/turf_analysis.dmi and b/icons/misc/Testing/turf_analysis.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 5773774cb3d..a73738159b1 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/species/drask/head.dmi b/icons/mob/clothing/species/drask/head.dmi index a457ac0c46f..142ec609c1d 100644 Binary files a/icons/mob/clothing/species/drask/head.dmi and b/icons/mob/clothing/species/drask/head.dmi differ diff --git a/icons/mob/clothing/species/grey/head.dmi b/icons/mob/clothing/species/grey/head.dmi index 969942655a1..7ecde8d716e 100644 Binary files a/icons/mob/clothing/species/grey/head.dmi and b/icons/mob/clothing/species/grey/head.dmi differ diff --git a/icons/mob/clothing/species/grey/suit.dmi b/icons/mob/clothing/species/grey/suit.dmi index e44d95e5fd3..352961bddb4 100644 Binary files a/icons/mob/clothing/species/grey/suit.dmi and b/icons/mob/clothing/species/grey/suit.dmi differ diff --git a/icons/mob/clothing/species/monkey/head.dmi b/icons/mob/clothing/species/monkey/head.dmi index c317bd317c9..bb41f455c5a 100644 Binary files a/icons/mob/clothing/species/monkey/head.dmi and b/icons/mob/clothing/species/monkey/head.dmi differ diff --git a/icons/mob/clothing/species/monkey/suit.dmi b/icons/mob/clothing/species/monkey/suit.dmi index bec159fa475..f09a68bc677 100644 Binary files a/icons/mob/clothing/species/monkey/suit.dmi and b/icons/mob/clothing/species/monkey/suit.dmi differ diff --git a/icons/mob/clothing/species/unathi/suit.dmi b/icons/mob/clothing/species/unathi/suit.dmi index 6b9efd400ed..bd2e1b06f58 100644 Binary files a/icons/mob/clothing/species/unathi/suit.dmi and b/icons/mob/clothing/species/unathi/suit.dmi differ diff --git a/icons/mob/clothing/species/vox/helmet.dmi b/icons/mob/clothing/species/vox/helmet.dmi index 566f35099e0..2fb432c44a9 100644 Binary files a/icons/mob/clothing/species/vox/helmet.dmi and b/icons/mob/clothing/species/vox/helmet.dmi differ diff --git a/icons/mob/clothing/species/vox/suit.dmi b/icons/mob/clothing/species/vox/suit.dmi index 262e3e48652..fd66420f853 100644 Binary files a/icons/mob/clothing/species/vox/suit.dmi and b/icons/mob/clothing/species/vox/suit.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index b36a4fb3211..c562667fb5e 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 4d0d9601a55..045e1f4648c 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 339f278e581..6cddfdcfc2e 100755 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/inhands/lavaland/bait_lefthand.dmi b/icons/mob/inhands/lavaland/bait_lefthand.dmi new file mode 100644 index 00000000000..5bc04cab74f Binary files /dev/null and b/icons/mob/inhands/lavaland/bait_lefthand.dmi differ diff --git a/icons/mob/inhands/lavaland/bait_righthand.dmi b/icons/mob/inhands/lavaland/bait_righthand.dmi new file mode 100644 index 00000000000..1d4c4034a66 Binary files /dev/null and b/icons/mob/inhands/lavaland/bait_righthand.dmi differ diff --git a/icons/mob/inhands/lavaland/fish_items_lefthand.dmi b/icons/mob/inhands/lavaland/fish_items_lefthand.dmi new file mode 100644 index 00000000000..8b97bc90533 Binary files /dev/null and b/icons/mob/inhands/lavaland/fish_items_lefthand.dmi differ diff --git a/icons/mob/inhands/lavaland/fish_items_righthand.dmi b/icons/mob/inhands/lavaland/fish_items_righthand.dmi new file mode 100644 index 00000000000..5f79f5dd1c4 Binary files /dev/null and b/icons/mob/inhands/lavaland/fish_items_righthand.dmi differ diff --git a/icons/mob/inhands/lavaland/fish_lefthand.dmi b/icons/mob/inhands/lavaland/fish_lefthand.dmi new file mode 100644 index 00000000000..8058db5f35d Binary files /dev/null and b/icons/mob/inhands/lavaland/fish_lefthand.dmi differ diff --git a/icons/mob/inhands/lavaland/fish_righthand.dmi b/icons/mob/inhands/lavaland/fish_righthand.dmi new file mode 100644 index 00000000000..20af2a6e5f2 Binary files /dev/null and b/icons/mob/inhands/lavaland/fish_righthand.dmi differ diff --git a/icons/mob/inhands/lavaland/food_lefthand.dmi b/icons/mob/inhands/lavaland/food_lefthand.dmi new file mode 100644 index 00000000000..9c5cd046096 Binary files /dev/null and b/icons/mob/inhands/lavaland/food_lefthand.dmi differ diff --git a/icons/mob/inhands/lavaland/food_righthand.dmi b/icons/mob/inhands/lavaland/food_righthand.dmi new file mode 100644 index 00000000000..990cfd96014 Binary files /dev/null and b/icons/mob/inhands/lavaland/food_righthand.dmi differ diff --git a/icons/mob/inhands/lavaland/lava_items_lefthand.dmi b/icons/mob/inhands/lavaland/lava_items_lefthand.dmi new file mode 100644 index 00000000000..6f91d9545dc Binary files /dev/null and b/icons/mob/inhands/lavaland/lava_items_lefthand.dmi differ diff --git a/icons/mob/inhands/lavaland/lava_items_righthand.dmi b/icons/mob/inhands/lavaland/lava_items_righthand.dmi new file mode 100644 index 00000000000..ece866ecf52 Binary files /dev/null and b/icons/mob/inhands/lavaland/lava_items_righthand.dmi differ diff --git a/icons/mob/inhands/lavaland/misc_lefthand.dmi b/icons/mob/inhands/lavaland/misc_lefthand.dmi new file mode 100644 index 00000000000..7b168a69799 Binary files /dev/null and b/icons/mob/inhands/lavaland/misc_lefthand.dmi differ diff --git a/icons/mob/inhands/lavaland/misc_righthand.dmi b/icons/mob/inhands/lavaland/misc_righthand.dmi new file mode 100644 index 00000000000..2ecc7749d96 Binary files /dev/null and b/icons/mob/inhands/lavaland/misc_righthand.dmi differ diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi index 489e64b2242..a2394b1f37b 100644 Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index ca91ed224cc..182aa9d3410 100644 Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ diff --git a/icons/mob/sprite_accessories/unathi/unathi_body_markings.dmi b/icons/mob/sprite_accessories/unathi/unathi_body_markings.dmi index eaa51df36d1..1e39251e1a2 100644 Binary files a/icons/mob/sprite_accessories/unathi/unathi_body_markings.dmi and b/icons/mob/sprite_accessories/unathi/unathi_body_markings.dmi differ diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi index a5cabd6c54f..2382791a9d9 100644 Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index bb18035eac1..e006b43b5fd 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 4de3e867232..a2cbeb3933d 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi index 20cffe4cca0..1b0e2cab7d8 100644 Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ diff --git a/icons/obj/fish_items.dmi b/icons/obj/fish_items.dmi index fc3d149b8bf..a6e366ccb1b 100644 Binary files a/icons/obj/fish_items.dmi and b/icons/obj/fish_items.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 265921109b3..93455b7831d 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/lavaland/Ashie_Food.dmi b/icons/obj/lavaland/Ashie_Food.dmi new file mode 100644 index 00000000000..02e4831c6a2 Binary files /dev/null and b/icons/obj/lavaland/Ashie_Food.dmi differ diff --git a/icons/obj/lavaland/grace_of_lazis.dmi b/icons/obj/lavaland/grace_of_lazis.dmi new file mode 100644 index 00000000000..566d99e7c16 Binary files /dev/null and b/icons/obj/lavaland/grace_of_lazis.dmi differ diff --git a/icons/obj/lavaland/lava_fishing.dmi b/icons/obj/lavaland/lava_fishing.dmi new file mode 100644 index 00000000000..352985b10f6 Binary files /dev/null and b/icons/obj/lavaland/lava_fishing.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 0f93d917301..5c909189fc2 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index ceb86c0667b..41e976d901d 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index af18ea9c48b..ca84ace69df 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 99f677fdbef..eadb344d326 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/weapons/ammo.dmi b/icons/obj/weapons/ammo.dmi index f118d5aa100..fd61497ff0f 100644 Binary files a/icons/obj/weapons/ammo.dmi and b/icons/obj/weapons/ammo.dmi differ diff --git a/icons/obj/weapons/projectiles.dmi b/icons/obj/weapons/projectiles.dmi index f87070e2238..52e2b8210a5 100644 Binary files a/icons/obj/weapons/projectiles.dmi and b/icons/obj/weapons/projectiles.dmi differ diff --git a/paradise.dme b/paradise.dme index 0f2940420fc..0f5c66bd930 100644 --- a/paradise.dme +++ b/paradise.dme @@ -502,8 +502,8 @@ #include "code\datums\components\jetpack.dm" #include "code\datums\components\label.dm" #include "code\datums\components\material_container.dm" -#include "code\datums\components\overlay_lighting.dm" #include "code\datums\components\object_possession.dm" +#include "code\datums\components\overlay_lighting.dm" #include "code\datums\components\paintable.dm" #include "code\datums\components\pellet_cloud.dm" #include "code\datums\components\persistent_overlay.dm" @@ -611,6 +611,7 @@ #include "code\datums\elements\pref_viewer.dm" #include "code\datums\elements\reagent_attack.dm" #include "code\datums\elements\ridable.dm" +#include "code\datums\elements\ritual_dye_removal.dm" #include "code\datums\elements\simple_flying.dm" #include "code\datums\elements\squish.dm" #include "code\datums\elements\strippable.dm" @@ -1295,6 +1296,7 @@ #include "code\game\objects\items\weapons\experimental_syringe_gun.dm" #include "code\game\objects\items\weapons\explosives.dm" #include "code\game\objects\items\weapons\extinguisher.dm" +#include "code\game\objects\items\weapons\fishing_rod.dm" #include "code\game\objects\items\weapons\flamethrower.dm" #include "code\game\objects\items\weapons\garrote.dm" #include "code\game\objects\items\weapons\gift_wrappaper.dm" @@ -2221,6 +2223,7 @@ #include "code\modules\food_and_drinks\food\foods\ethnic.dm" #include "code\modules\food_and_drinks\food\foods\ingredients.dm" #include "code\modules\food_and_drinks\food\foods\junkfood.dm" +#include "code\modules\food_and_drinks\food\foods\lavaland_food.dm" #include "code\modules\food_and_drinks\food\foods\meat.dm" #include "code\modules\food_and_drinks\food\foods\misc.dm" #include "code\modules\food_and_drinks\food\foods\pasta.dm" @@ -2247,10 +2250,12 @@ #include "code\modules\food_and_drinks\kitchen_machinery\oven_new.dm" #include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" #include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\tribal_oven.dm" #include "code\modules\food_and_drinks\recipes\recipes_candy.dm" #include "code\modules\food_and_drinks\recipes\recipes_grill.dm" #include "code\modules\food_and_drinks\recipes\recipes_microwave.dm" #include "code\modules\food_and_drinks\recipes\recipes_oven.dm" +#include "code\modules\food_and_drinks\recipes\recipes_tribal.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_table.dm" #include "code\modules\games\52card.dm" #include "code\modules\games\cards.dm" @@ -2433,6 +2438,12 @@ #include "code\modules\mining\ores_coins.dm" #include "code\modules\mining\satchel_ore_boxdm.dm" #include "code\modules\mining\shelters.dm" +#include "code\modules\mining\ash_walkers\ash_rune.dm" +#include "code\modules\mining\ash_walkers\bait.dm" +#include "code\modules\mining\ash_walkers\fish.dm" +#include "code\modules\mining\ash_walkers\lavaland_dye.dm" +#include "code\modules\mining\ash_walkers\misc.dm" +#include "code\modules\mining\ash_walkers\torch_holder.dm" #include "code\modules\mining\equipment\explorer_gear.dm" #include "code\modules\mining\equipment\hardmode_grenade.dm" #include "code\modules\mining\equipment\kinetic_crusher.dm" diff --git a/sound/objects/fishing_rod_catch.ogg b/sound/objects/fishing_rod_catch.ogg new file mode 100644 index 00000000000..1da26e97a86 Binary files /dev/null and b/sound/objects/fishing_rod_catch.ogg differ diff --git a/sound/objects/fishing_rod_throw.ogg b/sound/objects/fishing_rod_throw.ogg new file mode 100644 index 00000000000..18ae0d95427 Binary files /dev/null and b/sound/objects/fishing_rod_throw.ogg differ diff --git a/sound/rituals/ritual_fail1.ogg b/sound/rituals/ritual_fail1.ogg new file mode 100644 index 00000000000..c59b38f02a1 Binary files /dev/null and b/sound/rituals/ritual_fail1.ogg differ diff --git a/sound/rituals/ritual_fail2.ogg b/sound/rituals/ritual_fail2.ogg new file mode 100644 index 00000000000..ebb7fcf8a42 Binary files /dev/null and b/sound/rituals/ritual_fail2.ogg differ diff --git a/sound/rituals/ritual_start1.ogg b/sound/rituals/ritual_start1.ogg new file mode 100644 index 00000000000..ec6a5eee356 Binary files /dev/null and b/sound/rituals/ritual_start1.ogg differ diff --git a/sound/rituals/ritual_start2.ogg b/sound/rituals/ritual_start2.ogg new file mode 100644 index 00000000000..fa2e1ba2952 Binary files /dev/null and b/sound/rituals/ritual_start2.ogg differ diff --git a/sound/rituals/ritual_start3.ogg b/sound/rituals/ritual_start3.ogg new file mode 100644 index 00000000000..d7d9b21f525 Binary files /dev/null and b/sound/rituals/ritual_start3.ogg differ diff --git a/sound/rituals/ritual_success1.ogg b/sound/rituals/ritual_success1.ogg new file mode 100644 index 00000000000..aa6e1386f27 Binary files /dev/null and b/sound/rituals/ritual_success1.ogg differ diff --git a/sound/rituals/ritual_success2.ogg b/sound/rituals/ritual_success2.ogg new file mode 100644 index 00000000000..e5428f68dfa Binary files /dev/null and b/sound/rituals/ritual_success2.ogg differ diff --git a/sound/weapons/bows/arrow_insert1.ogg b/sound/weapons/bows/arrow_insert1.ogg new file mode 100644 index 00000000000..1b6fa858e05 Binary files /dev/null and b/sound/weapons/bows/arrow_insert1.ogg differ diff --git a/sound/weapons/bows/arrow_insert2.ogg b/sound/weapons/bows/arrow_insert2.ogg new file mode 100644 index 00000000000..ab0c6cc39f7 Binary files /dev/null and b/sound/weapons/bows/arrow_insert2.ogg differ diff --git a/sound/weapons/bows/arrow_remove1.ogg b/sound/weapons/bows/arrow_remove1.ogg new file mode 100644 index 00000000000..b890ad4520c Binary files /dev/null and b/sound/weapons/bows/arrow_remove1.ogg differ diff --git a/sound/weapons/bows/arrow_remove2.ogg b/sound/weapons/bows/arrow_remove2.ogg new file mode 100644 index 00000000000..acb31e2bffa Binary files /dev/null and b/sound/weapons/bows/arrow_remove2.ogg differ diff --git a/sound/weapons/bows/bonebow_drop.ogg b/sound/weapons/bows/bonebow_drop.ogg new file mode 100644 index 00000000000..57283465726 Binary files /dev/null and b/sound/weapons/bows/bonebow_drop.ogg differ diff --git a/sound/weapons/bows/bonebow_fire.ogg b/sound/weapons/bows/bonebow_fire.ogg new file mode 100644 index 00000000000..27f062ecd8b Binary files /dev/null and b/sound/weapons/bows/bonebow_fire.ogg differ diff --git a/sound/weapons/bows/bonebow_pull.ogg b/sound/weapons/bows/bonebow_pull.ogg new file mode 100644 index 00000000000..a5c95f6ffd2 Binary files /dev/null and b/sound/weapons/bows/bonebow_pull.ogg differ diff --git a/sound/weapons/bows/bow_drop.ogg b/sound/weapons/bows/bow_drop.ogg new file mode 100644 index 00000000000..d5aa6f40d16 Binary files /dev/null and b/sound/weapons/bows/bow_drop.ogg differ diff --git a/sound/weapons/bows/bow_equip.ogg b/sound/weapons/bows/bow_equip.ogg new file mode 100644 index 00000000000..d60780b7acb Binary files /dev/null and b/sound/weapons/bows/bow_equip.ogg differ diff --git a/sound/weapons/bows/bow_fire.ogg b/sound/weapons/bows/bow_fire.ogg new file mode 100644 index 00000000000..c2ee947b6c7 Binary files /dev/null and b/sound/weapons/bows/bow_fire.ogg differ diff --git a/sound/weapons/bows/bow_pickup.ogg b/sound/weapons/bows/bow_pickup.ogg new file mode 100644 index 00000000000..aa957a0876f Binary files /dev/null and b/sound/weapons/bows/bow_pickup.ogg differ diff --git a/sound/weapons/bows/bow_pull.ogg b/sound/weapons/bows/bow_pull.ogg new file mode 100644 index 00000000000..c8f4fbba936 Binary files /dev/null and b/sound/weapons/bows/bow_pull.ogg differ diff --git a/tgui/packages/tgui/interfaces/RitualMenu.js b/tgui/packages/tgui/interfaces/RitualMenu.js new file mode 100644 index 00000000000..0d8913914de --- /dev/null +++ b/tgui/packages/tgui/interfaces/RitualMenu.js @@ -0,0 +1,188 @@ +import { useBackend, useLocalState } from '../backend'; +import { Box, Button, Stack, Dropdown } from '../components'; +import { Window } from '../layouts'; + +export const RitualMenu = (props, context) => { + const { act, data } = useBackend(context); + const { + rituals, + selected_ritual, + description, + params, + things, + ritual_available, + time_left, + } = data; + + return ( + + + + + Выбор ритуала + { + act('select_ritual', { selected_ritual: val }); + }} + style={{ + 'color': 'white', + 'border': '1px solid #444', + 'border-radius': '5px', + }} + /> + + + {selected_ritual ? ( + <> + + + + + Свойства: + + + + + Результат: + + + + + + + + + {params + ? Object.entries(params).map(([key, value]) => { + return ( + + {key} {` ${value}`} +
+
+ ); + }) + : ''} +
+ Список необходимых предметов: +
    + {things + ? Object.entries(things).map(([key, value]) => { + return ( +
  • + {key} {` ${value}`} +
    +
  • + ); + }) + : ''} +
+
+
+ + + {description} + + +
+
+ +