diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index bf0a0cb141..275cf95856 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -6155,6 +6155,9 @@
/turf/closed/wall/r_wall,
/area/command/heads_quarters/cmo)
"ajH" = (
+/obj/machinery/door/window/eastleft{
+ req_access_txt = "48;50"
+ },
/obj/structure/plasticflaps/opaque,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
@@ -10523,6 +10526,7 @@
dir = 1
},
/obj/effect/turf_decal/stripes/line,
+/obj/structure/closet/secure_closet/contraband/armory,
/turf/open/floor/plasteel,
/area/security/brig)
"aqC" = (
@@ -20157,17 +20161,21 @@
/turf/open/floor/plasteel,
/area/engineering/main)
"aFB" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/airalarm{
- pixel_y = 24
- },
/obj/machinery/camera{
c_tag = "Starboard Bow Solar";
network = list("ss13","engine")
},
+/obj/machinery/power/solar_control{
+ id = "forestarboard";
+ name = "Starboard Bow Solar Control"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/effect/turf_decal/bot,
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
"aFC" = (
@@ -23300,7 +23308,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/space/basic,
+/turf/open/floor/plating,
/area/maintenance/port/aft)
"aKo" = (
/obj/structure/lattice,
@@ -24244,13 +24252,10 @@
/turf/open/floor/plasteel,
/area/engineering/gravity_generator)
"aLL" = (
-/obj/effect/turf_decal/box,
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/machinery/power/tracker,
-/turf/open/floor/plasteel/airless/solarpanel,
-/area/solars/port/aft)
+/obj/structure/grille,
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"aLM" = (
/obj/structure/cable/white{
icon_state = "1-2"
@@ -32798,7 +32803,6 @@
pixel_x = -32;
pixel_y = 32
},
-/obj/effect/turf_decal/delivery,
/obj/structure/cable{
icon_state = "4-8"
},
@@ -32811,6 +32815,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/effect/turf_decal/caution,
/turf/open/floor/plasteel,
/area/maintenance/solars/port/aft)
"bal" = (
@@ -33358,13 +33363,13 @@
/turf/open/floor/plating,
/area/maintenance/port/aft)
"bbf" = (
-/obj/machinery/power/smes,
/obj/machinery/camera{
c_tag = "Port Quarter Solar";
dir = 4;
network = list("ss13","engine")
},
-/obj/structure/cable{
+/obj/machinery/power/smes,
+/obj/structure/cable/white{
icon_state = "0-4"
},
/turf/open/floor/plating,
@@ -33379,6 +33384,9 @@
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/cable/white{
+ icon_state = "4-8"
+ },
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
"bbi" = (
@@ -33389,10 +33397,7 @@
pixel_x = 24
},
/obj/structure/cable/white{
- icon_state = "2-8"
- },
-/obj/structure/cable/white{
- icon_state = "0-2"
+ icon_state = "0-8"
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
@@ -33481,10 +33486,10 @@
/obj/machinery/power/terminal{
dir = 1
},
-/obj/effect/turf_decal/delivery,
-/obj/structure/cable/white{
+/obj/structure/cable{
icon_state = "0-4"
},
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
"bbp" = (
@@ -33831,9 +33836,15 @@
/area/solars/starboard/fore)
"bbR" = (
/obj/machinery/light/small,
-/obj/structure/cable/white{
- icon_state = "1-8"
+/obj/machinery/power/solar_control{
+ dir = 8;
+ id = "aftport";
+ name = "Port Quarter Solar Control"
},
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/effect/turf_decal/bot,
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
"bbS" = (
@@ -33881,7 +33892,6 @@
/turf/open/floor/plating/airless,
/area/solars/starboard/fore)
"bbZ" = (
-/obj/effect/turf_decal/delivery,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
@@ -33891,6 +33901,7 @@
/obj/machinery/light/small{
dir = 8
},
+/obj/effect/turf_decal/caution,
/turf/open/floor/plasteel,
/area/maintenance/solars/starboard/fore)
"bca" = (
@@ -33902,7 +33913,6 @@
dir = 8
},
/obj/effect/landmark/xeno_spawn,
-/obj/effect/turf_decal/delivery,
/obj/structure/cable{
icon_state = "4-8"
},
@@ -34318,25 +34328,19 @@
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
"bcJ" = (
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/obj/effect/turf_decal/box,
-/obj/machinery/power/tracker,
-/turf/open/floor/plasteel/airless/solarpanel,
-/area/solars/starboard/fore)
+/obj/structure/lattice,
+/obj/structure/grille,
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space/nearstation)
"bcK" = (
-/obj/machinery/power/solar_control{
- id = "forestarboard";
- name = "Starboard Bow Solar Control"
- },
-/obj/effect/turf_decal/bot,
/obj/machinery/power/terminal{
dir = 4
},
/obj/structure/cable{
icon_state = "0-8"
},
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
"bcL" = (
@@ -34400,6 +34404,10 @@
/obj/structure/cable/white{
icon_state = "1-8"
},
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
"bcS" = (
@@ -34889,14 +34897,11 @@
/turf/open/floor/plating/airless,
/area/solars/starboard/fore)
"bdC" = (
-/obj/machinery/power/solar_control{
- id = "aftport";
- name = "Port Quarter Solar Control"
- },
-/obj/effect/turf_decal/bot,
-/obj/structure/cable,
/obj/structure/cable{
- icon_state = "1-8"
+ icon_state = "1-2"
+ },
+/obj/structure/cable/white{
+ icon_state = "4-8"
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
@@ -34926,17 +34931,17 @@
},
/area/command/heads_quarters/rd)
"bdE" = (
-/obj/machinery/power/apc{
- areastring = "/area/maintenance/solars/starboard/fore";
- name = "Starboard Bow Solar APC";
- pixel_y = -26
- },
/obj/structure/cable/white{
icon_state = "4-8"
},
/obj/structure/cable/white{
icon_state = "0-8"
},
+/obj/machinery/power/apc{
+ areastring = "/area/maintenance/solars/starboard/fore";
+ name = "Starboard Bow Solar APC";
+ pixel_y = -26
+ },
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
"bdF" = (
@@ -34963,7 +34968,7 @@
dir = 1;
pixel_y = -22
},
-/obj/structure/cable/white{
+/obj/structure/cable{
icon_state = "4-8"
},
/turf/open/floor/plating,
@@ -36808,8 +36813,11 @@
/turf/open/floor/engine,
/area/maintenance/disposal/incinerator)
"bgk" = (
-/obj/structure/cable/white{
- icon_state = "4-8"
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
@@ -40900,6 +40908,10 @@
},
/turf/closed/wall/r_wall,
/area/science/mixing)
+"eDE" = (
+/obj/effect/landmark/carpspawn,
+/turf/open/space/basic,
+/area/space/station_ruins)
"eOg" = (
/obj/structure/closet/crate{
icon_state = "crateopen"
@@ -47272,6 +47284,14 @@
/obj/item/pickaxe,
/turf/open/floor/plating,
/area/engineering/atmos)
+"uBW" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/effect/turf_decal/box,
+/obj/machinery/power/tracker,
+/turf/open/floor/plasteel/airless/solarpanel,
+/area/solars/starboard/fore)
"uCY" = (
/turf/open/pool,
/area/maintenance/starboard/aft)
@@ -47650,6 +47670,14 @@
"vMb" = (
/turf/open/floor/engine/n2o,
/area/engineering/atmos)
+"vPH" = (
+/obj/effect/turf_decal/box,
+/obj/machinery/power/tracker,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plasteel/airless/solarpanel,
+/area/solars/port/aft)
"vPZ" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 8
@@ -47778,6 +47806,13 @@
},
/turf/open/floor/plasteel/dark,
/area/command/bridge)
+"wle" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/space/basic,
+/area/solars/starboard/fore)
"wqL" = (
/obj/machinery/atmospherics/pipe/simple/yellow/visible{
dir = 4
@@ -71072,7 +71107,7 @@ jFP
jFP
jFP
jFP
-jFP
+eDE
jFP
jFP
jFP
@@ -71584,23 +71619,23 @@ jFP
jFP
jFP
jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
jFP
jFP
jFP
@@ -71841,23 +71876,23 @@ jFP
jFP
jFP
jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
jFP
jFP
jFP
@@ -72098,23 +72133,23 @@ jFP
jFP
jFP
jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
jFP
jFP
jFP
@@ -72355,23 +72390,23 @@ jFP
jFP
jFP
jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
+aaa
+aaa
+fMP
+sdX
+aLL
+aLL
+aLL
+sdX
+vPH
+sdX
+aLL
+aLL
+aLL
+sdX
+aLL
+aaa
+aaa
jFP
jFP
jFP
@@ -72612,23 +72647,23 @@ jFP
jFP
jFP
jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
+aaa
+aaa
+fMP
+aaa
+aaa
+aaa
+aaa
+aaa
+aMH
+aaa
+aaa
+aaa
+aaa
+aaa
+aLL
+aaa
+aaa
jFP
jFP
jFP
@@ -72869,21 +72904,21 @@ jFP
jFP
jFP
jFP
-jFP
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaa
aaa
+fMP
aaa
+aKr
+aKr
+aKr
+aKr
+aMI
+aKr
+aKr
+aKr
+aKr
aaa
+aLL
aaa
aaa
jFP
@@ -73126,21 +73161,21 @@ jFP
jFP
jFP
jFP
-jFP
-aaa
-aaa
-aaa
-aab
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
aaa
aaa
+sdX
+sdX
+aKB
+aLz
+aLz
+aLz
+aMQ
+bar
+bar
+bar
+bbS
+sdX
+sdX
aaa
aaa
jFP
@@ -73385,19 +73420,19 @@ aaa
aaa
aaa
aaa
-pZU
-sdX
-pZU
-pZU
-pZU
-sdX
aLL
-sdX
-pZU
-pZU
-pZU
-sdX
-pZU
+aaa
+aKF
+aKF
+aKF
+aKF
+aMH
+aKF
+aKF
+aKF
+aKF
+aaa
+bcJ
aaa
aaa
jFP
@@ -73642,13 +73677,13 @@ aaa
aaa
aaa
aaa
-pZU
+aLL
aaa
aaa
aaa
aaa
aaa
-aMH
+aZS
aaa
aaa
aaa
@@ -96711,7 +96746,7 @@ aaa
aaa
aaa
aaa
-pZU
+sdX
aaa
aaa
aaa
@@ -96723,7 +96758,7 @@ aaa
aaa
aaa
aaa
-pZU
+sdX
aaa
aaa
aaa
@@ -96968,7 +97003,7 @@ aaa
aaa
aaa
aaa
-sdX
+aLL
aaa
abL
abL
@@ -96980,7 +97015,7 @@ abL
abL
abL
aaa
-sdX
+pZU
aaa
aaa
aaa
@@ -97225,7 +97260,7 @@ jFP
aaa
aaa
aaa
-pZU
+aLL
sdX
abM
bbQ
@@ -97482,13 +97517,13 @@ jFP
aaa
aaa
aaa
-pZU
+aLL
aaa
acu
acu
acu
acu
-aef
+wle
acu
acu
acu
@@ -97739,19 +97774,19 @@ jFP
aaa
aaa
aaa
-pZU
+sdX
aaa
aaa
aaa
aaa
aaa
-adt
+aef
aaa
aaa
aaa
aaa
aaa
-pZU
+sdX
aaa
aaa
aaa
@@ -97996,19 +98031,19 @@ jFP
aaa
aaa
aaa
-sdX
-sdX
-pZU
-pZU
-pZU
-sdX
bcJ
-sdX
+aaa
+abL
+abL
+abL
+abL
+adt
+abL
+abL
+abL
+abL
+aaa
pZU
-pZU
-pZU
-sdX
-sdX
aaa
aaa
aaa
@@ -98253,19 +98288,19 @@ jFP
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aLL
+sdX
+abM
+bbQ
+bbQ
+bbQ
+adM
+bbV
+bbV
+bbV
+bcD
+sdX
+pZU
aaa
aaa
aaa
@@ -98510,19 +98545,19 @@ jFP
aaa
aaa
aaa
+pZU
aaa
+acu
+acu
+acu
+acu
+aef
+acu
+acu
+acu
+acu
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+pZU
aaa
aaa
aaa
@@ -98767,19 +98802,19 @@ jFP
aaa
aaa
aaa
+pZU
aaa
aaa
aaa
aaa
aaa
+adt
aaa
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
+pZU
aaa
aaa
aaa
@@ -99024,19 +99059,19 @@ jFP
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+pZU
+sdX
+pZU
+pZU
+pZU
+sdX
+uBW
+sdX
+pZU
+pZU
+pZU
+sdX
+pZU
aaa
aaa
aaa
@@ -99536,23 +99571,23 @@ jFP
jFP
jFP
jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
jFP
jFP
jFP
@@ -99793,23 +99828,23 @@ jFP
jFP
jFP
jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
-jFP
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
jFP
jFP
jFP
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index fdded58308..dad0f49832 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -359,6 +359,9 @@
#define COMSIG_LIVING_RUN_BLOCK "living_do_run_block" //from base of mob/living/do_run_block(): (real_attack, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone)
#define COMSIG_LIVING_GET_BLOCKING_ITEMS "get_blocking_items" //from base of mob/living/get_blocking_items(): (list/items)
+#define COMSIG_LIVING_RESTING "living_on_resting" //from mob/living/set_resting
+#define COMSIG_LIVING_STOPPED_PULLING "living_on_stop_pulling" //from mob/living/stop_pulling
+
#define COMSIG_LIVING_ACTIVE_BLOCK_START "active_block_start" //from base of mob/living/keybind_start_active_blocking(): (obj/item/blocking_item, list/backup_items)
#define COMPONENT_PREVENT_BLOCK_START 1
#define COMSIG_LIVING_ACTIVE_PARRY_START "active_parry_start" //from base of mob/living/initiate_parry_sequence(): (parrying_method, datum/parrying_item_mob_or_art, list/backup_items, list/override)
diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm
index 4b8b2c797e..55c3ac8772 100644
--- a/code/__DEFINES/research.dm
+++ b/code/__DEFINES/research.dm
@@ -74,5 +74,5 @@
)
#define BOMB_TARGET_POINTS 50000 //Adjust as needed. Actual hard cap is double this, but will never be reached due to hyperbolic curve.
-#define BOMB_TARGET_SIZE 200 // The shockwave radius required for a bomb to get TECHWEB_BOMB_MIDPOINT points.
-#define BOMB_SUB_TARGET_EXPONENT 2 // The power of the points curve below the target size. Higher = less points for worse bombs, below target.
+#define BOMB_TARGET_SIZE 175 // The shockwave radius required for a bomb to get TECHWEB_BOMB_MIDPOINT points.
+#define BOMB_SUB_TARGET_EXPONENT 3 // The power of the points curve below the target size. Higher = less points for worse bombs, below target.
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 3272060835..8d6646b8d0 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -3066,6 +3066,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
save_character()
character.dna.features = features.Copy()
+
character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE)
character.dna.species.eye_type = eye_type
if(chosen_limb_id && (chosen_limb_id in character.dna.species.allowed_limb_ids))
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 1dc50bfe73..f5e1c2e113 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
@@ -28,10 +28,9 @@
for(var/path in typesof(prototype))
if(path == prototype && skip_prototype)
continue
- if(roundstart)
- var/datum/sprite_accessory/P = path
- if(initial(P.locked))
- continue
+ var/datum/sprite_accessory/P = path
+ if((roundstart && initial(P.locked)) || initial(P.ignore))
+ continue
var/datum/sprite_accessory/D = new path()
if(D.icon_state)
@@ -64,6 +63,7 @@
var/mutant_part_string //Also used in species.handle_mutant_bodyparts() to generate the overlay icon state.
var/alpha_mask_state
var/matrixed_sections = MATRIX_NONE //if color_src is MATRIXED, how many sections does it have? 1-3
+ var/ignore = FALSE //NEVER include in customization if set to TRUE
//Special / holdover traits for Citadel specific sprites.
var/extra = FALSE
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm
index c525a13ef8..11fde50a37 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm
@@ -126,6 +126,11 @@
hide_legs = USE_SNEK_CLIP_MASK
matrixed_sections = MATRIX_RED_GREEN
+/datum/sprite_accessory/taur/naga/coiled
+ name = "Naga (coiled)"
+ icon_state = "naga_coiled"
+ ignore = TRUE
+
/datum/sprite_accessory/taur/otie
name = "Otie"
icon_state = "otie"
diff --git a/code/modules/mob/living/carbon/human/innate_abilities/coiling.dm b/code/modules/mob/living/carbon/human/innate_abilities/coiling.dm
new file mode 100644
index 0000000000..52e2a87a7d
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/innate_abilities/coiling.dm
@@ -0,0 +1,89 @@
+
+/datum/action/innate/ability/coiling
+ name = "Coil Grabbed Mob"
+ check_flags = AB_CHECK_CONSCIOUS
+ button_icon_state = "coil_icon"
+ icon_icon = 'icons/mob/actions/actions_snake.dmi'
+ background_icon_state = "bg_alien"
+ required_mobility_flags = MOBILITY_STAND
+ var/currently_coiling = FALSE
+ var/mob/living/carbon/human/currently_coiled
+ var/mutable_appearance/tracked_overlay
+
+/datum/action/innate/ability/coiling/Activate()
+ // make sure they meet the mobility/check flags
+ if(IsAvailable())
+ // check that the user has grabbed someone and they are not currently coiling someone
+ if(ishuman(owner.pulling) && !currently_coiling)
+ coil_mob(owner.pulling)
+
+/datum/action/innate/ability/coiling/proc/update_coil_offset(atom/source, old_dir, new_dir)
+ // update the coiling offset on the coiled user depending on the way the owner is facing
+ switch(new_dir)
+ if(NORTH)
+ currently_coiled.pixel_x = -12
+ if(EAST)
+ currently_coiled.pixel_x = -12
+ if(SOUTH)
+ currently_coiled.pixel_x = 12
+ if(WEST)
+ currently_coiled.pixel_x = 12
+
+/datum/action/innate/ability/coiling/proc/coil_mob(var/mob/living/carbon/human/H)
+ // begin the coiling action
+ H.visible_message("[owner] coils [H] with their tail!", \
+ "[owner] coils you with their tail!")
+ currently_coiling = TRUE
+ currently_coiled = H
+
+ H.layer -= 0.1 // LISTEN I HATE TOUCHING MOB LAYERS TOO BUT THIS IS JUST SO THEY RENDER UNDER THE OTHER PLAYER SDFHSDFHDSFHDSH
+
+ // move user to same tile
+ H.forceMove(get_turf(owner))
+
+ // cancel the coiling action if certain things are done
+ RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/cancel_coil)
+ RegisterSignal(owner, COMSIG_LIVING_RESTING, .proc/cancel_coil)
+ RegisterSignal(owner, COMSIG_LIVING_STOPPED_PULLING, .proc/cancel_coil)
+
+ // update the coil offset, update again if owner changes direction
+ RegisterSignal(owner, COMSIG_ATOM_DIR_CHANGE, .proc/update_coil_offset)
+ update_coil_offset(null, null, owner.dir)
+
+ // set our overlay to new image
+ var/mob/living/carbon/human/user = owner
+ user.dna.species.mutant_bodyparts["taur"] = "Naga (coiled)"
+ user.dna.features["taur"] = "Naga (coiled)"
+ user.update_mutant_bodyparts()
+
+/datum/action/innate/ability/coiling/proc/cancel_coil()
+ var/mob/living/carbon/human/H = owner
+
+ // cancel the coiling action by removing the overlay
+ currently_coiled.pixel_x = 0
+
+ currently_coiling = FALSE
+ currently_coiled = null
+
+ // unregister signals
+ UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
+ UnregisterSignal(owner, COMSIG_LIVING_RESTING)
+ UnregisterSignal(owner, COMSIG_LIVING_STOPPED_PULLING)
+ UnregisterSignal(owner, COMSIG_ATOM_DIR_CHANGE)
+
+ // change overlay back to original image
+ H.dna.species.mutant_bodyparts["taur"] = "Naga"
+ H.dna.features["taur"] = "Naga"
+ H.update_mutant_bodyparts()
+
+ H.update_body()
+
+ H.layer += 0.1
+
+ // remove the added overlay
+ owner.cut_overlay(tracked_overlay)
+ tracked_overlay = null
+
+/datum/action/innate/ability/coiling/Remove(mob/M)
+ cancel_coil()
+ ..(M)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index bbe2781403..e6ac8ae881 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -612,7 +612,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(Q.type in blacklisted_quirks)
removed_quirks += Q.type
. += 1
- qdel(Q)
+ qdel(Q)
else
var/point_overhead = 0
for(var/datum/quirk/Q as anything in C.roundstart_quirks)
@@ -906,6 +906,22 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/tauric = mutant_bodyparts["taur"] && H.dna.features["taur"] && H.dna.features["taur"] != "None"
+ // stuff for adding/removing the coiling ability if you have a taur part
+ // if another action is ever based on mutant parts we should probably make a system for it so it's all done in one proc with less overhead
+ var/datum/action/found_action
+
+ for(var/datum/action/A in H.actions)
+ if(A.type == /datum/action/innate/ability/coiling)
+ found_action = A
+
+ if(found_action && (!tauric || (H.dna.features["taur"] != "Naga" && H.dna.features["taur"] != "Naga (coiled)")))
+ found_action.Remove(H)
+
+ if(!found_action && tauric && H.dna.features["taur"] == "Naga")
+ found_action = new /datum/action/innate/ability/coiling()
+ found_action.Grant(H)
+
+
for(var/mutant_part in mutant_bodyparts)
var/reference_list = GLOB.mutant_reference_list[mutant_part]
if(reference_list)
@@ -1220,7 +1236,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(!HAS_TRAIT(H, TRAIT_ROBOTIC_ORGANISM))
H.adjustBruteLoss(1)
else
- H.adjustFireLoss(1) //Robots melt instead of taking brute.
+ H.adjustFireLoss(1) //Robots melt instead of taking brute.
/datum/species/proc/spec_death(gibbed, mob/living/carbon/human/H)
if(H)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 2070d07e14..bf3094cb08 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -395,6 +395,7 @@
..()
update_pull_movespeed()
update_pull_hud_icon()
+ SEND_SIGNAL(src, COMSIG_LIVING_STOPPED_PULLING)
/mob/living/verb/stop_pulling1()
set name = "Stop Pulling"
diff --git a/code/modules/mob/living/living_mobility.dm b/code/modules/mob/living/living_mobility.dm
index af34fb54cf..6aed30ab83 100644
--- a/code/modules/mob/living/living_mobility.dm
+++ b/code/modules/mob/living/living_mobility.dm
@@ -9,6 +9,8 @@
resting = new_resting
if(!silent)
to_chat(src, "You are now [resting? "resting" : "getting up"].")
+ if(resting == 1)
+ SEND_SIGNAL(src, COMSIG_LIVING_RESTING)
update_resting(updating)
/mob/living/proc/update_resting(update_mobility = TRUE)
diff --git a/html/changelogs/AutoChangeLog-pr-15523.yml b/html/changelogs/AutoChangeLog-pr-15523.yml
new file mode 100644
index 0000000000..48767debcb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-15523.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - balance: "Now slightly easier to get 50,000 points with toxins (50,000 point baseline changed from 200 light range to 175)"
diff --git a/html/changelogs/archive/2022-02.yml b/html/changelogs/archive/2022-02.yml
index 4d58b2e226..0715711ef7 100644
--- a/html/changelogs/archive/2022-02.yml
+++ b/html/changelogs/archive/2022-02.yml
@@ -145,3 +145,12 @@
accessible by engineers tweak: [Omega] Chapel mass driver and mass driver bulkhead
are now controlled by one button instead of two'
- bugfix: '[Omega] Lawyer''s carpet is no longer airless'
+2022-02-25:
+ TripleShades:
+ - rscadd: '[Omega] Additional Solar Panels to both existing arrays'
+ - rscadd: '[Omega] Floor tile underneath library maint airlock'
+ - rscadd: '[Omega] Contraband locker to Armoury'
+ - bugfix: '[Omega] Solar Array SMES Units actually connect to the grid properly
+ now'
+ timothyteakettle:
+ - rscadd: adds snake coiling
diff --git a/icons/mob/actions/actions_snake.dmi b/icons/mob/actions/actions_snake.dmi
new file mode 100644
index 0000000000..6856171b0d
Binary files /dev/null and b/icons/mob/actions/actions_snake.dmi differ
diff --git a/modular_citadel/icons/mob/mam_taur.dmi b/modular_citadel/icons/mob/mam_taur.dmi
index cf332019af..cc4bc0446c 100644
Binary files a/modular_citadel/icons/mob/mam_taur.dmi and b/modular_citadel/icons/mob/mam_taur.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index cd5a1eb823..0896e19bb9 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2699,6 +2699,7 @@
#include "code\modules\mob\living\carbon\human\typing_indicator.dm"
#include "code\modules\mob\living\carbon\human\update_icons.dm"
#include "code\modules\mob\living\carbon\human\innate_abilities\blobform.dm"
+#include "code\modules\mob\living\carbon\human\innate_abilities\coiling.dm"
#include "code\modules\mob\living\carbon\human\innate_abilities\customization.dm"
#include "code\modules\mob\living\carbon\human\innate_abilities\limb_regeneration.dm"
#include "code\modules\mob\living\carbon\human\species_types\abductor.dm"
diff --git a/tgui/packages/tgui/interfaces/common/AtmosControls.js b/tgui/packages/tgui/interfaces/common/AtmosControls.js
index 76348a956f..fcca00188a 100644
--- a/tgui/packages/tgui/interfaces/common/AtmosControls.js
+++ b/tgui/packages/tgui/interfaces/common/AtmosControls.js
@@ -37,7 +37,7 @@ export const Vent = (props, context) => {