diff --git a/_maps/bubber/automapper/templates/Birdshot/birdshot_armory.dmm b/_maps/bubber/automapper/templates/Birdshot/birdshot_armory.dmm
index fd9cce4c295..cfb27ed463f 100644
--- a/_maps/bubber/automapper/templates/Birdshot/birdshot_armory.dmm
+++ b/_maps/bubber/automapper/templates/Birdshot/birdshot_armory.dmm
@@ -234,7 +234,7 @@
},
/area/station/security/armory)
"V" = (
-/mob/living/simple_animal/bot/secbot/beepsky/armsky,
+/mob/living/basic/bot/secbot/beepsky/armsky,
/obj/effect/turf_decal/tile/dark_red/opposingcorners,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
diff --git a/_maps/bubber/automapper/templates/Deltastation/deltastation_armory.dmm b/_maps/bubber/automapper/templates/Deltastation/deltastation_armory.dmm
index de46faf7e50..2a6248ad320 100644
--- a/_maps/bubber/automapper/templates/Deltastation/deltastation_armory.dmm
+++ b/_maps/bubber/automapper/templates/Deltastation/deltastation_armory.dmm
@@ -109,7 +109,7 @@
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
-/mob/living/simple_animal/bot/secbot/beepsky/armsky,
+/mob/living/basic/bot/secbot/beepsky/armsky,
/turf/open/floor/iron/dark,
/area/station/security/armory)
"n" = (
diff --git a/_maps/bubber/automapper/templates/IceBoxStation/iceboxstation_armory.dmm b/_maps/bubber/automapper/templates/IceBoxStation/iceboxstation_armory.dmm
index 50f9263feba..8e6805f1aba 100644
--- a/_maps/bubber/automapper/templates/IceBoxStation/iceboxstation_armory.dmm
+++ b/_maps/bubber/automapper/templates/IceBoxStation/iceboxstation_armory.dmm
@@ -68,7 +68,7 @@
/turf/open/floor/iron/dark/textured,
/area/station/security/armory)
"B" = (
-/mob/living/simple_animal/bot/secbot/beepsky/armsky,
+/mob/living/basic/bot/secbot/beepsky/armsky,
/turf/open/floor/iron/dark/textured,
/area/station/security/armory)
"C" = (
diff --git a/_maps/bubber/automapper/templates/MetaStation/metastation_armory.dmm b/_maps/bubber/automapper/templates/MetaStation/metastation_armory.dmm
index 9550d4ea1f7..a59df42266a 100644
--- a/_maps/bubber/automapper/templates/MetaStation/metastation_armory.dmm
+++ b/_maps/bubber/automapper/templates/MetaStation/metastation_armory.dmm
@@ -17,7 +17,7 @@
/area/station/security/armory)
"e" = (
/obj/effect/turf_decal/bot,
-/mob/living/simple_animal/bot/secbot/beepsky/armsky,
+/mob/living/basic/bot/secbot/beepsky/armsky,
/turf/open/floor/iron/dark,
/area/station/security/armory)
"f" = (
diff --git a/_maps/bubber/automapper/templates/tramstation/tramstation_armory.dmm b/_maps/bubber/automapper/templates/tramstation/tramstation_armory.dmm
index 527087e3085..e2a990e44ce 100644
--- a/_maps/bubber/automapper/templates/tramstation/tramstation_armory.dmm
+++ b/_maps/bubber/automapper/templates/tramstation/tramstation_armory.dmm
@@ -37,7 +37,7 @@
"g" = (
/obj/effect/turf_decal/stripes/line,
/obj/structure/cable,
-/mob/living/simple_animal/bot/secbot/beepsky/armsky,
+/mob/living/basic/bot/secbot/beepsky/armsky,
/turf/open/floor/iron,
/area/station/security/armory)
"l" = (
diff --git a/_maps/custom/wawastation.dmm b/_maps/custom/wawastation.dmm
index 1ba68dc0e27..fc5c3217cef 100644
--- a/_maps/custom/wawastation.dmm
+++ b/_maps/custom/wawastation.dmm
@@ -818,7 +818,7 @@
dir = 5
},
/obj/machinery/camera/autoname/directional/east,
-/mob/living/simple_animal/bot/secbot/pingsky,
+/mob/living/basic/bot/secbot/pingsky,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white,
@@ -5765,7 +5765,7 @@
/area/station/service/lawoffice)
"bZI" = (
/obj/effect/turf_decal/bot,
-/mob/living/simple_animal/bot/secbot/beepsky/armsky,
+/mob/living/basic/bot/secbot/beepsky/armsky,
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/dark/textured_large,
/area/station/security/armory)
@@ -51283,7 +51283,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/mob/living/simple_animal/bot/secbot/beepsky/officer,
+/mob/living/basic/bot/secbot/beepsky/officer,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"rFX" = (
@@ -67602,7 +67602,7 @@
/area/station/maintenance/port/lesser)
"xkc" = (
/obj/structure/cable/layer3,
-/mob/living/simple_animal/bot/secbot/pingsky,
+/mob/living/basic/bot/secbot/pingsky,
/turf/open/floor/iron/dark,
/area/station/ai/satellite/foyer)
"xkI" = (
diff --git a/_maps/map_files/Blueshift/Blueshift.dmm b/_maps/map_files/Blueshift/Blueshift.dmm
index 691c8da0ab0..3d15b18f8fd 100644
--- a/_maps/map_files/Blueshift/Blueshift.dmm
+++ b/_maps/map_files/Blueshift/Blueshift.dmm
@@ -43199,7 +43199,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/mob/living/simple_animal/bot/secbot/beepsky/officer,
+/mob/living/basic/bot/secbot/beepsky/officer,
/obj/structure/disposalpipe/segment{
dir = 4
},
@@ -47871,7 +47871,7 @@
"jhL" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/mob/living/simple_animal/bot/secbot/beepsky/jr,
+/mob/living/basic/bot/secbot/beepsky/jr,
/turf/open/floor/iron/dark/side{
dir = 1
},
@@ -81136,7 +81136,7 @@
"pzw" = (
/obj/structure/cable,
/obj/effect/landmark/event_spawn,
-/mob/living/simple_animal/bot/secbot/beepsky/armsky,
+/mob/living/basic/bot/secbot/beepsky/armsky,
/obj/machinery/holopad/secure,
/turf/open/floor/iron,
/area/station/security/armory)
@@ -85157,7 +85157,7 @@
},
/area/station/hallway/secondary/command)
"qnM" = (
-/mob/living/simple_animal/bot/secbot/pingsky,
+/mob/living/basic/bot/secbot/pingsky,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 5d858ab2e26..548ee150b4a 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -23189,7 +23189,7 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/mob/living/simple_animal/bot/secbot/pingsky,
+/mob/living/basic/bot/secbot/pingsky,
/turf/open/floor/iron/dark,
/area/station/ai/satellite/interior)
"cuT" = (
@@ -24473,7 +24473,7 @@
/area/station/service/chapel/office)
"cCh" = (
/obj/item/bedsheet/red,
-/mob/living/simple_animal/bot/secbot/beepsky/officer,
+/mob/living/basic/bot/secbot/beepsky/officer,
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/fore)
@@ -55038,7 +55038,7 @@
/turf/closed/wall/r_wall,
/area/station/engineering/circuit_workshop)
"nvX" = (
-/mob/living/simple_animal/bot/secbot/beepsky/armsky,
+/mob/living/basic/bot/secbot/beepsky/armsky,
/obj/effect/landmark/event_spawn,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron/dark,
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 94183643c8a..642672524c5 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -39762,7 +39762,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
-/mob/living/simple_animal/bot/secbot/pingsky,
+/mob/living/basic/bot/secbot/pingsky,
/obj/structure/cable/layer3,
/turf/open/floor/engine,
/area/station/ai/satellite/interior)
@@ -48289,7 +48289,7 @@
dir = 4
},
/obj/structure/cable,
-/mob/living/simple_animal/bot/secbot/beepsky/armsky,
+/mob/living/basic/bot/secbot/beepsky/armsky,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 8
},
@@ -69051,7 +69051,7 @@
/area/station/service/bar/atrium)
"vYs" = (
/obj/structure/chair,
-/mob/living/simple_animal/bot/secbot/beepsky/officer,
+/mob/living/basic/bot/secbot/beepsky/officer,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 1
},
diff --git a/_maps/map_files/biodome/biodome.dmm b/_maps/map_files/biodome/biodome.dmm
index 4680ce807cb..aab200d19d6 100644
--- a/_maps/map_files/biodome/biodome.dmm
+++ b/_maps/map_files/biodome/biodome.dmm
@@ -12519,7 +12519,7 @@
/obj/machinery/door/firedoor/border_only{
dir = 1
},
-/mob/living/simple_animal/bot/secbot/pingsky,
+/mob/living/basic/bot/secbot/pingsky,
/turf/open/floor/iron,
/area/station/science/lower)
"euM" = (
@@ -47257,7 +47257,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/mob/living/simple_animal/bot/secbot/pingsky,
+/mob/living/basic/bot/secbot/pingsky,
/obj/machinery/ai_slipper{
uses = 10
},
diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm
index cabb02fd49c..a3b3d2b8b5b 100644
--- a/code/__DEFINES/spaceman_dmm.dm
+++ b/code/__DEFINES/spaceman_dmm.dm
@@ -24,14 +24,14 @@
* where a signal or other important handling in the parent proc is being skipped.
* Child procs may set this setting to `0` instead to override the check.
*/
- #define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X
+ #define SHOULD_CALL_PARENT(X) set _call_parent = X
/**
* If set, raise a warning for any child procs that override this one,
* regardless of if it calls parent or not.
* This functions in a similar way to the `final` keyword in some languages.
* This cannot be disabled by child overrides.
*/
- #define SHOULD_NOT_OVERRIDE(X) set SpacemanDMM_should_not_override = X
+ #define SHOULD_NOT_OVERRIDE(X) set _not_override = X
/**
* If set, raise a warning if the proc or one of the sub-procs it calls
* uses a blocking call, such as `sleep()` or `input()` without using `set waitfor = 0`
diff --git a/code/__DEFINES/~skyrat_defines/span.dm b/code/__DEFINES/~skyrat_defines/span.dm
index 42eea1aaf0b..4cb83a64a61 100644
--- a/code/__DEFINES/~skyrat_defines/span.dm
+++ b/code/__DEFINES/~skyrat_defines/span.dm
@@ -10,7 +10,6 @@
#define span_crossasay(str) ("" + str + "")
#define span_doyourjobidiot(str) ("" + str + "")
#define span_brown(str) ("" + str + "")
-#define span_cyan(str) ("" + str + "")
#define span_orange(str) ("" + str + "")
#define span_yellow(str) ("" + str + "")
#define span_gangradio(str) ("" + str + "")
diff --git a/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm b/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
index 69cd36502a1..5a47ae3c3f7 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
@@ -87,8 +87,8 @@
target.penis = null
- client.mob.hud_used.hidden_inventory_update(client.mob)
- client.mob.hud_used.persistent_inventory_update(client.mob)
+ client.mob.hud_used.inventory_update(client.mob)
+ client.mob.hud_used.inventory_update(client.mob)
/datum/preference/toggle/erp/sex_toy_sounds
savefile_key = "sextoy_sounds_pref"
@@ -155,6 +155,7 @@
"Ask (L)OOC",
"No",
"Yes",
+ "Free Use",
)
/datum/preference/choiced/erp_status/create_default_value()
@@ -185,7 +186,14 @@
savefile_key = "erp_status_pref_nc"
/datum/preference/choiced/erp_status_nc/init_possible_values()
- return list("Yes - Switch", "Yes - Dom", "Yes - Sub", "Yes", "Ask (L)OOC", "Check OOC Notes", "No")
+ return list(
+ "No",
+ "Ask (L)OOC",
+ "Check OOC Notes",
+ "Yes",
+ "Yes - Dom",
+ "Yes - Switch",
+ )
/datum/preference/choiced/erp_status_nc/create_default_value()
return "No"
@@ -215,7 +223,15 @@
savefile_key = "erp_status_pref_v"
/datum/preference/choiced/erp_status_v/init_possible_values()
- return list("Yes - Switch", "Yes - Prey", "Yes - Pred", "Check OOC Notes", "Ask (L)OOC", "No", "Yes")
+ return list(
+ "No",
+ "Ask (L)OOC",
+ "Check OOC Notes",
+ "Yes",
+ "Yes - Pred",
+ "Yes - Prey",
+ "Yes - Switch",
+ )
/datum/preference/choiced/erp_status_v/create_default_value()
return "No"
@@ -245,7 +261,12 @@
savefile_key = "erp_status_pref_mechanics"
/datum/preference/choiced/erp_status_mechanics/init_possible_values()
- return list("Roleplay only", "Mechanical only", "Mechanical and Roleplay", "None")
+ return list(
+ "None",
+ "Roleplay only",
+ "Mechanical only",
+ "Mechanical and Roleplay",
+ )
/datum/preference/choiced/erp_status_mechanics/create_default_value()
return "None"
diff --git a/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm b/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm
index ddc3e457ed8..e7b94c05a20 100644
--- a/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm
+++ b/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm
@@ -101,7 +101,7 @@
/obj/item/crusher_trophy/watcher_wing,
)
ritual_success_items = list(
- /obj/item/tendril_seed,
+ /obj/item/ash_seed/tendril,
)
/datum/ash_ritual/incite_megafauna
@@ -109,13 +109,13 @@
desc = "Causes a horrible, unrecognizable sound that will attract the large fauna from around the planet."
required_components = list(
"north" = /mob/living/carbon/human,
- "south" = /obj/item/tendril_seed,
+ "south" = /obj/item/ash_seed/tendril,
"east" = /mob/living/carbon/human,
"west" = /mob/living/carbon/human,
)
consumed_components = list(
/mob/living/carbon/human,
- /obj/item/tendril_seed,
+ /obj/item/ash_seed/tendril,
)
/datum/ash_ritual/incite_megafauna/ritual_success(obj/effect/ash_rune/success_rune)
diff --git a/modular_skyrat/modules/ashwalkers/code/items/ash_tool.dm b/modular_skyrat/modules/ashwalkers/code/items/ash_tool.dm
index d01c24bbcfd..73dd9457184 100644
--- a/modular_skyrat/modules/ashwalkers/code/items/ash_tool.dm
+++ b/modular_skyrat/modules/ashwalkers/code/items/ash_tool.dm
@@ -3,15 +3,14 @@
name = "primitive screwdriver"
icon = 'modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi'
icon_state = "screwdriver"
- post_init_icon_state = null
- random_color = FALSE
custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT)
greyscale_colors = null
greyscale_config = null
greyscale_config_inhand_left = null
greyscale_config_inhand_right = null
- greyscale_config_belt = null
+ greyscale_config_worn = null
+ post_init_icon_state = null
/datum/crafting_recipe/ash_recipe/ash_screwdriver
name = "Ash Screwdriver"
@@ -21,14 +20,14 @@
name = "primitive wirecutters"
icon = 'modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi'
icon_state = "cutters"
- random_color = FALSE
custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT)
greyscale_colors = null
greyscale_config = null
greyscale_config_inhand_left = null
greyscale_config_inhand_right = null
- greyscale_config_belt = null
+ greyscale_config_worn = null
+ post_init_icon_state = null
/datum/crafting_recipe/ash_recipe/ash_cutters
name = "Ash Wirecutters"
@@ -45,11 +44,28 @@
greyscale_config_inhand_left = null
greyscale_config_inhand_right = null
greyscale_config_worn = null
+ post_init_icon_state = null
/datum/crafting_recipe/ash_recipe/ash_wrench
name = "Ash Wrench"
result = /obj/item/wrench/ashwalker
+/obj/item/secateurs/ashwalker
+ name = "primitive secateurs"
+ icon = 'modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi'
+ icon_state = "secateurs"
+ custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT)
+
+ greyscale_colors = null
+ greyscale_config = null
+ greyscale_config_inhand_left = null
+ greyscale_config_inhand_right = null
+ greyscale_config_worn = null
+
+/datum/crafting_recipe/ash_recipe/ash_secateur
+ name = "Ash Secateur"
+ result = /obj/item/secateurs/ashwalker
+
/obj/item/crowbar/ashwalker
name = "primitive crowbar"
icon = 'modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi'
@@ -61,11 +77,31 @@
greyscale_config_inhand_left = null
greyscale_config_inhand_right = null
greyscale_config_worn = null
+ post_init_icon_state = null
/datum/crafting_recipe/ash_recipe/ash_crowbar
name = "Ash Crowbar"
result = /obj/item/crowbar/ashwalker
+/obj/item/chisel/ashwalker
+ name = "primitive chisel"
+ desc = "Where there is a will there is a way; the tool head of this chisel is fashioned from bone shaped when it was fresh and then left to calcify in iron rich water, to make a strong head for all your carving needs."
+ icon = 'modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi'
+ icon_state = "chisel"
+ custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT)
+
+ greyscale_colors = null
+ greyscale_config = null
+ greyscale_config_inhand_left = null
+ greyscale_config_inhand_right = null
+ greyscale_config_worn = null
+ post_init_icon_state = null
+ toolspeed = 4
+
+/datum/crafting_recipe/ash_recipe/ash_chisel
+ name = "Ash Chisel"
+ result = /obj/item/chisel/ashwalker
+
/obj/item/cursed_dagger
name = "cursed ash dagger"
desc = "A blunted dagger that seems to cause the shadows near it to tremble."
@@ -79,37 +115,61 @@
. = ..()
. += span_notice("To be used on tendrils. It will visually change the tendril to indicate whether it has been cursed or not.")
-/obj/item/tendril_seed
- name = "tendril seed"
- desc = "A horrible fleshy mass that pulse with a dark energy."
+/obj/item/ash_seed
icon = 'modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi'
- icon_state = "tendril_seed"
-/obj/item/tendril_seed/examine(mob/user)
+ ///list of things the ash seed can spawn
+ var/list/spawn_list
+
+/obj/item/ash_seed/examine(mob/user)
. = ..()
. += span_notice("In order to be planted, it is required to be on the mining level as well as on basalt.")
-/obj/item/tendril_seed/attack_self(mob/user, modifiers)
+/obj/item/ash_seed/proc/harm_user(mob/living/user, sent_message, damage_amount)
+ to_chat(user, span_warning(sent_message))
+ user.adjust_brute_loss(damage_amount)
+ if(!do_after(user, 4 SECONDS, target = src))
+ to_chat(user, span_warning("You stop the process of planting [src]!"))
+ return FALSE
+
+ return TRUE
+
+/obj/item/ash_seed/attack_self(mob/user, modifiers)
. = ..()
+ if(isnull(spawn_list))
+ return
+
var/turf/src_turf = get_turf(src)
if(!is_mining_level(src_turf.z) || !istype(src_turf, /turf/open/misc/asteroid/basalt))
return
+
if(!isliving(user))
return
+
var/mob/living/living_user = user
- to_chat(living_user, span_warning("You begin to squeeze [src]..."))
- if(!do_after(living_user, 4 SECONDS, target = src))
+ if(!harm_user(user, "You begin to squeeze [src]...", 20))
return
- to_chat(living_user, span_warning("[src] begins to crawl between your hand's appendages, crawling up your arm..."))
- living_user.adjust_brute_loss(35)
- if(!do_after(living_user, 4 SECONDS, target = src))
+
+ if(!harm_user(user, "[src] begins to crawl between your hand's appendages, crawling up your arm...", 20))
return
- to_chat(living_user, span_warning("[src] wraps around your chest and begins to tighten, causing an odd needling sensation..."))
- living_user.adjust_brute_loss(35)
- if(!do_after(living_user, 4 SECONDS, target = src))
+
+ if(!harm_user(user, "[src] wraps around your chest and begins to tighten, causing an odd needling sensation...", 20))
return
+
to_chat(living_user, span_warning("[src] leaps from you satisfied and begins to grossly assemble itself!"))
- var/type = pick(/obj/structure/spawner/lavaland, /obj/structure/spawner/lavaland/goliath, /obj/structure/spawner/lavaland/legion)
+ var/type = pick(spawn_list)
new type(user.loc)
playsound(get_turf(src), 'sound/effects/magic/demon_attack1.ogg', 50, TRUE)
qdel(src)
+
+/obj/item/ash_seed/tendril
+ name = "tendril seed"
+ desc = "A horrible fleshy mass that pulse with a dark energy."
+ icon_state = "tendril_seed"
+ spawn_list = list(/mob/living/basic/mining/tendril)
+
+/obj/item/ash_seed/vent
+ name = "ore seed"
+ desc = "A horrible fleshy mass covers a boulder. It seems to slowly pulse, reacting to you near it"
+ icon_state = "vent_seed"
+ spawn_list = list(/obj/structure/ore_vent/random)
diff --git a/modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi b/modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi
index a39621f0d1d..7566a439a87 100644
Binary files a/modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi and b/modular_skyrat/modules/ashwalkers/icons/ashwalker_tools.dmi differ
diff --git a/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm b/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm
index d427c433522..32e83fb119c 100644
--- a/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm
+++ b/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm
@@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(clockwork_marauders)
/obj/item/nullrod/Initialize(mapload)
. = ..()
- AddElement(/datum/element/bane, /mob/living/basic/clockwork_marauder, 1, 15, FALSE)
+ AddComponent(/datum/component/bane, /mob/living/basic/clockwork_marauder, 1, 15, FALSE)
#undef MARAUDER_SHIELD_MAX
#undef WELDER_REPAIR_AMOUNT
diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm
index 0baf3450881..95c445096d3 100644
--- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm
@@ -42,6 +42,10 @@
var/color_layer_names
/// If this sprite accessory will be inaccessable if ERP config is disabled
var/erp_accessory = FALSE
+ // If this sprite accessory should use something other than the feature_key to decide its sprite key
+ // For example, if TG has it different in their icon files (e.g. "_fish_tail_" instead of "_tail_")
+ // This should hopefully prevent the need to copy paste TG icons into tails.dmi
+ var/feature_key_override
/datum/sprite_accessory/blank
factual = FALSE
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm
index f9c36e115dc..d0b393e82d7 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm
@@ -29,8 +29,8 @@
always_customizable = FALSE
-/datum/species/pod/podweak/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired)
- . = ..()
+/datum/species/pod/podweak/proc/on_life(mob/living/carbon/human/H, seconds_per_tick)
+ SIGNAL_HANDLER
if(H.stat != CONSCIOUS)
return
diff --git a/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm b/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm
index e9c722e1f22..cabec5734d7 100644
--- a/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm
+++ b/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm
@@ -1,5 +1,5 @@
/obj/item/organ/tail
- mutantpart_key = "tail"
+ mutantpart_key = "FEATURE_TAIL"
mutantpart_info = list(MUTANT_INDEX_NAME = "Smooth", MUTANT_INDEX_COLOR_LIST = list("#FFFFFF"))
var/can_wag = TRUE
var/wagging = FALSE
diff --git a/modular_skyrat/modules/delam_emergency_stop/code/scram.dm b/modular_skyrat/modules/delam_emergency_stop/code/scram.dm
index 30b0e2c4199..b2cc36ba926 100644
--- a/modular_skyrat/modules/delam_emergency_stop/code/scram.dm
+++ b/modular_skyrat/modules/delam_emergency_stop/code/scram.dm
@@ -94,7 +94,7 @@
/obj/machinery/atmospherics/components/unary/delam_scram/proc/panic_time(source, trigger_reason)
SIGNAL_HANDLER
- if(!prereq_check(source, trigger_reason))
+ if(!prereq_check())
return
send_warning(source, trigger_reason)
@@ -156,7 +156,8 @@
use_reverb = TRUE,
falloff_distance = 10,
)
- power_fail(duration_min = 27, duration_max = 33)
+ ASYNC
+ power_fail(40, 50)
/// Stop the delamination. Let the fireworks begin
/obj/machinery/atmospherics/components/unary/delam_scram/proc/put_on_a_show()
diff --git a/modular_skyrat/modules/indicators/code/ssd_indicator.dm b/modular_skyrat/modules/indicators/code/ssd_indicator.dm
index d84edb1d569..73cb6e855bf 100644
--- a/modular_skyrat/modules/indicators/code/ssd_indicator.dm
+++ b/modular_skyrat/modules/indicators/code/ssd_indicator.dm
@@ -25,7 +25,7 @@ GLOBAL_VAR_INIT(ssd_indicator_overlay, mutable_appearance('modular_skyrat/module
. = ..()
//Temporary, look below for the reason
-/mob/living/ghostize(can_reenter_corpse = TRUE)
+/mob/living/ghostize(can_reenter_corpse = TRUE, forced = FALSE)
. = ..()
set_ssd_indicator(FALSE)
diff --git a/modular_skyrat/modules/liquids/code/ocean_biomes.dm b/modular_skyrat/modules/liquids/code/ocean_biomes.dm
index d49698f6caf..0ceebb75689 100644
--- a/modular_skyrat/modules/liquids/code/ocean_biomes.dm
+++ b/modular_skyrat/modules/liquids/code/ocean_biomes.dm
@@ -1,37 +1,37 @@
/datum/biome/ocean_sand
- turf_type = /turf/open/misc/ocean
+ open_turf_type = /turf/open/misc/ocean
flora_types = list(/obj/effect/spawner/ocean_curio, /obj/structure/flora/rock, /obj/structure/flora/rock/pile, /obj/structure/flora/ocean/glowweed, /obj/structure/flora/ocean/seaweed, /obj/structure/flora/ocean/longseaweed)
flora_density = 10
/datum/biome/ocean_sand_flora
- turf_type = /turf/open/misc/ocean
+ open_turf_type = /turf/open/misc/ocean
flora_types = list(/obj/effect/spawner/ocean_curio, /obj/structure/flora/rock/pile, /obj/structure/flora/ocean/glowweed, /obj/structure/flora/ocean/seaweed, /obj/structure/flora/ocean/longseaweed, /obj/structure/flora/ocean/coral)
flora_density = 25
fauna_density = 0.03
fauna_types = list(/mob/living/basic/carp)
/datum/biome/ocean_redsand
- turf_type = /turf/open/misc/ironsand/ocean
+ open_turf_type = /turf/open/misc/ironsand/ocean
flora_types = list(/obj/effect/spawner/ocean_curio, /obj/structure/flora/rock/pile, /obj/structure/flora/ocean/glowweed, /obj/structure/flora/ocean/seaweed, /obj/structure/flora/ocean/longseaweed, /obj/structure/flora/ocean/coral)
flora_density = 40
fauna_density = 0.06
fauna_types = list(/mob/living/basic/carp)
/datum/biome/ocean_rocklight
- turf_type = /turf/open/misc/ocean/rock
+ open_turf_type = /turf/open/misc/ocean/rock
flora_types = list(/obj/effect/spawner/ocean_curio/rock, /obj/structure/flora/rock, /obj/structure/flora/rock/pile)
flora_density = 3
/datum/biome/ocean_rockmed
- turf_type = /turf/open/misc/ocean/rock/medium
+ open_turf_type = /turf/open/misc/ocean/rock/medium
flora_types = list(/obj/effect/spawner/ocean_curio/rock, /obj/structure/flora/rock, /obj/structure/flora/rock/pile)
flora_density = 5
/datum/biome/ocean_rockheavy
- turf_type = /turf/open/misc/ocean/rock/heavy
+ open_turf_type = /turf/open/misc/ocean/rock/heavy
flora_types = list(/obj/effect/spawner/ocean_curio/rock, /obj/structure/flora/rock, /obj/structure/flora/rock/pile)
flora_density = 7
/datum/biome/ocean_wall
- turf_type = /turf/closed/mineral/random/stationside/ocean
+ closed_turf_type = /turf/closed/mineral/random/stationside/ocean
flora_density = 0
diff --git a/modular_skyrat/modules/liquids/code/ocean_turfs.dm b/modular_skyrat/modules/liquids/code/ocean_turfs.dm
index e0b94156f50..cb21831a432 100644
--- a/modular_skyrat/modules/liquids/code/ocean_turfs.dm
+++ b/modular_skyrat/modules/liquids/code/ocean_turfs.dm
@@ -21,7 +21,7 @@
if(!ismineralturf(T))
return
var/turf/closed/mineral/M = T
- M.mineralAmt = 0
+ M.mineral_amt = 0
M.gets_drilled()
baseturfs = /turf/open/openspace/ocean //This is to ensure that IF random turf generation produces a openturf, there won't be other turfs assigned other than openspace.
diff --git a/modular_skyrat/modules/mapping/code/planet_turfs.dm b/modular_skyrat/modules/mapping/code/planet_turfs.dm
index 92ec1ce8d7a..750fbe92613 100644
--- a/modular_skyrat/modules/mapping/code/planet_turfs.dm
+++ b/modular_skyrat/modules/mapping/code/planet_turfs.dm
@@ -84,15 +84,15 @@
/turf/closed/mineral/random/asteroid/rockplanet //A version that can be used on the mining planet without destroying atmos - starts with Low_Pressure, along with the rest of the planet.
name = "iron rock"
- icon = MAP_SWITCH('icons/turf/walls/red_wall.dmi', 'icons/turf/mining.dmi')
- icon = 'icons/turf/mining.dmi'
+ icon = MAP_SWITCH('modular_zubbers/icons/turf/walls/red_wall.dmi', 'icons/turf/mining.dmi')
+ icon = 'modular_zubbers/icons/turf/walls/red_wall.dmi'
icon_state = "redrock"
base_icon_state = "red_wall"
turf_type = /turf/open/misc/asteroid/lowpressure
baseturfs = /turf/open/misc/asteroid/lowpressure
initial_gas_mix = OPENTURF_LOW_PRESSURE
defer_change = TRUE
- mineralChance = 25 //Higher mineral chance than normal
+ mineral_chance = 25 //Higher mineral chance than normal
/turf/closed/mineral/random/asteroid/rockplanet/mineral_chances()
return list(
diff --git a/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm b/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm
index 093e9e566b7..4df966f82b4 100644
--- a/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm
+++ b/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm
@@ -74,10 +74,10 @@
if(message["identifier"] == sender_identifier)
message["sender_name"] = message_name
message["message"] = received_message
- message["timestamp"] = station_time_timestamp()
+ message["timestamp"] = "[server_timestamp(ic_time = TRUE)] (PT: [round_timestamp()]"
return TRUE
- message_list.Insert(1, list(list(identifier = sender_identifier, sender_name = received_name, message = received_message, timestamp = station_time_timestamp())))
+ message_list.Insert(1, list(list(identifier = sender_identifier, sender_name = received_name, message = received_message, timestamp = "[server_timestamp(ic_time = TRUE)] (PT: [round_timestamp()]")))
return TRUE
/// Removes the message_to_remove from the message_list, If the message cannot be found the proc will return FALSE, otherwise it will delete the message_to_remove and return TRUE.
diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm
index ead1d76e3bb..c7d79ad4a3c 100644
--- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm
+++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm
@@ -247,7 +247,6 @@
update_mob_action_buttons() //some of our action buttons might be unusable when we're handcuffed.
update_worn_handcuffs()
- update_hud_handcuffed()
/obj/item/restraints/handcuffs/milker
name = "chair cuffs"
diff --git a/modular_skyrat/modules/mutants/code/mutant_species.dm b/modular_skyrat/modules/mutants/code/mutant_species.dm
index 74a6d678b27..20479bb0e59 100644
--- a/modular_skyrat/modules/mutants/code/mutant_species.dm
+++ b/modular_skyrat/modules/mutants/code/mutant_species.dm
@@ -151,8 +151,8 @@
if(COOLDOWN_FINISHED(src, regen_cooldown))
COOLDOWN_START(src, regen_cooldown, REGENERATION_DELAY)
-/datum/species/mutant/infectious/spec_life(mob/living/carbon/carbon_mob, seconds_per_tick, times_fired)
- . = ..()
+/datum/species/mutant/infectious/proc/on_life(mob/living/carbon/carbon_mob, seconds_per_tick)
+ SIGNAL_HANDLER
//mutants never actually die, they just fall down until they regenerate enough to rise back up.
if(COOLDOWN_FINISHED(src, regen_cooldown))
var/heal_amt = heal_rate
diff --git a/modular_skyrat/modules/officestuff/code/officestuff.dm b/modular_skyrat/modules/officestuff/code/officestuff.dm
index 7b661b24fa5..7c0ae62a8cb 100644
--- a/modular_skyrat/modules/officestuff/code/officestuff.dm
+++ b/modular_skyrat/modules/officestuff/code/officestuff.dm
@@ -8,7 +8,7 @@
// stolen from the wall clock
/obj/structure/grandfatherclock/examine(mob/user)
. = ..()
- . += span_info("The current CST (local) time is: [station_time_timestamp()].")
+ . += span_info("The current CST (local) time is: [round_timestamp()].")
. += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss")].")
if(soundloop)
. += span_notice("The hands of the clock are freely ticking away. They could be screwed down.")
diff --git a/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm b/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm
index c5bb5aafa51..822179b32ec 100644
--- a/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm
+++ b/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm
@@ -182,10 +182,25 @@
/obj/projectile/bullet/shotgun_slug/hunter
name = "12g hunter slug"
damage = 20
+ range = 12
+ /// How much the damage is multiplied by when we hit a mob with the correct biotype
+ var/biotype_damage_multiplier = 5
+ /// What biotype we look for
+ var/biotype_we_look_for = MOB_BEAST
-/obj/projectile/bullet/shotgun_slug/hunter/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/bane, mob_biotypes = MOB_BEAST, damage_multiplier = 6)
+/obj/projectile/bullet/shotgun_slug/hunter/on_hit(atom/target, blocked, pierce_hit)
+ if(ismineralturf(target))
+ var/turf/closed/mineral/mineral_turf = target
+ mineral_turf.gets_drilled(firer)
+ if(range > 0)
+ return BULLET_ACT_FORCE_PIERCE
+ return ..()
+ if(!isliving(target) || (damage > initial(damage)))
+ return ..()
+ var/mob/living/target_mob = target
+ if(target_mob.mob_biotypes & biotype_we_look_for || istype(target_mob, /mob/living/simple_animal/hostile/megafauna))
+ damage *= biotype_damage_multiplier
+ return ..()
/obj/item/ammo_casing/shotgun/honkshot
name = "confetti shell"
diff --git a/modular_skyrat/modules/synths/code/species/synthetic.dm b/modular_skyrat/modules/synths/code/species/synthetic.dm
index 230cd002fd8..0926103490e 100644
--- a/modular_skyrat/modules/synths/code/species/synthetic.dm
+++ b/modular_skyrat/modules/synths/code/species/synthetic.dm
@@ -69,8 +69,8 @@
MUTANT_SYNTH_HEAD = list("Default Head", FALSE),
)
-/datum/species/synthetic/spec_life(mob/living/carbon/human/human)
- . = ..()
+/datum/species/synthetic/proc/on_life(mob/living/carbon/human/human)
+ SIGNAL_HANDLER
if(human.stat == SOFT_CRIT || human.stat == HARD_CRIT)
human.adjust_fire_loss(1) //Still deal some damage in case a cold environment would be preventing us from the sweet release to robot heaven
diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm
index 6077f63e0e7..401b4456ad7 100644
--- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm
+++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm
@@ -197,10 +197,10 @@
//turfs
/turf/closed/mineral/strange_rock
- mineralAmt = 1
+ mineral_amt = 1
icon = MAP_SWITCH('modular_zubbers/icons/turf/walls/smoothrocks.dmi', 'modular_skyrat/modules/xenoarch/icons/mining.dmi')
scan_state = "rock_Strange"
- mineralType = /obj/item/xenoarch/strange_rock
+ mineral_type = /obj/item/xenoarch/strange_rock
/turf/closed/mineral/strange_rock/volcanic
turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface
@@ -213,7 +213,7 @@
baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = TRUE
- mineralChance = 10
+ mineral_chance = 7
/turf/closed/mineral/random/volcanic/mineral_chances()
return list(
@@ -261,7 +261,7 @@
/turf/closed/mineral/random/snow/underground
baseturfs = /turf/open/misc/asteroid/snow/icemoon
// abundant ore
- mineralChance = 20
+ mineral_chance = 16
/turf/closed/mineral/random/snow/underground/mineral_chances()
return list(
@@ -302,7 +302,7 @@
/turf/closed/mineral/random/stationside/asteroid/rockplanet
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
turf_type = /turf/open/misc/asteroid
- mineralChance = 30
+ mineral_chance = 25
/turf/closed/mineral/random/stationside/asteroid/rockplanet/mineral_chances()
return list(
diff --git a/modular_zubbers/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/modular_zubbers/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
index 8e3a9d7ba49..5bd5e4ece37 100644
--- a/modular_zubbers/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
+++ b/modular_zubbers/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
@@ -27,7 +27,7 @@
*
* Arguments:
* * dna - The `/datum/dna` datum from which we're going to be extracting the data to set the
- * * accessory_name - instead of using the name from mutant_bodyparts[feature_key][MUTANT_INDEX_NAME] you can optionally pass one explicitly
+ * * accessory_name - instead of using the name from mutant_bodyparts[feature_key] you can optionally pass one explicitly
* * feature_key - same as with accessory_key, you can optionally pass a feature_key explicitly
* appearance.
*/
@@ -40,7 +40,6 @@
sprite_datum = fetch_sprite_datum_from_name(accessory_name ? accessory_name : mutantparts_list[feature_key][MUTANT_INDEX_NAME])
modsuit_affected = sprite_datum.use_custom_mod_icon
draw_color = mutantparts_list[feature_key][MUTANT_INDEX_COLOR_LIST]
- build_emissive_eligibility(mutantparts_list[feature_key][MUTANT_INDEX_EMISSIVE_LIST])
cache_key = jointext(generate_icon_cache(), "_")
return TRUE
@@ -54,12 +53,12 @@
/// Generate a unique key based on our sprites. So that if we've aleady drawn these sprites,
/// they can be found in the cache and wont have to be drawn again (blessing and curse, but mostly curse)
-/datum/bodypart_overlay/mutant/generate_icon_cache()
+/datum/bodypart_overlay/mutant/generate_icon_cache(obj/item/bodypart/limb)
. = list()
. += "[get_base_icon_state()]"
. += "[get_feature_key_for_overlay()]"
-
- . += cache_key_extra_information // We can do it like this because it's meant to be a list of strings anyway. BYOND list operations actually being useful for once.
+ if(LAZYLEN(cache_key_extra_information))
+ . += cache_key_extra_information // We can do it like this because it's meant to be a list of strings anyway. BYOND list operations actually being useful for once.
if(islist(draw_color))
for(var/sub_color in draw_color)
@@ -72,8 +71,8 @@
. += "[alpha]"
if(emissive_eligibility_by_color_index)
- for(var/index in emissive_eligibility_by_color_index)
- . += "[emissive_eligibility_by_color_index[index]]"
+ for(var/emissive_boolean in emissive_eligibility_by_color_index)
+ . += emissive_boolean
return .
@@ -83,11 +82,11 @@
* overriden in the cases where `feature_key` is not what we want to use here.
*/
/datum/bodypart_overlay/mutant/proc/get_feature_key_for_overlay()
- return feature_key
+ return sprite_datum?.feature_key_override || feature_key
/datum/bodypart_overlay/mutant/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner)
- if(!..(bodypart_owner))
+ if(!..())
return FALSE
var/mob/living/carbon/human/human = bodypart_owner.owner
if(!istype(human))
@@ -113,19 +112,19 @@
var/mutable_appearance/mod_overlay
var/icon/custom_mod_icon = sprite_datum.get_custom_mod_icon(owner)
- cache_key_extra_information = list()
last_built_icon_states = list()
+ LAZYCLEARLIST(cache_key_extra_information)
if(custom_mod_icon)
- mod_overlay = get_singular_image(image_layer = image_layer, owner = owner, icon_override = custom_mod_icon)
+ mod_overlay = get_singular_image(image_layer = image_layer, owner = owner, icon_override = custom_mod_icon, limb = limb)
switch(sprite_datum.color_src)
if(USE_MATRIXED_COLORS)
- var/list/color_layer_names = get_color_layer_names(build_icon_state(gender, image_layer))
+ var/list/color_layer_names = get_color_layer_names(build_icon_state_bubber(gender, image_layer))
for (var/color_index in color_layer_names)
- var/mutable_appearance/color_layer_image = get_singular_image(build_icon_state(gender, image_layer, color_layer_names[color_index]), image_layer, owner)
+ var/mutable_appearance/color_layer_image = get_singular_image(build_icon_state_bubber(gender, image_layer, color_layer_names[color_index]), image_layer, owner, limb = limb)
returned_images += color_layer_image
overlay_indexes_to_color += index
@@ -135,7 +134,7 @@
mod_overlay.add_overlay(sprite_datum.get_custom_mod_icon(owner, color_layer_image))
else
- var/mutable_appearance/image_to_return = get_singular_image(build_icon_state(gender, image_layer), image_layer, owner)
+ var/mutable_appearance/image_to_return = get_singular_image(build_icon_state_bubber(gender, image_layer), image_layer, owner, limb = limb)
returned_images = list(image_to_return)
overlay_indexes_to_color += index
@@ -143,16 +142,22 @@
mod_overlay.add_overlay(sprite_datum.get_custom_mod_icon(owner, image_to_return))
if(sprite_datum.has_inner)
- returned_images += get_singular_image(build_icon_state(gender, image_layer, feature_key_suffix = "inner"), image_layer, owner)
+ returned_images += get_singular_image(build_icon_state_bubber(gender, image_layer, feature_key_suffix = "inner"), image_layer, owner, limb = limb)
// Gets the icon_state of a single or matrix colored accessory and overlays it with a texture
if(mod_overlay)
returned_images += mod_overlay
- cache_key_extra_information += "MOD"
+ LAZYADD(cache_key_extra_information, "MOD")
return returned_images
+// Cybernetic cat ears - special case - need a unique version for each inner color.
+/datum/bodypart_overlay/mutant/cat_ears/cybernetic/generate_icon_cache(obj/item/bodypart/limb)
+ . = ..()
+ . += inner_color
+
+
/**
* Returns the color_layer_names of the sprite_datum associated with our datum.
* Mainly here so that it can be overriden elsewhere to have other effects.
@@ -211,7 +216,7 @@
* * feature_key_suffix - A string that will be directly appended to the result
* of `get_feature_key_for_overlay()`. Defaults to `null`.
*/
-/datum/bodypart_overlay/mutant/proc/build_icon_state(gender, image_layer, color_layer = null, feature_key_suffix = null)
+/datum/bodypart_overlay/mutant/proc/build_icon_state_bubber(gender, image_layer, color_layer = null, feature_key_suffix = null)
var/list/icon_state_builder = list()
icon_state_builder += sprite_datum.gender_specific ? gender : "m" //Male is default because sprite accessories are so ancient they predate the concept of not hardcoding gender
@@ -241,7 +246,7 @@
* `sprite_datum.icon`. Default is `null`, and its value will be used if it's
* anything else.
*/
-/datum/bodypart_overlay/mutant/proc/get_singular_image(image_icon_state, image_layer, mob/living/carbon/human/owner, icon_override = null)
+/datum/bodypart_overlay/mutant/proc/get_singular_image(image_icon_state, image_layer, mob/living/carbon/human/owner, icon_override = null, obj/item/bodypart/limb)
// We get from icon_override if it is filled, and from sprite_datum.icon if not.
var/mutable_appearance/appearance = mutable_appearance(icon_override || sprite_datum.get_special_icon(owner), image_icon_state, layer = image_layer)
@@ -251,6 +256,17 @@
return appearance
+// Special case - fish tail
+/datum/bodypart_overlay/mutant/tail/fish/get_singular_image(image_icon_state, image_layer, mob/living/carbon/human/owner, icon_override = null, obj/item/bodypart/limb)
+ var/mutable_appearance/appearance = ..()
+ // We add all appearances the parent bodypart has to the tail to inherit scales and fancy effects
+ // but most other organs don't want to inherit those so we do it here and not on parent
+ for (var/datum/bodypart_overlay/texture/texture in limb.bodypart_overlays)
+ if(texture.can_draw_on_bodypart(limb, limb.owner, limb.is_husked))
+ texture.modify_bodypart_appearance(appearance)
+ return appearance
+
+
/**
* Helper proc to add the appropriate emissives to the overlays, based on the preferences.
*
@@ -264,33 +280,13 @@
if(!limb || !length(emissive_eligibility_by_color_index))
return overlays
- var/index = 1
- var/list/image/emissives = list()
-
- for(var/image/overlay in overlays)
- if(emissive_eligibility_by_color_index[num2text(index)])
- emissives += emissive_appearance_copy(overlay, limb)
-
- index++
-
- return overlays + emissives
-
-
-/**
- * Builds `emissive_eligibility_by_layer` from the input list of three booleans.
- * Will not do anything if the given argument is `null`.
- */
-/datum/bodypart_overlay/mutant/proc/build_emissive_eligibility(list/emissive_eligibility)
- if(!emissive_eligibility || !islist(emissive_eligibility))
- return
-
- emissive_eligibility_by_color_index = list()
- var/i = 1
-
- for(var/eligibility in emissive_eligibility)
- emissive_eligibility_by_color_index[num2text(i)] = eligibility
- i++
+ var/list/image/emissives
+ var/max = min(3, length(overlays)) // only care about the first 3 indexes
+ for(var/index = 1 to max)
+ if(emissive_eligibility_by_color_index[index])
+ LAZYADD(emissives, emissive_appearance_copy(overlays[index], limb))
+ return emissives ? (overlays + emissives) : overlays
/**
* Helper to set the MOD-related info on the overlay, useful for MODsuit overlays.
diff --git a/modular_zubbers/code/datums/materials/basemats.dm b/modular_zubbers/code/datums/materials/basemats.dm
index 8ff9f118f7d..006d428f81e 100644
--- a/modular_zubbers/code/datums/materials/basemats.dm
+++ b/modular_zubbers/code/datums/materials/basemats.dm
@@ -1,7 +1,10 @@
/datum/material/silver/on_applied(atom/source, mat_amount, multiplier, from_slot)
. = ..()
- source.AddElement(/datum/element/bane, mob_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.5)
+ source.AddComponent(/datum/component/bane, affected_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.5)
-/datum/material/silver/on_removed(atom/source, mat_amount, multiplier, from_slot)
+/* /datum/material/silver/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
- source.RemoveElement(/datum/element/bane, mob_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.5)
+ source.RemoveComponentSource(/datum/component/bane, affected_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.5)
+
+//this component should be removed when silver is naturally removed, it should be possible for silver to be removed without this proc being called.
+ */
diff --git a/modular_zubbers/code/game/objects/items/holy_weapons.dm b/modular_zubbers/code/game/objects/items/holy_weapons.dm
index 9e46de49bb0..6811635edef 100644
--- a/modular_zubbers/code/game/objects/items/holy_weapons.dm
+++ b/modular_zubbers/code/game/objects/items/holy_weapons.dm
@@ -88,7 +88,7 @@ means that you'll be forced to move carefully while it's on. Fits in pockets, an
on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \
effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune, /obj/effect/cosmic_rune), \
)
- AddElement(/datum/element/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE)
+ AddComponent(/datum/component/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE)
/obj/item/dualsaber/chaplain/proc/on_cult_rune_removed(obj/effect/target, mob/living/user)
if(!istype(target, /obj/effect/rune))
diff --git a/modular_zubbers/code/game/objects/items/more_pkas.dm b/modular_zubbers/code/game/objects/items/more_pkas.dm
index 1d57117c914..883e0b3d952 100644
--- a/modular_zubbers/code/game/objects/items/more_pkas.dm
+++ b/modular_zubbers/code/game/objects/items/more_pkas.dm
@@ -56,7 +56,7 @@
obj_flags = UNIQUE_RENAME
weapon_weight = WEAPON_HEAVY
max_mod_capacity = 60
- disabled_modkits = list(/obj/item/borg/upgrade/modkit/aoe) // Should cover all AOE variants
+ disabled_modkits = list(/obj/item/borg/upgrade/modkit/cooldown/aoe/) // Should cover all AOE variants
/obj/item/gun/energy/recharge/kinetic_accelerator/glock
name = "proto-kinetic pistol"
@@ -90,7 +90,7 @@
obj_flags = UNIQUE_RENAME
weapon_weight = WEAPON_LIGHT
max_mod_capacity = 75
- disabled_modkits = list(/obj/item/borg/upgrade/modkit/aoe) // Should cover all AOE variants
+ disabled_modkits = list(/obj/item/borg/upgrade/modkit/cooldown/aoe/) // Should cover all AOE variants
/obj/item/gun/energy/recharge/kinetic_accelerator/shockwave/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
target = get_edge_target_turf(user, user.dir)
@@ -154,7 +154,7 @@
fire_sound = 'sound/items/weapons/gun/general/cannon.ogg'
/obj/item/ammo_casing/energy/kinetic/m79
- projectile_type = /obj/projectile/bullet/mining_bomb //uses the mining bomb projectile from the mining modsuit
+ projectile_type = /obj/projectile/bullet/mining_missile //uses the mining bomb projectile from the mining modsuit
select_name = "kinetic"
e_cost = LASER_SHOTS(1, STANDARD_CELL_CHARGE * 0.5)
fire_sound = 'sound/items/weapons/gun/general/grenade_launch.ogg'
diff --git a/modular_zubbers/code/game/objects/structures/lewd_portals.dm b/modular_zubbers/code/game/objects/structures/lewd_portals.dm
index cf90dea5442..f8343caf4a3 100644
--- a/modular_zubbers/code/game/objects/structures/lewd_portals.dm
+++ b/modular_zubbers/code/game/objects/structures/lewd_portals.dm
@@ -179,7 +179,7 @@
/obj/structure/lewd_portal/proc/head_only()
SIGNAL_HANDLER
current_mob.cut_overlays()
- current_mob.update_body_parts_head_only()
+ current_mob.update_body_parts()
var/obj/item/clothing/glasses = current_mob.glasses
if(glasses)
current_mob.update_worn_glasses()
diff --git a/modular_zubbers/code/game/turfs/closed/lunar_cave.dm b/modular_zubbers/code/game/turfs/closed/lunar_cave.dm
index f537aa25eff..9dfe12f278e 100644
--- a/modular_zubbers/code/game/turfs/closed/lunar_cave.dm
+++ b/modular_zubbers/code/game/turfs/closed/lunar_cave.dm
@@ -56,7 +56,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/lunar_cave/mineral_chances()
return list(
@@ -81,7 +81,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/labormineral/lunar_cave/mineral_chances()
return list(
@@ -98,7 +98,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/high_chance/lunar_cave/mineral_chances()
return list(
@@ -121,7 +121,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/low_chance/lunar_cave/mineral_chances()
return list(
diff --git a/modular_zubbers/code/game/turfs/closed/lunar_surface.dm b/modular_zubbers/code/game/turfs/closed/lunar_surface.dm
index c98cd1ca730..87d9c2f46ad 100644
--- a/modular_zubbers/code/game/turfs/closed/lunar_surface.dm
+++ b/modular_zubbers/code/game/turfs/closed/lunar_surface.dm
@@ -56,7 +56,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/lunar/mineral_chances()
return list(
@@ -76,7 +76,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/labormineral/lunar/mineral_chances()
return list(
@@ -93,7 +93,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/high_chance/lunar/mineral_chances()
return list(
@@ -116,7 +116,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/low_chance/lunar/mineral_chances()
return list(
diff --git a/modular_zubbers/code/modules/client/ssd.dm b/modular_zubbers/code/modules/client/ssd.dm
index 286bb22adce..4bcd17b491c 100644
--- a/modular_zubbers/code/modules/client/ssd.dm
+++ b/modular_zubbers/code/modules/client/ssd.dm
@@ -24,7 +24,7 @@
var/datum/timedevent/logout_timer
// Handles fresh ghosts. This includes cryo chambers
-/mob/living/ghostize(can_reenter_corpse)
+/mob/living/ghostize(can_reenter_corpse = TRUE, forced = FALSE)
. = ..()
var/mob/dead/observer/ghost = .
if(!istype(ghost))
diff --git a/modular_zubbers/code/modules/client/verbs/character_directory.dm b/modular_zubbers/code/modules/client/verbs/character_directory.dm
index 57b6da350ec..573b3587946 100644
--- a/modular_zubbers/code/modules/client/verbs/character_directory.dm
+++ b/modular_zubbers/code/modules/client/verbs/character_directory.dm
@@ -29,7 +29,21 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
savefile_identifier = PREFERENCE_CHARACTER
/datum/preference/choiced/attraction/init_possible_values()
- return list("Gay", "Lesbian", "Straight", "Skolio", "Bi", "Pan", "Poly", "Omni", "Ace", "Aro", "Aro/Ace", "Unset", "Check OOC")
+ return list(
+ "Unset",
+ "Check OOC",
+ "Straight",
+ "Lesbian",
+ "Gay",
+ "Bisexual",
+ "Pansexual",
+ "Polysexual",
+ "Asexual",
+ "Aromantic",
+ "Aro/Ace",
+ "Skoliosexual",
+ "Omnisexual",
+ )
/datum/preference/choiced/attraction/create_default_value()
return "Unset"
@@ -43,7 +57,20 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
savefile_identifier = PREFERENCE_CHARACTER
/datum/preference/choiced/display_gender/init_possible_values()
- return list("Male", "Female", "Null", "Plural", "Nonbinary", "Omni", "Trans", "Transmasc", "Transfem", "Andro", "Gyno", "Fluid", "Unset", "Check OOC")
+ return list(
+ "Unset",
+ "Check OOC",
+ "Male",
+ "Female",
+ "Nonbinary",
+ "Genderfluid",
+ "Trans",
+ "Andromorph",
+ "Gynomorph",
+ "Agender",
+ "Plural",
+ "Omnigender",
+ )
/datum/preference/choiced/display_gender/create_default_value()
return "Unset"
diff --git a/modular_zubbers/code/modules/clothing/accessory/accessory.dm b/modular_zubbers/code/modules/clothing/accessory/accessory.dm
index caf7a98a74c..a30d5b62129 100644
--- a/modular_zubbers/code/modules/clothing/accessory/accessory.dm
+++ b/modular_zubbers/code/modules/clothing/accessory/accessory.dm
@@ -23,7 +23,7 @@
/obj/item/clothing/accessory/pocketwatch/examine(mob/user)
. = ..()
- . += span_info("The current CST (local) time is: [station_time_timestamp()].")
+ . += span_info("The current CST (local) time is: [round_timestamp()].")
. += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss")].")
/obj/item/storage/backpack/kanken //Donor item for LT3
diff --git a/modular_zubbers/code/modules/customization/eyes_opacity/eyes_opacity.dm b/modular_zubbers/code/modules/customization/eyes_opacity/eyes_opacity.dm
index 0cb60af228d..9f008359f1e 100644
--- a/modular_zubbers/code/modules/customization/eyes_opacity/eyes_opacity.dm
+++ b/modular_zubbers/code/modules/customization/eyes_opacity/eyes_opacity.dm
@@ -1,3 +1,5 @@
+var/eyes_opacity = 255
+
/datum/preference/numeric/eyes_opacity
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
diff --git a/modular_zubbers/code/modules/customization/species/lycans/materials.dm b/modular_zubbers/code/modules/customization/species/lycans/materials.dm
index ac207b5c8b4..496fa285491 100644
--- a/modular_zubbers/code/modules/customization/species/lycans/materials.dm
+++ b/modular_zubbers/code/modules/customization/species/lycans/materials.dm
@@ -2,9 +2,12 @@
. = ..()
if (isitem(source))
- source.AddElement(/datum/element/bane, /datum/species/lycan, damage_multiplier = 2, requires_combat_mode = FALSE, bane_damage_override = BURN)
+ source.AddComponent(/datum/component/bane, /datum/species/lycan, damage_multiplier = 2, requires_combat_mode = FALSE, bane_damage_override = BURN)
-/datum/material/silver/on_removed(atom/source, mat_amount, multiplier, from_slot)
+/* /datum/material/silver/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
- source.RemoveElement(/datum/element/bane, /datum/species/lycan, damage_multiplier = 2, requires_combat_mode = FALSE, bane_damage_override = BURN)
+ source.RemoveElementSource(/datum/element/bane, /datum/species/lycan, damage_multiplier = 2, requires_combat_mode = FALSE, bane_damage_override = BURN)
+
+//this component should be removed when silver is naturally removed, it should be possible for silver to be removed without this proc being called.
+ */
diff --git a/modular_zubbers/code/modules/jobs/job_types/chaplain.dm b/modular_zubbers/code/modules/jobs/job_types/chaplain.dm
index 9844b018b9d..16024399d7e 100644
--- a/modular_zubbers/code/modules/jobs/job_types/chaplain.dm
+++ b/modular_zubbers/code/modules/jobs/job_types/chaplain.dm
@@ -23,5 +23,5 @@
/obj/item/nullrod/whip/Initialize(mapload)
. = ..()
// 1.3 * 18 = 23.4 per hit
- AddElement(/datum/element/bane, mob_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.3)
+ AddComponent(/datum/component/bane, affected_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.3)
diff --git a/modular_zubbers/code/modules/mob/living/carbon/human/human_update_icons.dm b/modular_zubbers/code/modules/mob/living/carbon/human/human_update_icons.dm
index fba20f5ae56..11896d171a7 100644
--- a/modular_zubbers/code/modules/mob/living/carbon/human/human_update_icons.dm
+++ b/modular_zubbers/code/modules/mob/living/carbon/human/human_update_icons.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/update_underwear()
+/mob/living/carbon/human/get_underwear_overlays()
remove_overlay(BODY_LAYER)
if(HAS_TRAIT(src, TRAIT_INVISIBLE_MAN))
return
diff --git a/modular_zubbers/modules/ammo_workbench/code/ammo_workbench.dm b/modular_zubbers/modules/ammo_workbench/code/ammo_workbench.dm
index 9678a23bb82..6f84d9bc1ba 100644
--- a/modular_zubbers/modules/ammo_workbench/code/ammo_workbench.dm
+++ b/modular_zubbers/modules/ammo_workbench/code/ammo_workbench.dm
@@ -98,7 +98,7 @@
return
var/obj/item/ammo_casing/ammo_type = loaded_magazine.ammo_type
var/ammo_caliber = initial(ammo_type.caliber)
- var/obj/item/ammo_casing/ammo_parent_type = type2parent(ammo_type)
+ var/obj/item/ammo_casing/ammo_parent_type = ammo_type::parent_type
if(loaded_magazine.multitype)
if(ammo_caliber == initial(ammo_parent_type.caliber) && ammo_caliber != null)