This commit is contained in:
shayoki
2026-06-03 01:25:02 -05:00
parent f601a6ddaf
commit 97a15ec8f8
47 changed files with 286 additions and 156 deletions
@@ -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{
@@ -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" = (
@@ -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" = (
@@ -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" = (
@@ -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" = (
+4 -4
View File
@@ -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" = (
+4 -4
View File
@@ -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,
+3 -3
View File
@@ -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,
+3 -3
View File
@@ -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
},
+2 -2
View File
@@ -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
},
+2 -2
View File
@@ -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`
-1
View File
@@ -10,7 +10,6 @@
#define span_crossasay(str) ("<span class='crossasay'>" + str + "</span>")
#define span_doyourjobidiot(str) ("<span class='doyourjobidiot'>" + str + "</span>")
#define span_brown(str) ("<span class='brown'>" + str + "</span>")
#define span_cyan(str) ("<span class='cyan'>" + str + "</span>")
#define span_orange(str) ("<span class='orange'>" + str + "</span>")
#define span_yellow(str) ("<span class='yellow'>" + str + "</span>")
#define span_gangradio(str) ("<span class='gangradio'>" + str + "</span>")
@@ -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"
@@ -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)
@@ -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)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

@@ -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
@@ -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
@@ -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
@@ -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
@@ -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()
@@ -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)
@@ -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
@@ -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.
@@ -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(
@@ -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.
@@ -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"
@@ -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
@@ -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 <b>screwed</b> down.")
@@ -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"
@@ -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
@@ -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(
@@ -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.
@@ -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.
*/
@@ -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))
@@ -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'
@@ -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()
@@ -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(
@@ -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(
+1 -1
View File
@@ -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))
@@ -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"
@@ -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
@@ -1,3 +1,5 @@
var/eyes_opacity = 255
/datum/preference/numeric/eyes_opacity
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
@@ -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.
*/
@@ -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)
@@ -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
@@ -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)