diff --git a/_maps/RandomRuins/RockRuins/rockplanet_nomadcrash.dmm b/_maps/RandomRuins/RockRuins/rockplanet_nomadcrash.dmm
new file mode 100644
index 000000000000..7ca31921e401
--- /dev/null
+++ b/_maps/RandomRuins/RockRuins/rockplanet_nomadcrash.dmm
@@ -0,0 +1,4760 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aw" = (
+/obj/structure/bonfire/prelit,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"aL" = (
+/obj/structure/door_assembly/door_assembly_centcom{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"aN" = (
+/obj/machinery/space_heater,
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 10
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"aX" = (
+/obj/effect/turf_decal/weather/dirt,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"ba" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/airlock{
+ dir = 4;
+ name = "Crew Berth"
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ruin/rockplanet/nanotrasen)
+"bv" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"cd" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "9-10"
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"cl" = (
+/obj/machinery/power/shuttle/engine/electric{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/engine/hull/interior,
+/area/ruin/rockplanet/nanotrasen)
+"cr" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"cO" = (
+/obj/structure/chair/plastic{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"cP" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/structure/flora/rock{
+ icon_state = "redrocks2"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"cU" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 8
+ },
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"df" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible/layer2{
+ dir = 4
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"dB" = (
+/turf/open/floor/plasteel/tech/grid,
+/area/ruin/rockplanet/nanotrasen)
+"dJ" = (
+/obj/structure/flora/rock{
+ icon_state = "redrock2"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"dM" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/structure/railing,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"ei" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/door_assembly/door_assembly_hatch{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"eo" = (
+/turf/open/floor/plating/asteroid/rockplanet/plating/scorched,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"fc" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/structure/frame/machine,
+/turf/open/floor/plating{
+ icon_state = "wet_cracked2"
+ },
+/area/ruin/rockplanet/nanotrasen)
+"fd" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"fe" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/structure/sink{
+ pixel_y = 30
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"fw" = (
+/obj/machinery/power/port_gen/pacman,
+/obj/structure/cable/yellow{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"fF" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4;
+ name = "Helm"
+ },
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"fK" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"fM" = (
+/obj/machinery/door/airlock/external{
+ dir = 4
+ },
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"ga" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/layer2{
+ dir = 4
+ },
+/obj/machinery/portable_atmospherics/canister,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"gn" = (
+/obj/structure/flora/rock/asteroid,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"gs" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/bottlegreen{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit{
+ icon_state = "plastic"
+ },
+/area/ruin/rockplanet/nanotrasen)
+"gO" = (
+/obj/structure/table/reinforced,
+/obj/item/radio/intercom/wideband/table{
+ dir = 4;
+ pixel_x = 3
+ },
+/obj/effect/decal/cleanable/glass/plasma,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"gY" = (
+/turf/open/floor/plating/asteroid/rockplanet/mud,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"ha" = (
+/obj/structure/cable{
+ icon_state = "2-5"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/plating/scorched,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"hc" = (
+/obj/effect/gibspawner,
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"hm" = (
+/obj/structure/bed/pod,
+/obj/effect/mob_spawn/human/corpse/damaged,
+/obj/structure/curtain/cloth,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"hy" = (
+/obj/effect/turf_decal/spline/fancy/opaque/yellow{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/item/stack/sheet/metal/five,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"hV" = (
+/obj/structure/flora/rock{
+ icon_state = "basalt"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/mud,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"il" = (
+/obj/effect/turf_decal/spline/fancy/opaque/yellow{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"ip" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/door/airlock/public/glass{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ruin/rockplanet/nanotrasen)
+"is" = (
+/obj/item/chair/greyscale,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"iN" = (
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"iZ" = (
+/obj/effect/turf_decal/spline/fancy/opaque/yellow{
+ dir = 6
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ruin/rockplanet/nanotrasen)
+"jl" = (
+/obj/effect/turf_decal/techfloor{
+ dir = 4
+ },
+/obj/structure/girder/displaced,
+/obj/effect/decal/cleanable/glass/plasma,
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"jm" = (
+/turf/closed/mineral/random/rockplanet,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"jw" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"jC" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"jD" = (
+/obj/effect/turf_decal/weather/dirt/corner,
+/obj/structure/flora/rock{
+ icon_state = "redrock2"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"jI" = (
+/obj/structure/fence/door{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/plating/scorched,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"kf" = (
+/obj/structure/table_frame,
+/turf/open/floor/plating/ashplanet/rocky,
+/area/ruin/rockplanet/nanotrasen)
+"kN" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"kS" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible/layer2{
+ dir = 1
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-9"
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"kV" = (
+/obj/structure/flora/rock{
+ icon_state = "redrocks2"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"lg" = (
+/turf/closed/wall,
+/area/ruin/rockplanet/nanotrasen)
+"lw" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"lz" = (
+/obj/machinery/power/smes/shuttle/precharged,
+/turf/open/floor/plating/asteroid/rockplanet/plating/scorched,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"mu" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"mz" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/bottlegreen,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit{
+ icon_state = "panelscorched"
+ },
+/area/ruin/rockplanet/nanotrasen)
+"mW" = (
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/mud,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"nf" = (
+/turf/open/floor/plating/asteroid/rockplanet/plasteel,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"nB" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"on" = (
+/turf/closed/mineral/random/rockplanet,
+/area/ruin/rockplanet/nanotrasen)
+"oq" = (
+/obj/machinery/atmospherics/components/binary/pump/on/layer2{
+ dir = 8;
+ name = "Air to Distro"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/plasteel,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"or" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/frame/machine,
+/obj/effect/spawner/lootdrop/salvage_matter_bin,
+/turf/open/floor/plating/asteroid/rockplanet/plasteel,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"oz" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/rockplanet/nanotrasen)
+"oI" = (
+/obj/effect/turf_decal/spline/fancy/opaque/yellow{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/arrowaxe_small/center{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ruin/rockplanet/nanotrasen)
+"oW" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"oZ" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/dirt,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"pb" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"po" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"pH" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"pJ" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"pV" = (
+/obj/machinery/atmospherics/components/binary/pump/on/layer2{
+ dir = 8;
+ name = "Air to Distro"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/ruin/rockplanet/nanotrasen)
+"qp" = (
+/obj/effect/turf_decal/spline/fancy/opaque/yellow{
+ dir = 10
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ruin/rockplanet/nanotrasen)
+"qL" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"qM" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"qU" = (
+/obj/structure/closet/crate,
+/obj/item/stack/sheet/metal/ten,
+/obj/item/stack/cable_coil/random/five,
+/obj/item/stack/cable_coil/random/five,
+/obj/structure/cable/yellow{
+ icon_state = "4-5"
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"rc" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"rD" = (
+/obj/structure/frame/machine,
+/turf/open/floor/plating/dirt/jungle/lit,
+/area/ruin/rockplanet/nanotrasen)
+"rH" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 8
+ },
+/obj/structure/flora/driftlog,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"rW" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"rY" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/structure/frame/machine,
+/obj/machinery/light/small/directional/north,
+/obj/effect/spawner/lootdrop/salvage_matter_bin,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"sn" = (
+/obj/structure/frame/machine,
+/obj/item/stock_parts/manipulator/femto,
+/turf/open/floor/plating/asteroid/rockplanet/plasteel,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"sy" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 1
+ },
+/obj/structure/railing,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"sK" = (
+/obj/effect/turf_decal/weather/dirt/corner,
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"sR" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/turf/closed/wall/mineral/sandstone,
+/area/ruin/rockplanet/nanotrasen)
+"sX" = (
+/obj/structure/cable/yellow{
+ icon_state = "5-8"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/ruin/rockplanet/nanotrasen)
+"sZ" = (
+/turf/closed/wall/rust,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"tA" = (
+/obj/structure/flora/tree/dead/tall/grey,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"tI" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/obj/structure/flora/rock{
+ icon_state = "redrocks1"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"tN" = (
+/turf/closed/wall,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"tX" = (
+/obj/machinery/holopad/emergency/command,
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"uh" = (
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"uo" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/obj/item/stack/cable_coil/random/five,
+/obj/item/wirecutters,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"uu" = (
+/obj/machinery/door/airlock/engineering{
+ dir = 1;
+ name = "Engineering"
+ },
+/turf/closed/wall,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"uB" = (
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"uD" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"uK" = (
+/obj/effect/turf_decal/corner_techfloor_grid{
+ dir = 6
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ruin/rockplanet/nanotrasen)
+"uL" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 1
+ },
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"uN" = (
+/obj/structure/table,
+/obj/item/crowbar/large,
+/obj/item/clothing/mask/breath{
+ pixel_x = 14;
+ pixel_y = 7
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = 14;
+ pixel_y = 4
+ },
+/obj/item/clothing/mask/breath{
+ pixel_x = 14;
+ pixel_y = 1
+ },
+/obj/item/stock_parts/capacitor/adv{
+ pixel_x = -5;
+ pixel_y = 11
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"uT" = (
+/obj/structure/flora/tree/cactus,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"vi" = (
+/obj/structure/flora/rock{
+ icon_state = "redrocks3"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"vl" = (
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/rockplanet,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"vw" = (
+/obj/machinery/power/terminal{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-10"
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"vF" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"vL" = (
+/obj/structure/flora/rock{
+ icon_state = "redrocks1"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"vM" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/turf/open/floor/plating/asteroid/rockplanet/grass,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"vN" = (
+/obj/effect/turf_decal/spline/fancy/opaque/yellow{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"vS" = (
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"vW" = (
+/obj/effect/turf_decal/weather/dirt/corner,
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"wf" = (
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"wq" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 8
+ },
+/obj/structure/railing,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"wW" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"xk" = (
+/obj/effect/turf_decal/techfloor,
+/obj/structure/cable{
+ icon_state = "0-1"
+ },
+/obj/machinery/computer/monitor{
+ dir = 1;
+ icon_state = "computer_broken"
+ },
+/obj/machinery/light/small/broken/directional/south,
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"xG" = (
+/obj/structure/cable{
+ icon_state = "0-1"
+ },
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/rack,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"yb" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"yn" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/grass,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"yw" = (
+/obj/structure/flora/rock/asteroid{
+ icon_state = "asteroid2"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"zg" = (
+/obj/effect/turf_decal/spline/fancy/opaque/bottlegreen{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/glass/plasma,
+/turf/open/floor/plating/asteroid/rockplanet/lit{
+ icon_state = "plastic"
+ },
+/area/ruin/rockplanet/nanotrasen)
+"zh" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/spline/fancy/opaque/bottlegreen,
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit{
+ icon_state = "plastic"
+ },
+/area/ruin/rockplanet/nanotrasen)
+"zp" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/obj/machinery/telecomms/receiver,
+/turf/open/floor/plating{
+ icon_state = "wet_cracked0"
+ },
+/area/ruin/rockplanet/nanotrasen)
+"zw" = (
+/obj/machinery/door/airlock/maintenance_hatch,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/plasteel,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"zx" = (
+/obj/machinery/power/smes/shuttle/precharged{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"zz" = (
+/obj/machinery/atmospherics/components/unary/tank/air{
+ dir = 4;
+ piping_layer = 2
+ },
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/ruin/rockplanet/nanotrasen)
+"zF" = (
+/obj/effect/turf_decal/techfloor{
+ dir = 4
+ },
+/turf/closed/mineral/random/rockplanet,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"zH" = (
+/obj/structure/fence/door{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 4
+ },
+/obj/structure/curtain/cloth/grey,
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/ruin/rockplanet/nanotrasen)
+"zU" = (
+/obj/item/banner/medical/mundane,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"Ab" = (
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/ruin/rockplanet/nanotrasen)
+"AS" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"AX" = (
+/obj/effect/turf_decal/spline/fancy/opaque/yellow{
+ dir = 4
+ },
+/obj/machinery/light/small/broken/directional/east,
+/obj/effect/turf_decal/arrowaxe_small/left{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ruin/rockplanet/nanotrasen)
+"Ba" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2,
+/turf/open/floor/plating/asteroid/rockplanet/plasteel,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Bc" = (
+/obj/machinery/power/smes/shuttle/precharged{
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"Bt" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"BA" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"BX" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 4
+ },
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Cm" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/turf/closed/wall/mineral/sandstone,
+/area/ruin/rockplanet/nanotrasen)
+"CC" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plating/dirt/jungle/lit,
+/area/ruin/rockplanet/nanotrasen)
+"CN" = (
+/turf/open/floor/plating/asteroid/rockplanet/stairs,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"CT" = (
+/obj/effect/turf_decal/weather/dirt/corner,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"DJ" = (
+/obj/structure/flora/rock/asteroid{
+ icon_state = "asteroid2"
+ },
+/obj/structure/flora/driftlog,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"DP" = (
+/obj/effect/turf_decal/weather/dirt/corner,
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"DR" = (
+/obj/structure/closet/crate,
+/obj/item/weldingtool/mini,
+/obj/item/clothing/mask/gas/welding,
+/obj/item/reagent_containers/glass/bottle/welding_fuel,
+/obj/item/reagent_containers/glass/bottle/welding_fuel,
+/obj/item/reagent_containers/glass/bottle/welding_fuel,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"Ec" = (
+/turf/open/floor/plating/dirt/jungle/lit,
+/area/ruin/rockplanet/nanotrasen)
+"Em" = (
+/obj/structure/rack,
+/obj/item/storage/firstaid{
+ pixel_x = 3;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/glass/rag{
+ pixel_x = -3
+ },
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/ruin/rockplanet/nanotrasen)
+"En" = (
+/obj/effect/decal/cleanable/robot_debris/gib,
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Er" = (
+/obj/structure/flora/rock{
+ icon_state = "basalt2"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ew" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"EF" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/ruin/rockplanet/nanotrasen)
+"EI" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/effect/gibspawner,
+/obj/effect/decal/remains/human,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 10
+ },
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"EK" = (
+/obj/effect/turf_decal/weather/dirt/corner,
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"EL" = (
+/obj/structure/table_frame,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"EM" = (
+/obj/structure/frame,
+/obj/item/stock_parts/micro_laser/high,
+/turf/open/floor/engine/hull/interior,
+/area/ruin/rockplanet/nanotrasen)
+"Fk" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/ruin/rockplanet/nanotrasen)
+"FI" = (
+/obj/effect/turf_decal/spline/fancy/opaque/yellow{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ruin/rockplanet/nanotrasen)
+"FJ" = (
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/ruin/rockplanet/nanotrasen)
+"FP" = (
+/obj/structure/frame/machine,
+/turf/open/floor/plating/asteroid/rockplanet/plating/scorched,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Gu" = (
+/obj/structure/closet/crate,
+/obj/item/gun/energy/laser,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"GA" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"GB" = (
+/obj/effect/turf_decal/spline/fancy/opaque/bottlegreen{
+ dir = 5
+ },
+/obj/item/chair/stool/bar,
+/turf/open/floor/plating/asteroid/rockplanet/lit{
+ icon_state = "plastic"
+ },
+/area/ruin/rockplanet/nanotrasen)
+"GK" = (
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"He" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/pond,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Hi" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Hr" = (
+/obj/structure/rack,
+/obj/item/ammo_box/magazine/m45,
+/obj/item/ammo_box/magazine/m45{
+ pixel_x = -5
+ },
+/obj/item/ammo_box/magazine/m45{
+ pixel_x = 7
+ },
+/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag,
+/turf/open/floor/plating/ashplanet/rocky,
+/area/ruin/rockplanet/nanotrasen)
+"HG" = (
+/obj/structure/flora/driftlog,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"HL" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/airlock/freezer{
+ dir = 8;
+ name = "Head"
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ruin/rockplanet/nanotrasen)
+"Io" = (
+/obj/structure/railing{
+ dir = 10
+ },
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ir" = (
+/obj/structure/railing,
+/obj/structure/closet/crate,
+/obj/item/gun/energy/laser,
+/obj/item/stock_parts/cell/high,
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Iw" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"IG" = (
+/obj/machinery/atmospherics/pipe/layer_manifold/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"IH" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/obj/effect/turf_decal/weather/dirt,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"IX" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/dirt/corner,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"IY" = (
+/obj/effect/decal/cleanable/glass/plasma,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"Jf" = (
+/obj/structure/window/plasma/reinforced/plastitanium,
+/turf/open/floor/plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Jy" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-6"
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"JA" = (
+/obj/effect/turf_decal/weather/dirt/corner,
+/obj/structure/flora/rock{
+ icon_state = "redrocks3"
+ },
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"JL" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/grass,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"JN" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"Kl" = (
+/obj/effect/turf_decal/weather/dirt/corner,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Kn" = (
+/obj/structure/window/plasma/reinforced/plastitanium,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"KA" = (
+/obj/structure/railing{
+ dir = 6
+ },
+/obj/structure/chair/plastic{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"KL" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"KN" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"KW" = (
+/obj/effect/decal/cleanable/robot_debris/gib,
+/obj/item/stack/sheet/metal/five{
+ pixel_x = 3;
+ pixel_y = 9
+ },
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"KX" = (
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Le" = (
+/obj/effect/turf_decal/spline/plain/transparent/green{
+ dir = 4;
+ icon_state = "spline_plain_cee"
+ },
+/obj/structure/frame/machine,
+/obj/effect/spawner/lootdrop/salvage_matter_bin,
+/turf/open/floor/plasteel/tech/grid,
+/area/ruin/rockplanet/nanotrasen)
+"Lk" = (
+/turf/open/floor/plasteel/grimy,
+/area/ruin/rockplanet/nanotrasen)
+"Ly" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"LA" = (
+/obj/structure/cable{
+ icon_state = "4-10"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/plating/scorched,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"LN" = (
+/obj/structure/filingcabinet/chestdrawer,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"LW" = (
+/obj/structure/rack,
+/obj/machinery/recharger{
+ pixel_x = 5;
+ pixel_y = 7
+ },
+/obj/item/stock_parts/cell{
+ pixel_x = -7;
+ pixel_y = 8
+ },
+/obj/item/stock_parts/cell{
+ pixel_x = -7;
+ pixel_y = 2
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"LX" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/techfloor{
+ dir = 1
+ },
+/obj/structure/cursed_money{
+ pixel_x = 3;
+ pixel_y = 10
+ },
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"Md" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Me" = (
+/obj/structure/table,
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 10;
+ pixel_y = 10
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 1;
+ pixel_y = 7
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 10;
+ pixel_y = 3
+ },
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 1;
+ pixel_y = 3
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"Mi" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/pond,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ms" = (
+/obj/structure/flora/rock{
+ icon_state = "basalt"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"MV" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"MW" = (
+/obj/structure/salvageable/autolathe,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"NV" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Oc" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-5"
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"Op" = (
+/turf/closed/wall/yesdiag,
+/area/ruin/rockplanet/nanotrasen)
+"Or" = (
+/mob/living/simple_animal/hostile/asteroid/basilisk/whitesands,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ot" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/general/visible/layer2{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/ruin/rockplanet/nanotrasen)
+"Ox" = (
+/obj/effect/turf_decal/spline/fancy/opaque/yellow{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/obj/effect/turf_decal/techfloor/hole,
+/turf/open/floor/plasteel/tech/techmaint,
+/area/ruin/rockplanet/nanotrasen)
+"OM" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/turf/open/floor/plating/asteroid/rockplanet/pond,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"OP" = (
+/obj/structure/rack,
+/obj/item/storage/fancy/cigarettes/cigars,
+/obj/item/lighter/greyscale,
+/turf/open/floor/plating/asteroid/rockplanet/plasteel,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"OS" = (
+/obj/structure/rack,
+/obj/item/reagent_containers/glass/bottle/morphine{
+ pixel_x = 4;
+ pixel_y = 6
+ },
+/obj/item/reagent_containers/hypospray/medipen/morphine{
+ pixel_y = -3
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"OY" = (
+/obj/item/reagent_containers/glass/bucket/wooden{
+ pixel_x = 5;
+ pixel_y = 4
+ },
+/obj/item/stack/sheet/cotton/cloth/ten{
+ pixel_x = -15;
+ pixel_y = 8
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/turf/open/floor/plating/asteroid/rockplanet/grass,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"OZ" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Pn" = (
+/obj/machinery/power/smes/engineering{
+ charge = 1000
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/plating/ashplanet/rocky,
+/area/ruin/rockplanet/nanotrasen)
+"PD" = (
+/obj/structure/bed{
+ icon_state = "dirty_mattress";
+ name = "dirty mattress"
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"PH" = (
+/obj/structure/frame/machine,
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"PI" = (
+/obj/effect/turf_decal/weather/dirt,
+/turf/open/floor/plating/asteroid/rockplanet/pond,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"PX" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/structure/table,
+/obj/machinery/computer/secure_data/laptop{
+ dir = 8;
+ pixel_x = 2;
+ pixel_y = 6
+ },
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating,
+/area/ruin/rockplanet/nanotrasen)
+"Qc" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/airlock/command{
+ dir = 8;
+ name = "Bridge";
+ req_access_txt = "19"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ruin/rockplanet/nanotrasen)
+"Qv" = (
+/turf/template_noop,
+/area/template_noop)
+"Rj" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/techfloor{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/glass/plasma,
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"Rk" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/terminal{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/rockplanet/nanotrasen)
+"Rn" = (
+/obj/machinery/power/shuttle/engine/electric,
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"RB" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"RM" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 1
+ },
+/obj/structure/flora/rock{
+ icon_state = "redrocks3"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"RN" = (
+/obj/structure/fence/door{
+ dir = 4
+ },
+/obj/structure/curtain/cloth/grey,
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/ruin/rockplanet/nanotrasen)
+"Sh" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Si" = (
+/obj/machinery/power/shieldwallgen/atmos{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"So" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/obj/item/stack/sheet/metal/five,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"SH" = (
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 8
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"SN" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 8
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Tb" = (
+/obj/structure/mecha_wreckage/ripley/firefighter,
+/turf/open/floor/plating/asteroid/rockplanet/plating/scorched,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Tn" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/turf/open/floor/plasteel,
+/area/ruin/rockplanet/nanotrasen)
+"TJ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/engineering{
+ dir = 1;
+ name = "Engineering"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2,
+/turf/open/floor/plasteel/patterned/grid,
+/area/ruin/rockplanet/nanotrasen)
+"TL" = (
+/obj/effect/turf_decal/spline/fancy/opaque/yellow{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"TT" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Ui" = (
+/obj/machinery/light/directional/south,
+/obj/effect/turf_decal/techfloor,
+/obj/structure/frame/computer{
+ dir = 1
+ },
+/turf/open/floor/plasteel/tech,
+/area/ruin/rockplanet/nanotrasen)
+"UX" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/airlock/maintenance_hatch{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"Vy" = (
+/obj/effect/decal/cleanable/xenoblood/xgibs,
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Wl" = (
+/obj/structure/barricade/sandbags,
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Wm" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/structure/flora/driftlog,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Xb" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Xj" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/plasteel,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Xk" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/light/small/broken/directional/south,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"Xq" = (
+/obj/structure/flora/rock{
+ icon_state = "redrocks1"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Xy" = (
+/obj/machinery/door/airlock/external{
+ dir = 4
+ },
+/turf/open/floor/engine/hull/interior,
+/area/ruin/rockplanet/nanotrasen)
+"XH" = (
+/turf/open/floor/plating/asteroid/rockplanet/pond,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"XK" = (
+/turf/closed/wall/rust,
+/area/ruin/rockplanet/nanotrasen)
+"XX" = (
+/obj/structure/mineral_door/sandstone,
+/turf/open/floor/plating/dirt/jungle/lit,
+/area/ruin/rockplanet/nanotrasen)
+"Yl" = (
+/obj/structure/table,
+/obj/item/modular_computer/laptop{
+ pixel_x = 3;
+ pixel_y = 8
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"Ym" = (
+/turf/closed/wall/yesdiag,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Yq" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/door_assembly/door_assembly_com{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/plasteel/patterned/grid,
+/area/ruin/rockplanet/nanotrasen)
+"Yy" = (
+/mob/living/simple_animal/hostile/asteroid/gutlunch,
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"YC" = (
+/obj/structure/toilet{
+ dir = 8
+ },
+/obj/structure/curtain,
+/turf/open/floor/plating,
+/area/ruin/rockplanet/nanotrasen)
+"YQ" = (
+/turf/closed/wall/mineral/sandstone,
+/area/ruin/rockplanet/nanotrasen)
+"YT" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/light/small/broken/directional/south,
+/turf/open/floor/plasteel/telecomms_floor,
+/area/ruin/rockplanet/nanotrasen)
+"YW" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/manifold/general/visible/layer2,
+/obj/structure/cable/yellow{
+ icon_state = "1-10"
+ },
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos,
+/area/ruin/rockplanet/nanotrasen)
+"Zc" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 5
+ },
+/obj/structure/cable/yellow{
+ icon_state = "6-8"
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"Ze" = (
+/obj/structure/closet/crate,
+/obj/item/storage/toolbox/emergency,
+/obj/item/storage/toolbox/emergency,
+/obj/item/stack/sheet/metal/ten,
+/turf/open/floor/plating/asteroid/rockplanet/plasteel,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"Zf" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/obj/machinery/light/small/broken/directional/south,
+/obj/structure/rack,
+/obj/item/stock_parts/subspace/crystal{
+ pixel_x = -8;
+ pixel_y = 4
+ },
+/obj/item/stock_parts/subspace/filter,
+/obj/item/circuitboard/machine/telecomms/relay,
+/turf/open/floor/plating{
+ icon_state = "wet_cracked2"
+ },
+/area/ruin/rockplanet/nanotrasen)
+"Zy" = (
+/turf/closed/wall/mineral/iron,
+/area/ruin/rockplanet/nanotrasen)
+"ZE" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"ZO" = (
+/obj/structure/rack,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/rockplanet/nanotrasen)
+"ZS" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/obj/effect/turf_decal/weather/dirt/corner{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/rockplanet/lit,
+/area/overmap_encounter/planetoid/rockplanet/explored)
+"ZZ" = (
+/obj/effect/turf_decal/spline/fancy/opaque/bottlegreen{
+ dir = 1
+ },
+/obj/machinery/light/small/broken/directional/north,
+/obj/structure/table_frame,
+/turf/open/floor/plating/asteroid/rockplanet/lit{
+ icon_state = "plastic"
+ },
+/area/ruin/rockplanet/nanotrasen)
+
+(1,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(2,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+Kl
+Hi
+iN
+vi
+iN
+iN
+iN
+iN
+Kl
+Hi
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(3,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+iN
+Kl
+pJ
+Md
+TT
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+Ly
+Hi
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(4,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+kV
+iN
+vi
+iN
+aX
+gY
+gY
+TT
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+gY
+Ly
+Hi
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(5,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+iN
+iN
+aX
+gY
+gY
+TT
+iN
+HG
+iN
+iN
+iN
+iN
+rc
+RB
+gY
+TT
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(6,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+uT
+iN
+Er
+aX
+gY
+pH
+yb
+iN
+iN
+iN
+Kl
+Hi
+iN
+iN
+aX
+gY
+TT
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(7,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+gY
+TT
+iN
+iN
+iN
+iN
+rc
+yb
+iN
+iN
+aX
+gY
+TT
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(8,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+tA
+dJ
+iN
+iN
+DP
+KN
+sK
+Hi
+iN
+iN
+iN
+iN
+iN
+vl
+Kl
+Md
+gY
+TT
+iN
+iN
+kV
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(9,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+gY
+wW
+TT
+iN
+iN
+Yy
+iN
+iN
+iN
+aX
+gY
+gY
+TT
+iN
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(10,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+gY
+gY
+TT
+iN
+iN
+iN
+iN
+iN
+vi
+DP
+SN
+gY
+TT
+vi
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(11,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+Ms
+iN
+iN
+iN
+Kl
+Md
+gY
+gY
+TT
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+gY
+gY
+TT
+iN
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(12,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+iN
+iN
+kV
+aX
+gY
+gY
+gY
+TT
+iN
+KX
+KX
+KX
+KX
+iN
+aX
+gY
+gY
+TT
+iN
+iN
+Ms
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(13,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+gY
+gY
+gY
+TT
+KX
+iN
+iN
+iN
+iN
+EK
+Md
+gY
+pH
+yb
+iN
+iN
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(14,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Xq
+iN
+iN
+KX
+KX
+KX
+BA
+gY
+gY
+pH
+yb
+iN
+iN
+iN
+gn
+DJ
+aX
+gY
+gY
+TT
+iN
+iN
+iN
+iN
+iN
+vi
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(15,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+KX
+iN
+iN
+iN
+rc
+RB
+gY
+TT
+iN
+iN
+iN
+yw
+aw
+iN
+aX
+gY
+mW
+fd
+iN
+iN
+Yy
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(16,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+gY
+TT
+iN
+iN
+iN
+HG
+yw
+vi
+DP
+qM
+nB
+uL
+iN
+Xq
+iN
+iN
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+"}
+(17,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+Er
+iN
+iN
+iN
+vi
+aX
+gY
+TT
+iN
+iN
+iN
+iN
+Kl
+Hi
+aX
+gY
+Ly
+cU
+iN
+iN
+iN
+iN
+Er
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+"}
+(18,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+pH
+sy
+bv
+bv
+Io
+TT
+aX
+TT
+aX
+gY
+gY
+TT
+KX
+iN
+iN
+iN
+iN
+tA
+iN
+Qv
+Qv
+Qv
+Qv
+"}
+(19,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+Yy
+iN
+iN
+Or
+rc
+vW
+wq
+vS
+cO
+Ir
+TT
+aX
+Ly
+Iw
+gY
+gY
+Ly
+Wl
+pJ
+Hi
+vi
+iN
+iN
+dJ
+jm
+jm
+jm
+Qv
+"}
+(20,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+gn
+iN
+Kl
+Md
+dM
+vS
+PX
+KA
+TT
+aX
+gY
+rW
+RB
+gY
+Ym
+sZ
+jI
+Ym
+tN
+iN
+jm
+jm
+jm
+jm
+jm
+Qv
+"}
+(21,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+Kl
+Md
+gY
+dM
+vS
+CN
+CN
+TT
+rc
+OZ
+vW
+Md
+Ym
+sZ
+Ba
+nf
+tN
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+"}
+(22,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+Xq
+iN
+aX
+gY
+gY
+NV
+vF
+CT
+SH
+iN
+iN
+iN
+aX
+gY
+gY
+vS
+nf
+Tb
+Ym
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(23,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+gY
+gY
+TT
+Kl
+Md
+TT
+iN
+iN
+iN
+aX
+gY
+gY
+mu
+Si
+sZ
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(24,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+kV
+iN
+iN
+iN
+aX
+gY
+gY
+TT
+aX
+gY
+jC
+iN
+iN
+iN
+DP
+lw
+gY
+rW
+tI
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(25,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+vi
+iN
+iN
+iN
+iN
+iN
+vi
+aX
+IH
+gY
+TT
+Wm
+gY
+TT
+Kl
+Hi
+iN
+aX
+gY
+Xb
+rH
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(26,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+Er
+iN
+iN
+iN
+iN
+rc
+ZE
+gY
+TT
+aX
+gY
+TT
+aX
+TT
+Kl
+Md
+gY
+gY
+Ly
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(27,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+uT
+iN
+iN
+iN
+iN
+iN
+iN
+vl
+iN
+iN
+aX
+gY
+TT
+rc
+OZ
+yb
+aX
+Ly
+Md
+gY
+gY
+EM
+XK
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+"}
+(28,1,1) = {"
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+iN
+iN
+iN
+iN
+iN
+iN
+jD
+Md
+gY
+Ly
+JA
+pJ
+pJ
+Md
+gY
+gY
+lg
+cl
+Bc
+XK
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+"}
+(29,1,1) = {"
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+pJ
+iN
+iN
+iN
+iN
+iN
+Xq
+iN
+iN
+iN
+iN
+aX
+gY
+gY
+gY
+oZ
+gY
+gY
+gY
+gY
+Bt
+lg
+zx
+Xk
+XK
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+"}
+(30,1,1) = {"
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+vM
+Sh
+Hi
+iN
+iN
+tA
+iN
+iN
+iN
+Er
+Kl
+Md
+gY
+gY
+YQ
+Xy
+XK
+YQ
+XX
+XK
+XK
+XK
+kN
+pb
+XK
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+"}
+(31,1,1) = {"
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+PI
+gY
+gY
+Ly
+Hi
+iN
+iN
+iN
+iN
+iN
+iN
+aX
+gY
+gY
+mu
+YQ
+uh
+XK
+zg
+zh
+lg
+Le
+XK
+XK
+UX
+XK
+on
+Zy
+Zy
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(32,1,1) = {"
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+He
+OM
+gY
+yn
+Ly
+Hi
+iN
+iN
+vi
+iN
+iN
+aX
+gY
+cr
+ZS
+YQ
+dB
+lg
+ZZ
+mz
+lg
+YT
+lg
+fw
+oz
+Kn
+ga
+LW
+Zy
+on
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(33,1,1) = {"
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+XH
+He
+OM
+JL
+hV
+TT
+iN
+iN
+iN
+iN
+iN
+cP
+gY
+YQ
+YQ
+YQ
+fM
+lg
+GB
+gs
+lg
+ei
+XK
+Rk
+Jy
+wf
+df
+Oc
+Hr
+Zy
+on
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(34,1,1) = {"
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+XH
+PI
+OY
+vM
+TT
+uT
+kV
+iN
+Kl
+pJ
+Iw
+gY
+Cm
+Zf
+lg
+uK
+XK
+XK
+ip
+lg
+qL
+XK
+rY
+Ot
+kS
+YW
+Zc
+wf
+qU
+on
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(35,1,1) = {"
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+XH
+He
+Mi
+jm
+yb
+iN
+iN
+iN
+aX
+gY
+uD
+YQ
+sR
+Ec
+CC
+GA
+Ox
+hy
+vN
+FI
+qp
+TJ
+Tn
+EF
+Zy
+IG
+Ab
+cd
+sX
+on
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(36,1,1) = {"
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+XH
+jm
+jm
+iN
+Or
+iN
+Kl
+AS
+OZ
+ZE
+YQ
+zp
+Ec
+fc
+rD
+TL
+AX
+oI
+il
+iZ
+XK
+lg
+aL
+Zy
+pV
+Fk
+vw
+wf
+on
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(37,1,1) = {"
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+aX
+Ly
+Hi
+aX
+YQ
+rD
+uo
+lg
+lg
+ba
+XK
+Qc
+lg
+HL
+XK
+uh
+uh
+on
+zz
+KL
+Pn
+xG
+on
+jm
+jm
+jm
+jm
+Qv
+Qv
+"}
+(38,1,1) = {"
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+KX
+aX
+gY
+IX
+Md
+YQ
+So
+fK
+XK
+uh
+MV
+lg
+Ew
+lg
+fe
+lg
+Gu
+on
+Zy
+Zy
+zH
+Zy
+Zy
+on
+on
+jm
+jm
+jm
+Qv
+Qv
+"}
+(39,1,1) = {"
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+Er
+iN
+BA
+mW
+uD
+gY
+XK
+DR
+lg
+lg
+Lk
+PD
+lg
+Ew
+lg
+YC
+lg
+lg
+Zy
+Yl
+FJ
+KL
+MW
+Em
+ZO
+Zy
+jm
+jm
+Qv
+Qv
+Qv
+"}
+(40,1,1) = {"
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Xq
+iN
+iN
+Kl
+pJ
+Md
+gY
+BX
+jw
+Op
+XK
+Op
+XK
+XK
+lg
+lg
+Yq
+XK
+XK
+XK
+jm
+Zy
+kf
+wf
+Fk
+wf
+FJ
+wf
+Zy
+jm
+jm
+Qv
+Qv
+Qv
+"}
+(41,1,1) = {"
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+vi
+aX
+gY
+gY
+gY
+Ly
+AS
+OZ
+RB
+gY
+XK
+LN
+is
+uB
+EI
+JN
+xk
+lg
+jm
+on
+uN
+FJ
+aN
+oW
+wf
+zU
+on
+jm
+jm
+Qv
+Qv
+Qv
+"}
+(42,1,1) = {"
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+Kl
+Md
+gY
+po
+gY
+gY
+TT
+iN
+kV
+jm
+jm
+LX
+hc
+uh
+tX
+fF
+Ui
+lg
+jm
+on
+Me
+wf
+FJ
+wf
+wf
+FJ
+Zy
+jm
+Qv
+Qv
+Qv
+Qv
+"}
+(43,1,1) = {"
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+Yy
+Kl
+Md
+Ym
+sZ
+gY
+gY
+pH
+RM
+iN
+iN
+jm
+jm
+jm
+zF
+IY
+jl
+gO
+Rj
+lg
+jm
+on
+EL
+FJ
+wf
+hm
+OS
+hm
+Zy
+jm
+Qv
+Qv
+Qv
+Qv
+"}
+(44,1,1) = {"
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+vi
+iN
+iN
+aX
+Ym
+tN
+Bt
+gY
+gY
+TT
+iN
+iN
+iN
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+on
+on
+RN
+Zy
+Zy
+on
+on
+jm
+Qv
+Qv
+Qv
+Qv
+"}
+(45,1,1) = {"
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+tA
+iN
+aX
+uu
+eo
+eo
+tN
+Ym
+TT
+iN
+Ms
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+vL
+GK
+GK
+GK
+GK
+GK
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(46,1,1) = {"
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+Ym
+sZ
+nf
+nf
+nf
+Ze
+sZ
+TT
+iN
+iN
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+GK
+GK
+Vy
+GK
+GK
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(47,1,1) = {"
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+sZ
+sZ
+sZ
+nf
+Xj
+OP
+tN
+Ym
+TT
+kV
+iN
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+GK
+GK
+GK
+GK
+GK
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(48,1,1) = {"
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+iN
+iN
+iN
+tN
+ha
+zw
+oq
+or
+Jf
+Ym
+OZ
+yb
+iN
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+GK
+GK
+GK
+KW
+GK
+GK
+GK
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(49,1,1) = {"
+Qv
+Qv
+Qv
+jm
+jm
+jm
+iN
+iN
+iN
+iN
+Ms
+iN
+sZ
+LA
+eo
+sZ
+sn
+Jf
+Ym
+iN
+iN
+iN
+dJ
+jm
+jm
+jm
+jm
+jm
+En
+GK
+GK
+GK
+GK
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(50,1,1) = {"
+Qv
+Qv
+Qv
+jm
+jm
+jm
+dJ
+iN
+iN
+iN
+iN
+iN
+PH
+lz
+eo
+sZ
+Jf
+Ym
+iN
+iN
+iN
+Qv
+jm
+jm
+jm
+jm
+jm
+Vy
+GK
+GK
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(51,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+jm
+Qv
+iN
+iN
+iN
+vi
+iN
+iN
+Rn
+FP
+sZ
+Ym
+iN
+iN
+vi
+iN
+Qv
+Qv
+jm
+jm
+jm
+GK
+GK
+GK
+GK
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(52,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+iN
+vS
+tN
+Ym
+iN
+kV
+Yy
+iN
+iN
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(53,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+uT
+iN
+sZ
+Ym
+iN
+iN
+tA
+iN
+iN
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(54,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+iN
+vi
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(55,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+Er
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(56,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+iN
+iN
+iN
+iN
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(57,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+jm
+jm
+jm
+jm
+jm
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
+(58,1,1) = {"
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+"}
diff --git a/_maps/map_catalogue.txt b/_maps/map_catalogue.txt
index e4f2881948b3..defa6335817d 100644
--- a/_maps/map_catalogue.txt
+++ b/_maps/map_catalogue.txt
@@ -290,6 +290,10 @@ Find the key for using this catalogue in "map_catalogue_key.txt"
Size = (x = 9)(y = 9)(z = 1)
Tags = "Boss Combat Challenge", "Major Loot", "Hazardous", "Inhospitable"
+ File Name = "_maps\RandomRuins\RockRuins\rockplanet_nomadcrash.dmm"
+ Size = (x = 58)(y = 48)(z = 1)
+ Tags = "Medium Combat Challenge", "Medium Loot", "Hazardous", "Hospitable"
+
SandRuins:
File Name = "_maps\RandomRuins\Ruins\whitesands_surface_assaultpodcrash.dmm"
@@ -507,6 +511,10 @@ Find the key for using this catalogue in "map_catalogue_key.txt"
Size = (x = 37)(y = 43)(z = 1)
Tags = "Medium Combat Challenge", "Medium Loot", "Liveable"
+ File Name = "_maps\RandomRuins\BeachRuins\beach_float_resort.dmm"
+ Size = (x = 38)(y = 52)(z = 1)
+ Tags = "No Combat", "Minor Loot", "Liveable"
+
Deprecated:
File Name = "_maps\RandomRuins\deprecated\jungle_surface_tumblr_sexyman.dmm"
Size = (x = 30)(y = 20)(z = 1)
@@ -565,7 +573,7 @@ Find the key for using this catalogue in "map_catalogue_key.txt"
Tags = "No Combat", "Medium Loot", "Shelter"
- Waste Ruins:
+ Waste Ruins:
File name ="_maps\RandomRuins\wasteruins\wasteplanet_clowncrash.dmm"
Size = (x = 11)(y = 12)(z = 1)
Tags = "No Combat", "Minor Loot", "Shelter" "hospitable"
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 36da2cc3ae7d..7df3a453acfb 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -134,8 +134,11 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(/obj/item/gun)))
#define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE)
//Gun weapon weight
+/// Allows you to dual wield this gun and your offhand gun
#define WEAPON_LIGHT 1
+/// Does not allow you to dual wield with this gun and your offhand gun
#define WEAPON_MEDIUM 2
+/// You must wield the gun to fire this gun
#define WEAPON_HEAVY 3
//Gun trigger guards
#define TRIGGER_GUARD_ALLOW_ALL -1
diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm
index a1494018d434..97b9c9d82aad 100644
--- a/code/__DEFINES/keybinding.dm
+++ b/code/__DEFINES/keybinding.dm
@@ -42,6 +42,7 @@
//Human
#define COMSIG_KB_HUMAN_QUICKEQUIP_DOWN "keybinding_human_quickequip_down"
#define COMSIG_KB_HUMAN_QUICKEQUIPBELT_DOWN "keybinding_human_quickequipbelt_down"
+#define COMSIG_KB_HUMAN_UNIQUEACTION "keybinding_uniqueaction"
#define COMSIG_KB_HUMAN_BAGEQUIP_DOWN "keybinding_human_bagequip_down"
#define COMSIG_KB_HUMAN_EQUIPMENTSWAP_DOWN "keybinding_human_equipmentswap_down"
#define COMSIG_KB_HUMAN_SUITEQUIP_DOWN "keybinding_human_suitequip_down"
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index 570edb76d8c4..865470774039 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -64,3 +64,13 @@
/// Flags for the pod_flags var on /obj/structure/closet/supplypod
#define FIRST_SOUNDS (1<<0) // If it shouldn't play sounds the first time it lands, used for reverse mode
+
+
+// Bullet hit sounds
+#define PROJECTILE_HITSOUND_FLESH (1<<0)
+#define PROJECTILE_HITSOUND_NON_LIVING (1<<1)
+#define PROJECTILE_HITSOUND_GLASS (1<<2)
+#define PROJECTILE_HITSOUND_STONE (1<<3)
+#define PROJECTILE_HITSOUND_METAL (1<<4)
+#define PROJECTILE_HITSOUND_WOOD (1<<5)
+#define PROJECTILE_HITSOUND_SNOW (1<<6)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 56f75905b7c4..1048aaa5c861 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -39,7 +39,6 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_legs, GLOB.spider_legs_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_spinneret, GLOB.spider_spinneret_list)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_mandibles, GLOB.spider_mandibles_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_feathers, GLOB.kepori_feathers_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_body_feathers, GLOB.kepori_body_feathers_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_tail_feathers, GLOB.kepori_tail_feathers_list)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index e824b3d82273..8838ba324530 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -78,8 +78,6 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_legs, GLOB.spider_legs_list)
if(!GLOB.spider_spinneret_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_spinneret, GLOB.spider_spinneret_list)
- if(!GLOB.spider_mandibles_list.len)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/spider_mandibles, GLOB.spider_mandibles_list)
if(!GLOB.kepori_feathers_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/kepori_feathers, GLOB.kepori_feathers_list)
if(!GLOB.kepori_tail_feathers_list.len)
@@ -118,7 +116,6 @@
"moth_wings" = pick(GLOB.moth_wings_list),
"face_markings" = pick(GLOB.face_markings_list),
"spider_legs" = pick(GLOB.spider_legs_list),
- "spider_mandibles" = pick(GLOB.spider_mandibles_list),
"spider_spinneret" = pick(GLOB.spider_spinneret_list),
"spines" = pick(GLOB.spines_list),
"squid_face" = pick(GLOB.squid_face_list),
@@ -244,7 +241,7 @@ GLOBAL_LIST_EMPTY(species_list)
return "unknown"
///Timed action involving two mobs, the user and the target.
-/proc/do_mob(mob/user , mob/target, time = 3 SECONDS, uninterruptible = FALSE, progress = TRUE, datum/callback/extra_checks = null)
+/proc/do_mob(mob/user , mob/target, time = 3 SECONDS, uninterruptible = FALSE, progress = TRUE, datum/callback/extra_checks = null, ignore_loc_change = FALSE)
if(!user || !target)
return FALSE
@@ -284,7 +281,12 @@ GLOBAL_LIST_EMPTY(species_list)
drifting = FALSE
user_loc = user.loc
- if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_held_item() != holding || user.incapacitated() || (extra_checks && !extra_checks.Invoke()))
+
+ if(!ignore_loc_change && ((!drifting && user.loc != user_loc) || target.loc != target_loc))
+ . = FALSE
+ break
+
+ if(user.get_active_held_item() != holding || user.incapacitated() || (extra_checks && !extra_checks.Invoke()))
. = FALSE
break
if(!QDELETED(progbar))
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index efd551badefb..d8aa5e22b1de 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -32,6 +32,27 @@
else if(dx<0)
.+=360
+
+////Tile coordinates (x, y) to absolute coordinates (in number of pixels). Center of a tile is generally assumed to be (16,16), but can be offset.
+#define ABS_COOR(c) (((c - 1) * 32) + 16)
+#define ABS_COOR_OFFSET(c, o) (((c - 1) * 32) + o)
+
+/proc/get_angle_with_scatter(atom/start, atom/end, scatter, x_offset = 16, y_offset = 16)
+ var/end_apx
+ var/end_apy
+ if(isliving(end)) //Center mass.
+ end_apx = ABS_COOR(end.x)
+ end_apy = ABS_COOR(end.y)
+ else //Exact pixel.
+ end_apx = ABS_COOR_OFFSET(end.x, x_offset)
+ end_apy = ABS_COOR_OFFSET(end.y, y_offset)
+ scatter = ((rand(0, min(scatter, 45))) * (prob(50) ? 1 : -1)) //Up to 45 degrees deviation to either side.
+ . = round((90 - ATAN2(end_apx - ABS_COOR(start.x), end_apy - ABS_COOR(start.y))), 1) + scatter
+ if(. < 0)
+ . += 360
+ else if(. >= 360)
+ . -= 360
+
/proc/Get_Pixel_Angle(y, x)//for getting the angle when animating something's pixel_x and pixel_y
if(!y)
return (x>=0)?90:270
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 66196b1a6dd6..aca090086487 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -43,7 +43,6 @@ GLOBAL_LIST_EMPTY(ipc_chassis_list)
GLOBAL_LIST_INIT(ipc_brain_list, list("Posibrain", "Man-Machine Interface"))
GLOBAL_LIST_EMPTY(spider_legs_list)
GLOBAL_LIST_EMPTY(spider_spinneret_list)
-GLOBAL_LIST_EMPTY(spider_mandibles_list)
GLOBAL_LIST_EMPTY(kepori_feathers_list)
GLOBAL_LIST_EMPTY(kepori_body_feathers_list)
GLOBAL_LIST_EMPTY(kepori_tail_feathers_list)
@@ -128,7 +127,7 @@ GLOBAL_LIST_INIT(ai_core_display_screens, sortList(list(
"Helios",
"House",
"Inverted",
- "Lamp", //WS edit, moff ai display
+ "Lamp",
"Matrix",
"Monochrome",
"Murica",
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index 28ab56d05211..f9c5c9c86399 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -134,17 +134,6 @@ SUBSYSTEM_DEF(mapping)
for(var/datum/planet_type/type as anything in subtypesof(/datum/planet_type))
planet_types[initial(type.planet)] = new type
- // Still supporting bans by filename
- // I hate this so much. I want to kill it because I don't think ANYONE uses this
- // Couldn't you just remove it on a fork or something??? come onnnnnnnnnnnn stop EXISTING already
- var/list/banned = generateMapList("[global.config.directory]/lavaruinblacklist.txt")
- banned += generateMapList("[global.config.directory]/spaceruinblacklist.txt")
- banned += generateMapList("[global.config.directory]/iceruinblacklist.txt")
- banned += generateMapList("[global.config.directory]/sandruinblacklist.txt")
- banned += generateMapList("[global.config.directory]/jungleruinblacklist.txt")
- banned += generateMapList("[global.config.directory]/rockruinblacklist.txt")
- banned += generateMapList("[global.config.directory]/wasteruinblacklist.txt")
-
for(var/item in sortList(subtypesof(/datum/map_template/ruin), /proc/cmp_ruincost_priority))
var/datum/map_template/ruin/ruin_type = item
// screen out the abstract subtypes
@@ -152,9 +141,6 @@ SUBSYSTEM_DEF(mapping)
continue
var/datum/map_template/ruin/R = new ruin_type()
- if(R.mappath in banned)
- continue
-
map_templates[R.name] = R
ruins_templates[R.name] = R
ruin_types_list[R.ruin_type] += list(R.name = R)
diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm
index bc55b9b76fc9..a6959425acba 100644
--- a/code/datums/components/fullauto.dm
+++ b/code/datums/components/fullauto.dm
@@ -243,9 +243,8 @@
if(!can_shoot())
shoot_with_empty_chamber(shooter)
return FALSE
- var/obj/item/bodypart/other_hand = shooter.has_hand_for_held_index(shooter.get_inactive_hand_index())
- if(weapon_weight == WEAPON_HEAVY && (shooter.get_inactive_held_item() || !other_hand))
- to_chat(shooter, "You need two hands to fire [src]!")
+ if(weapon_weight == WEAPON_HEAVY && (!wielded))
+ to_chat(shooter, "You need a more secure grip to fire [src]!")
return FALSE
return TRUE
@@ -260,6 +259,9 @@
SIGNAL_HANDLER
if(semicd || shooter.incapacitated())
return NONE
+ if(weapon_weight == WEAPON_HEAVY && (!wielded))
+ to_chat(shooter, "You need a more secure grip to fire [src]!")
+ return NONE
if(!can_shoot())
shoot_with_empty_chamber(shooter)
return NONE
diff --git a/code/datums/keybinding/carbon.dm b/code/datums/keybinding/carbon.dm
index 29e53039fa86..568a56e368df 100644
--- a/code/datums/keybinding/carbon.dm
+++ b/code/datums/keybinding/carbon.dm
@@ -22,7 +22,7 @@
return TRUE
/datum/keybinding/carbon/hold_throw_mode
- hotkey_keys = list("Space")
+// hotkey_keys = list("Space")
name = "hold_throw_mode"
full_name = "Hold throw mode"
description = "Hold this to turn on throw mode, and release it to turn off throw mode"
diff --git a/code/datums/keybinding/human.dm b/code/datums/keybinding/human.dm
index 41b698059bb4..e4ce3478e73a 100644
--- a/code/datums/keybinding/human.dm
+++ b/code/datums/keybinding/human.dm
@@ -20,6 +20,22 @@
H.quick_equip()
return TRUE
+/datum/keybinding/human/unique_action
+ hotkey_keys = list("Space")
+ name = "unique_action"
+ full_name = "Perform unique action"
+ description = ""
+ keybind_signal = COMSIG_KB_HUMAN_UNIQUEACTION
+
+
+/datum/keybinding/human/unique_action/down(client/user)
+ . = ..()
+ if(.)
+ return
+ var/mob/living/carbon/human/current_human = user.mob
+ current_human.do_unique_action()
+ return TRUE
+
/datum/keybinding/human/quick_equip_belt
hotkey_keys = list("ShiftE")
name = "quick_equip_belt"
diff --git a/code/datums/ruins/beachplanet.dm b/code/datums/ruins/beachplanet.dm
index f67112e4c52f..dae334aefae1 100644
--- a/code/datums/ruins/beachplanet.dm
+++ b/code/datums/ruins/beachplanet.dm
@@ -1,4 +1,4 @@
-// Hey! Listen! Update \config\beachruinblacklist.txt with your new ruins!
+// Hey! Listen! Update _maps\map_catalogue.txt with your new ruins!
/datum/map_template/ruin/beachplanet
prefix = "_maps/RandomRuins/BeachRuins/"
diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm
index afd841ff802e..a38ad6a1f86b 100644
--- a/code/datums/ruins/icemoon.dm
+++ b/code/datums/ruins/icemoon.dm
@@ -1,4 +1,4 @@
-// Hey! Listen! Update \config\iceruinblacklist.txt with your new ruins!
+// Hey! Listen! Update _maps\map_catalogue.txt with your new ruins!
/datum/map_template/ruin/icemoon
prefix = "_maps/RandomRuins/IceRuins/"
diff --git a/code/datums/ruins/jungle.dm b/code/datums/ruins/jungle.dm
index b6147faac1cd..b340bf2f9ac1 100644
--- a/code/datums/ruins/jungle.dm
+++ b/code/datums/ruins/jungle.dm
@@ -1,4 +1,4 @@
-// Hey! Listen! Update \config\jungleruinblacklist.txt with your new ruins!
+// Hey! Listen! Update _maps\map_catalogue.txt with your new ruins!
/datum/map_template/ruin/jungle
prefix = "_maps/RandomRuins/JungleRuins/"
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index 13d884187ad9..0c46f33ccacb 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -1,4 +1,4 @@
-// Hey! Listen! Update \config\lavaruinblacklist.txt with your new ruins!
+// Hey! Listen! Update _maps\map_catalogue.txt with your new ruins!
/datum/map_template/ruin/lavaland
prefix = "_maps/RandomRuins/LavaRuins/"
diff --git a/code/datums/ruins/rockplanet.dm b/code/datums/ruins/rockplanet.dm
index 5d8e74000564..269198a16ed4 100644
--- a/code/datums/ruins/rockplanet.dm
+++ b/code/datums/ruins/rockplanet.dm
@@ -1,4 +1,4 @@
-// Hey! Listen! Update \config\rockruinblacklist.txt with your new ruins!
+// Hey! Listen! Update _maps\map_catalogue.txt with your new ruins!
/datum/map_template/ruin/rockplanet
prefix = "_maps/RandomRuins/RockRuins/"
@@ -93,3 +93,9 @@
description = "Nanotrasen's gotta lay off some personnel, and this facility hasn't been worth the effort so far"
id = "rockplanet_budgetcuts"
suffix = "rockplanet_budgetcuts.dmm"
+
+/datum/map_template/ruin/rockplanet/nomadcrash
+ name = "Nomad Crash"
+ description = "A Crashed Arrow & Axe Interceptor. A long forgotten Crew. They tried their best to survive..."
+ id = "rockplanet_nomadcrash"
+ suffix = "rockplanet_nomadcrash.dmm"
diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 5aba2df7d5ce..f754aba26329 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -1,4 +1,4 @@
-// Hey! Listen! Update \config\spaceruinblacklist.txt with your new ruins!
+// Hey! Listen! Update _maps\map_catalogue.txt with your new ruins!
/datum/map_template/ruin/space
prefix = "_maps/RandomRuins/SpaceRuins/"
diff --git a/code/datums/ruins/wasteplanet.dm b/code/datums/ruins/wasteplanet.dm
index 38c07d74cdfc..80bf701526be 100644
--- a/code/datums/ruins/wasteplanet.dm
+++ b/code/datums/ruins/wasteplanet.dm
@@ -1,4 +1,4 @@
-// Hey! Listen! Update \config\wasteruinblacklist.txt with your new ruins!
+// Hey! Listen! Update _maps\map_catalogue.txt with your new ruins!
/datum/map_template/ruin/wasteplanet
prefix = "_maps/RandomRuins/WasteRuins/"
diff --git a/code/datums/ruins/whitesands.dm b/code/datums/ruins/whitesands.dm
index 062a64db559a..eaf742ce2a29 100644
--- a/code/datums/ruins/whitesands.dm
+++ b/code/datums/ruins/whitesands.dm
@@ -1,4 +1,4 @@
-// Hey! Listen! Update \config\sandruinblacklist.txt with your new ruins!
+// Hey! Listen! Update _maps\map_catalogue.txt with your new ruins!
/datum/map_template/ruin/whitesands
prefix = "_maps/RandomRuins/SandRuins/"
diff --git a/code/game/area/areas/ruins/rockplanet.dm b/code/game/area/areas/ruins/rockplanet.dm
index cabadd3f252d..a869f0c53816 100644
--- a/code/game/area/areas/ruins/rockplanet.dm
+++ b/code/game/area/areas/ruins/rockplanet.dm
@@ -1,7 +1,17 @@
/**********************Rock Planet Areas**************************/
-/area/mine/rockplanet
+//syndicate
+/area/ruin/rockplanet/syndicate
name = "Abandoned Syndicate Mining Facility"
+ icon_state = "green"
-/area/mine/rockplanet_nanotrasen
+//budgetcuts
+/area/ruin/rockplanet/nanotrasen
name = "Abandoned Mining Facility"
+ icon_state = "green"
+
+//nomad
+/area/ruin/rockplanet/nomad
+ name = "Abandoned Crash Site"
+ always_unpowered = FALSE
+ icon_state = "red"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 084736fb7069..af81665d8c46 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -156,6 +156,10 @@
///Default Y pixel offset
var/base_pixel_y
+ ///Wanted sound when hit by a projectile
+ var/hitsound_type = PROJECTILE_HITSOUND_NON_LIVING
+ ///volume wanted for being hit
+ var/hitsound_volume = 50
/**
* Called when an atom is created in byond (built in engine proc)
*
@@ -587,6 +591,33 @@
SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone)
. = P.on_hit(src, 0, def_zone, piercing_hit)
+/atom/proc/bullet_hit_sfx(obj/projectile/hitting_projectile)
+ var/selected_sound = ""
+
+ if(!hitsound_volume)
+ return FALSE
+ if(!hitsound_volume)
+ return FALSE
+
+ switch(hitsound_type)
+ if(PROJECTILE_HITSOUND_FLESH)
+ selected_sound = hitting_projectile.hitsound
+ if(PROJECTILE_HITSOUND_NON_LIVING)
+ selected_sound = hitting_projectile.hitsound_non_living
+ if(PROJECTILE_HITSOUND_GLASS)
+ selected_sound = hitting_projectile.hitsound_glass
+ if(PROJECTILE_HITSOUND_STONE)
+ selected_sound = hitting_projectile.hitsound_stone
+ if(PROJECTILE_HITSOUND_METAL)
+ selected_sound = hitting_projectile.hitsound_metal
+ if(PROJECTILE_HITSOUND_WOOD)
+ selected_sound = hitting_projectile.hitsound_wood
+ if(PROJECTILE_HITSOUND_SNOW)
+ selected_sound = hitting_projectile.hitsound_snow
+
+ playsound(src, selected_sound, hitsound_volume, TRUE)
+ return TRUE
+
///Return true if we're inside the passed in atom
/atom/proc/in_contents_of(container)//can take class or object instance as argument
if(ispath(container))
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index bc793eb60d82..3af464033b52 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -95,6 +95,8 @@ Class Procs:
anchored = TRUE
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT
+ hitsound_type = PROJECTILE_HITSOUND_METAL
+
var/machine_stat = NONE
var/use_power = IDLE_POWER_USE
//0 = dont run the auto
diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm
index 49b13bb0c2c9..bdbadf79a943 100644
--- a/code/game/machinery/computer/_computer.dm
+++ b/code/game/machinery/computer/_computer.dm
@@ -21,6 +21,8 @@
///Does this computer have a unique icon_state? Prevents the changing of icons from alternative computer construction
var/unique_icon = FALSE
+ hitsound_type = PROJECTILE_HITSOUND_GLASS
+
/obj/machinery/computer/Initialize(mapload, obj/item/circuitboard/C)
. = ..()
power_change()
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index e10f0786489c..149e1a4f12a2 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -24,6 +24,8 @@
var/cable = 1
var/list/debris = list()
+ hitsound_type = PROJECTILE_HITSOUND_GLASS
+
/obj/machinery/door/window/Initialize(mapload, set_dir)
. = ..()
flags_1 &= ~PREVENT_CLICK_UNDER_1
diff --git a/code/game/objects/effects/decals/turfdecal/flooring_decals.dm b/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
index cfbc81a631a1..b5c6f9fe0eec 100644
--- a/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
+++ b/code/game/objects/effects/decals/turfdecal/flooring_decals.dm
@@ -1092,3 +1092,17 @@ TURF_DECAL_COLOR_HELPER(transparent/inteqbrown, "#4b2a18", 140)
/obj/effect/turf_decal/hardline_big/seven
icon_state = "hardline_big-7"
+
+//ARROW & AXE DOCKYARDS
+
+/obj/effect/turf_decal/arrowaxe_small
+ name = "small arrow & axe logo"
+
+/obj/effect/turf_decal/arrowaxe_small/left
+ icon_state = "arrowaxe-left"
+
+/obj/effect/turf_decal/arrowaxe_small/center
+ icon_state = "arrowaxe-center"
+
+/obj/effect/turf_decal/arrowaxe_small/right
+ icon_state = "arrowaxe-right"
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index d825f49c811d..8f2a0eb60262 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -544,3 +544,16 @@
/obj/effect/constructing_effect/proc/end()
qdel(src)
+
+/obj/effect/muzzle_flash
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "muzzle_flash"
+ layer = ABOVE_MOB_LAYER
+ plane = GAME_PLANE
+ appearance_flags = KEEP_APART|TILE_BOUND
+ var/applied = FALSE
+
+/obj/effect/muzzle_flash/Initialize(mapload, new_icon_state)
+ . = ..()
+ if(new_icon_state)
+ icon_state = new_icon_state
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index e13cca64caf9..7c68edad2b61 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -453,14 +453,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
SEND_SIGNAL(src, COMSIG_ITEM_HIT_REACT, args)
if((prob(final_block_chance) && COOLDOWN_FINISHED(src, block_cooldown)) || (prob(final_block_chance) && istype(src, /obj/item/shield)))
owner.visible_message("[owner] blocks [attack_text] with [src]!")
- var/rand_ricochet = pick(list(
- 'sound/weapons/effects/ric1.ogg',
- 'sound/weapons/effects/ric2.ogg',
- 'sound/weapons/effects/ric3.ogg',
- 'sound/weapons/effects/ric4.ogg',
- 'sound/weapons/effects/ric5.ogg'
- ))
- playsound(src, rand_ricochet, 100)
+ playsound(src, 'sound/weapons/effects/deflect.ogg', 100)
if(!istype(src, /obj/item/shield))
COOLDOWN_START(src, block_cooldown, block_cooldown_time)
return 1
@@ -1099,6 +1092,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
if(SEND_SIGNAL(src, COMSIG_ITEM_OFFER_TAKEN, offerer, taker) & COMPONENT_OFFER_INTERRUPT)
return TRUE
+///Intended for interactions with guns, like racking
+/obj/item/proc/unique_action(mob/living/user)
+ return
+
/**
* Returns null if this object cannot be used to interact with physical writing mediums such as paper.
* Returns a list of key attributes for this object interacting with paper otherwise.
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 61acce5c9d0a..9187aac8c808 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -68,13 +68,13 @@
if(3)
take_damage(rand(10, 90), BRUTE, "bomb", 0)
-/obj/bullet_act(obj/projectile/P)
+/obj/bullet_act(obj/projectile/hitting_projectile)
. = ..()
- playsound(src, P.hitsound, 50, TRUE)
- if(P.suppressed != SUPPRESSED_VERY)
- visible_message("[src] is hit by \a [P]!", null, null, COMBAT_MESSAGE_RANGE)
+ bullet_hit_sfx(hitting_projectile)
+ if(hitting_projectile.suppressed != SUPPRESSED_VERY)
+ visible_message("[src] is hit by \a [hitting_projectile]!", null, null, COMBAT_MESSAGE_RANGE)
if(!QDELETED(src)) //Bullet on_hit effect might have already destroyed this object
- take_damage(P.damage, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration)
+ take_damage(hitting_projectile.damage, hitting_projectile.damage_type, hitting_projectile.flag, 0, turn(hitting_projectile.dir, 180), hitting_projectile.armour_penetration)
///Called to get the damage that hulks will deal to the obj.
/obj/proc/hulk_damage()
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index c0198939c24a..69efcd42af15 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -7,6 +7,8 @@
flags_ricochet = RICOCHET_HARD
ricochet_chance_mod = 0.5
+ hitsound_type = PROJECTILE_HITSOUND_METAL
+
var/climb_time = 20
var/climbable = FALSE
var/mob/living/structureclimber
diff --git a/code/game/objects/structures/beds_chairs/pew.dm b/code/game/objects/structures/beds_chairs/pew.dm
index b7aa1f65d2bd..8e5cf9a19493 100644
--- a/code/game/objects/structures/beds_chairs/pew.dm
+++ b/code/game/objects/structures/beds_chairs/pew.dm
@@ -9,6 +9,8 @@
buildstackamount = 3
item_chair = null
+ hitsound_type = PROJECTILE_HITSOUND_WOOD
+
/obj/structure/chair/pew/left
name = "left wooden pew end"
icon_state = "pewend_left"
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 700d55361d90..ebfda776726f 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -6,6 +6,8 @@
density = TRUE
anchored = TRUE
+ hitsound_type = PROJECTILE_HITSOUND_WOOD
+
/obj/structure/dresser/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_WRENCH)
to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].")
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 2c56b9d7a095..ed408da5487b 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -3,6 +3,8 @@
max_integrity = 40
anchored = TRUE
+ hitsound_type = PROJECTILE_HITSOUND_NON_LIVING
+
/obj/structure/flora/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
@@ -22,6 +24,8 @@
layer = FLY_LAYER
var/log_amount = 10
+ hitsound_type = PROJECTILE_HITSOUND_WOOD
+
/obj/structure/flora/tree/ComponentInitialize()
. = ..()
AddComponent(/datum/component/largetransparency)
@@ -52,6 +56,8 @@
density = FALSE
pixel_x = -16
+ hitsound_type = PROJECTILE_HITSOUND_WOOD
+
/obj/structure/flora/tree/pine
name = "pine tree"
desc = "A coniferous pine tree."
@@ -370,6 +376,8 @@
icon_state = "random_plant"
var/list/static/states
+ hitsound_type = PROJECTILE_HITSOUND_STONE
+
/obj/item/kirbyplants/random/Initialize()
. = ..()
icon = 'icons/obj/flora/plants.dmi'
@@ -424,6 +432,8 @@
max_integrity = 100
var/obj/item/stack/mineResult = /obj/item/stack/ore/glass/basalt
+ hitsound_type = PROJECTILE_HITSOUND_STONE
+
/obj/structure/flora/rock/Initialize()
. = ..()
icon_state = "[base_icon_state][rand(1,3)]"
diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm
index d06d5e167157..970aa5c19317 100644
--- a/code/game/objects/structures/lavaland/necropolis_tendril.dm
+++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm
@@ -15,6 +15,8 @@
anchored = TRUE
resistance_flags = FIRE_PROOF | LAVA_PROOF
+ hitsound_type = PROJECTILE_HITSOUND_FLESH
+
var/gps = null
var/obj/effect/light_emitter/tendril/emitted_light
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 16189291abc0..94c556f41383 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -339,6 +339,8 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
var/list/debris = list()
+ hitsound_type = PROJECTILE_HITSOUND_GLASS
+
/obj/structure/table/glass/Initialize()
. = ..()
debris += new frame
@@ -424,6 +426,8 @@
smoothing_groups = list(SMOOTH_GROUP_WOOD_TABLES) //Don't smooth with SMOOTH_GROUP_TABLES
canSmoothWith = list(SMOOTH_GROUP_WOOD_TABLES)
+ hitsound_type = PROJECTILE_HITSOUND_WOOD
+
/obj/structure/table/wood/narsie_act(total_override = TRUE)
if(!total_override)
..()
@@ -776,6 +780,8 @@
armor = list("melee" = 10, "bullet" = 30, "laser" = 30, "energy" = 100, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) //trolld
can_flip = FALSE //same as reinforced and theres no sprites for it
+ hitsound_type = PROJECTILE_HITSOUND_WOOD
+
/obj/structure/table/wood/reinforced/deconstruction_hints(mob/user)
if(deconstruction_ready)
return "The top cover has been pried loose and the main frame's bolts are exposed."
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 92a72b7261be..06ec0ac2fbf4 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -30,6 +30,8 @@
flags_ricochet = RICOCHET_HARD
ricochet_chance_mod = 0.4
+ hitsound_type = PROJECTILE_HITSOUND_GLASS
+
/obj/structure/window/examine(mob/user)
. = ..()
if(flags_1 & NODECONSTRUCT_1)
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 09affc888bf0..9b53f3d2b010 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -245,8 +245,62 @@ distance_multiplier - Can be used to multiply the distance at which the sound is
soundin = pick('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
if ("pageturn")
soundin = pick('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg')
- if ("ricochet")
- soundin = pick('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg','sound/weapons/effects/ric3.ogg','sound/weapons/effects/ric4.ogg','sound/weapons/effects/ric5.ogg')
+//gun related stuff start
+ if ("bullet_hit")
+ soundin = pick('sound/weapons/gun/hit/bullet_impact1.ogg', 'sound/weapons/gun/hit/bullet_impact2.ogg','sound/weapons/gun/hit/bullet_impact3.ogg')
+ if ("bullet_impact")
+ soundin = pick('sound/weapons/gun/hit/bullet_ricochet1.ogg', 'sound/weapons/gun/hit/bullet_ricochet2.ogg','sound/weapons/gun/hit/bullet_ricochet3.ogg','sound/weapons/gun/hit/bullet_ricochet4.ogg','sound/weapons/gun/hit/bullet_ricochet5.ogg','sound/weapons/gun/hit/bullet_ricochet6.ogg','sound/weapons/gun/hit/bullet_ricochet7.ogg','sound/weapons/gun/hit/bullet_ricochet8.ogg')
+ if ("bullet_bounce")
+ soundin = pick('sound/weapons/gun/hit/bullet_bounce1.ogg', 'sound/weapons/gun/hit/bullet_bounce2.ogg','sound/weapons/gun/hit/bullet_bounce3.ogg','sound/weapons/gun/hit/bullet_bounce4.ogg','sound/weapons/gun/hit/bullet_bounce5.ogg')
+ if("bullet_miss")
+ soundin = pick('sound/weapons/gun/hit/bullet_miss1.ogg', 'sound/weapons/gun/hit/bullet_miss2.ogg', 'sound/weapons/gun/hit/bullet_miss3.ogg')
+ if("bullet_hit_glass")
+ soundin = pick(
+ 'sound/weapons/gun/hit/bullet_glass_01.ogg',
+ 'sound/weapons/gun/hit/bullet_glass_02.ogg',
+ 'sound/weapons/gun/hit/bullet_glass_03.ogg',
+ 'sound/weapons/gun/hit/bullet_glass_04.ogg',
+ 'sound/weapons/gun/hit/bullet_glass_05.ogg',
+ 'sound/weapons/gun/hit/bullet_glass_06.ogg',
+ 'sound/weapons/gun/hit/bullet_glass_07.ogg',
+ )
+ if("bullet_hit_stone")
+ soundin = pick(
+ 'sound/weapons/gun/hit/bullet_masonry_01.ogg',
+ 'sound/weapons/gun/hit/bullet_masonry_02.ogg',
+ 'sound/weapons/gun/hit/bullet_masonry_03.ogg',
+ 'sound/weapons/gun/hit/bullet_masonry_04.ogg',
+ 'sound/weapons/gun/hit/bullet_masonry_05.ogg',
+ 'sound/weapons/gun/hit/bullet_masonry_06.ogg',
+ )
+ if("bullet_hit_metal")
+ soundin = pick(
+ 'sound/weapons/gun/hit/bullet_metal_01.ogg',
+ 'sound/weapons/gun/hit/bullet_metal_02.ogg',
+ 'sound/weapons/gun/hit/bullet_metal_03.ogg',
+ 'sound/weapons/gun/hit/bullet_metal_04.ogg',
+ 'sound/weapons/gun/hit/bullet_metal_05.ogg',
+ 'sound/weapons/gun/hit/bullet_metal_06.ogg',
+ )
+ if("bullet_hit_wood")
+ soundin = pick(
+ 'sound/weapons/gun/hit/bullet_wood_01.ogg',
+ 'sound/weapons/gun/hit/bullet_wood_02.ogg',
+ 'sound/weapons/gun/hit/bullet_wood_03.ogg',
+ 'sound/weapons/gun/hit/bullet_wood_04.ogg',
+ 'sound/weapons/gun/hit/bullet_wood_05.ogg',
+ 'sound/weapons/gun/hit/bullet_wood_06.ogg',
+ )
+ if("bullet_hit_snow")
+ soundin = pick(
+ 'sound/weapons/gun/hit/bullet_snow_01.ogg',
+ 'sound/weapons/gun/hit/bullet_snow_02.ogg',
+ 'sound/weapons/gun/hit/bullet_snow_03.ogg',
+ 'sound/weapons/gun/hit/bullet_snow_04.ogg',
+ 'sound/weapons/gun/hit/bullet_snow_05.ogg',
+ 'sound/weapons/gun/hit/bullet_snow_06.ogg',
+ )
+// gun related stuff end
if ("terminal_type")
soundin = pick('sound/machines/terminal_button01.ogg', 'sound/machines/terminal_button02.ogg', 'sound/machines/terminal_button03.ogg', \
'sound/machines/terminal_button04.ogg', 'sound/machines/terminal_button05.ogg', 'sound/machines/terminal_button06.ogg', \
@@ -257,8 +311,6 @@ distance_multiplier - Can be used to multiply the distance at which the sound is
soundin = pick('sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg')
if ("can_open")
soundin = pick('sound/effects/can_open1.ogg', 'sound/effects/can_open2.ogg', 'sound/effects/can_open3.ogg')
- if("bullet_miss")
- soundin = pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg')
if("revolver_spin")
soundin = pick('sound/weapons/gun/revolver/spin1.ogg', 'sound/weapons/gun/revolver/spin2.ogg', 'sound/weapons/gun/revolver/spin3.ogg')
if("law")
diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm
index aaaf430d37ee..d2d99ed67966 100644
--- a/code/game/turfs/closed/minerals.dm
+++ b/code/game/turfs/closed/minerals.dm
@@ -30,6 +30,8 @@
var/x_offset = -4
var/y_offset = -4
+ hitsound_type = PROJECTILE_HITSOUND_STONE
+
/turf/closed/mineral/Initialize(mapload, inherited_virtual_z)
. = ..()
if(has_borders)
diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm
index 77259ba448d2..720a95afd0e1 100644
--- a/code/game/turfs/closed/wall/mineral_walls.dm
+++ b/code/game/turfs/closed/wall/mineral_walls.dm
@@ -7,6 +7,8 @@
var/last_event = 0
var/active = null
+ hitsound_type = PROJECTILE_HITSOUND_METAL
+
/turf/closed/wall/mineral/gold
name = "gold wall"
desc = "A wall with gold plating. Swag!"
@@ -60,6 +62,8 @@
connector_icon_state = "diamond_wall_connector"
no_connector_typecache = list(/turf/closed/wall/mineral/diamond, /obj/structure/falsewall/diamond)
+ hitsound_type = PROJECTILE_HITSOUND_GLASS
+
/turf/closed/wall/mineral/diamond/yesdiag
icon_state = "diamond_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
@@ -97,6 +101,8 @@
connector_icon_state = "sandstone_wall_connector"
no_connector_typecache = list(/turf/closed/wall/mineral/sandstone, /obj/structure/falsewall/sandstone)
+ hitsound_type = PROJECTILE_HITSOUND_NON_LIVING
+
/turf/closed/wall/mineral/sandstone/yesdiag
icon_state = "sandstone_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
@@ -181,6 +187,8 @@
connector_icon_state = "plasma_wall_connector"
no_connector_typecache = list(/turf/closed/wall/mineral/plasma, /obj/structure/falsewall/plasma)
+ hitsound_type = PROJECTILE_HITSOUND_GLASS
+
/turf/closed/wall/mineral/plasma/yesdiag
icon_state = "plasma_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
@@ -230,6 +238,8 @@
connector_icon_state = "wood_wall_connector"
no_connector_typecache = list(/turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood)
+ hitsound_type = PROJECTILE_HITSOUND_WOOD
+
/turf/closed/wall/mineral/wood/yesdiag
icon_state = "wood_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS | SMOOTH_CONNECTORS
@@ -298,6 +308,8 @@
bullet_sizzle = TRUE
bullet_bounce_sound = null
+ hitsound_type = PROJECTILE_HITSOUND_SNOW
+
/turf/closed/wall/mineral/snow/yesdiag
icon_state = "snow_wall-255"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
@@ -331,6 +343,8 @@
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_TITANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE)
+ hitsound_type = PROJECTILE_HITSOUND_NON_LIVING
+
/turf/closed/wall/mineral/titanium/exterior
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_TITANIUM_WALLS_EXTERIOR)
canSmoothWith = list(SMOOTH_GROUP_TITANIUM_WALLS_EXTERIOR, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE)
@@ -407,6 +421,8 @@
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS)
canSmoothWith = list(SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE)
+ hitsound_type = PROJECTILE_HITSOUND_NON_LIVING
+
/turf/closed/wall/mineral/plastitanium/nodiagonal
icon = 'icons/turf/walls/plastitanium_wall.dmi'
icon_state = "map-shuttle_nd"
diff --git a/code/game/turfs/open/floor/plating/rockplanet.dm b/code/game/turfs/open/floor/plating/rockplanet.dm
index 1bd9f537c9af..1fbf75b2e2f2 100644
--- a/code/game/turfs/open/floor/plating/rockplanet.dm
+++ b/code/game/turfs/open/floor/plating/rockplanet.dm
@@ -33,6 +33,9 @@
icon_state = "wet_soft0"
base_icon_state = "wet_soft"
+/turf/open/floor/plating/asteroid/rockplanet/wet/atmos
+ initial_gas_mix = OPENTURF_DEFAULT_ATMOS
+
/turf/open/floor/plating/asteroid/rockplanet/wet/lit
light_range = 2
light_power = 0.6
@@ -46,3 +49,37 @@
light_range = 2
light_power = 0.6
light_color = COLOR_VERY_LIGHT_GRAY
+
+/turf/open/floor/plating/asteroid/rockplanet/grass
+ name = "dry grass"
+ desc = "A patch of dry grass."
+ icon_state = "grass0"
+
+/turf/open/floor/plating/asteroid/rockplanet/mud
+ name = "mud"
+ icon_state = "greenerdirt"
+
+/turf/open/floor/plating/asteroid/rockplanet/pond
+ name = "pond"
+ icon_state = "riverwater"
+
+/turf/open/floor/plating/asteroid/rockplanet/plating
+ name = "exterior plating"
+ icon_state = "plating"
+
+/turf/open/floor/plating/asteroid/rockplanet/plating/scorched
+ name = "exterior plating"
+ icon_state = "panelscorched"
+
+/turf/open/floor/plating/asteroid/rockplanet/stairs
+ name = "exterior stairs"
+ icon_state = "stairs"
+
+/turf/open/floor/plating/asteroid/rockplanet/hull_plating
+ name = "exterior hull plating"
+ icon_state = "regular_hull"
+
+/turf/open/floor/plating/asteroid/rockplanet/plasteel
+ name = "exterior floor"
+ icon_state = "tiled_gray"
+ icon = 'icons/turf/floors/tiles.dmi'
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index b3305f725e0e..eade8de308d7 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -33,7 +33,7 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists)
var/requires_activation //add to air processing after initialize?
var/changing_turf = FALSE
- var/bullet_bounce_sound = 'sound/weapons/gun/general/mag_bullet_remove.ogg' //sound played when a shell casing is ejected ontop of the turf.
+ var/list/bullet_bounce_sound = list('sound/weapons/gun/general/bulletcasing_bounce1.ogg', 'sound/weapons/gun/general/bulletcasing_bounce2.ogg', 'sound/weapons/gun/general/bulletcasing_bounce3.ogg')
var/bullet_sizzle = FALSE //used by ammo_casing/bounce_away() to determine if the shell casing should make a sizzle sound when it's ejected over the turf
//IE if the turf is supposed to be water, set TRUE.
@@ -76,6 +76,8 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists)
///the holodeck can load onto this turf if TRUE
var/holodeck_compatible = FALSE
+ hitsound_volume = 90
+
/turf/vv_edit_var(var_name, new_value)
var/static/list/banned_edits = list("x", "y", "z")
if(var_name in banned_edits)
@@ -669,3 +671,7 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists)
. += "[/obj/effect/turf_decal]{\n\ticon = '[decal.pic.icon]';\n\ticon_state = \"[decal.pic.icon_state]\";\n\tdir = [decal.pic.dir];\n\tcolor = \"[decal.pic.color]\"\n\t}"
first = FALSE
return
+
+/turf/bullet_act(obj/projectile/hitting_projectile)
+ . = ..()
+ bullet_hit_sfx(hitting_projectile)
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index 343289191fb6..c1845945485f 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -38,7 +38,6 @@
H.dna.features["moth_fluff"] = pick(GLOB.moth_fluff_list)
H.dna.features["spider_legs"] = pick(GLOB.spider_legs_list)
H.dna.features["spider_spinneret"] = pick(GLOB.spider_spinneret_list)
- H.dna.features["spider_mandibles"] = pick(GLOB.spider_mandibles_list)
H.dna.features["squid_face"] = pick(GLOB.squid_face_list)
H.dna.features["kepori_feathers"] = pick(GLOB.kepori_feathers_list)
H.dna.features["kepori_body_feathers"] = pick(GLOB.kepori_body_feathers_list)
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 7323160deceb..5dc59564a41e 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -173,7 +173,7 @@
/obj/item/cult_bastard/IsReflect()
if(spinning)
- playsound(src, pick('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg', 'sound/weapons/effects/ric3.ogg', 'sound/weapons/effects/ric4.ogg', 'sound/weapons/effects/ric5.ogg'), 100, TRUE)
+ playsound(src, 'sound/weapons/effects/deflect.ogg', 100, TRUE)
return TRUE
else
..()
@@ -182,7 +182,7 @@
if(prob(final_block_chance))
if(attack_type == PROJECTILE_ATTACK)
owner.visible_message("[owner] deflects [attack_text] with [src]!")
- playsound(src, pick('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg', 'sound/weapons/effects/ric3.ogg', 'sound/weapons/effects/ric4.ogg', 'sound/weapons/effects/ric5.ogg'), 100, TRUE)
+ playsound(src, 'sound/weapons/effects/deflect.ogg', 100, TRUE)
return TRUE
else
playsound(src, 'sound/weapons/parry.ogg', 75, TRUE)
@@ -666,7 +666,7 @@
if(prob(final_block_chance))
if(attack_type == PROJECTILE_ATTACK)
owner.visible_message("[owner] deflects [attack_text] with [src]!")
- playsound(src, pick('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg', 'sound/weapons/effects/ric3.ogg', 'sound/weapons/effects/ric4.ogg', 'sound/weapons/effects/ric5.ogg'), 100, TRUE)
+ playsound(src, 'sound/weapons/effects/deflect.ogg', 100, TRUE)
return TRUE
else
playsound(src, 'sound/weapons/parry.ogg', 100, TRUE)
diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm
index 9bb96a14be5c..33a5ee37be02 100644
--- a/code/modules/cargo/packs/ammo.dm
+++ b/code/modules/cargo/packs/ammo.dm
@@ -22,6 +22,15 @@
/obj/item/ammo_box/magazine/m45)
cost = 1500
+/datum/supply_pack/ammo/m45_speedloader
+ name = ".45 ACP Speedloader Crate"
+ desc = "Contains four .45 ACP speedloaders for revolvers, each containing six rounds."
+ contains = list(/obj/item/ammo_box/c45_speedloader,
+ /obj/item/ammo_box/c45_speedloader,
+ /obj/item/ammo_box/c45_speedloader,
+ /obj/item/ammo_box/c45_speedloader)
+ cost = 1500
+
/datum/supply_pack/ammo/c38_mag
name = ".38 Speedloader Crate"
desc = "Contains four .38 speedloaders for revolvers, each containing six rounds."
diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm
index b91fe38e0390..6ca715889855 100644
--- a/code/modules/cargo/packs/gun.dm
+++ b/code/modules/cargo/packs/gun.dm
@@ -39,12 +39,18 @@
/obj/item/gun/ballistic/revolver)
/datum/supply_pack/gun/detrevolver
- name = "Revolver crate"
+ name = "Hunter's Pride Detective Revolver crate"
desc = "Contains two concealable Solarian revolvers, chambered in .38."
cost = 2000
contains = list(/obj/item/gun/ballistic/revolver/detective,
/obj/item/gun/ballistic/revolver/detective)
+/datum/supply_pack/gun/cattlemanrevolver
+ name = "Cattleman Revolver crate"
+ desc = "Contains two concealable Cattleman revolvers, chambered in .45 ACP."
+ cost = 2500
+ contains = list(/obj/item/gun/ballistic/revolver/cattleman,
+ /obj/item/gun/ballistic/revolver/cattleman)
/*
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index f1fe218b175b..69ea5e634cda 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -609,7 +609,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("spider_legs" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
- dat += "
Spider Extra Legs Variant
"
+ dat += "Extra Legs
"
dat += "[features["spider_legs"]]
"
@@ -621,7 +621,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("spider_spinneret" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
- dat += "Spider Spinneret Markings
"
+ dat += "Spinneret
"
dat += "[features["spider_spinneret"]]
"
@@ -630,18 +630,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
mutant_category = 0
- if("spider_mandibles" in pref_species.default_features)
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
- dat += "Spider Mandible Variant
"
-
- dat += "[features["spider_mandibles"]]
"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
if("squid_face" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -1906,18 +1894,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_spider_spinneret)
features["spider_spinneret"] = new_spider_spinneret
- if("spider_mandibles")
- var/new_spider_mandibles
- new_spider_mandibles = input(user, "Choose your character's variant of mandibles:", "Character Preference") as null|anything in GLOB.spider_mandibles_list
- if (new_spider_mandibles)
- features["spider_mandibles"] = new_spider_mandibles
-
- if("squid_face")
- var/new_squid_face
- new_squid_face = input(user, "Choose your character's face type:", "Character Preference") as null|anything in GLOB.squid_face_list
- if (new_squid_face)
- features["squid_face"] = new_squid_face
-
if("ipc_screen")
var/new_ipc_screen
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 26cea413adb3..b08ba8588f69 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -503,52 +503,51 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
underwear = sanitize_inlist(underwear, GLOB.underwear_list)
undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list)
- socks = sanitize_inlist(socks, GLOB.socks_list)
- age = sanitize_integer(age, pref_species.species_age_min, pref_species.species_age_max, initial(age))
+ socks = sanitize_inlist(socks, GLOB.socks_list)
+ age = sanitize_integer(age, pref_species.species_age_min, pref_species.species_age_max, initial(age))
hair_color = sanitize_hexcolor(hair_color)
- facial_hair_color = sanitize_hexcolor(facial_hair_color)
- underwear_color = sanitize_hexcolor(underwear_color)
- eye_color = sanitize_hexcolor(eye_color)
- skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
+ facial_hair_color = sanitize_hexcolor(facial_hair_color)
+ underwear_color = sanitize_hexcolor(underwear_color)
+ eye_color = sanitize_hexcolor(eye_color)
+ skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
backpack = sanitize_inlist(backpack, GLOB.backpacklist, initial(backpack))
- jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
- exowear = sanitize_inlist(exowear, GLOB.exowearlist, initial(exowear))
- uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
- fbp = sanitize_integer(fbp, FALSE, TRUE, FALSE)
- features["grad_style"] = sanitize_inlist(features["grad_style"], GLOB.hair_gradients_list)
- features["grad_color"] = sanitize_hexcolor(features["grad_color"])
- features["body_size"] = sanitize_inlist(features["body_size"], GLOB.body_sizes, "Normal")
- features["mcolor"] = sanitize_hexcolor(features["mcolor"])
- features["mcolor2"] = sanitize_hexcolor(features["mcolor2"])
- features["ethcolor"] = copytext_char(features["ethcolor"], 1, 7)
- features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
- features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human, "None")
- features["face_markings"] = sanitize_inlist(features["face_markings"], GLOB.face_markings_list)
- features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
- features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list, "None")
- features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
- features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
- features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
- features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Normal Legs")
- features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list, "Plain")
- features["moth_fluff"] = sanitize_inlist(features["moth_fluff"], GLOB.moth_fluff_list, "Plain")
- features["spider_legs"] = sanitize_inlist(features["spider_legs"], GLOB.spider_legs_list, "Plain")
- features["spider_spinneret"] = sanitize_inlist(features["spider_spinneret"], GLOB.spider_spinneret_list, "Plain")
- features["spider_mandibles"] = sanitize_inlist(features["spider_mandibles"], GLOB.spider_mandibles_list, "Plain")
- features["moth_markings"] = sanitize_inlist(features["moth_markings"], GLOB.moth_markings_list, "None")
- features["squid_face"] = sanitize_inlist(features["squid_face"], GLOB.squid_face_list, "Squidward")
- features["ipc_screen"] = sanitize_inlist(features["ipc_screen"], GLOB.ipc_screens_list)
- features["ipc_antenna"] = sanitize_inlist(features["ipc_antenna"], GLOB.ipc_antennas_list)
- features["ipc_chassis"] = sanitize_inlist(features["ipc_chassis"], GLOB.ipc_chassis_list)
- features["ipc_brain"] = sanitize_inlist(features["ipc_brain"], GLOB.ipc_brain_list)
- features["kepori_feathers"] = sanitize_inlist(features["kepori_feathers"], GLOB.kepori_feathers_list, "Plain")
- features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "Plain")
- features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "Fan")
- features["vox_head_quills"] = sanitize_inlist(features["vox_head_quills"], GLOB.vox_head_quills_list, "None")
- features["vox_neck_quills"] = sanitize_inlist(features["vox_neck_quills"], GLOB.vox_neck_quills_list, "None")
- features["elzu_horns"] = sanitize_inlist(features["elzu_horns"], GLOB.elzu_horns_list)
- features["tail_elzu"] = sanitize_inlist(features["tail_elzu"], GLOB.tails_list_elzu)
- features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"]))
+ jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style))
+ exowear = sanitize_inlist(exowear, GLOB.exowearlist, initial(exowear))
+ uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc))
+ fbp = sanitize_integer(fbp, FALSE, TRUE, FALSE)
+ features["grad_style"] = sanitize_inlist(features["grad_style"], GLOB.hair_gradients_list)
+ features["grad_color"] = sanitize_hexcolor(features["grad_color"])
+ features["body_size"] = sanitize_inlist(features["body_size"], GLOB.body_sizes, "Normal")
+ features["mcolor"] = sanitize_hexcolor(features["mcolor"])
+ features["mcolor2"] = sanitize_hexcolor(features["mcolor2"])
+ features["ethcolor"] = copytext_char(features["ethcolor"], 1, 7)
+ features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard)
+ features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human, "None")
+ features["face_markings"] = sanitize_inlist(features["face_markings"], GLOB.face_markings_list)
+ features["horns"] = sanitize_inlist(features["horns"], GLOB.horns_list)
+ features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list, "None")
+ features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
+ features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
+ features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
+ features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Normal Legs")
+ features["moth_wings"] = sanitize_inlist(features["moth_wings"], GLOB.moth_wings_list, "Plain")
+ features["moth_fluff"] = sanitize_inlist(features["moth_fluff"], GLOB.moth_fluff_list, "Plain")
+ features["spider_legs"] = sanitize_inlist(features["spider_legs"], GLOB.spider_legs_list, "Plain")
+ features["spider_spinneret"] = sanitize_inlist(features["spider_spinneret"], GLOB.spider_spinneret_list, "Plain")
+ features["moth_markings"] = sanitize_inlist(features["moth_markings"], GLOB.moth_markings_list, "None")
+ features["squid_face"] = sanitize_inlist(features["squid_face"], GLOB.squid_face_list, "Squidward")
+ features["ipc_screen"] = sanitize_inlist(features["ipc_screen"], GLOB.ipc_screens_list)
+ features["ipc_antenna"] = sanitize_inlist(features["ipc_antenna"], GLOB.ipc_antennas_list)
+ features["ipc_chassis"] = sanitize_inlist(features["ipc_chassis"], GLOB.ipc_chassis_list)
+ features["ipc_brain"] = sanitize_inlist(features["ipc_brain"], GLOB.ipc_brain_list)
+ features["kepori_feathers"] = sanitize_inlist(features["kepori_feathers"], GLOB.kepori_feathers_list, "Plain")
+ features["kepori_body_feathers"] = sanitize_inlist(features["kepori_body_feathers"], GLOB.kepori_body_feathers_list, "Plain")
+ features["kepori_tail_feathers"] = sanitize_inlist(features["kepori_tail_feathers"], GLOB.kepori_tail_feathers_list, "Fan")
+ features["vox_head_quills"] = sanitize_inlist(features["vox_head_quills"], GLOB.vox_head_quills_list, "None")
+ features["vox_neck_quills"] = sanitize_inlist(features["vox_neck_quills"], GLOB.vox_neck_quills_list, "None")
+ features["elzu_horns"] = sanitize_inlist(features["elzu_horns"], GLOB.elzu_horns_list)
+ features["tail_elzu"] = sanitize_inlist(features["tail_elzu"], GLOB.tails_list_elzu)
+ features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"]))
all_quirks = SANITIZE_LIST(all_quirks)
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 2cd8c28602c8..2dc357ad9478 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -145,7 +145,7 @@
attached_light.update_brightness()
to_chat(user, "You toggle the helmet light [attached_light.on ? "on":"off"].")
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ playsound(user, attached_light.on ? attached_light.toggle_on_sound : attached_light.toggle_off_sound, 100, TRUE)
update_helmlight()
/obj/item/clothing/head/helmet/proc/update_helmlight()
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
index 443f13c6917f..afe97c858cff 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
@@ -54,7 +54,7 @@
var/gender_specific //Something that can be worn by either gender, but looks different on each
var/use_static //determines if the accessory will be skipped by color preferences
var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
- var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
+ var/secondary_color //Decides if this sprite has a secondary color in use.
var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects
var/center = FALSE //Should we center the sprite?
var/limbs_id //The limbs id supplied for full-body replacing features.
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
index 36b2f4d91dab..8b0ec1d6f79d 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -11,13 +11,13 @@
icon = 'icons/mob/species/misc/cat.dmi'
name = "Cat"
icon_state = "cat"
- hasinner = 1
+ secondary_color = TRUE
color_src = HAIR
/datum/sprite_accessory/ears/cat/slime
name = "Slimecat"
icon_state = "cat"
- hasinner = FALSE
+ secondary_color = FALSE
color_src = HAIR
image_alpha = 150
@@ -25,11 +25,11 @@
icon = 'icons/mob/species/misc/fox.dmi'
name = "Fox"
icon_state = "fox"
- hasinner = 1
+ secondary_color = TRUE
color_src = HAIR
/datum/sprite_accessory/ears/elf
name = "Elf"
icon_state = "elf"
- hasinner = FALSE
+ secondary_color = FALSE
color_src = SKINCOLORS
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/lizard.dm b/code/modules/mob/dead/new_player/sprite_accessories/lizard.dm
index e18e88353061..ce536a403e48 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/lizard.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/lizard.dm
@@ -172,7 +172,7 @@
/datum/sprite_accessory/frills/ears
name = "Normal ears"
icon_state = "ears"
- hasinner = TRUE
+ secondary_color = TRUE
//End ears
/datum/sprite_accessory/frills/simple
name = "Simple"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/rachnid.dm b/code/modules/mob/dead/new_player/sprite_accessories/rachnid.dm
index 1e60fd1d7ab5..d34b915e3e35 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/rachnid.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/rachnid.dm
@@ -4,52 +4,37 @@
/datum/sprite_accessory/spider_legs
icon = 'icons/mob/species/rachnid/spider_legs.dmi'
- color_src = MUTCOLORS
-
-/datum/sprite_accessory/spider_legs/plain
- name = "Plain"
- icon_state = "plain"
+ color_src = 0
+ secondary_color = TRUE
-/datum/sprite_accessory/spider_legs/fuzzy
- name = "Fuzzy"
- icon_state = "fuzzy"
-
-/datum/sprite_accessory/spider_legs/spiky
- name = "Spiky"
- icon_state = "spiky"
+/datum/sprite_accessory/spider_legs/carapace
+ name = "Carapace"
+ icon_state = "carapace"
//Start spinner
/datum/sprite_accessory/spider_spinneret
icon = 'icons/mob/species/rachnid/spider_spinneret.dmi'
color_src = MUTCOLORS
+ secondary_color = TRUE
-/datum/sprite_accessory/spider_spinneret/plain
- name = "Plain"
- icon_state = "plain"
-
-/datum/sprite_accessory/spider_spinneret/fuzzy
- name = "Fuzzy"
- icon_state = "fuzzy"
+/datum/sprite_accessory/spider_spinneret/spikecore
+ name = "Spikecore"
+ icon_state = "spikecore"
-/datum/sprite_accessory/spider_spinneret/black_widow
- name = "Black Widow"
- icon_state = "blackwidow"
-
-//Start mandible
-
-/datum/sprite_accessory/spider_mandibles
- icon = 'icons/mob/species/rachnid/spider_mandibles.dmi'
- color_src = MUTCOLORS
+/datum/sprite_accessory/spider_spinneret/cerberus
+ name = "Cerberus"
+ icon_state = "cerberus"
-/datum/sprite_accessory/spider_mandibles/plain
- name = "Plain"
- icon_state = "plain"
+/datum/sprite_accessory/spider_spinneret/queen
+ name = "Queen"
+ icon_state = "queen"
-/datum/sprite_accessory/spider_mandibles/fuzzy
- name = "Fuzzy"
- icon_state = "fuzzy"
+/datum/sprite_accessory/spider_spinneret/folds
+ name = "Folds"
+ icon_state = "folds"
+ secondary_color = FALSE
-/datum/sprite_accessory/spider_mandibles/spiky
- name = "Spiky"
- icon_state = "spiky"
+/datum/sprite_accessory/spider_spinneret/prongs
+ name = "Prongs"
+ icon_state = "prongs"
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 4da26d4406ca..2045bfe4aa18 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -25,12 +25,16 @@
update_damage_overlays()
else //no bodypart, we deal damage with a more general method.
adjustBruteLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
if(BURN)
if(BP)
if(BP.receive_damage(0, damage_amount, break_modifier))
update_damage_overlays()
else
adjustFireLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
if(TOX)
adjustToxLoss(damage_amount, forced = forced)
if(OXY)
@@ -43,6 +47,8 @@
update_damage_overlays()
else
adjustStaminaLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
return TRUE
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index 3a4591fabb98..c9a7e4f1019c 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -429,7 +429,7 @@
icon = 'icons/mob/animal.dmi'
icon_state = "heart"
hitsound = 'sound/effects/kiss.ogg'
- hitsound_wall = 'sound/effects/kiss.ogg'
+ hitsound_non_living = 'sound/effects/kiss.ogg'
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
speed = 1.6
damage_type = BRUTE
diff --git a/code/modules/mob/living/carbon/human/consistent_human.dm b/code/modules/mob/living/carbon/human/consistent_human.dm
index c28328fde590..c35d8a71759e 100644
--- a/code/modules/mob/living/carbon/human/consistent_human.dm
+++ b/code/modules/mob/living/carbon/human/consistent_human.dm
@@ -24,7 +24,6 @@
dna.features["moth_fluff"] = GLOB.moth_fluff_list[seed % length(GLOB.moth_fluff_list) + 1]
dna.features["spider_legs"] = GLOB.spider_legs_list[seed % length(GLOB.spider_legs_list) + 1]
dna.features["spider_spinneret"] = GLOB.spider_spinneret_list[seed % length(GLOB.spider_spinneret_list) + 1]
- dna.features["spider_mandibles"] = GLOB.spider_mandibles_list[seed % length(GLOB.spider_mandibles_list) + 1]
dna.features["squid_face"] = GLOB.squid_face_list[seed % length(GLOB.squid_face_list) + 1]
dna.features["kepori_feathers"] = GLOB.kepori_feathers_list[seed % length(GLOB.kepori_feathers_list) + 1]
dna.features["kepori_body_feathers"] = GLOB.kepori_body_feathers_list[seed % length(GLOB.kepori_body_feathers_list) + 1]
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 4f3399675f0a..61524b925d90 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -978,8 +978,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
S = GLOB.spider_legs_list[H.dna.features["spider_legs"]]
if("spider_spinneret")
S = GLOB.spider_spinneret_list[H.dna.features["spider_spinneret"]]
- if ("spider_mandibles")
- S = GLOB.spider_mandibles_list[H.dna.features["spider_mandibles"]]
if("kepori_body_feathers")
S = GLOB.kepori_body_feathers_list[H.dna.features["kepori_body_feathers"]]
if("kepori_tail_feathers")
@@ -1054,17 +1052,17 @@ GLOBAL_LIST_EMPTY(roundstart_races)
accessory_overlay.color = forced_colour
standing += accessory_overlay
- if(S.hasinner)
- var/mutable_appearance/inner_accessory_overlay = mutable_appearance(S.icon, layer = -layer)
+ if(S.secondary_color)
+ var/mutable_appearance/secondary_color_overlay = mutable_appearance(S.icon, layer = -layer)
if(S.gender_specific)
- inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[S.icon_state]_[layertext]"
+ secondary_color_overlay.icon_state = "[g]_[bodypart]_secondary_[S.icon_state]_[layertext]"
else
- inner_accessory_overlay.icon_state = "m_[bodypart]inner_[S.icon_state]_[layertext]"
+ secondary_color_overlay.icon_state = "m_[bodypart]_secondary_[S.icon_state]_[layertext]"
if(S.center)
- inner_accessory_overlay = center_image(inner_accessory_overlay, S.dimension_x, S.dimension_y)
- inner_accessory_overlay.color = "#[H.dna.features["mcolor2"]]"
- standing += inner_accessory_overlay
+ secondary_color_overlay = center_image(secondary_color_overlay, S.dimension_x, S.dimension_y)
+ secondary_color_overlay.color = "#[H.dna.features["mcolor2"]]"
+ standing += secondary_color_overlay
H.overlays_standing[layer] = standing.Copy()
standing = list()
@@ -1768,6 +1766,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.update_damage_overlays()
else//no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage_amount)
+ if(H.stat <= HARD_CRIT)
+ H.shake_animation(damage_amount)
if(BURN)
H.damageoverlaytemp = 20
var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod
@@ -1776,6 +1776,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.update_damage_overlays()
else
H.adjustFireLoss(damage_amount)
+ if(H.stat <= HARD_CRIT)
+ H.shake_animation(damage_amount)
if(TOX)
var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.tox_mod
H.adjustToxLoss(damage_amount)
@@ -1792,6 +1794,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.update_stamina()
else
H.adjustStaminaLoss(damage_amount)
+ if(H.stat <= HARD_CRIT)
+ H.shake_animation(damage_amount)
if(BRAIN)
var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount)
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index 55217a814d35..ba23e45b4ba8 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -17,12 +17,6 @@
var/obj/item/dullahan_relay/myhead
-
-/datum/species/dullahan/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return FALSE
-
/datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
. = ..()
H.lose_hearing_sensitivity(ORGAN_TRAIT)
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 4164b8e2bb8e..38a8b64c0aac 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -696,11 +696,6 @@
REMOVE_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
..()
-/datum/species/golem/cloth/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return ..()
-
/datum/species/golem/cloth/random_name(gender,unique,lastname)
var/pharaoh_name = pick("Neferkare", "Hudjefa", "Khufu", "Mentuhotep", "Ahmose", "Amenhotep", "Thutmose", "Hatshepsut", "Tutankhamun", "Ramses", "Seti", \
"Merenptah", "Djer", "Semerkhet", "Nynetjer", "Khafre", "Pepi", "Intef", "Ay") //yes, Ay was an actual pharaoh
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index f54c9dff634d..6e4ae1cdb9a3 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -32,11 +32,6 @@
else if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //heal in the dark
H.heal_overall_damage(1,1, 0, BODYTYPE_ORGANIC)
-/datum/species/shadow/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return ..()
-
/datum/species/shadow/nightmare
name = "Nightmare"
id = "nightmare"
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index caa36764a1ff..920115f52c02 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -23,11 +23,6 @@
species_l_leg = /obj/item/bodypart/leg/left/skeleton
species_r_leg = /obj/item/bodypart/leg/right/skeleton
-/datum/species/skeleton/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return ..()
-
//Can still metabolize milk through meme magic
/datum/species/skeleton/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.type == /datum/reagent/consumable/milk)
diff --git a/code/modules/mob/living/carbon/human/species_types/spider.dm b/code/modules/mob/living/carbon/human/species_types/spider.dm
index 84faffde6ca2..222386c44909 100644
--- a/code/modules/mob/living/carbon/human/species_types/spider.dm
+++ b/code/modules/mob/living/carbon/human/species_types/spider.dm
@@ -45,8 +45,8 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt"))
default_color = "00FF00"
species_traits = list(LIPS, NOEYESPRITES, MUTCOLORS_PARTSONLY)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
- mutant_bodyparts = list("spider_legs", "spider_spinneret", "spider_mandibles")
- default_features = list("spider_legs" = "Plain", "spider_spinneret" = "Plain", "spider_mandibles" = "Plain", "body_size" = "Normal")
+ mutant_bodyparts = list("spider_legs", "spider_spinneret")
+ default_features = list("spider_legs" = "Carapaced", "spider_spinneret" = "Plain", "body_size" = "Normal")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index b4c9fac9db08..ebc923c01075 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -16,14 +16,6 @@
var/info_text = "You are a Vampire. You will slowly but constantly lose blood if outside of a coffin. If inside a coffin, you will slowly heal. You may gain more blood by grabbing a live victim and using your drain ability."
var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/batform //attached to the datum itself to avoid cloning memes, and other duplicates
-
-
-
-/datum/species/vampire/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return FALSE
-
/datum/species/vampire/on_species_gain(mob/living/carbon/human/C, datum/species/old_species)
. = ..()
to_chat(C, "[info_text]")
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 8c53a6ca9a07..702adfb224a2 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -24,11 +24,6 @@
species_l_leg = /obj/item/bodypart/leg/left/zombie
species_r_leg = /obj/item/bodypart/leg/right/zombie
-/datum/species/zombie/check_roundstart_eligible()
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- return TRUE
- return ..()
-
/datum/species/zombie/infectious
name = "\improper Infectious Zombie"
id = "memezombies"
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 4916d062da29..76daa5ba21d4 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -23,8 +23,12 @@
switch(damagetype)
if(BRUTE)
adjustBruteLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
if(BURN)
adjustFireLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
if(TOX)
adjustToxLoss(damage_amount, forced = forced)
if(OXY)
@@ -33,6 +37,8 @@
adjustCloneLoss(damage_amount, forced = forced)
if(STAMINA)
adjustStaminaLoss(damage_amount, forced = forced)
+ if(stat <= HARD_CRIT)
+ shake_animation(damage_amount)
return TRUE
///like [apply_damage][/mob/living/proc/apply_damage] except it always uses the damage procs
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 31676cd64007..e5617beafade 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -55,6 +55,7 @@
var/on_hit_state = P.on_hit(src, armor, piercing_hit)
if(!P.nodamage && on_hit_state != BULLET_ACT_BLOCK && !QDELETED(src)) //QDELETED literally just for the instagib rifle. Yeah.
apply_damage(P.damage, P.damage_type, def_zone, armor)
+ recoil_camera(src, clamp((P.damage-armor)/4,0.5,10), clamp((P.damage-armor)/4,0.5,10), P.damage/8, P.Angle)
apply_effects(P.stun, P.knockdown, P.unconscious, P.irradiate, P.slur, P.stutter, P.eyeblur, P.drowsy, armor, P.stamina, P.jitter, P.paralyze, P.immobilize)
if(P.dismemberment)
check_projectile_dismemberment(P, def_zone)
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
index 91da0614fb50..c7cca51545cc 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm
@@ -47,7 +47,7 @@
flag = "energy"
light_color = LIGHT_COLOR_YELLOW
hitsound = 'sound/weapons/sear.ogg'
- hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+ hitsound_non_living = 'sound/weapons/effects/searwall.ogg'
nondirectional_sprite = TRUE
/obj/projectile/seedling/Bump(atom/A)//Stops seedlings from destroying other jungle mobs through FF
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index d48db130f983..01c2ee10ed26 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -623,6 +623,22 @@
I.attack_self(src)
update_inv_hands()
+/mob/verb/do_unique_action()
+ set name = "Do Unique Action"
+ set category = "Object"
+ set src = usr
+
+ if(ismecha(loc))
+ return
+
+ if(incapacitated())
+ return
+
+ var/obj/item/I = get_active_held_item()
+ if(I)
+ I.unique_action(src)
+ update_inv_hands()
+
/**
* Get the notes of this mob
*
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 4c4a58378410..de1cb857ed4e 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -221,23 +221,37 @@
return sanitize(.)
///Shake the camera of the person viewing the mob SO REAL!
-/proc/shake_camera(mob/M, duration, strength=1)
- if(!M || !M.client || duration < 1)
+/proc/shake_camera(mob/recoilster, duration, strength=1)
+ if(!recoilster || !recoilster.client || duration < 1)
return
- var/client/C = M.client
- var/oldx = C.pixel_x
- var/oldy = C.pixel_y
+ var/client/client_to_shake = recoilster.client
+ var/oldx = client_to_shake.pixel_x
+ var/oldy = client_to_shake.pixel_y
var/max = strength*world.icon_size
var/min = -(strength*world.icon_size)
for(var/i in 0 to duration-1)
if (i == 0)
- animate(C, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
+ animate(client_to_shake, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
else
animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
animate(pixel_x=oldx, pixel_y=oldy, time=1)
+/proc/recoil_camera(mob/recoilster, duration, backtime_duration, strength, angle)
+ if(!recoilster || !recoilster.client)
+ return
+ strength *= world.icon_size
+ var/client/client_to_shake = recoilster.client
+ var/oldx = client_to_shake.pixel_x
+ var/oldy = client_to_shake.pixel_y
+
+ //get pixels to move the camera in an angle
+ var/mpx = sin(angle) * strength
+ var/mpy = cos(angle) * strength
+ animate(client_to_shake, pixel_x = oldx+mpx, pixel_y = oldy+mpy, time = duration, flags = ANIMATION_RELATIVE)
+ animate(pixel_x = oldx, pixel_y = oldy, time = backtime_duration, easing = BACK_EASING)
+
///Find if the message has the real name of any user mob in the mob_list
/proc/findname(msg)
if(!istext(msg))
diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm
index 32f5756e0843..b10e25c84e7a 100644
--- a/code/modules/movespeed/modifiers/items.dm
+++ b/code/modules/movespeed/modifiers/items.dm
@@ -11,5 +11,9 @@
/datum/movespeed_modifier/die_of_fate
multiplicative_slowdown = 1
+/datum/movespeed_modifier/gun
+ multiplicative_slowdown = 1
+ variable = TRUE
+
/datum/movespeed_modifier/berserk
multiplicative_slowdown = -0.2
diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm
index 6222f147861e..9a34e0cff94a 100644
--- a/code/modules/projectiles/ammunition/_ammunition.dm
+++ b/code/modules/projectiles/ammunition/_ammunition.dm
@@ -23,7 +23,7 @@
/// The sound played when this ammo is fired by an energy gun.
var/fire_sound = null
/// The visual effect that appears when the ammo is fired.
- var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect
+ var/firing_effect_type
/// Enables casing spinning and sizzling after being ejected from a gun.
var/heavy_metal = TRUE
/// If true, the casing's sprite will automatically be transformed in Initialize().
@@ -36,6 +36,8 @@
var/delay = 0 //Delay for energy weapons
var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
+ var/list/bounce_sfx_override // if true, overrides the bouncing sfx from the turf to this one
+
/obj/item/ammo_casing/spent
name = "spent bullet casing"
@@ -104,7 +106,10 @@
update_appearance()
SpinAnimation(10, 1)
var/turf/T = get_turf(src)
+ if(bounce_sfx_override)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, pick(bounce_sfx_override), 20, 1), bounce_delay) //Soft / non-solid turfs that shouldn't make a sound when a shell casing is ejected over them.
+ return
if(still_warm && T && T.bullet_sizzle)
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/items/welder.ogg', 20, 1), bounce_delay) //If the turf is made of water and the shell casing is still hot, make a sizzling sound when it's ejected.
else if(T && T.bullet_bounce_sound)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, T.bullet_bounce_sound, 20, 1), bounce_delay) //Soft / non-solid turfs that shouldn't make a sound when a shell casing is ejected over them.
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, src, pick(T.bullet_bounce_sound), 20, 1), bounce_delay) //Soft / non-solid turfs that shouldn't make a sound when a shell casing is ejected over them.
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
index 15abfdb02e10..b9237ea91b4d 100644
--- a/code/modules/projectiles/ammunition/ballistic/pistol.dm
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -127,3 +127,11 @@
name = ".50 AE hollow point bullet casing"
desc = "A .50 AE hollow point bullet casing."
projectile_type = /obj/projectile/bullet/a50AE/hp
+
+// .22 LR (Himehabu)
+/obj/item/ammo_casing/c22lr
+ name = ".22 LR bullet casing"
+ desc = "A .22 LR bullet casing."
+ projectile_type = /obj/projectile/bullet/c22lr
+ caliber = "22lr"
+
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index 9f74727086e5..b297ee30e776 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -9,6 +9,8 @@
custom_materials = list(/datum/material/iron=4000)
projectile_type = /obj/projectile/bullet/slug
+ bounce_sfx_override = 'sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg'
+
/obj/item/ammo_casing/shotgun/update_icon_state()
icon_state = "[initial(icon_state)][BB ? "" : "-spent"]"
return ..()
diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm
index 05653dab0bd8..1e2d92996077 100644
--- a/code/modules/projectiles/ammunition/energy/laser.dm
+++ b/code/modules/projectiles/ammunition/energy/laser.dm
@@ -151,4 +151,5 @@
select_name = "kill"
projectile_type = /obj/projectile/beam/weak/penetrator
variance = 0.8
+ delay = 0.5
fire_sound = 'sound/weapons/laser4.ogg'
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index 0336744ec748..e8c47f60f85b 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -150,6 +150,7 @@
max_ammo = 22
multiple_sprites = AMMO_BOX_FULL_EMPTY
item_flags = NO_MAT_REDEMPTION
+ instant_load = TRUE
// Ammo Boxes
@@ -366,3 +367,21 @@
icon_state = "foambox_riot"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
custom_materials = list(/datum/material/iron = 50000)
+
+/obj/item/ammo_box/c22lr_box
+ name = "ammo box (.22 LR)"
+ desc = "A box of standard .22 LR ammo."
+ icon_state = "22lrbox"
+ ammo_type = /obj/item/ammo_casing/c22lr
+ max_ammo = 75
+
+/obj/item/ammo_box/c45_speedloader
+ name = "speed loader (.45)"
+ desc = "Designed to quickly reload revolvers."
+ icon_state = "38"
+ ammo_type = /obj/item/ammo_casing/c45
+ max_ammo = 6
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ custom_materials = list(/datum/material/iron = 15000)
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
diff --git a/code/modules/projectiles/boxes_magazines/external/gauss.dm b/code/modules/projectiles/boxes_magazines/external/gauss.dm
index ca497d6560cb..fa3797707ce6 100644
--- a/code/modules/projectiles/boxes_magazines/external/gauss.dm
+++ b/code/modules/projectiles/boxes_magazines/external/gauss.dm
@@ -9,7 +9,7 @@
/obj/item/ammo_box/magazine/modelh
name = "Model H magazine (ferromagnetic slugs)"
- desc = "A 10-round magazine for the Model H pistol. Ferromagnetic slugs are slow, but do incredible damage with significant armor penetration."
+ desc = "A 10-round magazine for the Model H pistol. Ferromagnetic slugs are slow and incredibly powerful bullets, but are easily stopped by even a sliver of armor."
icon_state = "smallmagmag"
ammo_type = /obj/item/ammo_casing/caseless/gauss/slug
caliber = "slug"
diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm
index 192a9f723857..402db1502853 100644
--- a/code/modules/projectiles/boxes_magazines/external/lmg.dm
+++ b/code/modules/projectiles/boxes_magazines/external/lmg.dm
@@ -5,7 +5,7 @@
base_icon_state = "a762"
ammo_type = /obj/item/ammo_casing/mm712x82
caliber = "7.12x82mm"
- max_ammo = 50
+ max_ammo = 100
w_class = WEIGHT_CLASS_NORMAL
/obj/item/ammo_box/magazine/mm712x82/hollow
@@ -30,4 +30,4 @@
/obj/item/ammo_box/magazine/mm712x82/update_icon_state()
. = ..()
- icon_state = "[base_icon_state]-[round(ammo_count(), 10)]"
+ icon_state = "[base_icon_state]-[round(ammo_count(), 20)]"
diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm
index ca4702b641d7..cc92a758eba0 100644
--- a/code/modules/projectiles/boxes_magazines/external/pistol.dm
+++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm
@@ -136,3 +136,12 @@
caliber = "9mm"
max_ammo = 4
custom_materials = list(/datum/material/iron = 20000)
+
+/obj/item/ammo_box/magazine/m22lr
+ name = "pistol magazine (.22 LR)"
+ desc = "A single-stack handgun magazine designed to chamber .22 LR. It's rather tiny, all things considered."
+ icon_state = "pistol_22lr"
+ ammo_type = /obj/item/ammo_casing/c22lr
+ caliber = "22lr"
+ max_ammo = 10
+ w_class = WEIGHT_CLASS_TINY
diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm
index 86fef186652b..9ae63763593b 100644
--- a/code/modules/projectiles/boxes_magazines/external/rifle.dm
+++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm
@@ -27,7 +27,7 @@
base_icon_state = "47x33mm"
ammo_type = /obj/item/ammo_casing/caseless/c47x33mm
caliber = "4.73x33mm caseless"
- max_ammo = 50 //brrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
+ max_ammo = 100 //brrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
w_class = WEIGHT_CLASS_NORMAL
/obj/item/ammo_box/magazine/rifle47x33mm/update_icon_state()
@@ -64,7 +64,7 @@
icon_state = "ak47_mag"
ammo_type = /obj/item/ammo_casing/a762_39
caliber = "7.62x39mm"
- max_ammo = 20
+ max_ammo = 30
/obj/item/ammo_box/magazine/ak47/update_icon_state()
. = ..()
diff --git a/code/modules/projectiles/boxes_magazines/internal/gauss.dm b/code/modules/projectiles/boxes_magazines/internal/gauss.dm
index 06527ae49197..6e561f6d26d5 100644
--- a/code/modules/projectiles/boxes_magazines/internal/gauss.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/gauss.dm
@@ -3,3 +3,4 @@
ammo_type = /obj/item/ammo_casing/caseless/gauss
caliber = "pellet"
max_ammo = 22
+ instant_load = TRUE
diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
index 13b007e229e0..7715d31b1323 100644
--- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
@@ -32,3 +32,10 @@
/obj/item/ammo_box/magazine/internal/cylinder/pepperbox
name = "pepperbox revolver cylinder"
max_ammo = 5
+
+/obj/item/ammo_box/magazine/internal/cylinder/rev45
+ name = "cattleman revolver cylinder"
+ ammo_type = /obj/item/ammo_casing/c45
+ caliber = ".45"
+ max_ammo = 6
+ instant_load = TRUE
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index f91fa467cfef..6cd673874f31 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -31,7 +31,6 @@
var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
var/suppressed_volume = 60
var/can_unsuppress = TRUE
- var/recoil = 0 //boom boom shake the room
var/clumsy_check = TRUE
var/obj/item/ammo_casing/chambered = null
trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers
@@ -43,7 +42,6 @@
var/semicd = 0 //cooldown handler
var/weapon_weight = WEAPON_LIGHT
var/dual_wield_spread = 24 //additional spread when dual wielding
- var/spread = 0 //Spread induced by the gun itself.
var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once.
var/projectile_damage_multiplier = 1 //Alters projectile damage multiplicatively based on this value. Use it for "better" or "worse" weapons that use the same ammo.
@@ -77,14 +75,78 @@
var/pb_knockback = 0
+ var/wielded = FALSE // true if the gun is wielded via twohanded component, shouldnt affect anything else
+
+ var/wielded_fully = FALSE // true if the gun is wielded after delay, should affects accuracy
+
+ ///How much the bullet scatters when fired while wielded.
+ var/spread = 4
+ ///How much the bullet scatters when fired while unwielded.
+ var/spread_unwielded = 12
+
+ ///Screen shake when the weapon is fired while wielded.
+ var/recoil = 0
+ ///Screen shake when the weapon is fired while unwielded.
+ var/recoil_unwielded = 0
+ ///a multiplier of the duration the recoil takes to go back to normal view, this is (recoil*recoil_backtime_multiplier)+1
+ var/recoil_backtime_multiplier = 2
+ ///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max.
+ var/recoil_deviation = 22.5
+
+ ///Slowdown for wielding
+ var/wield_slowdown = 0.1
+ ///How long between wielding and firing in tenths of seconds
+ var/wield_delay = 0.4 SECONDS
+ ///Storing value for above
+ var/wield_time = 0
+
+ ///Effect for the muzzle flash of the gun.
+ var/obj/effect/muzzle_flash/muzzle_flash
+ ///Icon state of the muzzle flash effect.
+ var/muzzleflash_iconstate
+ ///Brightness of the muzzle flash effect.
+ var/muzzle_flash_lum = 3
+ ///Color of the muzzle flash effect.
+ var/muzzle_flash_color = COLOR_VERY_SOFT_YELLOW
+
/obj/item/gun/Initialize()
. = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield)
if(pin)
pin = new pin(src)
if(gun_light)
alight = new(src)
+ muzzle_flash = new(src, muzzleflash_iconstate)
build_zooming()
+/obj/item/gun/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed)
+
+/// triggered on wield of two handed item
+/obj/item/gun/proc/on_wield(obj/item/source, mob/user)
+ wielded = TRUE
+ INVOKE_ASYNC(src, .proc.do_wield, user)
+
+/obj/item/gun/proc/do_wield(mob/user)
+ user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown)
+ wield_time = world.time + wield_delay
+ if(wield_time > 0)
+ if(do_mob(user, user, wield_delay, FALSE, TRUE, CALLBACK(src, .proc/is_wielded), ignore_loc_change = TRUE))
+ wielded_fully = TRUE
+ else
+ wielded_fully = TRUE
+
+/obj/item/gun/proc/is_wielded()
+ return wielded
+
+/// triggered on unwield of two handed item
+/obj/item/gun/proc/on_unwield(obj/item/source, mob/user)
+ wielded = FALSE
+ wielded_fully = FALSE
+ user.remove_movespeed_modifier(/datum/movespeed_modifier/gun)
+
/obj/item/gun/Destroy()
if(isobj(pin)) //Can still be the initial path, then we skip
QDEL_NULL(pin)
@@ -98,6 +160,8 @@
QDEL_NULL(azoom)
if(isatom(suppressed)) //SUPPRESSED IS USED AS BOTH A TRUE/FALSE AND AS A REF, WHAT THE FUCKKKKKKKKKKKKKKKKK
QDEL_NULL(suppressed)
+ if(muzzle_flash)
+ QDEL_NULL(muzzle_flash)
return ..()
/obj/item/gun/handle_atom_del(atom/A)
@@ -154,8 +218,15 @@
/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1)
- if(recoil)
- shake_camera(user, recoil + 1, recoil)
+ var/actual_angle = get_angle_with_scatter((user || get_turf(src)), pbtarget, rand(-recoil_deviation, recoil_deviation) + 180)
+ var/muzzle_angle = Get_Angle(get_turf(src), pbtarget)
+ if(muzzle_flash && !muzzle_flash.applied)
+ handle_muzzle_flash(user, muzzle_angle)
+
+ if(wielded_fully && recoil)
+ simulate_recoil(user, recoil, actual_angle)
+ else if(!wielded_fully && recoil_unwielded)
+ simulate_recoil(user, recoil_unwielded, actual_angle)
if(suppressed)
playsound(user, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
@@ -224,9 +295,8 @@
if(check_botched(user))
return
- var/obj/item/bodypart/other_hand = user.has_hand_for_held_index(user.get_inactive_hand_index()) //returns non-disabled inactive hands
- if(weapon_weight == WEAPON_HEAVY && (user.get_inactive_held_item() || !other_hand))
- to_chat(user, "You need two hands to fire [src]!")
+ if(weapon_weight == WEAPON_HEAVY && (!wielded))
+ to_chat(user, "You need a more secure grip to fire [src]!")
return
//DUAL (or more!) WIELDING
var/bonus_spread = 0
@@ -322,8 +392,12 @@
var/sprd = 0
var/randomized_gun_spread = 0
var/rand_spr = rand()
- if(spread)
+
+ if(wielded_fully && spread)
randomized_gun_spread = rand(0,spread)
+ else if(!wielded_fully && spread_unwielded)
+ randomized_gun_spread = rand(0,spread_unwielded)
+
if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex
bonus_spread += 25
var/randomized_bonus_spread = rand(0, bonus_spread)
@@ -353,8 +427,9 @@
return
process_chamber()
update_appearance()
- semicd = TRUE
- addtimer(CALLBACK(src, .proc/reset_semicd), fire_delay)
+ if(fire_delay)
+ semicd = TRUE
+ addtimer(CALLBACK(src, .proc/reset_semicd), fire_delay)
if(user)
user.update_inv_hands()
@@ -550,7 +625,7 @@
gun_light.update_brightness()
to_chat(user, "You toggle the gunlight [gun_light.on ? "on":"off"].")
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ playsound(user, gun_light.on ? gun_light.toggle_on_sound : gun_light.toggle_off_sound, 40, TRUE)
update_gunlight()
/obj/item/gun/proc/update_gunlight()
@@ -637,6 +712,111 @@
/obj/item/gun/proc/before_firing(atom/target,mob/user)
return
+/obj/item/gun/proc/simulate_recoil(mob/living/user, recoil_bonus = 0, firing_angle)
+ var/total_recoil = recoil_bonus
+
+ var/actual_angle = firing_angle + rand(-recoil_deviation, recoil_deviation) + 180
+ if(actual_angle > 360)
+ actual_angle -= 360
+ if(total_recoil > 0)
+ recoil_camera(user, total_recoil + 1, (total_recoil * recoil_backtime_multiplier)+1, total_recoil, actual_angle)
+ return TRUE
+
+/obj/item/gun/proc/handle_muzzle_flash(mob/living/user, firing_angle)
+ var/atom/movable/flash_loc = user
+ var/prev_light = light_range
+ if(!light_on && (light_range <= muzzle_flash_lum))
+ set_light_range(muzzle_flash_lum)
+ set_light_color(muzzle_flash_color)
+ set_light_on(TRUE)
+ update_light()
+ addtimer(CALLBACK(src, .proc/reset_light_range, prev_light), 1 SECONDS)
+ //Offset the pixels.
+ switch(firing_angle)
+ if(0, 360)
+ muzzle_flash.pixel_x = 0
+ muzzle_flash.pixel_y = 8
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(1 to 44)
+ muzzle_flash.pixel_x = round(4 * ((firing_angle) / 45))
+ muzzle_flash.pixel_y = 8
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(45)
+ muzzle_flash.pixel_x = 8
+ muzzle_flash.pixel_y = 8
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(46 to 89)
+ muzzle_flash.pixel_x = 8
+ muzzle_flash.pixel_y = round(4 * ((90 - firing_angle) / 45))
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(90)
+ muzzle_flash.pixel_x = 8
+ muzzle_flash.pixel_y = 0
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(91 to 134)
+ muzzle_flash.pixel_x = 8
+ muzzle_flash.pixel_y = round(-3 * ((firing_angle - 90) / 45))
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(135)
+ muzzle_flash.pixel_x = 8
+ muzzle_flash.pixel_y = -6
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(136 to 179)
+ muzzle_flash.pixel_x = round(4 * ((180 - firing_angle) / 45))
+ muzzle_flash.pixel_y = -6
+ muzzle_flash.layer = ABOVE_MOB_LAYER
+ if(180)
+ muzzle_flash.pixel_x = 0
+ muzzle_flash.pixel_y = -6
+ muzzle_flash.layer = ABOVE_MOB_LAYER
+ if(181 to 224)
+ muzzle_flash.pixel_x = round(-6 * ((firing_angle - 180) / 45))
+ muzzle_flash.pixel_y = -6
+ muzzle_flash.layer = ABOVE_MOB_LAYER
+ if(225)
+ muzzle_flash.pixel_x = -6
+ muzzle_flash.pixel_y = -6
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(226 to 269)
+ muzzle_flash.pixel_x = -6
+ muzzle_flash.pixel_y = round(-6 * ((270 - firing_angle) / 45))
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(270)
+ muzzle_flash.pixel_x = -6
+ muzzle_flash.pixel_y = 0
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(271 to 314)
+ muzzle_flash.pixel_x = -6
+ muzzle_flash.pixel_y = round(8 * ((firing_angle - 270) / 45))
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(315)
+ muzzle_flash.pixel_x = -6
+ muzzle_flash.pixel_y = 8
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+ if(316 to 359)
+ muzzle_flash.pixel_x = round(-6 * ((360 - firing_angle) / 45))
+ muzzle_flash.pixel_y = 8
+ muzzle_flash.layer = initial(muzzle_flash.layer)
+
+ muzzle_flash.transform = null
+ muzzle_flash.transform = turn(muzzle_flash.transform, firing_angle)
+ flash_loc.vis_contents += muzzle_flash
+ muzzle_flash.applied = TRUE
+
+ addtimer(CALLBACK(src, .proc/remove_muzzle_flash, flash_loc, muzzle_flash), 0.2 SECONDS)
+
+/obj/item/gun/proc/reset_light_range(lightrange)
+ set_light_range(lightrange)
+ set_light_color(initial(light_color))
+ if(lightrange <= 0)
+ set_light_on(FALSE)
+ update_light()
+
+/obj/item/gun/proc/remove_muzzle_flash(atom/movable/flash_loc, obj/effect/muzzle_flash/muzzle_flash)
+ if(!QDELETED(flash_loc))
+ flash_loc.vis_contents -= muzzle_flash
+ muzzle_flash.applied = FALSE
+
/////////////
// ZOOMING //
/////////////
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 9efbc6169b25..90bcf0c73508 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -81,12 +81,15 @@
var/rack_delay = 5
///time of the most recent rack, used for cooldown purposes
var/recent_rack = 0
- ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it
- var/tac_reloads = TRUE //Snowflake mechanic no more.
///Whether the gun can be sawn off by sawing tools
var/can_be_sawn_off = FALSE
var/flip_cooldown = 0
+ ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it
+ var/tac_reloads = TRUE //Snowflake mechanic no more.
+ ///If we have the 'snowflake mechanic,' how long should it take to reload?
+ var/tactical_reload_delay = 1.2 SECONDS
+
/obj/item/gun/ballistic/Initialize()
. = ..()
if (!spawnwithmagazine)
@@ -220,19 +223,23 @@
playsound(src, eject_empty_sound, eject_sound_volume, eject_sound_vary)
magazine.forceMove(drop_location())
var/obj/item/ammo_box/magazine/old_mag = magazine
- if (tac_load)
- if (insert_magazine(user, tac_load, FALSE))
- to_chat(user, "You perform a tactical reload on \the [src].")
- else
- to_chat(user, "You dropped the old [magazine_wording], but the new one doesn't fit. How embarassing.")
- magazine = null
- else
- magazine = null
- user.put_in_hands(old_mag)
old_mag.update_appearance()
+ magazine = null
if (display_message)
to_chat(user, "You pull the [magazine_wording] out of \the [src].")
update_appearance()
+ if (tac_load)
+ if(do_after(user, tactical_reload_delay, TRUE, src))
+ if (insert_magazine(user, tac_load, FALSE))
+ to_chat(user, "You perform a tactical reload on \the [src].")
+ else
+ to_chat(user, "You dropped the old [magazine_wording], but the new one doesn't fit. How embarassing.")
+ else
+ to_chat(user, "Your reload was interupted!")
+ return
+
+ user.put_in_hands(old_mag)
+ update_appearance()
/obj/item/gun/ballistic/can_shoot()
return chambered
@@ -342,7 +349,7 @@
return
return ..()
-/obj/item/gun/ballistic/attack_self(mob/living/user)
+/obj/item/gun/ballistic/unique_action(mob/living/user)
if(HAS_TRAIT(user, TRAIT_GUNFLIP))
if(flip_cooldown <= world.time)
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40))
@@ -352,13 +359,10 @@
user.dropItemToGround(src, TRUE)
return
flip_cooldown = (world.time + 30)
+ SpinAnimation(7,1)
user.visible_message("[user] spins the [src] around their finger by the trigger. That’s pretty badass.")
playsound(src, 'sound/items/handling/ammobox_pickup.ogg', 20, FALSE)
return
- if(!internal_magazine && magazine)
- if(!magazine.ammo_count())
- eject_magazine(user)
- return
if(bolt_type == BOLT_TYPE_NO_BOLT)
chambered = null
var/num_unloaded = 0
diff --git a/code/modules/projectiles/guns/ballistic/assault.dm b/code/modules/projectiles/guns/ballistic/assault.dm
index 7ec610bbc33c..5b3ced3e8100 100644
--- a/code/modules/projectiles/guns/ballistic/assault.dm
+++ b/code/modules/projectiles/guns/ballistic/assault.dm
@@ -1,12 +1,31 @@
/obj/item/gun/ballistic/automatic/assault
burst_size = 1
actions_types = list()
+ wield_delay = 0.7 SECONDS
+ wield_slowdown = 0.6
+
+ fire_delay = 1
+
+ load_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/rifle/ar_reload.ogg'
+ eject_sound = 'sound/weapons/gun/rifle/ar_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/rifle/ar_unload.ogg'
+
+ rack_sound = 'sound/weapons/gun/rifle/ar_cock.ogg'
+ spread_unwielded = 20
/obj/item/gun/ballistic/automatic/assault/ak47
name = "\improper SVG-67"
desc = "A Frontier-built assault rifle descended from a pattern of unknown provenance. Its low cost, ease of maintenance, and powerful 7.62x39mm cartridge make it a popular choice among a wide variety of outlaws."
icon = 'icons/obj/guns/48x32guns.dmi'
fire_sound = 'sound/weapons/gun/rifle/ak47.ogg'
+
+ rack_sound = 'sound/weapons/gun/rifle/ak47_cocked.ogg'
+ load_sound = 'sound/weapons/gun/rifle/ak47_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/rifle/ak47_reload.ogg'
+ eject_sound = 'sound/weapons/gun/rifle/ak47_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/rifle/ak47_unload.ogg'
+
icon_state = "ak47"
item_state = "ak47"
mag_display = TRUE
@@ -14,6 +33,8 @@
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/ak47
+ spread = 0
+ wield_delay = 0.7 SECONDS
/obj/item/gun/ballistic/automatic/assault/ak47/ComponentInitialize()
. = ..()
@@ -89,6 +110,13 @@
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/p16
+ spread = 2
+ wield_delay = 0.5 SECONDS
+ rack_sound = 'sound/weapons/gun/rifle/m16_cocked.ogg'
+ load_sound = 'sound/weapons/gun/rifle/m16_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/rifle/m16_reload.ogg'
+ eject_sound = 'sound/weapons/gun/rifle/m16_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/rifle/m16_unload.ogg'
/obj/item/gun/ballistic/automatic/assault/p16/ComponentInitialize()
. = ..()
@@ -133,6 +161,8 @@
slot_flags = ITEM_SLOT_BACK
mag_type = /obj/item/ammo_box/magazine/swiss
actions_types = list(/datum/action/item_action/toggle_firemode)
+ spread = 8
+ spread_unwielded = 15
/obj/item/gun/ballistic/automatic/assault/swiss_cheese/ComponentInitialize()
. = ..()
@@ -157,7 +187,7 @@
fire_delay = initial(fire_delay)
to_chat(user, "You switch to [burst_size]-rnd Matter.")
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
update_appearance()
for(var/datum/action/action as anything in actions)
action.UpdateButtonIcon()
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index b159376b547b..ed45f24a7625 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -14,6 +14,13 @@
weapon_weight = WEAPON_MEDIUM
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+ wield_delay = 1 SECONDS
+ spread = 0
+ spread_unwielded = 13
+ recoil = 0
+ recoil_unwielded = 4
+ wield_slowdown = 0.35
+
/obj/item/gun/ballistic/automatic/update_overlays()
. = ..()
if(!select)
@@ -39,7 +46,7 @@
fire_delay = initial(fire_delay)
to_chat(user, "You switch to [burst_size]-rnd burst.")
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
update_appearance()
for(var/X in actions)
var/datum/action/A = X
@@ -71,6 +78,13 @@
actions_types = list()
mag_display = TRUE
+ spread = -5
+ spread_unwielded = 20
+ recoil = 0
+ recoil_unwielded = 4
+ wield_slowdown = 1
+ wield_delay = 1.3 SECONDS
+
/obj/item/gun/ballistic/automatic/sniper_rifle/syndicate
name = "syndicate sniper rifle"
desc = "A heavily-modified .50 BMG anti-material rifle utilized by Syndicate agents. Requires both hands to fire."
@@ -117,7 +131,6 @@
icon = 'icons/obj/guns/48x32guns.dmi'
lefthand_file = 'icons/mob/inhands/weapons/64x_guns_left.dmi'
righthand_file = 'icons/mob/inhands/weapons/64x_guns_right.dmi'
- fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
icon_state = "ebr"
item_state = "ebr"
mag_display = TRUE
@@ -128,6 +141,9 @@
burst_size = 0
actions_types = list()
+ wield_slowdown = 2
+ spread = -4
+
/obj/item/gun/ballistic/automatic/gal
name = "\improper CM-GAL-S"
desc = "The standard issue DMR of the CMM. Dates back to the Xenofauna War, this particular model is in a carbine configuration, and, as such, is shorter than the standard model. Chambered in .308."
@@ -143,6 +159,9 @@
burst_size = 0
actions_types = list()
+ wield_slowdown = 2
+ spread = -4
+
/obj/item/gun/ballistic/automatic/gal/inteq
name = "\improper SsG-04"
desc = "A marksman rifle purchased from the Colonial Minutemen and modified to suit IRMG's needs. Chambered in .308."
diff --git a/code/modules/projectiles/guns/ballistic/gauss.dm b/code/modules/projectiles/guns/ballistic/gauss.dm
index 993c616f885f..32cee65317cf 100644
--- a/code/modules/projectiles/guns/ballistic/gauss.dm
+++ b/code/modules/projectiles/guns/ballistic/gauss.dm
@@ -18,6 +18,13 @@
charge_sections = 4
ammo_x_offset = 2
+ spread = 0
+ spread_unwielded = 25
+ recoil = 0
+ recoil_unwielded = 4
+ wield_slowdown = 0.75
+ wield_delay = 1 SECONDS
+
/obj/item/gun/ballistic/automatic/powered/gauss/modelh
name = "Model H"
desc = "Standard-issue pistol of the Solarian Confederation. Fires slow ferromagnetic slugs at a high energy cost, though they rend flesh with ease."
@@ -32,6 +39,11 @@
fire_delay = 0 //pistol
mag_display = FALSE
empty_indicator = FALSE
+ recoil = 1
+ recoil_unwielded = 2
+ spread = 3
+ spread_unwielded = 6
+
/obj/item/gun/ballistic/automatic/powered/gauss/claris
name = "Claris"
@@ -65,6 +77,9 @@
actions_types = list()
empty_indicator = FALSE
+ wield_delay = 0.7 SECONDS
+ fire_delay = 1
+
/obj/item/gun/ballistic/automatic/powered/gauss/gar/ComponentInitialize()
. = ..()
AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) //setiting this to 0.1 breaks auotfire, not sure why, so we use the standard fire rate but in 2 shot bursts to shoot 'faster'
diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm
index dfe8a52cde19..29d4b7914395 100644
--- a/code/modules/projectiles/guns/ballistic/hmg.dm
+++ b/code/modules/projectiles/guns/ballistic/hmg.dm
@@ -6,6 +6,13 @@
actions_types = list()
slowdown = 1
drag_slowdown = 1.5
+ fire_delay = 1
+
+ spread = 2
+ spread_unwielded = 80
+ recoil = 1
+ recoil_unwielded = 4
+ wield_slowdown = 4
// L6 SAW //
@@ -29,7 +36,7 @@
/obj/item/gun/ballistic/automatic/hmg/l6_saw/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
/obj/item/gun/ballistic/automatic/hmg/l6_saw/examine(mob/user)
. = ..()
@@ -86,4 +93,4 @@
/obj/item/gun/ballistic/automatic/hmg/solar/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index 18030833e6cd..eafe30f362a8 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -50,6 +50,7 @@
item_state = "rocketlauncher"
mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher
fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg'
+ load_sound = 'sound/weapons/gun/general/rocket_load.ogg'
w_class = WEIGHT_CLASS_BULKY
can_suppress = FALSE
pin = /obj/item/firing_pin
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index d03b3992b741..b466f2811dd4 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -1,21 +1,21 @@
/obj/item/gun/ballistic/automatic/pistol
- name = "stechkin pistol"
+ name = "Stechkin"
desc = "A small, easily concealable 10mm handgun that bears Scarborough Arms stamps. Has a threaded barrel for suppressors."
icon_state = "pistol"
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/m10mm
can_suppress = TRUE
burst_size = 1
- fire_delay = 0
+ fire_delay = 0 //spam it as fast as you can
actions_types = list()
bolt_type = BOLT_TYPE_LOCKING
fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
dry_fire_sound = 'sound/weapons/gun/pistol/dry_fire.ogg'
suppressed_sound = 'sound/weapons/gun/pistol/shot_suppressed.ogg'
- load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
- load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
- eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
- eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ load_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert_alt.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release_alt.ogg'
vary_fire_sound = FALSE
rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg'
lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg'
@@ -24,7 +24,13 @@
bolt_wording = "slide"
weapon_weight = WEAPON_LIGHT
pickup_sound = 'sound/items/handling/gun_pickup.ogg'
- fire_delay = 1
+
+ wield_delay = 0.2 SECONDS
+ spread = -2
+ spread_unwielded = 4
+ wield_slowdown = 0.15
+
+ muzzleflash_iconstate = "muzzle_flash_light"
/obj/item/gun/ballistic/automatic/pistol/no_mag
spawnwithmagazine = FALSE
@@ -35,16 +41,21 @@
install_suppressor(S)
/obj/item/gun/ballistic/automatic/pistol/m1911
- name = "\improper M1911"
+ name = "\improper M1911A8"
desc = "A classic .45 handgun. An engraving on the slide marks it as a product of Hunter's Pride."
icon_state = "m1911"
w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/m45
can_suppress = FALSE
- fire_sound = 'sound/weapons/gun/pistol/shot.ogg'
- rack_sound = 'sound/weapons/gun/pistol/rack.ogg'
+ fire_sound = 'sound/weapons/gun/pistol/m1911.ogg'
+ rack_sound = 'sound/weapons/gun/pistol/m1911_cocked.ogg'
lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg'
+ load_sound = 'sound/weapons/gun/pistol/m1911_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/m1911_reload.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/m1911_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/m1911_unload.ogg'
+ recoil = -2
/obj/item/gun/ballistic/automatic/pistol/m1911/no_mag
spawnwithmagazine = FALSE
@@ -57,10 +68,19 @@
mag_type = /obj/item/ammo_box/magazine/m50
can_suppress = FALSE
mag_display = TRUE
- fire_sound = 'sound/weapons/gun/rifle/shot_alt.ogg'
+ fire_sound = 'sound/weapons/gun/pistol/deagle.ogg'
rack_sound = 'sound/weapons/gun/pistol/rack.ogg'
lock_back_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
bolt_drop_sound = 'sound/weapons/gun/pistol/slide_drop.ogg'
+ load_sound = 'sound/weapons/gun/pistol/deagle_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/deagle_reload.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/deagle_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/deagle_unload.ogg'
+ fire_delay = 0.7 SECONDS
+ recoil = 1
+ recoil_unwielded = 2
+ spread = 4
+ spread_unwielded = 7
/obj/item/gun/ballistic/automatic/pistol/deagle/gold
desc = "A gold-plated Desert Eagle folded over a million times by superior Martian gunsmiths. Uses .50 AE ammo."
@@ -106,6 +126,11 @@
w_class = WEIGHT_CLASS_NORMAL
mag_type = /obj/item/ammo_box/magazine/co9mm
can_suppress = FALSE
+ fire_sound = 'sound/weapons/gun/pistol/commander.ogg'
+ load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
/obj/item/gun/ballistic/automatic/pistol/commander/no_mag
spawnwithmagazine = FALSE
@@ -128,6 +153,10 @@
can_suppress = FALSE
var/funnysounds = TRUE
var/cooldown = 0
+ load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
/obj/item/gun/ballistic/automatic/pistol/commissar/equipped(mob/living/user, slot)
..()
@@ -177,6 +206,10 @@
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/pistol556mm
fire_sound = 'sound/weapons/gun/pistol/pistolec.ogg'
+ load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
/obj/item/gun/ballistic/automatic/pistol/solgov/old
icon_state = "pistole-c-old"
@@ -189,6 +222,10 @@
w_class = WEIGHT_CLASS_SMALL
mag_type = /obj/item/ammo_box/magazine/tec9
mag_display = TRUE
+ load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg'
+ eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
+ eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg'
/obj/item/gun/ballistic/automatic/pistol/disposable
name = "disposable gun"
@@ -265,3 +302,17 @@
desc = "The golden sheen is somewhat counter-intuitive on a holdout weapon, but it looks cool. Uses .357 ammo."
icon_state = "derringer_gold"
mag_type = /obj/item/ammo_box/magazine/internal/derr357
+
+/obj/item/gun/ballistic/automatic/pistol/himehabu
+ name = "\improper Himehabu"
+ desc = "A very small .22 LR pistol. The long awaited successor to the Stechkin; It has become a favorite among syndicate spies. Chambered in .22 LR."
+ icon_state = "himehabu"
+ w_class = WEIGHT_CLASS_TINY
+ mag_type = /obj/item/ammo_box/magazine/m22lr
+ can_suppress = FALSE
+ fire_sound = 'sound/weapons/gun/pistol/himehabu.ogg'
+
+ recoil = -2
+ recoil_unwielded = -2
+ spread_unwielded = 0
+ wield_slowdown = 0
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index b1c70e7a73b6..1e922d26aed0 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -4,6 +4,7 @@
icon_state = "revolver"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder
fire_sound = 'sound/weapons/gun/revolver/shot.ogg'
+ rack_sound = 'sound/weapons/gun/revolver/revolver_prime.ogg'
load_sound = 'sound/weapons/gun/revolver/load_bullet.ogg'
eject_sound = 'sound/weapons/gun/revolver/empty.ogg'
vary_fire_sound = FALSE
@@ -15,7 +16,50 @@
tac_reloads = FALSE
var/spin_delay = 10
var/recent_spin = 0
- fire_delay = 7
+ fire_delay = 2
+ spread_unwielded = 15
+ recoil = 0.5
+ recoil_unwielded = 1
+ semi_auto = FALSE
+ bolt_wording = "hammer"
+ wield_slowdown = 0.3
+
+/obj/item/gun/ballistic/revolver/examine(mob/user)
+ . = ..()
+ . += "You can use the revolver with your other empty hand to empty the cylinder."
+
+/obj/item/gun/ballistic/revolver/attack_hand(mob/user)
+ if(loc == user && user.is_holding(src))
+ chambered = null
+ var/num_unloaded = 0
+ for(var/obj/item/ammo_casing/CB in get_ammo_list(FALSE, TRUE))
+ CB.forceMove(drop_location())
+ CB.bounce_away(FALSE, NONE)
+ num_unloaded++
+ SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name)
+ if (num_unloaded)
+ to_chat(user, "You unload [num_unloaded] [cartridge_wording]\s from [src].")
+ playsound(user, eject_sound, eject_sound_volume, eject_sound_vary)
+ update_appearance()
+ return
+ else
+ return ..()
+ else
+ return ..()
+
+
+/obj/item/gun/ballistic/revolver/unique_action(mob/living/user)
+ rack(user)
+ return
+
+///updates a bunch of racking related stuff and also handles the sound effects and the like
+/obj/item/gun/ballistic/revolver/rack(mob/user = null)
+ if(user)
+ to_chat(user, "You rack the [bolt_wording] of \the [src].")
+ chamber_round(TRUE)
+ playsound(src, rack_sound, rack_sound_volume, rack_sound_vary)
+ update_appearance()
+
/obj/item/gun/ballistic/revolver/chamber_round(spin_cylinder = TRUE)
if(spin_cylinder)
@@ -23,10 +67,6 @@
else
chambered = magazine.stored_ammo[1]
-/obj/item/gun/ballistic/revolver/shoot_with_empty_chamber(mob/living/user as mob|obj)
- ..()
- chamber_round(TRUE)
-
/obj/item/gun/ballistic/revolver/AltClick(mob/user)
..()
spin()
@@ -76,7 +116,7 @@
/obj/item/gun/ballistic/revolver/detective
name = "\improper Colt Detective Special"
desc = "A compact and ridiculously old-fashioned law enforcement firearm. Uses .38 special rounds."
- fire_sound = 'sound/weapons/gun/revolver/shot.ogg'
+ fire_sound = 'sound/weapons/gun/revolver/shot_light.ogg'
icon_state = "detective"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38
obj_flags = UNIQUE_RENAME
@@ -91,6 +131,8 @@
"Black Panther" = "detective_panther"
)
+ recoil = 0 //weaker than normal revovler, no recoil
+
/obj/item/gun/ballistic/revolver/detective/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
if(magazine.caliber != initial(magazine.caliber))
if(prob(100 - (magazine.ammo_count() * 5))) //minimum probability of 70, maximum of 95
@@ -140,6 +182,9 @@
name = "\improper Unica 6 auto-revolver"
desc = "A high-powered revolver with a unique auto-reloading system. Uses .357 ammo."
icon_state = "mateba"
+ semi_auto = TRUE
+ spread = 0
+ spread_unwielded = 7
/obj/item/gun/ballistic/revolver/golden
name = "\improper Golden revolver"
@@ -154,6 +199,9 @@
desc = "An ancient model of revolver with notoriously poor ergonomics, chambered in 7.62x38mmR. Uniquely able to be suppressed."
icon_state = "nagant"
can_suppress = TRUE
+ spread_unwielded = 12
+ recoil = 0
+ recoil_unwielded = 0
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev762
@@ -163,6 +211,12 @@
desc = "A massive, long-barreled revolver designed for the most dangerous game. Can only be reloaded one cartridge at a time due to its reinforced frame. Uses .45-70 ammo."
icon_state = "hunting"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev4570
+ fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg'
+ wield_slowdown = 0.5
+ spread_unwielded = 5
+ spread = 2
+ recoil = 2
+ recoil_unwielded = 3
// A gun to play Russian Roulette!
// You can spin the chamber to randomize the position of the bullet.
@@ -277,4 +331,21 @@
icon_state = "pepperbox"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/pepperbox
spread = 20
- fire_delay = 4
+ spread_unwielded = 50
+ fire_delay = 0
+ semi_auto = TRUE
+
+/obj/item/gun/ballistic/revolver/cattleman
+ name = "\improper Cattleman"
+ desc = "A strangely ancient revolver. Despite the age, it is a favorite of fast drawing spacers and officers in various militaries, but sometimes very rarely used in small colonial police units. Uses .45 ACP."
+ fire_sound = 'sound/weapons/gun/revolver/cattleman.ogg'
+ icon = 'icons/obj/guns/48x32guns.dmi'
+ icon_state = "cattleman"
+ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev45
+ obj_flags = UNIQUE_RENAME
+ unique_reskin = list("Default" = "cattleman",
+ "Army" = "cattleman_army",
+ "General" = "cattleman_general"
+ )
+
+ recoil = 0 //weaker than normal revovler, no recoil
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index ac80dc47e890..5d29a26a84a8 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -17,6 +17,13 @@
weapon_weight = WEAPON_MEDIUM
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+ spread = -1
+ spread_unwielded = 12
+ recoil = -3
+ recoil_unwielded = 4
+ wield_slowdown = 1
+ wield_delay = 1.2 SECONDS
+
/obj/item/gun/ballistic/rifle/update_overlays()
. = ..()
. += "[icon_state]_bolt[bolt_locked ? "_locked" : ""]"
@@ -89,6 +96,13 @@
fire_sound = 'sound/weapons/gun/rifle/ssg669c.ogg'
can_be_sawn_off = FALSE
+ spread = -5
+ spread_unwielded = 20
+ recoil = 0
+ recoil_unwielded = 4
+ wield_slowdown = 1
+ wield_delay = 1.3 SECONDS
+
/obj/item/gun/ballistic/rifle/boltaction/roumain
name = "standard-issue 'Smile' rifle"
desc = "A bolt-action rifle usually given to mercenary hunters of the Saint-Roumain Militia. Chambered in .300 Magnum."
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index e333122e2e0a..5f9db248d6af 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -27,6 +27,14 @@
fire_delay = 7
pb_knockback = 2
+ wield_slowdown = 0.45
+ wield_delay = 0.6 SECONDS //Shotguns are really easy to put up to fire, since they are designed for CQC (at least compared to a rifle)
+
+ spread = 4
+ spread_unwielded = 10
+ recoil = 2
+ recoil_unwielded = 4
+
/obj/item/gun/ballistic/shotgun/blow_up(mob/user)
. = 0
if(chambered && chambered.BB)
@@ -41,13 +49,34 @@
/obj/item/gun/ballistic/shotgun/riot //for spawn in the armory
name = "riot shotgun"
desc = "A sturdy shotgun with a six-shell tube and a fixed wooden stock designed for non-lethal riot control."
+ icon = 'icons/obj/guns/48x32guns.dmi'
icon_state = "riotshotgun"
item_state = "shotgun"
mag_type = /obj/item/ammo_box/magazine/internal/shot/riot
sawn_desc = "Come with me if you want to live."
can_be_sawn_off = TRUE
+ rack_sound = 'sound/weapons/gun/shotgun/rack_alt.ogg'
+ fire_delay = 1
+
+/obj/item/gun/ballistic/shotgun/riot/sawoff(mob/user)
+ . = ..()
+ if(.)
+ weapon_weight = WEAPON_MEDIUM
+ wield_slowdown = 0.25
+ wield_delay = 0.3 SECONDS //OP? maybe
+
+ spread = 8
+ spread_unwielded = 15
+ recoil = 3 //or not
+ recoil_unwielded = 5
// Automatic Shotguns//
+/obj/item/gun/ballistic/shotgun/automatic
+ spread = 4
+ spread_unwielded = 16
+ recoil = 1
+ recoil_unwielded = 4
+ wield_delay = 0.65 SECONDS
/obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user)
..()
@@ -146,6 +175,13 @@
tac_reloads = TRUE
pickup_sound = 'sound/items/handling/rifle_pickup.ogg'
+ spread = 4
+ spread_unwielded = 16
+ recoil = 1
+ recoil_unwielded = 4
+ wield_slowdown = 0.6
+ wield_delay = 0.65 SECONDS
+
/obj/item/gun/ballistic/shotgun/bulldog/unrestricted
pin = /obj/item/firing_pin
@@ -208,6 +244,13 @@
. = ..()
if(.)
weapon_weight = WEAPON_MEDIUM
+ wield_slowdown = 0.25
+ wield_delay = 0.3 SECONDS //OP? maybe
+
+ spread = 8
+ spread_unwielded = 15
+ recoil = 3 //or not
+ recoil_unwielded = 5
// IMPROVISED SHOTGUN //
@@ -372,6 +415,7 @@
attack_verb = list("bludgeoned", "smashed")
mag_type = /obj/item/ammo_box/magazine/internal/shot/sex
burst_size = 6
+ fire_delay = 0.1
pb_knockback = 12
unique_reskin = null
recoil = 10
@@ -420,10 +464,21 @@
inhand_y_dimension = 32
mag_type = /obj/item/ammo_box/magazine/internal/shot/winchester
fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
- rack_sound = 'sound/weapons/gun/rifle/winchester_cocked.ogg'
+ rack_sound = 'sound/weapons/gun/rifle/ak47_cocked.ogg'
bolt_wording = "lever"
cartridge_wording = "bullet"
+ spread = -5
+ spread_unwielded = 7
+ recoil = 0
+ recoil_unwielded = 2
+ wield_slowdown = 0.5
+
+/obj/item/gun/ballistic/shotgun/winchester/rack(mob/user = null)
+ . = ..()
+ if(!wielded)
+ SpinAnimation(7,1)
+
/obj/item/gun/ballistic/shotgun/winchester/mk1
name = "Winchester MK.1"
desc = "A sturdy lever-action rifle. This antique pattern appears to be in excellent condition despite its age."
@@ -469,7 +524,7 @@
inhand_x_dimension = 32
inhand_y_dimension = 32
mag_type = /obj/item/ammo_box/magazine/internal/shot/contender
- fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
+ fire_sound = 'sound/weapons/gun/revolver/shot_hunting.ogg'
can_be_sawn_off=TRUE
sawn_desc= "A single-shot pistol. It's hard to aim without a front sight."
w_class = WEIGHT_CLASS_BULKY
@@ -483,9 +538,22 @@
bolt_type = BOLT_TYPE_NO_BOLT
can_be_sawn_off = TRUE
pb_knockback = 3
+ wield_slowdown = 0.7
+ spread_unwielded = 15
+ spread = 0
+ recoil = 0
+ recoil_unwielded = 5
+
/obj/item/gun/ballistic/shotgun/contender/sawoff(mob/user)
. = ..()
if(.)
item_state = "contender_sawn"
+ wield_slowdown = 0.5
+ wield_delay = 0.5 SECONDS
+
+ spread_unwielded = 5 //mostly the hunting revolver stats
+ spread = 2
+ recoil = 2
+ recoil_unwielded = 3
diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index e617173c932e..8ffe9be41bf2 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -1,6 +1,16 @@
/obj/item/gun/ballistic/automatic/smg
burst_size = 1
actions_types = list()
+ fire_delay = 1
+ spread = 4
+ spread_unwielded = 10
+ wield_slowdown = 0.35
+ recoil_unwielded = 0.5
+
+ load_sound = 'sound/weapons/gun/smg/smg_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/smg/smg_reload.ogg'
+ eject_sound = 'sound/weapons/gun/smg/smg_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/smg/smg_unload.ogg'
/obj/item/gun/ballistic/automatic/smg/proto
name = "\improper Nanotrasen Saber SMG"
@@ -14,7 +24,7 @@
/obj/item/gun/ballistic/automatic/smg/proto/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/proto/unrestricted
pin = /obj/item/firing_pin
@@ -35,7 +45,7 @@
/obj/item/gun/ballistic/automatic/smg/c20r/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/c20r/unrestricted
pin = /obj/item/firing_pin
@@ -56,6 +66,7 @@
desc = "An extreme modification of an obsolete assault rifle, converted into a compact submachine gun by IRMG. Chambered in 10mm."
icon_state = "inteqsmg"
item_state = "inteqsmg"
+ fire_sound = 'sound/weapons/gun/smg/vector_fire.ogg'
mag_type = /obj/item/ammo_box/magazine/smgm10mm
can_bayonet = FALSE
can_flashlight = TRUE
@@ -66,7 +77,7 @@
/obj/item/gun/ballistic/automatic/smg/inteq/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/wt550
name = "\improper WT-550 Automatic Rifle"
@@ -84,38 +95,51 @@
mag_display = TRUE
mag_display_ammo = TRUE
empty_indicator = TRUE
+ fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
/obj/item/gun/ballistic/automatic/smg/wt550/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/mini_uzi
name = "\improper Type U3 Uzi"
desc = "A lightweight submachine gun, for when you really want someone dead. Uses 9mm rounds."
icon_state = "uzi"
mag_type = /obj/item/ammo_box/magazine/uzim9mm
- burst_size = 2
bolt_type = BOLT_TYPE_OPEN
mag_display = TRUE
- rack_sound = 'sound/weapons/gun/pistol/slide_lock.ogg'
+
+ fire_sound = 'sound/weapons/gun/smg/uzi.ogg'
+ rack_sound = 'sound/weapons/gun/smg/uzi_cocked.ogg'
+
+ load_sound = 'sound/weapons/gun/smg/uzi_reload.ogg'
+ load_empty_sound = 'sound/weapons/gun/smg/uzi_reload.ogg'
+ eject_sound = 'sound/weapons/gun/smg/uzi_unload.ogg'
+ eject_empty_sound = 'sound/weapons/gun/smg/uzi_unload.ogg'
+
+ spread = 4
+ spread_unwielded = 8
+ wield_slowdown = 0.25
+ wield_delay = 0.2 SECONDS
/obj/item/gun/ballistic/automatic/smg/mini_uzi/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.1 SECONDS)
/obj/item/gun/ballistic/automatic/smg/vector
name = "\improper Vector carbine"
desc = "A police carbine based on a pre-Night of Fire SMG design. Most of the complex workings have been removed for reliability. Chambered in 9mm."
icon_state = "vector"
item_state = "vector"
- mag_type = /obj/item/ammo_box/magazine/smgm9mm/rubber //you guys remember when the autorifle was chambered in 9mm
+ mag_type = /obj/item/ammo_box/magazine/smgm9mm //you guys remember when the autorifle was chambered in 9mm
bolt_type = BOLT_TYPE_LOCKING
mag_display = TRUE
weapon_weight = WEAPON_LIGHT
+ fire_sound = 'sound/weapons/gun/smg/vector_fire.ogg'
/obj/item/gun/ballistic/automatic/smg/vector/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/m90
name = "\improper M-90gl Carbine"
@@ -133,6 +157,10 @@
empty_indicator = TRUE
fire_sound = 'sound/weapons/gun/rifle/shot_alt.ogg'
+ spread = 1
+ spread_unwielded = 8
+ wield_slowdown = 0.4
+
/obj/item/gun/ballistic/automatic/smg/m90/Initialize()
. = ..()
underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher(src)
@@ -186,7 +214,7 @@
burst_size = 1
fire_delay = 0
to_chat(user, "You switch to semi-auto.")
- playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
update_appearance()
return
@@ -203,10 +231,11 @@
actions_types = list()
fire_delay = 1
bolt_type = BOLT_TYPE_OPEN
+ wield_slowdown = 0.4
/obj/item/gun/ballistic/automatic/smg/thompson/Initialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/thompson/drum
name = "\improper Chicago Typewriter"
@@ -220,11 +249,11 @@
item_state = "cm5"
mag_type = /obj/item/ammo_box/magazine/smgm9mm
weapon_weight = WEAPON_LIGHT
- fire_sound = 'sound/weapons/gun/smg/smg_light.ogg'
+ fire_sound = 'sound/weapons/gun/smg/smg_heavy.ogg'
/obj/item/gun/ballistic/automatic/smg/cm5/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/automatic_fire, 0.25 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
/obj/item/gun/ballistic/automatic/smg/aks74u
name = "\improper AKS-74U"
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index b186569afad4..943c1319a4a0 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -4,6 +4,9 @@
desc = "A basic energy-based gun."
icon = 'icons/obj/guns/energy.dmi'
+ muzzleflash_iconstate = "muzzle_flash_laser"
+ muzzle_flash_color = COLOR_SOFT_RED
+
var/obj/item/stock_parts/cell/gun/cell //What type of power cell this uses
var/cell_type = /obj/item/stock_parts/cell/gun
var/modifystate = 0
@@ -93,7 +96,7 @@
recharge_newshot(TRUE)
update_appearance()
-/obj/item/gun/energy/attack_self(mob/living/user as mob)
+/obj/item/gun/energy/unique_action(mob/living/user)
if(ammo_type.len > 1)
select_fire(user)
update_appearance()
@@ -196,6 +199,7 @@
if (shot.select_name)
to_chat(user, "[src] is now set to [shot.select_name].")
chambered = null
+ playsound(user, 'sound/weapons/gun/general/selector.ogg', 100, TRUE)
recharge_newshot(TRUE)
update_appearance()
return
@@ -268,18 +272,18 @@
else if(BB.nodamage || !BB.damage || BB.damage_type == STAMINA)
user.visible_message("[user] tries to light [user.p_their()] [A.name] with [src], but it doesn't do anything. Dumbass.")
playsound(user, E.fire_sound, 50, TRUE)
- playsound(user, BB.hitsound, 50, TRUE)
+ playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
. = ""
else if(BB.damage_type != BURN)
user.visible_message("[user] tries to light [user.p_their()] [A.name] with [src], but only succeeds in utterly destroying it. Dumbass.")
playsound(user, E.fire_sound, 50, TRUE)
- playsound(user, BB.hitsound, 50, TRUE)
+ playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
qdel(A)
. = ""
else
playsound(user, E.fire_sound, 50, TRUE)
- playsound(user, BB.hitsound, 50, TRUE)
+ playsound(user, BB.hitsound_non_living, 50, TRUE)
cell.use(E.e_cost)
. = "[user] casually lights their [A.name] with [src]. Damn."
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 7928094cab13..3cb4877ff17c 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -18,6 +18,10 @@
internal_cell = TRUE
custom_price = 750
w_class = WEIGHT_CLASS_BULKY
+
+ muzzleflash_iconstate = "muzzle_flash_light"
+ muzzle_flash_color = COLOR_WHITE
+
var/overheat_time = 16
var/holds_charge = FALSE
var/unique_frequency = FALSE // modified by KA modkits
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 4551014cafea..5a4caeefc373 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -10,6 +10,9 @@
shaded_charge = 1
supports_variations = VOX_VARIATION
+ spread = 0
+ spread_unwielded = 10
+
/obj/item/gun/energy/laser/practice
name = "practice laser gun"
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm
index 029c5f8a2693..b21e176b92e8 100644
--- a/code/modules/projectiles/guns/energy/laser_gatling.dm
+++ b/code/modules/projectiles/guns/energy/laser_gatling.dm
@@ -22,6 +22,7 @@
. = ..()
gun = new(src)
battery = new(src)
+ gun.cell = battery
START_PROCESSING(SSobj, src)
/obj/item/minigunpack/Destroy()
@@ -107,7 +108,7 @@
slot_flags = null
w_class = WEIGHT_CLASS_HUGE
custom_materials = null
- weapon_weight = WEAPON_HEAVY
+ weapon_weight = WEAPON_MEDIUM
ammo_type = list(/obj/item/ammo_casing/energy/laser/minigun)
cell_type = /obj/item/stock_parts/cell/crap
item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND
@@ -120,7 +121,7 @@
ammo_pack = loc
AddElement(/datum/element/update_icon_blocker)
- AddComponent(/datum/component/automatic_fire, 0.2 SECONDS)
+ AddComponent(/datum/component/automatic_fire, 0.15 SECONDS)
return ..()
/obj/item/gun/energy/minigun/Destroy()
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index a4d252107fc6..83a33691008b 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -12,6 +12,11 @@
internal_cell = TRUE //prevents you from giving it an OP cell - WS Edit
cell_type = "/obj/item/stock_parts/cell/pulse"
+ spread_unwielded = 25
+
+ muzzleflash_iconstate = "muzzle_flash_pulse"
+ muzzle_flash_color = COLOR_BRIGHT_BLUE
+
/obj/item/gun/energy/pulse/emp_act(severity)
return
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 2caeca6f3a16..1d8f78213707 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -6,6 +6,9 @@
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
ammo_x_offset = 3
+ spread = 2
+ spread_unwielded = 4
+
/obj/item/gun/energy/e_gun/advtaser
name = "hybrid taser"
desc = "A dual-mode taser designed to fire both short-range high-power electrodes and long-range disabler beams."
@@ -13,6 +16,9 @@
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/disabler)
ammo_x_offset = 2
+ spread = 2
+ spread_unwielded = 4
+
/obj/item/gun/energy/e_gun/advtaser/cyborg
name = "cyborg taser"
desc = "An integrated hybrid taser that draws directly from a cyborg's power cell. The weapon contains a limiter to prevent the cyborg's power cell from overheating."
@@ -31,6 +37,9 @@
flight_x_offset = 15
flight_y_offset = 10
+ spread = 2
+ spread_unwielded = 4
+
/obj/item/gun/energy/disabler/cyborg
name = "cyborg disabler"
desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating."
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index 4822e2b59ba7..c2205777103c 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -148,7 +148,7 @@
current_zoom_x = 0
current_zoom_y = 0
-/obj/item/gun/energy/beam_rifle/attack_self(mob/user)
+/obj/item/gun/energy/beam_rifle/unique_action(mob/living/user)
projectile_setting_pierce = !projectile_setting_pierce
to_chat(user, "You set \the [src] to [projectile_setting_pierce? "pierce":"impact"] mode.")
aiming_beam()
@@ -521,7 +521,7 @@
tracer_type = /obj/effect/projectile/tracer/tracer/aiming
name = "aiming beam"
hitsound = null
- hitsound_wall = null
+ hitsound_non_living = null
nodamage = TRUE
damage = 0
constant_tracer = TRUE
diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm
index d2a8c80827fc..888e680479ea 100644
--- a/code/modules/projectiles/guns/misc/blastcannon.dm
+++ b/code/modules/projectiles/guns/misc/blastcannon.dm
@@ -35,7 +35,7 @@
QDEL_NULL(bomb)
return ..()
-/obj/item/gun/blastcannon/attack_self(mob/user)
+/obj/item/gun/blastcannon/unique_action(mob/living/user)
if(bomb)
bomb.forceMove(user.loc)
user.put_in_hands(bomb)
diff --git a/code/modules/projectiles/guns/misc/bow.dm b/code/modules/projectiles/guns/misc/bow.dm
index df30f5a89022..aa97994ae95c 100644
--- a/code/modules/projectiles/guns/misc/bow.dm
+++ b/code/modules/projectiles/guns/misc/bow.dm
@@ -28,7 +28,7 @@
chambered = magazine.get_round(TRUE)
chambered.forceMove(src)
-/obj/item/gun/ballistic/bow/attack_self(mob/user)
+/obj/item/gun/ballistic/bow/unique_action(mob/living/user)
if(chambered)
to_chat(user, "You [drawn ? "release" : "draw"] [src]'s string.")
if(!drawn)
diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm
index efd99b2d5b49..34af73b855c6 100644
--- a/code/modules/projectiles/guns/misc/syringe_gun.dm
+++ b/code/modules/projectiles/guns/misc/syringe_gun.dm
@@ -38,7 +38,7 @@
. = ..()
. += "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining."
-/obj/item/gun/syringe/attack_self(mob/living/user)
+/obj/item/gun/syringe/unique_action(mob/living/user)
if(!syringes.len)
to_chat(user, "[src] is empty!")
return 0
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index a50b6eed4ae6..a2ea92e6b4c1 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -13,7 +13,17 @@
generic_canpass = FALSE
//The sound this plays on impact.
var/hitsound = 'sound/weapons/pierce.ogg'
- var/hitsound_wall = ""
+ var/hitsound_non_living = ""
+ var/hitsound_glass
+ var/hitsound_stone
+ var/hitsound_metal
+ var/hitsound_wood
+ var/hitsound_snow
+
+ var/near_miss_sound = ""
+ var/ricochet_sound = ""
+
+
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/def_zone = "" //Aiming at
@@ -223,11 +233,6 @@
if(!isliving(target))
if(impact_effect_type && !hitscan)
new impact_effect_type(target_loca, hitx, hity)
- if(isturf(target) && hitsound_wall)
- var/volume = clamp(vol_by_damage() + 20, 0, 100)
- if(suppressed)
- volume = 5
- playsound(loc, hitsound_wall, volume, TRUE, -1)
return BULLET_ACT_HIT
var/mob/living/L = target
@@ -264,8 +269,7 @@
to_chat(L, "You're shot by \a [src][organ_hit_text]!")
else
if(hitsound)
- var/volume = vol_by_damage()
- playsound(src, hitsound, volume, TRUE, -1)
+ playsound(get_turf(L), hitsound, 100, TRUE, -1)
L.visible_message("[L] is hit by \a [src][organ_hit_text]!", \
"You're hit by \a [src][organ_hit_text]!", null, COMBAT_MESSAGE_RANGE)
L.on_hit(src)
@@ -350,6 +354,8 @@
range = decayedRange
if(hitscan)
store_hitscan_collision(pcache)
+ if(ricochet_sound)
+ playsound(get_turf(src), ricochet_sound, 120, TRUE, 2) //make it loud, we want to make it known when a ricochet happens. for aesthetic reasons mostly
return TRUE
var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
@@ -521,6 +527,16 @@
if(can_hit_target(M, M == original, TRUE))
Impact(M)
break
+ if(!near_miss_sound)
+ return FALSE
+ if(decayedRange <= range+2)
+ return FALSE
+ for(var/mob/misser in range(1,src))
+ if(!(misser.stat <= SOFT_CRIT))
+ continue
+ misser.playsound_local(get_turf(src), near_miss_sound, 100, FALSE)
+ misser.shake_animation(damage)
+
/**
* Projectile crossed: When something enters a projectile's tile, make sure the projectile hits it if it should be hitting it.
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index d17f94af19ae..d0fa95841ab4 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -4,8 +4,18 @@
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 20
damage_type = BURN
- hitsound = 'sound/weapons/sear.ogg'
- hitsound_wall = 'sound/weapons/effects/searwall.ogg'
+
+ hitsound = 'sound/weapons/gun/hit/energy_impact1.ogg'
+ hitsound_non_living = 'sound/weapons/effects/searwall.ogg'
+ hitsound_glass = 'sound/weapons/effects/searwall.ogg'
+ hitsound_stone = 'sound/weapons/sear.ogg'
+ hitsound_metal = 'sound/weapons/effects/searwall.ogg'
+ hitsound_wood = 'sound/weapons/sear.ogg'
+ hitsound_snow = 'sound/weapons/sear.ogg'
+
+ near_miss_sound = 'sound/weapons/gun/hit/energy_miss1.ogg'
+ ricochet_sound = 'sound/weapons/gun/hit/energy_ricochet1.ogg'
+
flag = "laser"
eyeblur = 2
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
@@ -14,7 +24,7 @@
light_power = 1
light_color = COLOR_SOFT_RED
ricochets_max = 50 //Honk!
- ricochet_chance = 80
+ ricochet_chance = 90
reflectable = REFLECT_NORMAL
/obj/projectile/beam/throw_atom_into_space()
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 6123789df438..43106f97deec 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -6,5 +6,20 @@
damage_type = BRUTE
nodamage = FALSE
flag = "bullet"
- hitsound_wall = "ricochet"
+
+ hitsound = "bullet_hit"
+ hitsound_non_living = "bullet_impact"
+ hitsound_glass = "bullet_hit_glass"
+ hitsound_stone = "bullet_hit_stone"
+ hitsound_metal = "bullet_hit_metal"
+ hitsound_wood = "bullet_hit_wood"
+ hitsound_snow = "bullet_hit_snow"
+
+ near_miss_sound = "bullet_miss"
+ ricochet_sound = "bullet_bounce"
+
+
impact_effect_type = /obj/effect/temp_visual/impact_effect
+ ricochets_max = 5 //should be enough to scare the shit out of someone
+ ricochet_chance = 30
+ ricochet_decay_damage = 0.5 //shouldnt being reliable, but deadly enough to be careful if you accidentally hit an ally
diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm
index ad20c47eeb71..b8cd6f92b10d 100644
--- a/code/modules/projectiles/projectile/bullets/dnainjector.dm
+++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm
@@ -3,7 +3,7 @@
icon_state = "syringeproj"
var/obj/item/dnainjector/injector
damage = 5
- hitsound_wall = "shatter"
+ hitsound_non_living = "shatter"
/obj/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE)
if(iscarbon(target))
diff --git a/code/modules/projectiles/projectile/bullets/gauss.dm b/code/modules/projectiles/projectile/bullets/gauss.dm
index d057213f92e7..0955745ed798 100644
--- a/code/modules/projectiles/projectile/bullets/gauss.dm
+++ b/code/modules/projectiles/projectile/bullets/gauss.dm
@@ -3,8 +3,7 @@
/obj/projectile/bullet/gauss
name = "ferromagnetic pellet"
icon_state = "gauss-pellet"
- damage = 20
- armour_penetration = 40
+ damage = 25
range = 35
light_color = COLOR_SOFT_RED
light_range = 3
@@ -15,6 +14,7 @@
name = "ferromagnetic lance"
icon_state = "redtrac"
damage = 30
+ armour_penetration = 20
// Ferromagnetic Slug (Model H)
@@ -22,4 +22,5 @@
name = "ferromagnetic slug"
icon_state = "gauss-slug"
damage = 50
+ armour_penetration = -60
speed = 0.8
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
index dcf8bb682387..ecd8b5abbbb9 100644
--- a/code/modules/projectiles/projectile/bullets/revolver.dm
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -19,13 +19,9 @@
// .38 (Colt Detective Special & Winchester)
/obj/projectile/bullet/c38
- name = ".38 special bullet"
+ name = ".38 bullet"
damage = 25
- armour_penetration = -30
- ricochets_max = 2
- ricochet_chance = 50
- ricochet_auto_aim_angle = 10
- ricochet_auto_aim_range = 3
+ armour_penetration = -20
/obj/projectile/bullet/c38/match
name = ".38 match bullet"
@@ -126,7 +122,7 @@
/obj/projectile/bullet/a4570
name = ".45-70 bullet"
- damage = 40 //crits in 3-4 taps depending on armor
+ damage = 45 //crits in 3-4 taps depending on armor
/obj/projectile/bullet/a4570/match
name = ".45-70 match bullet"
@@ -152,3 +148,11 @@
..()
explosion(target, -1, 0, 1)
return BULLET_ACT_HIT
+
+
+/obj/projectile/bullet/c22lr
+ name = ".22LR bullet"
+ damage = 20
+ armour_penetration = -45
+ ricochet_incidence_leeway = 20
+ ricochet_chance = 45
diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm
index 0f2d43206fc8..0979a268ee16 100644
--- a/code/modules/projectiles/projectile/bullets/shotgun.dm
+++ b/code/modules/projectiles/projectile/bullets/shotgun.dm
@@ -1,6 +1,7 @@
/obj/projectile/bullet/slug
name = "12g shotgun slug"
damage = 40
+ armour_penetration = -10
speed = 0.5
/obj/projectile/bullet/slug/beanbag
@@ -11,7 +12,8 @@
/obj/projectile/bullet/incendiary/shotgun
name = "incendiary slug"
- damage = 20
+ damage = 25
+ armour_penetration = -10
speed = 0.5
/obj/projectile/bullet/incendiary/shotgun/dragonsbreath
@@ -65,12 +67,14 @@
///How much stamina damage is subtracted per tile?
var/tile_dropoff_stamina = 1.5 //As above
+ icon_state = "pellet"
armour_penetration = -35
speed = 0.5
/obj/projectile/bullet/pellet/buckshot
name = "buckshot pellet"
- damage = 10
+ damage = 20
+ armour_penetration = -10
/obj/projectile/bullet/pellet/rubbershot
name = "rubbershot pellet"
diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm
index 74fa2b2ad17a..be3a627cc765 100644
--- a/code/modules/projectiles/projectile/special/hallucination.dm
+++ b/code/modules/projectiles/projectile/special/hallucination.dm
@@ -128,7 +128,7 @@
hal_icon_state = "bullet"
hal_fire_sound = "gunshot"
hal_hitsound = 'sound/weapons/pierce.ogg'
- hal_hitsound_wall = "ricochet"
+ hal_hitsound_wall = "bullet_impact"
hal_impact_effect = "impact_bullet"
hal_impact_effect_wall = "impact_bullet"
hit_duration = 5
diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm
index d86f90b9368e..0680c62279fd 100644
--- a/code/modules/projectiles/projectile/special/rocket.dm
+++ b/code/modules/projectiles/projectile/special/rocket.dm
@@ -19,7 +19,7 @@
/obj/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE)
..()
- explosion(target, -1, 1, 3, 1, 0, flame_range = 4)
+ explosion(target, 1, 1, 2, 1, 0, flame_range = 4)
if(ismecha(target))
var/obj/mecha/M = target
@@ -69,7 +69,7 @@
..()
for(var/i in sturdy)
if(istype(target, i))
- explosion(target, 0, 1, 1, 2)
+ explosion(target, 1, 1, 1, 2)
return BULLET_ACT_HIT
//if(istype(target, /turf/closed) || ismecha(target))
new /obj/item/broken_missile(get_turf(src), 1)
diff --git a/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm
index 163b94385dea..367c07a54970 100644
--- a/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/rachnid_bodyparts.dm
@@ -1,31 +1,34 @@
/obj/item/bodypart/head/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
- is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ overlay_icon_state = TRUE
/obj/item/bodypart/chest/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
is_dimorphic = FALSE
should_draw_greyscale = FALSE
+ overlay_icon_state = TRUE
/obj/item/bodypart/l_arm/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
should_draw_greyscale = FALSE
/obj/item/bodypart/r_arm/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
should_draw_greyscale = FALSE
/obj/item/bodypart/leg/left/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
should_draw_greyscale = FALSE
+ overlay_icon_state = TRUE
/obj/item/bodypart/leg/right/rachnid
- icon = 'icons/mob/species/rachnid/bodyparts.dmi'
+ static_icon = 'icons/mob/species/rachnid/bodyparts.dmi'
limb_id = SPECIES_RACHNID
should_draw_greyscale = FALSE
+ overlay_icon_state = TRUE
diff --git a/config/atmos_mix.txt b/config/atmos_mix.txt
deleted file mode 100644
index f7b21b503dd7..000000000000
--- a/config/atmos_mix.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-## HOW TO MIX A BATCH
-## First, unzip... wait, wrong docs
-
-## How to configure an atmos mix for a planet:
-## each entry is designed as follows:
-## WHITESANDS_ATMOS_MIX <% of mix>
-
-## White Sands Atmospheric mix configuration
-
-WHITESANDS_ATMOS_MOLES 103.98
-
-WHITESANDS_ATMOS_MIX o2 0.105
-WHITESANDS_ATMOS_MIX co2 0.105
-WHITESANDS_ATMOS_MIX n2 0.79
diff --git a/config/awaymissionconfig.txt b/config/awaymissionconfig.txt
deleted file mode 100644
index 5c685d825e0a..000000000000
--- a/config/awaymissionconfig.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-#List the potential random Z-levels here.
-#Maps must be the full path to them
-#Maps should be 255x255 or smaller and be bounded. Falling off the edge of the map will result in undefined behavior.
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-#!!IMPORTANT NOTES FOR HOSTING AWAY MISSIONS!!:
-#Do NOT tick the maps during compile -- the game uses this list to decide which map to load. Ticking the maps will result in them ALL being loaded at once.
-#DO tick the associated code file for the away mission you are enabling. Otherwise, the map will be trying to reference objects which do not exist, which will cause runtime errors!
-
-#_maps/RandomZLevels/blackmarketpackers.dmm
-#_maps/RandomZLevels/spacebattle.dmm
-#_maps/RandomZLevels/TheBeach.dmm
-#_maps/RandomZLevels/Academy.dmm
-#_maps/RandomZLevels/wildwest.dmm
-#_maps/RandomZLevels/challenge.dmm
-#_maps/RandomZLevels/centcomAway.dmm
-#_maps/RandomZLevels/moonoutpost19.dmm
-#_maps/RandomZLevels/undergroundoutpost45.dmm
-#_maps/RandomZLevels/caves.dmm
-#_maps/RandomZLevels/snowdin.dmm
-#_maps/RandomZLevels/research.dmm
-#_maps/RandomZLevels/SnowCabin.dmm
-_maps/RandomZLevels/VR/snowdin_VR.dmm
diff --git a/config/external_rsc_urls.txt b/config/external_rsc_urls.txt
deleted file mode 100644
index 16d6faf653e8..000000000000
--- a/config/external_rsc_urls.txt
+++ /dev/null
@@ -1 +0,0 @@
-http://url_goes_here/shiptest.zip
diff --git a/config/iceruinblacklist.txt b/config/iceruinblacklist.txt
deleted file mode 100644
index 031188b80de3..000000000000
--- a/config/iceruinblacklist.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-#Listing maps here will blacklist them from generating in the ice moon.
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\IceRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-##RESPAWN
-#_maps/RandomRuins/IceRuins/icemoon_surface_slimerancher.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_drakelair.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_oldstation.dmm
-
-##MISC
-#_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_newcops.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_brazillianlab.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_burnies_lair.dmm
-#_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm
diff --git a/config/jobs.txt b/config/jobs.txt
deleted file mode 100644
index a266110233d0..000000000000
--- a/config/jobs.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-#This allows easy configuration of the number of positions allowed for each job
-#Format is: [Job name]=[total positions],[spawn positions]
-#Job names must be identical to the title var of each job datum
-#Positions can be set to -1 to allow unlimited slots
-Captain=1,1
-Head of Personnel=1,1
-Head of Security=1,1
-Chief Engineer=1,1
-Research Director=1,1
-Chief Medical Officer=1,1
-
-Assistant=-1,-1
-Prisoner=0,2
-
-Quartermaster=1,1
-Cargo Technician=3,2
-Shaft Miner=3,3
-
-Bartender=1,1
-Cook=2,1
-Botanist=3,2
-Janitor=2,1
-
-Clown=1,1
-Mime=1,1
-Curator=1,1
-Lawyer=2,2
-
-Chaplain=1,1
-
-Station Engineer=5,5
-Atmospheric Technician=3,2
-
-Medical Doctor=5,3
-Paramedic=2,2
-Chemist=2,2
-Geneticist=2,2
-Virologist=1,1
-Psychologist=1,1
-
-Scientist=5,3
-Roboticist=2,2
-
-Warden=1,1
-Detective=1,1
-Security Officer=5,5
-Brig Physician=1,1
-
-AI=0,1
-Cyborg=0,1
diff --git a/config/jungleruinblacklist.txt b/config/jungleruinblacklist.txt
deleted file mode 100644
index faf518fde632..000000000000
--- a/config/jungleruinblacklist.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-#Listing maps here will blacklist them from generating in jungle planets
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\JungleRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-#_maps/RandomRuins/JungleRuins/jungle_botany.dmm
-#_maps/RandomRuins/JungleRuins/jungle_demon.dmm
-#_maps/RandomRuins/JungleRuins/jungle_hangar.dmm
-#_maps/RandomRuins/JungleRuins/jungle_nest.dmm
-#_maps/RandomRuins/JungleRuins/jungle_pirate.dmm
-#_maps/RandomRuins/JungleRuins/jungle_pizzawave.dmm
-#_maps/RandomRuins/JungleRuins/jungle_seedling.dmm
-#_maps/RandomRuins/JungleRuins/jungle_spider.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_abandonedsolgov.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_coffinpirate.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_ikea_ai.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_ninjashrine.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_roommates.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_tumblr_sexyman.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_unabomber_cabin.dmm
-#_maps/RandomRuins/JungleRuins/jungle_surface_weed_shack.dmm
-#_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm
-#_maps/RandomRuins/JungleRuins/jungle_village.dmm
-#_maps/RandomRuins/JungleRuins/jungle_witch.dmm
-#_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm
-#_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm
-#_maps/RandomRuins/JungleRuins/jungle_paradise.dmm
diff --git a/config/lavaruinblacklist.txt b/config/lavaruinblacklist.txt
deleted file mode 100644
index 973b402ba7a1..000000000000
--- a/config/lavaruinblacklist.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-#Listing maps here will blacklist them from generating in lavaland.
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\LavaRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-##BIODOMES
-#_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_cube.dmm
-
-##RESPAWN
-#_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
-
-##SIN
-#_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm
-
-##MISC
-#_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_ww_vault.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_comm_outpost.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_crashed_pinnance.dmm
diff --git a/config/maps.txt b/config/maps.txt
deleted file mode 100644
index 23a0a19dcd45..000000000000
--- a/config/maps.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-This file contains a list of maps for use in map rotation.
-#Lines starting with # are ignored.
-Lines not inside map blocks are also ignored
-Duplicated entries use the latter one.
-All whitespace at the start and end of lines is ignored. (including indentation, thats just for show)
-Format:
-#map [map name] (name of .json file in _maps folder without the .json part)
- minplayers [number] (0 or less disables this requirement)
- maxplayers [number] (0 or less disables this requirement)
- default (The last map with this defined will get all votes of players who have not explicitly voted for a map)
- voteweight [number] (How much to count each player vote as, defaults to 1, setting to 0.5 counts each vote as half a vote, 2 as double, etc, Setting to 0 disables the map but allows players to still pick it)
- disabled (disables the map)
- votable (is this map votable)
-endmap
-
-map salvage
- default
- votable
-endmap
-
-map amogus
- votable
-endmap
-
-map diner
- votable
-endmap
-
-map minigalaxy
- votable
-endmap
-
-map engineergaming
- votable
-endmap
-
-map bubble
- votable
-endmap
-
-
-# Whiteships
-
-map boxship
- votable
-endmap
-
-map deltaship
- votable
-endmap
-
-map metaship
- votable
-endmap
-
-map midwayship
- votable
-endmap
-
-map pubbyship
- votable
-endmap
-
-map skipper
- votable
-endmap
diff --git a/config/rockruinblacklist.txt b/config/rockruinblacklist.txt
deleted file mode 100644
index e38e248cd109..000000000000
--- a/config/rockruinblacklist.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-#Listing maps here will blacklist them from generating in rock planets
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\RockRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-#_maps/RandomRuins/RockRuins/rockplanet_boxsci.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_chaosmarine.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_clock.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_clowncrash.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_crash_cult.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_crash_kitchen.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_cult.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_dangerpod.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_daniel.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_fortress_of_solitide.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_heirophant.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_house.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_lab.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_miningexpedition.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_moth.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_ore_proccessing_facility.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_pandora.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_pioneer.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_pod.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_rd_god.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_soviet.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_tradepost.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_unhonorable.dmm
-#_maps/RandomRuins/RockRuins/rockplanet_wizard.dmm
diff --git a/config/sandruinblacklist.txt b/config/sandruinblacklist.txt
deleted file mode 100644
index f54299fc4e44..000000000000
--- a/config/sandruinblacklist.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-#Listing maps here will blacklist them from generating on the sand planet.
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\IceRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-##MISC
-#_maps/RandomRuins/SandRuins/whitesands_surface_hermit.dmm
-#_maps/RandomRuins/SandRuins/whitesands_surface_solgovcrash.dmm
-#_maps/RandomRuins/SandRuins/crash_kitchen.dmm
-#_maps/RandomRuins/SandRuins/crash_bar.dmm
-#_maps/RandomRuins/SandRuins/crash_cargo.dmm
-#_maps/RandomRuins/SandRuins/crash_cult.dmm
diff --git a/config/spaceruinblacklist.txt b/config/spaceruinblacklist.txt
deleted file mode 100644
index f7116456ed5f..000000000000
--- a/config/spaceruinblacklist.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-#Listing maps here will blacklist them from generating in space.
-#Maps must be the full path to them
-#A list of maps valid to blacklist can be found in _maps\RandomRuins\SpaceRuins
-#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
-
-#_maps/RandomRuins/SpaceRuins/abandonedteleporter.dmm
-#_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm
-#_maps/RandomRuins/SpaceRuins/bigderelict1.dmm
-#_maps/RandomRuins/SpaceRuins/bus.dmm
-#_maps/RandomRuins/SpaceRuins/caravanambush.dmm
-#_maps/RandomRuins/SpaceRuins/clericden.dmm
-#_maps/RandomRuins/SpaceRuins/cloning_facility.dmm
-#_maps/RandomRuins/SpaceRuins/clownplanet.dmm
-#_maps/RandomRuins/SpaceRuins/crashedclownship.dmm
-#_maps/RandomRuins/SpaceRuins/crashedship.dmm
-#_maps/RandomRuins/SpaceRuins/deepstorage.dmm
-#_maps/RandomRuins/SpaceRuins/djstation.dmm
-#_maps/RandomRuins/SpaceRuins/emptyshell.dmm
-#_maps/RandomRuins/SpaceRuins/Fast_Food.dmm
-#_maps/RandomRuins/SpaceRuins/gasthelizards.dmm
-#_maps/RandomRuins/SpaceRuins/gondolaasteroid.dmm
-#_maps/RandomRuins/SpaceRuins/hilbertshoteltestingsite.dmm
-#_maps/RandomRuins/SpaceRuins/intactemptyship.dmm
-#_maps/RandomRuins/SpaceRuins/listeningstation.dmm
-#_maps/RandomRuins/SpaceRuins/mechtransport.dmm
-#_maps/RandomRuins/SpaceRuins/mrow_thats_right
-#_maps/RandomRuins/SpaceRuins/oldAIsat.dmm
-#_maps/RandomRuins/SpaceRuins/oldstation.dmm
-#_maps/RandomRuins/SpaceRuins/oldteleporter.dmm
-#_maps/RandomRuins/SpaceRuins/onehalf.dmm
-#_maps/RandomRuins/SpaceRuins/power_puzzle.dmm
-#_maps/RandomRuins/SpaceRuins/scav_mining.dmm
-#_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm
-#_maps/RandomRuins/SpaceRuins/spacegym.dmm
-#_maps/RandomRuins/SpaceRuins/spacehotel.dmm
-#_maps/RandomRuins/SpaceRuins/thederelict.dmm
-#_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm
-#_maps/RandomRuins/SpaceRuins/vaporwave.dmm
-#_maps/RandomRuins/SpaceRuins/way_home.dmm
-#_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm
-#_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm
-#_maps/RandomRuins/SpaceRuins/forgottenship.dmm
diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml
index 7f895552d0b9..34dc45ee6419 100644
--- a/html/changelogs/archive/2023-10.yml
+++ b/html/changelogs/archive/2023-10.yml
@@ -87,3 +87,15 @@
- rscadd: Added new areas for the ruin
- rscadd: Added a subtype of the heavy frontiersmen corpse that lacks the minigun
pack
+2023-10-29:
+ retlaw34:
+ - rscadd: 22lr and cattleman revolver
+ - rscadd: many gun sounds
+ - balance: guns reworked
+2023-10-30:
+ thgvr:
+ - rscdel: Halloween no longer allows different species in prefs
+2023-10-31:
+ thgvr:
+ - imageadd: New rachnid sprites!
+ - imagedel: Removed Rachnid mandibles.
diff --git a/html/changelogs/archive/2023-11.yml b/html/changelogs/archive/2023-11.yml
new file mode 100644
index 000000000000..c8f1b947bab6
--- /dev/null
+++ b/html/changelogs/archive/2023-11.yml
@@ -0,0 +1,10 @@
+2023-11-01:
+ Zevotech:
+ - rscdel: Ruin blacklist text files.
+ - rscdel: Misc. deprecated text files.
+ Zytolg:
+ - rscadd: New Rockplanet Ruin
+ - rscadd: New ship manufacturer sprites.
+ - code_imp: Repaths areas in rockplanet.dmm to be in line with other ruins. Starts
+ using rockplanet.dmm.
+ - code_imp: Code support for Arrow & Axe Dockyard sprites.
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index f9a4f9cc7874..115688eeca5e 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/species/lizard/frills.dmi b/icons/mob/species/lizard/frills.dmi
index 6d661308c093..b8587a7bd8e2 100644
Binary files a/icons/mob/species/lizard/frills.dmi and b/icons/mob/species/lizard/frills.dmi differ
diff --git a/icons/mob/species/misc/cat.dmi b/icons/mob/species/misc/cat.dmi
index 685110a16114..aaab4f1b8637 100644
Binary files a/icons/mob/species/misc/cat.dmi and b/icons/mob/species/misc/cat.dmi differ
diff --git a/icons/mob/species/misc/fox.dmi b/icons/mob/species/misc/fox.dmi
index 6971b406bce7..da344bb33a3b 100644
Binary files a/icons/mob/species/misc/fox.dmi and b/icons/mob/species/misc/fox.dmi differ
diff --git a/icons/mob/species/rachnid/bodyparts.dmi b/icons/mob/species/rachnid/bodyparts.dmi
index cef6559f29e7..94fe73ee6a0a 100644
Binary files a/icons/mob/species/rachnid/bodyparts.dmi and b/icons/mob/species/rachnid/bodyparts.dmi differ
diff --git a/icons/mob/species/rachnid/spider_legs.dmi b/icons/mob/species/rachnid/spider_legs.dmi
index d04b5a719e30..907614753ddd 100644
Binary files a/icons/mob/species/rachnid/spider_legs.dmi and b/icons/mob/species/rachnid/spider_legs.dmi differ
diff --git a/icons/mob/species/rachnid/spider_mandibles.dmi b/icons/mob/species/rachnid/spider_mandibles.dmi
deleted file mode 100644
index 81b4b29a1262..000000000000
Binary files a/icons/mob/species/rachnid/spider_mandibles.dmi and /dev/null differ
diff --git a/icons/mob/species/rachnid/spider_spinneret.dmi b/icons/mob/species/rachnid/spider_spinneret.dmi
index 9adf49f05837..6f7fcc9f965c 100644
Binary files a/icons/mob/species/rachnid/spider_spinneret.dmi and b/icons/mob/species/rachnid/spider_spinneret.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 96528874fee3..c911e872b62d 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/guns/48x32guns.dmi b/icons/obj/guns/48x32guns.dmi
index 732e37318768..88dc73290622 100644
Binary files a/icons/obj/guns/48x32guns.dmi and b/icons/obj/guns/48x32guns.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 24b209d6ab2b..02e7d3812dcb 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 1ac2c63ed367..90854a704525 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi
index e14d164289bc..c670e677d226 100644
Binary files a/icons/turf/decals.dmi and b/icons/turf/decals.dmi differ
diff --git a/sound/weapons/effects/deflect.ogg b/sound/weapons/effects/deflect.ogg
new file mode 100644
index 000000000000..a4e9ed6ba4c0
Binary files /dev/null and b/sound/weapons/effects/deflect.ogg differ
diff --git a/sound/weapons/effects/ric1.ogg b/sound/weapons/effects/ric1.ogg
deleted file mode 100644
index b7f7bd99ca5a..000000000000
Binary files a/sound/weapons/effects/ric1.ogg and /dev/null differ
diff --git a/sound/weapons/effects/ric2.ogg b/sound/weapons/effects/ric2.ogg
deleted file mode 100644
index dcd44b07329e..000000000000
Binary files a/sound/weapons/effects/ric2.ogg and /dev/null differ
diff --git a/sound/weapons/effects/ric3.ogg b/sound/weapons/effects/ric3.ogg
deleted file mode 100644
index c538a97e35a6..000000000000
Binary files a/sound/weapons/effects/ric3.ogg and /dev/null differ
diff --git a/sound/weapons/effects/ric4.ogg b/sound/weapons/effects/ric4.ogg
deleted file mode 100644
index ac872734beaa..000000000000
Binary files a/sound/weapons/effects/ric4.ogg and /dev/null differ
diff --git a/sound/weapons/effects/ric5.ogg b/sound/weapons/effects/ric5.ogg
deleted file mode 100644
index 2c946c457d6b..000000000000
Binary files a/sound/weapons/effects/ric5.ogg and /dev/null differ
diff --git a/sound/weapons/gun/general/bulletcasing_bounce1.ogg b/sound/weapons/gun/general/bulletcasing_bounce1.ogg
new file mode 100644
index 000000000000..c33a27fa5007
Binary files /dev/null and b/sound/weapons/gun/general/bulletcasing_bounce1.ogg differ
diff --git a/sound/weapons/gun/general/bulletcasing_bounce2.ogg b/sound/weapons/gun/general/bulletcasing_bounce2.ogg
new file mode 100644
index 000000000000..f8d516643b25
Binary files /dev/null and b/sound/weapons/gun/general/bulletcasing_bounce2.ogg differ
diff --git a/sound/weapons/gun/general/bulletcasing_bounce3.ogg b/sound/weapons/gun/general/bulletcasing_bounce3.ogg
new file mode 100644
index 000000000000..84e670706284
Binary files /dev/null and b/sound/weapons/gun/general/bulletcasing_bounce3.ogg differ
diff --git a/sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg b/sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg
new file mode 100644
index 000000000000..324543b62587
Binary files /dev/null and b/sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg differ
diff --git a/sound/weapons/gun/general/rocket_load.ogg b/sound/weapons/gun/general/rocket_load.ogg
new file mode 100644
index 000000000000..4c5a2ec6911d
Binary files /dev/null and b/sound/weapons/gun/general/rocket_load.ogg differ
diff --git a/sound/weapons/gun/general/selector.ogg b/sound/weapons/gun/general/selector.ogg
new file mode 100644
index 000000000000..298181609e49
Binary files /dev/null and b/sound/weapons/gun/general/selector.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_bounce1.ogg b/sound/weapons/gun/hit/bullet_bounce1.ogg
new file mode 100644
index 000000000000..a8a1fb36f385
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_bounce1.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_bounce2.ogg b/sound/weapons/gun/hit/bullet_bounce2.ogg
new file mode 100644
index 000000000000..a06a0c320e9e
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_bounce2.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_bounce3.ogg b/sound/weapons/gun/hit/bullet_bounce3.ogg
new file mode 100644
index 000000000000..4313703c760b
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_bounce3.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_bounce4.ogg b/sound/weapons/gun/hit/bullet_bounce4.ogg
new file mode 100644
index 000000000000..a3c2c34ec018
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_bounce4.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_bounce5.ogg b/sound/weapons/gun/hit/bullet_bounce5.ogg
new file mode 100644
index 000000000000..35b8be603534
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_bounce5.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_01.ogg b/sound/weapons/gun/hit/bullet_glass_01.ogg
new file mode 100644
index 000000000000..30f6f1fb612b
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_01.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_02.ogg b/sound/weapons/gun/hit/bullet_glass_02.ogg
new file mode 100644
index 000000000000..472f98e9801a
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_02.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_03.ogg b/sound/weapons/gun/hit/bullet_glass_03.ogg
new file mode 100644
index 000000000000..25c6df47a921
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_03.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_04.ogg b/sound/weapons/gun/hit/bullet_glass_04.ogg
new file mode 100644
index 000000000000..b525f665c414
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_04.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_05.ogg b/sound/weapons/gun/hit/bullet_glass_05.ogg
new file mode 100644
index 000000000000..89ff21723aac
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_05.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_06.ogg b/sound/weapons/gun/hit/bullet_glass_06.ogg
new file mode 100644
index 000000000000..26cacb990766
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_06.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_glass_07.ogg b/sound/weapons/gun/hit/bullet_glass_07.ogg
new file mode 100644
index 000000000000..110a45074d17
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_glass_07.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_impact1.ogg b/sound/weapons/gun/hit/bullet_impact1.ogg
new file mode 100644
index 000000000000..4c0cd5b5eebb
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_impact1.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_impact2.ogg b/sound/weapons/gun/hit/bullet_impact2.ogg
new file mode 100644
index 000000000000..bfffcfeadfaa
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_impact2.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_impact3.ogg b/sound/weapons/gun/hit/bullet_impact3.ogg
new file mode 100644
index 000000000000..0356dc6c8819
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_impact3.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_01.ogg b/sound/weapons/gun/hit/bullet_masonry_01.ogg
new file mode 100644
index 000000000000..1a04e7688d63
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_01.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_02.ogg b/sound/weapons/gun/hit/bullet_masonry_02.ogg
new file mode 100644
index 000000000000..770e9e242a7f
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_02.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_03.ogg b/sound/weapons/gun/hit/bullet_masonry_03.ogg
new file mode 100644
index 000000000000..c0eb0bf13233
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_03.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_04.ogg b/sound/weapons/gun/hit/bullet_masonry_04.ogg
new file mode 100644
index 000000000000..83cbc57ebd83
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_04.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_05.ogg b/sound/weapons/gun/hit/bullet_masonry_05.ogg
new file mode 100644
index 000000000000..6d9a67304659
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_05.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_masonry_06.ogg b/sound/weapons/gun/hit/bullet_masonry_06.ogg
new file mode 100644
index 000000000000..2a982a56edb9
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_masonry_06.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_01.ogg b/sound/weapons/gun/hit/bullet_metal_01.ogg
new file mode 100644
index 000000000000..1a706abd90c0
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_01.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_02.ogg b/sound/weapons/gun/hit/bullet_metal_02.ogg
new file mode 100644
index 000000000000..ee938e2a593d
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_02.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_03.ogg b/sound/weapons/gun/hit/bullet_metal_03.ogg
new file mode 100644
index 000000000000..9ede9f161290
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_03.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_04.ogg b/sound/weapons/gun/hit/bullet_metal_04.ogg
new file mode 100644
index 000000000000..bf6824c8cefd
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_04.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_05.ogg b/sound/weapons/gun/hit/bullet_metal_05.ogg
new file mode 100644
index 000000000000..a45e3d6204e4
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_05.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_metal_06.ogg b/sound/weapons/gun/hit/bullet_metal_06.ogg
new file mode 100644
index 000000000000..53877b5e8ce6
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_metal_06.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_miss1.ogg b/sound/weapons/gun/hit/bullet_miss1.ogg
new file mode 100644
index 000000000000..dfff45a0cb5d
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_miss1.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_miss2.ogg b/sound/weapons/gun/hit/bullet_miss2.ogg
new file mode 100644
index 000000000000..54b111128021
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_miss2.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_miss3.ogg b/sound/weapons/gun/hit/bullet_miss3.ogg
new file mode 100644
index 000000000000..fbff6dde9046
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_miss3.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_miss4.ogg b/sound/weapons/gun/hit/bullet_miss4.ogg
new file mode 100644
index 000000000000..6392d6676915
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_miss4.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet1.ogg b/sound/weapons/gun/hit/bullet_ricochet1.ogg
new file mode 100644
index 000000000000..724f599cd5bd
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet1.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet2.ogg b/sound/weapons/gun/hit/bullet_ricochet2.ogg
new file mode 100644
index 000000000000..1c29b9e64e20
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet2.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet3.ogg b/sound/weapons/gun/hit/bullet_ricochet3.ogg
new file mode 100644
index 000000000000..96d470ffe2cb
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet3.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet4.ogg b/sound/weapons/gun/hit/bullet_ricochet4.ogg
new file mode 100644
index 000000000000..bde8fda3f4c4
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet4.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet5.ogg b/sound/weapons/gun/hit/bullet_ricochet5.ogg
new file mode 100644
index 000000000000..eba86301354f
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet5.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet6.ogg b/sound/weapons/gun/hit/bullet_ricochet6.ogg
new file mode 100644
index 000000000000..b143a3c2bdc9
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet6.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet7.ogg b/sound/weapons/gun/hit/bullet_ricochet7.ogg
new file mode 100644
index 000000000000..68a2ee63fa02
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet7.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_ricochet8.ogg b/sound/weapons/gun/hit/bullet_ricochet8.ogg
new file mode 100644
index 000000000000..622d8b6941ee
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_ricochet8.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_01.ogg b/sound/weapons/gun/hit/bullet_snow_01.ogg
new file mode 100644
index 000000000000..4da742bf1462
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_01.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_02.ogg b/sound/weapons/gun/hit/bullet_snow_02.ogg
new file mode 100644
index 000000000000..21572daf13d7
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_02.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_03.ogg b/sound/weapons/gun/hit/bullet_snow_03.ogg
new file mode 100644
index 000000000000..fb8e1dcb9dad
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_03.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_04.ogg b/sound/weapons/gun/hit/bullet_snow_04.ogg
new file mode 100644
index 000000000000..2bfb46d958b2
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_04.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_05.ogg b/sound/weapons/gun/hit/bullet_snow_05.ogg
new file mode 100644
index 000000000000..3752f95b3d62
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_05.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_snow_06.ogg b/sound/weapons/gun/hit/bullet_snow_06.ogg
new file mode 100644
index 000000000000..cac69cc7404c
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_snow_06.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_01.ogg b/sound/weapons/gun/hit/bullet_wood_01.ogg
new file mode 100644
index 000000000000..559310853f95
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_01.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_02.ogg b/sound/weapons/gun/hit/bullet_wood_02.ogg
new file mode 100644
index 000000000000..852c1d875cde
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_02.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_03.ogg b/sound/weapons/gun/hit/bullet_wood_03.ogg
new file mode 100644
index 000000000000..440681e0da48
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_03.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_04.ogg b/sound/weapons/gun/hit/bullet_wood_04.ogg
new file mode 100644
index 000000000000..89ddd21e2bbd
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_04.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_05.ogg b/sound/weapons/gun/hit/bullet_wood_05.ogg
new file mode 100644
index 000000000000..3a66b3f32c8a
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_05.ogg differ
diff --git a/sound/weapons/gun/hit/bullet_wood_06.ogg b/sound/weapons/gun/hit/bullet_wood_06.ogg
new file mode 100644
index 000000000000..cf54f8cc8f58
Binary files /dev/null and b/sound/weapons/gun/hit/bullet_wood_06.ogg differ
diff --git a/sound/weapons/gun/hit/energy_impact1.ogg b/sound/weapons/gun/hit/energy_impact1.ogg
new file mode 100644
index 000000000000..e9d6305972ca
Binary files /dev/null and b/sound/weapons/gun/hit/energy_impact1.ogg differ
diff --git a/sound/weapons/gun/hit/energy_miss1.ogg b/sound/weapons/gun/hit/energy_miss1.ogg
new file mode 100644
index 000000000000..55839b14d3d1
Binary files /dev/null and b/sound/weapons/gun/hit/energy_miss1.ogg differ
diff --git a/sound/weapons/gun/hit/energy_ricochet1.ogg b/sound/weapons/gun/hit/energy_ricochet1.ogg
new file mode 100644
index 000000000000..7601f7823a79
Binary files /dev/null and b/sound/weapons/gun/hit/energy_ricochet1.ogg differ
diff --git a/sound/weapons/gun/pistol/commander.ogg b/sound/weapons/gun/pistol/commander.ogg
new file mode 100644
index 000000000000..57ba0a347c84
Binary files /dev/null and b/sound/weapons/gun/pistol/commander.ogg differ
diff --git a/sound/weapons/gun/pistol/deagle.ogg b/sound/weapons/gun/pistol/deagle.ogg
new file mode 100644
index 000000000000..41d814d2fcec
Binary files /dev/null and b/sound/weapons/gun/pistol/deagle.ogg differ
diff --git a/sound/weapons/gun/pistol/deagle_reload.ogg b/sound/weapons/gun/pistol/deagle_reload.ogg
new file mode 100644
index 000000000000..77abf293efc6
Binary files /dev/null and b/sound/weapons/gun/pistol/deagle_reload.ogg differ
diff --git a/sound/weapons/gun/pistol/deagle_unload.ogg b/sound/weapons/gun/pistol/deagle_unload.ogg
new file mode 100644
index 000000000000..84b18d575b7f
Binary files /dev/null and b/sound/weapons/gun/pistol/deagle_unload.ogg differ
diff --git a/sound/weapons/gun/pistol/himehabu.ogg b/sound/weapons/gun/pistol/himehabu.ogg
new file mode 100644
index 000000000000..ad2dc7cfcc41
Binary files /dev/null and b/sound/weapons/gun/pistol/himehabu.ogg differ
diff --git a/sound/weapons/gun/pistol/m1911.ogg b/sound/weapons/gun/pistol/m1911.ogg
new file mode 100644
index 000000000000..1d7a88dbbdc0
Binary files /dev/null and b/sound/weapons/gun/pistol/m1911.ogg differ
diff --git a/sound/weapons/gun/pistol/m1911_cocked.ogg b/sound/weapons/gun/pistol/m1911_cocked.ogg
new file mode 100644
index 000000000000..b1daedcbf00f
Binary files /dev/null and b/sound/weapons/gun/pistol/m1911_cocked.ogg differ
diff --git a/sound/weapons/gun/pistol/m1911_reload.ogg b/sound/weapons/gun/pistol/m1911_reload.ogg
new file mode 100644
index 000000000000..5dbd7368bda6
Binary files /dev/null and b/sound/weapons/gun/pistol/m1911_reload.ogg differ
diff --git a/sound/weapons/gun/pistol/m1911_unload.ogg b/sound/weapons/gun/pistol/m1911_unload.ogg
new file mode 100644
index 000000000000..1cabe5cd2b86
Binary files /dev/null and b/sound/weapons/gun/pistol/m1911_unload.ogg differ
diff --git a/sound/weapons/gun/pistol/mag_insert.ogg b/sound/weapons/gun/pistol/mag_insert.ogg
index 42a05ebc483f..0791490c6889 100644
Binary files a/sound/weapons/gun/pistol/mag_insert.ogg and b/sound/weapons/gun/pistol/mag_insert.ogg differ
diff --git a/sound/weapons/gun/pistol/mag_insert_alt.ogg b/sound/weapons/gun/pistol/mag_insert_alt.ogg
new file mode 100644
index 000000000000..c442f8b16277
Binary files /dev/null and b/sound/weapons/gun/pistol/mag_insert_alt.ogg differ
diff --git a/sound/weapons/gun/pistol/mag_release.ogg b/sound/weapons/gun/pistol/mag_release.ogg
index cccbf5f9d914..757168fcf1b4 100644
Binary files a/sound/weapons/gun/pistol/mag_release.ogg and b/sound/weapons/gun/pistol/mag_release.ogg differ
diff --git a/sound/weapons/gun/pistol/mag_release_alt.ogg b/sound/weapons/gun/pistol/mag_release_alt.ogg
new file mode 100644
index 000000000000..334d1a12f299
Binary files /dev/null and b/sound/weapons/gun/pistol/mag_release_alt.ogg differ
diff --git a/sound/weapons/gun/pistol/rack.ogg b/sound/weapons/gun/pistol/rack.ogg
index fd0408d8ff2e..ff2512af27a5 100644
Binary files a/sound/weapons/gun/pistol/rack.ogg and b/sound/weapons/gun/pistol/rack.ogg differ
diff --git a/sound/weapons/gun/pistol/rack_small.ogg b/sound/weapons/gun/pistol/rack_small.ogg
index f33db717db82..a9ab76f14283 100644
Binary files a/sound/weapons/gun/pistol/rack_small.ogg and b/sound/weapons/gun/pistol/rack_small.ogg differ
diff --git a/sound/weapons/gun/pistol/shot.ogg b/sound/weapons/gun/pistol/shot.ogg
index a808f8690730..1bbd95e405bc 100644
Binary files a/sound/weapons/gun/pistol/shot.ogg and b/sound/weapons/gun/pistol/shot.ogg differ
diff --git a/sound/weapons/gun/revolver/cattleman.ogg b/sound/weapons/gun/revolver/cattleman.ogg
new file mode 100644
index 000000000000..b56abbcf1583
Binary files /dev/null and b/sound/weapons/gun/revolver/cattleman.ogg differ
diff --git a/sound/weapons/gun/revolver/revolver_prime.ogg b/sound/weapons/gun/revolver/revolver_prime.ogg
new file mode 100644
index 000000000000..5391854fbee3
Binary files /dev/null and b/sound/weapons/gun/revolver/revolver_prime.ogg differ
diff --git a/sound/weapons/gun/revolver/shot.ogg b/sound/weapons/gun/revolver/shot.ogg
index 91e480bd152a..d02d1c750c24 100644
Binary files a/sound/weapons/gun/revolver/shot.ogg and b/sound/weapons/gun/revolver/shot.ogg differ
diff --git a/sound/weapons/gun/revolver/shot_hunting.ogg b/sound/weapons/gun/revolver/shot_hunting.ogg
new file mode 100644
index 000000000000..4beb4d1e4648
Binary files /dev/null and b/sound/weapons/gun/revolver/shot_hunting.ogg differ
diff --git a/sound/weapons/gun/revolver/shot_light.ogg b/sound/weapons/gun/revolver/shot_light.ogg
new file mode 100644
index 000000000000..68b7fada6e49
Binary files /dev/null and b/sound/weapons/gun/revolver/shot_light.ogg differ
diff --git a/sound/weapons/gun/revolver/shot_old_new.ogg b/sound/weapons/gun/revolver/shot_old_new.ogg
new file mode 100644
index 000000000000..91e480bd152a
Binary files /dev/null and b/sound/weapons/gun/revolver/shot_old_new.ogg differ
diff --git a/sound/weapons/gun/rifle/ak47_cocked.ogg b/sound/weapons/gun/rifle/ak47_cocked.ogg
new file mode 100644
index 000000000000..5f2d32e31eaf
Binary files /dev/null and b/sound/weapons/gun/rifle/ak47_cocked.ogg differ
diff --git a/sound/weapons/gun/rifle/ak47_reload.ogg b/sound/weapons/gun/rifle/ak47_reload.ogg
new file mode 100644
index 000000000000..9105d5c31c16
Binary files /dev/null and b/sound/weapons/gun/rifle/ak47_reload.ogg differ
diff --git a/sound/weapons/gun/rifle/ak47_unload.ogg b/sound/weapons/gun/rifle/ak47_unload.ogg
new file mode 100644
index 000000000000..f6b5c73d7f6b
Binary files /dev/null and b/sound/weapons/gun/rifle/ak47_unload.ogg differ
diff --git a/sound/weapons/gun/rifle/ar_cock.ogg b/sound/weapons/gun/rifle/ar_cock.ogg
new file mode 100644
index 000000000000..ac02ed93c1d7
Binary files /dev/null and b/sound/weapons/gun/rifle/ar_cock.ogg differ
diff --git a/sound/weapons/gun/rifle/ar_reload.ogg b/sound/weapons/gun/rifle/ar_reload.ogg
new file mode 100644
index 000000000000..6e557b892a97
Binary files /dev/null and b/sound/weapons/gun/rifle/ar_reload.ogg differ
diff --git a/sound/weapons/gun/rifle/ar_unload.ogg b/sound/weapons/gun/rifle/ar_unload.ogg
new file mode 100644
index 000000000000..591599f52334
Binary files /dev/null and b/sound/weapons/gun/rifle/ar_unload.ogg differ
diff --git a/sound/weapons/gun/rifle/m16_cocked.ogg b/sound/weapons/gun/rifle/m16_cocked.ogg
new file mode 100644
index 000000000000..8d2e059efaa7
Binary files /dev/null and b/sound/weapons/gun/rifle/m16_cocked.ogg differ
diff --git a/sound/weapons/gun/rifle/m16_reload.ogg b/sound/weapons/gun/rifle/m16_reload.ogg
new file mode 100644
index 000000000000..b2666ca96fe7
Binary files /dev/null and b/sound/weapons/gun/rifle/m16_reload.ogg differ
diff --git a/sound/weapons/gun/rifle/m16_unload.ogg b/sound/weapons/gun/rifle/m16_unload.ogg
new file mode 100644
index 000000000000..d302e5a26748
Binary files /dev/null and b/sound/weapons/gun/rifle/m16_unload.ogg differ
diff --git a/sound/weapons/gun/shotgun/insert_shell.ogg b/sound/weapons/gun/shotgun/insert_shell.ogg
index 5b2c6cdc5003..cd5c5e31aa67 100644
Binary files a/sound/weapons/gun/shotgun/insert_shell.ogg and b/sound/weapons/gun/shotgun/insert_shell.ogg differ
diff --git a/sound/weapons/gun/shotgun/rack.ogg b/sound/weapons/gun/shotgun/rack.ogg
index c25a10ffa494..865dbef3d06e 100644
Binary files a/sound/weapons/gun/shotgun/rack.ogg and b/sound/weapons/gun/shotgun/rack.ogg differ
diff --git a/sound/weapons/gun/shotgun/rack_alt.ogg b/sound/weapons/gun/shotgun/rack_alt.ogg
new file mode 100644
index 000000000000..0f106fe85ab1
Binary files /dev/null and b/sound/weapons/gun/shotgun/rack_alt.ogg differ
diff --git a/sound/weapons/gun/smg/smg_reload.ogg b/sound/weapons/gun/smg/smg_reload.ogg
new file mode 100644
index 000000000000..4e7b8f7ea91e
Binary files /dev/null and b/sound/weapons/gun/smg/smg_reload.ogg differ
diff --git a/sound/weapons/gun/smg/smg_unload.ogg b/sound/weapons/gun/smg/smg_unload.ogg
new file mode 100644
index 000000000000..677b5a8f3d29
Binary files /dev/null and b/sound/weapons/gun/smg/smg_unload.ogg differ
diff --git a/sound/weapons/gun/smg/smgrack.ogg b/sound/weapons/gun/smg/smgrack.ogg
index 95f5a5f9c843..57ef99a0c5ca 100644
Binary files a/sound/weapons/gun/smg/smgrack.ogg and b/sound/weapons/gun/smg/smgrack.ogg differ
diff --git a/sound/weapons/gun/smg/uzi.ogg b/sound/weapons/gun/smg/uzi.ogg
new file mode 100644
index 000000000000..0168613ce872
Binary files /dev/null and b/sound/weapons/gun/smg/uzi.ogg differ
diff --git a/sound/weapons/gun/smg/uzi_cocked.ogg b/sound/weapons/gun/smg/uzi_cocked.ogg
new file mode 100644
index 000000000000..8cbe23b017b0
Binary files /dev/null and b/sound/weapons/gun/smg/uzi_cocked.ogg differ
diff --git a/sound/weapons/gun/smg/uzi_reload.ogg b/sound/weapons/gun/smg/uzi_reload.ogg
new file mode 100644
index 000000000000..8dae035f65e2
Binary files /dev/null and b/sound/weapons/gun/smg/uzi_reload.ogg differ
diff --git a/sound/weapons/gun/smg/uzi_unload.ogg b/sound/weapons/gun/smg/uzi_unload.ogg
new file mode 100644
index 000000000000..b285b71ac3a0
Binary files /dev/null and b/sound/weapons/gun/smg/uzi_unload.ogg differ
diff --git a/sound/weapons/gun/smg/vector_fire.ogg b/sound/weapons/gun/smg/vector_fire.ogg
new file mode 100644
index 000000000000..05c797c1464b
Binary files /dev/null and b/sound/weapons/gun/smg/vector_fire.ogg differ
diff --git a/tools/changelog/generate_cl.py b/tools/changelog/generate_cl.py
index 7259467f007d..2ab903eb8896 100644
--- a/tools/changelog/generate_cl.py
+++ b/tools/changelog/generate_cl.py
@@ -27,7 +27,7 @@
from pathlib import Path
from github import Github, InputGitAuthor
-from ruamel import yaml
+from ruamel.yaml import YAML
CL_BODY = re.compile(r":cl:(.+)?\r\n((.|\n|\r)+?)\r\n\/:cl:", re.MULTILINE)
CL_SPLIT = re.compile(r"(^\w+):\s+(\w.+)", re.MULTILINE)
@@ -71,8 +71,10 @@
write_cl["delete-after"] = True
+yaml = YAML(typ='safe', pure=True)
+
with open(Path.cwd().joinpath("tools/changelog/tags.yml")) as file:
- tags = yaml.safe_load(file)
+ tags = yaml.load(file)
write_cl["changes"] = []
@@ -86,7 +88,6 @@
if write_cl["changes"]:
with io.StringIO() as cl_contents:
- yaml = yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.dump(write_cl, cl_contents)
cl_contents.seek(0)