From 97a15ec8f8ccfe71eee8a7e7b3afafac516235d4 Mon Sep 17 00:00:00 2001 From: shayoki <96078776+shayoki@users.noreply.github.com> Date: Wed, 3 Jun 2026 01:25:02 -0500 Subject: [PATCH] initial --- .../templates/Birdshot/birdshot_armory.dmm | 2 +- .../Deltastation/deltastation_armory.dmm | 2 +- .../IceBoxStation/iceboxstation_armory.dmm | 2 +- .../MetaStation/metastation_armory.dmm | 2 +- .../tramstation/tramstation_armory.dmm | 2 +- _maps/custom/wawastation.dmm | 8 +- _maps/map_files/Blueshift/Blueshift.dmm | 8 +- _maps/map_files/BoxStation/BoxStation.dmm | 6 +- _maps/map_files/KiloStation/KiloStation.dmm | 6 +- _maps/map_files/biodome/biodome.dmm | 4 +- code/__DEFINES/spaceman_dmm.dm | 4 +- code/__DEFINES/~skyrat_defines/span.dm | 1 - .../client/preferences/erp_preferences.dm | 31 +++++- .../ashwalkers/code/effects/ash_rituals.dm | 6 +- .../modules/ashwalkers/code/items/ash_tool.dm | 100 ++++++++++++++---- .../ashwalkers/icons/ashwalker_tools.dmi | Bin 5197 -> 6648 bytes .../code/mobs/clockwork_marauder.dm | 2 +- .../mob/dead/new_player/sprite_accessories.dm | 4 + .../living/carbon/human/species/podweak.dm | 4 +- .../modules/surgery/organs/tails.dm | 2 +- .../delam_emergency_stop/code/scram.dm | 5 +- .../modules/indicators/code/ssd_indicator.dm | 2 +- .../modules/liquids/code/ocean_biomes.dm | 14 +-- .../modules/liquids/code/ocean_turfs.dm | 2 +- .../modules/mapping/code/planet_turfs.dm | 6 +- .../code/nifsofts/soul_poem.dm | 4 +- .../code/lewd_machinery/milking_machine.dm | 1 - .../modules/mutants/code/mutant_species.dm | 4 +- .../modules/officestuff/code/officestuff.dm | 2 +- .../modules/shotgunrebalance/code/shotgun.dm | 21 +++- .../modules/synths/code/species/synthetic.dm | 4 +- .../modules/research/xenoarch/strange_rock.dm | 10 +- .../mutant_bodypart_overlay.dm | 84 +++++++-------- .../code/datums/materials/basemats.dm | 9 +- .../code/game/objects/items/holy_weapons.dm | 2 +- .../code/game/objects/items/more_pkas.dm | 6 +- .../game/objects/structures/lewd_portals.dm | 2 +- .../code/game/turfs/closed/lunar_cave.dm | 8 +- .../code/game/turfs/closed/lunar_surface.dm | 8 +- modular_zubbers/code/modules/client/ssd.dm | 2 +- .../client/verbs/character_directory.dm | 31 +++++- .../modules/clothing/accessory/accessory.dm | 2 +- .../eyes_opacity/eyes_opacity.dm | 2 + .../customization/species/lycans/materials.dm | 9 +- .../code/modules/jobs/job_types/chaplain.dm | 2 +- .../living/carbon/human/human_update_icons.dm | 2 +- .../ammo_workbench/code/ammo_workbench.dm | 2 +- 47 files changed, 286 insertions(+), 156 deletions(-) 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 a39621f0d1d2ac3159bbf5df5b5119bad1a9f956..7566a439a8709949a8d820a185b49eece7607c47 100644 GIT binary patch literal 6648 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 P=m46kdMf2gmSO(`1h~mO literal 5197 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 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)