diff --git a/_maps/splurt_maps/templates/hilbertshotel.dmm b/_maps/splurt_maps/templates/hilbertshotel.dmm
index 22de1e748b..ecb4d2d646 100644
--- a/_maps/splurt_maps/templates/hilbertshotel.dmm
+++ b/_maps/splurt_maps/templates/hilbertshotel.dmm
@@ -7,7 +7,7 @@
/turf/open/indestructible/hoteltile,
/area/hilbertshotel)
"br" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/atmospherics/components/unary/vent_pump/hilbertshotel{
dir = 4
},
/turf/open/floor/carpet,
@@ -69,7 +69,7 @@
/area/hilbertshotel)
"fv" = (
/obj/structure/lattice,
-/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer3,
+/obj/machinery/atmospherics/components/unary/outlet_injector/hilbertshotel/layer3,
/turf/open/space/bluespace,
/area/hilbertshotel)
"fF" = (
@@ -85,7 +85,7 @@
/turf/closed/indestructible/hotelwall,
/area/hilbertshotel)
"hk" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/hilbertshotel/layer3{
dir = 8
},
/turf/open/floor/carpet,
@@ -160,7 +160,7 @@
/turf/closed/indestructible/hotelwall,
/area/hilbertshotel)
"nK" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/atmospherics/components/unary/vent_pump/hilbertshotel{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -260,7 +260,7 @@
/turf/open/floor/plasteel/cafeteria,
/area/hilbertshotel)
"zr" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/hilbertshotel/layer3{
dir = 4
},
/turf/open/indestructible/hotelwood,
@@ -455,7 +455,7 @@
/turf/open/indestructible/hotelwood,
/area/hilbertshotel)
"RP" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/hilbertshotel/layer3{
dir = 1
},
/turf/open/indestructible/hoteltile,
@@ -504,7 +504,7 @@
/turf/open/indestructible/hoteltile,
/area/hilbertshotel)
"Yl" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on{
+/obj/machinery/atmospherics/components/unary/vent_pump/hilbertshotel{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
diff --git a/auxmos b/auxmos
index d4e49afbc4..531c270128 160000
--- a/auxmos
+++ b/auxmos
@@ -1 +1 @@
-Subproject commit d4e49afbc434ebff077245ea2cbb2a2903fbb28a
+Subproject commit 531c27012870aa2d536c856ea215ab4fac5a2a6d
diff --git a/auxmos.dll b/auxmos.dll
index 913f44e5dd..468a7dfa3d 100644
Binary files a/auxmos.dll and b/auxmos.dll differ
diff --git a/auxmos.pdb b/auxmos.pdb
index bb76bfc6a9..9714601a7c 100644
Binary files a/auxmos.pdb and b/auxmos.pdb differ
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index 664b8c0c0d..adf9660585 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -123,6 +123,7 @@
#define COLOR_THEME_OPERATIVE "#B8221F"
#define COLOR_THEME_GLASS "#75A4C4"
#define COLOR_THEME_CLOCKWORK "#CFBA47"
+#define COLOR_THEME_LITEWEB "#226611"
///Colors for eigenstates
#define COLOR_PERIWINKLEE "#9999FF"
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 4252e1558b..6e5ea6f9b5 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -408,8 +408,9 @@ GLOBAL_LIST_EMPTY(species_datums)
override = TRUE
if(HAS_TRAIT(M, TRAIT_SIXTHSENSE))
override = TRUE
- if(SSticker.current_state == GAME_STATE_FINISHED)
- override = TRUE
+ if(CONFIG_GET(flag/reveal_everything))
+ if(SSticker.current_state == GAME_STATE_FINISHED)
+ override = TRUE
if(isnewplayer(M) && !override)
continue
if(M.stat != DEAD && !override)
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index c63c1e1136..ba726f39c4 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -249,8 +249,7 @@
for(var/m in GLOB.player_list)
var/mob/M = m
H.add_hud_to(M)
-
- CHECK_TICK
+ CHECK_TICK
//Set news report and mode result
mode.set_round_result()
@@ -274,8 +273,7 @@
// handle_hearts()
if(CONFIG_GET(flag/reveal_everything))
set_observer_default_invisibility(0, "The round is over! You are now visible to the living.")
-
- CHECK_TICK
+ CHECK_TICK
//These need update to actually reflect the real antagonists
//Print a list of antagonists to the server log
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 934aaae79f..05507f7728 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -268,6 +268,7 @@ GLOBAL_LIST_INIT(modular_ui_styles, list(
return
var/mob/screenmob = viewmob || mymob
hidden_inventory_update(screenmob)
+ extra_inventory_update(screenmob)
/datum/hud/robot/show_hud(version = 0, mob/viewmob)
. = ..()
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 7646297163..0d77011185 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -9,7 +9,6 @@
/atom/movable/screen
name = ""
icon = 'icons/mob/screen_gen.dmi'
- layer = HUD_LAYER
plane = HUD_PLANE
animate_movement = SLIDE_STEPS
speech_span = SPAN_ROBOT
@@ -144,12 +143,12 @@
/atom/movable/screen/inventory/MouseEntered(location, control, params)
. = ..()
- add_overlays()
+// add_overlays()
/atom/movable/screen/inventory/MouseExited()
..()
- cut_overlay(object_overlay)
- QDEL_NULL(object_overlay)
+// cut_overlay(object_overlay)
+// QDEL_NULL(object_overlay)
/atom/movable/screen/inventory/update_icon_state()
if(!icon_empty)
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index 90982a00ec..b85a33ec3c 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -294,3 +294,8 @@
description = "I hate when my shoes come untied!\n"
mood_change = -3
timeout = 1 MINUTES
+
+/datum/mood_event/sacrifice_bad
+ description = "Those darn savages!\n"
+ mood_change = -5
+ timeout = 2 MINUTES
diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm
index b73756c2b1..39b3212c68 100644
--- a/code/datums/mood_events/generic_positive_events.dm
+++ b/code/datums/mood_events/generic_positive_events.dm
@@ -205,3 +205,8 @@
/datum/mood_event/cleared_stomach
description = "Feels nice to get that out of the way!\n"
mood_change = 3
+
+/datum/mood_event/sacrifice_good
+ description = "The gods are pleased with this offering!\n"
+ mood_change = 5
+ timeout = 3 MINUTES
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 1c6c444fb4..67ba43dc4f 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -778,6 +778,24 @@ GLOBAL_LIST_EMPTY(possible_items_special)
target_amount = count
update_explanation_text()
*/
+/datum/objective/protect_object
+ name = "protect object"
+ var/obj/protect_target
+
+/datum/objective/protect_object/proc/set_target(obj/O)
+ protect_target = O
+ update_explanation_text()
+
+/datum/objective/protect_object/update_explanation_text()
+ . = ..()
+ if(protect_target)
+ explanation_text = "Protect \the [protect_target] at all costs."
+ else
+ explanation_text = "Free objective."
+
+/datum/objective/protect_object/check_completion()
+ return !QDELETED(protect_target)
+
//Changeling Objectives
/datum/objective/absorb
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 1c6c6686e8..856333139f 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -961,6 +961,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
outline_color = COLOR_THEME_CLOCKWORK //if you want free gbp go fix the fact that clockwork's tooltip css is glass'
if("glass")
outline_color = COLOR_THEME_GLASS
+ if("liteweb")
+ outline_color = COLOR_THEME_LITEWEB
else //this should never happen, hopefully
outline_color = COLOR_WHITE
if(color)
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 5d1ff851ef..c26c3b0e0b 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -1,5 +1,5 @@
//Objects that spawn ghosts in as a certain role when they click on it, i.e. away mission bartenders.
-
+#define spawnOverride TRUE
//Preserved terrarium/seed vault: Spawns in seed vault structures in lavaland. Ghosts become plantpeople and are advised to begin growing plants in the room near them.
/obj/effect/mob_spawn/human/seed_vault
name = "preserved terrarium"
@@ -36,7 +36,44 @@
//Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers.
-/* MOVED TO MODULAR
+/obj/structure/ash_walker_eggshell
+ name = "ash walker egg"
+ desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within. The egg shell looks resistant to temperature but otherwise rather brittle."
+ icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "large_egg"
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | FREEZE_PROOF
+ max_integrity = 80
+ var/obj/effect/mob_spawn/human/ash_walker/egg
+
+/obj/structure/ash_walker_eggshell/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) //lifted from xeno eggs
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(loc, 'sound/effects/attackblob.ogg', 100, TRUE)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, TRUE)
+ if(BURN)
+ if(damage_amount)
+ playsound(loc, 'sound/items/welder.ogg', 100, TRUE)
+
+/obj/structure/ash_walker_eggshell/attack_ghost(mob/user) //Pass on ghost clicks to the mob spawner
+ if(egg)
+ egg.attack_ghost(user)
+ . = ..()
+
+/obj/structure/ash_walker_eggshell/Destroy()
+ if(!egg)
+ return ..()
+ var/mob/living/carbon/human/yolk = new /mob/living/carbon/human/(get_turf(src))
+ yolk.fully_replace_character_name(null,random_unique_lizard_name(gender))
+ yolk.set_species(/datum/species/lizard/ashwalker)
+ yolk.underwear = "Nude"
+ yolk.equipOutfit(/datum/outfit/ashwalker)//this is an authentic mess we're making
+ yolk.update_body()
+ yolk.gib()
+ QDEL_NULL(egg)
+ return ..()
+
/obj/effect/mob_spawn/human/ash_walker
name = "ash walker egg"
desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within."
@@ -55,25 +92,48 @@
You have seen lights in the distance... they foreshadow the arrival of outsiders to your domain. \
Ensure your nest remains protected at all costs."
assignedrole = "Ash Walker"
+ var/datum/team/ashwalkers/team
+ var/obj/structure/ash_walker_eggshell/eggshell
+
+/obj/effect/mob_spawn/human/ash_walker/Destroy()
+ eggshell = null
+ return ..()
+
+/obj/effect/mob_spawn/human/ash_walker/allow_spawn(mob/user, silent = FALSE)
+ if(!(user.key in team.players_spawned) || spawnOverride)//one per person unless you get a bonus spawn
+ return TRUE
+ to_chat(user, span_warning("You have exhausted your usefulness to the Necropolis."))
+ return FALSE
/obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn)
new_spawn.real_name = random_unique_lizard_name(gender)
if(is_mining_level(z))
- to_chat(new_spawn, "Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind.")
+ to_chat(new_spawn, "Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Glory to the Necropolis!")
+ to_chat(new_spawn, "You can expand the weather proof area provided by your shelters by using the 'New Area' key near the bottom right of your HUD.")
+ to_chat(new_spawn, "Dragging injured ashwalkers to the tentacle or using the sleep verb next to it youself causes the body to remade whole after a short delay!")
else
to_chat(new_spawn, "You have been born outside of your natural home! Whether you decide to return home, or make due with your new home is your own decision.")
- if(!ishuman(new_spawn))
- return
- var/mob/living/carbon/human/H = new_spawn
- H.underwear = "Nude"
- H.undershirt = "Nude"
- H.socks = "Nude"
- H.update_body()
+//Ash walkers on birth understand how to make bone bows, bone arrows and ashen arrows
-/obj/effect/mob_spawn/human/ash_walker/Initialize(mapload)
+ if(ishuman(new_spawn))
+ var/mob/living/carbon/human/H = new_spawn
+ H.underwear = "Nude"
+ H.undershirt = "Nude"
+ H.socks = "Nude"
+ H.update_body()
+ new_spawn.mind.add_antag_datum(/datum/antagonist/ashwalker, team)
+ team.players_spawned += (new_spawn.key)
+ eggshell.egg = null
+ QDEL_NULL(eggshell)
+
+/obj/effect/mob_spawn/human/ash_walker/Initialize(mapload, datum/team/ashwalkers/ashteam)
. = ..()
var/area/A = get_area(src)
+ team = ashteam
+ eggshell = new /obj/structure/ash_walker_eggshell(get_turf(loc))
+ eggshell.egg = src
+ src.forceMove(eggshell)
if(A)
notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER, ignore_dnr_observers = TRUE)
@@ -81,7 +141,6 @@
name ="Ashwalker"
head = /obj/item/clothing/head/helmet/gladiator
uniform = /obj/item/clothing/under/costume/gladiator/ash_walker
-*/
//Timeless prisons: Spawns in Wish Granter prisons in lavaland. Ghosts become age-old users of the Wish Granter and are advised to seek repentance for their past.
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 43ef8bf54d..ebc38eb2bf 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -692,7 +692,7 @@
icon_state = "well_3"
return TRUE
else
- to_chat(user, "You need at least tweenty-five pieces of sandstone!")
+ to_chat(user, "You need at least twenty-five pieces of sandstone!")
return
if(steps == 3 && S.tool_behaviour == TOOL_SHOVEL)
S.use_tool(src, user, 80, volume=100)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 2d691149b6..9d92d08385 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -60,6 +60,7 @@ GLOBAL_PROTECT(admin_verbs_admin)
/client/proc/jumptokey, /*allows us to jump to the location of a mob with a certain ckey*/
/client/proc/jumptomob, /*allows us to jump to a specific mob*/
/client/proc/jumptoturf, /*allows us to jump to a specific turf*/
+ /client/proc/admin_end_shift, /*allows us to end the shift properly, also logs it*/
/client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/
/client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcom*/
// /client/proc/admin_disable_shuttle, /*allows us to disable the emergency shuttle admin-wise so that it cannot be called*/
@@ -232,6 +233,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/cmd_admin_headset_message,
/client/proc/cmd_admin_check_contents,
/datum/admins/proc/access_news_network,
+ /client/proc/admin_end_shift,
/client/proc/admin_call_shuttle,
/client/proc/admin_cancel_shuttle,
/client/proc/cmd_admin_direct_narrate,
diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm
index e751f5832d..7e8b12a330 100644
--- a/code/modules/antagonists/_common/antag_datum.dm
+++ b/code/modules/antagonists/_common/antag_datum.dm
@@ -99,7 +99,7 @@ GLOBAL_LIST_EMPTY(antagonists)
SHOULD_CALL_PARENT(TRUE)
if(old_body)
remove_innate_effects(old_body)
- if(!soft_antag && old_body.stat != DEAD && !LAZYLEN(old_body.mind?.antag_datums))
+ if(!soft_antag && old_body && old_body.stat != DEAD && !length(old_body.mind?.antag_datums))
old_body.remove_from_current_living_antags()
apply_innate_effects(new_body)
if(!soft_antag && new_body.stat != DEAD)
diff --git a/code/modules/antagonists/ashwalker/ashwalker.dm b/code/modules/antagonists/ashwalker/ashwalker.dm
new file mode 100644
index 0000000000..0ba84a201f
--- /dev/null
+++ b/code/modules/antagonists/ashwalker/ashwalker.dm
@@ -0,0 +1,40 @@
+/datum/team/ashwalkers
+ name = "Ashwalkers"
+ show_roundend_report = FALSE
+ var/list/players_spawned = new
+
+/datum/antagonist/ashwalker
+ name = "\improper Ash Walker"
+ job_rank = ROLE_LAVALAND
+ show_in_antagpanel = FALSE
+ show_to_ghosts = TRUE
+ antagpanel_category = "Ash Walkers"
+ var/datum/team/ashwalkers/ashie_team
+
+/datum/antagonist/ashwalker/create_team(datum/team/team)
+ if(team)
+ ashie_team = team
+ objectives |= ashie_team.objectives
+ else
+ ashie_team = new
+
+/datum/antagonist/ashwalker/get_team()
+ return ashie_team
+
+/datum/antagonist/ashwalker/on_body_transfer(mob/living/old_body, mob/living/new_body)
+ . = ..()
+ RegisterSignal(new_body, COMSIG_MOB_EXAMINATE, .proc/on_examinate)
+
+/datum/antagonist/ashwalker/on_gain()
+ . = ..()
+ RegisterSignal(owner.current, COMSIG_MOB_EXAMINATE, .proc/on_examinate)
+
+/datum/antagonist/ashwalker/on_removal()
+ . = ..()
+ UnregisterSignal(owner.current, COMSIG_MOB_EXAMINATE)
+
+/datum/antagonist/ashwalker/proc/on_examinate(datum/source, atom/A)
+ SIGNAL_HANDLER
+
+ if(istype(A, /obj/structure/headpike))
+ SEND_SIGNAL(owner.current, COMSIG_ADD_MOOD_EVENT, "headspear", /datum/mood_event/sacrifice_good)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index a2ac5581b9..5d6a70884a 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -33,6 +33,10 @@
var/ghost_usable = TRUE
var/skip_reentry_check = FALSE //Skips the ghost role blacklist time for people who ghost/suicide/cryo
+///override this to add special spawn conditions to a ghost role
+/obj/effect/mob_spawn/proc/allow_spawn(mob/user, silent = FALSE)
+ return TRUE
+
//ATTACK GHOST IGNORING PARENT RETURN VALUE
/obj/effect/mob_spawn/attack_ghost(mob/user, latejoinercalling)
if(!SSticker.HasRoundStarted() || !loc || !ghost_usable)
@@ -43,6 +47,8 @@
if(jobban_isbanned(user, banType))
to_chat(user, "You are jobanned!")
return
+ if(!allow_spawn(user, silent = FALSE))
+ return
if(QDELETED(src) || QDELETED(user))
return
if(isobserver(user))
diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm
index 329520ab85..3a517fac95 100644
--- a/code/modules/integrated_electronics/core/printer.dm
+++ b/code/modules/integrated_electronics/core/printer.dm
@@ -110,6 +110,14 @@
if(!(in_range(src, user) || issilicon(user)))
return
+ var/client/client = user.client
+ if (CONFIG_GET(flag/use_exp_tracking) && client && client.get_exp_living(TRUE) < 480) // Player with less than 8 hours playtime is using this machine.
+ if(client.next_circuit_grief_warning < world.time)
+ var/turf/T = get_turf(src)
+ client.next_circuit_grief_warning = world.time + 15 MINUTES // Wait 15 minutes before alerting admins again
+ message_admins("ANTI-GRIEF: New player [ADMIN_LOOKUPFLW(user)] has touched \a [src] at [ADMIN_VERBOSEJMP(T)].")
+ client.touched_circuit = TRUE
+
if(isnull(current_category))
current_category = SScircuit.circuit_fabricator_recipe_list[1]
diff --git a/code/modules/language/arachnid.dm b/code/modules/language/arachnid.dm
index e68e7a181b..de2de19c74 100644
--- a/code/modules/language/arachnid.dm
+++ b/code/modules/language/arachnid.dm
@@ -5,7 +5,7 @@
speech_verb = "chitter"
ask_verb = "chitter"
exclaim_verb = "chitter"
- key = "r"
+ key = "c"
flags = NO_STUTTER | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD
icon_state = "arachnid"
diff --git a/code/modules/language/dwarven.dm b/code/modules/language/dwarven.dm
index fa8f81244b..20ba4e25b8 100644
--- a/code/modules/language/dwarven.dm
+++ b/code/modules/language/dwarven.dm
@@ -4,7 +4,7 @@
name = "Dwarvish"
desc = "The language of the dwarves"
space_chance = 100 // Each 'syllable' is its own word
- key = "D"
+ key = "w"
flags = TONGUELESS_SPEECH
syllables = list("kulet", "alak", "bidok", "nicol", "anam", "gatal", "mabdug", "zustash", "sedil", "ustos", "emr", "izeg", "beming", "gost", "ntak", "tosid", "feb", "berim", "ibruk", "ermis", "thoth", "thatthil", "gistang", "libash", "lakish", "asdos", "roder", "nel", "biban", "ugog", "ish", "robek", "olmul", "nokzam", "emuth", "fer", "uvel", "dolush", "ag^k", "ucat", "ng rak", "enir", "ugath", "lisig", "etg", "erong", "osed", "lanlar", "udir", "tarmid", "s krith", "nural", "bugsud", "okag", "nazush", "nashon", "ftrid", "en''r", "dstik", "kogan", "ingish", "dudgoth", "stalk*b", "themor", "murak", "altth", "osod", "thcekut", "cog", "selsten", "egdoth", "othsin", "idek", "st", "suthmam", "im", "okab", "onlnl", "gasol", "tegir", "nam...sh", "noval", "shalig", "shin", "lek", ",,kim", "kfkdal", "stum,,m", "alud", "olom", "%lot", "rozsed", "thos", "okon", "nSerrated tendrils carefully pull [prey] to [src], absorbing the body and creating it anew.")
- var/datum/mind/deadmind
- if(prey.key)
- deadmind = prey.mind
+ for(var/mob/living/H in view(src, 1)) //Only for corpse right next to/on same tile
+ if(H.stat)
+ for(var/obj/item/W in H)
+ if(!H.dropItemToGround(W))
+ qdel(W)
+ if(issilicon(H)) //no advantage to sacrificing borgs...
+ H.gib()
+ visible_message(span_notice("Serrated tendrils eagerly pull [H] apart, but find nothing of interest."))
+ return
+
+ if(H.mind?.has_antag_datum(/datum/antagonist/ashwalker) && (H.key || H.get_ghost(FALSE, TRUE))) //special interactions for dead lava lizards with ghosts attached
+ visible_message(span_warning("Serrated tendrils carefully pull [H] to [src], absorbing the body and creating it anew."))
+ var/datum/mind/deadmind
+ if(H.key)
+ deadmind = H
+ else
+ deadmind = H.get_ghost(FALSE, TRUE)
+ to_chat(deadmind, "Your body has been returned to the nest. You are being remade anew, and will awaken shortly. Your memories will remain intact in your new body, as your soul is being salvaged")
+ SEND_SOUND(deadmind, sound('sound/magic/enter_blood.ogg',volume=100))
+ addtimer(CALLBACK(src, .proc/remake_walker, H.mind, H.real_name), 20 SECONDS)
+ new /obj/effect/gibspawner/generic(get_turf(H))
+ qdel(H)
+ return
+
+ if(ismegafauna(H))
+ meat_counter += 20
else
- deadmind = prey.get_ghost(FALSE, TRUE)
- to_chat(deadmind, "Your body has been returned to the nest. You are being remade anew, and will awaken shortly. Your memories will remain intact in your new body, as your soul is being salvaged.")
- SEND_SOUND(deadmind, sound('sound/magic/enter_blood.ogg',volume=100))
- new /obj/effect/gibspawner/generic(get_turf(prey))
- var/oldgender = prey.gender
- var/oldname = prey.real_name
- addtimer(CALLBACK(src, .proc/remake_walker, oldname, oldgender, deadmind), 20 SECONDS)
- qdel(prey)
-
- continue
- playsound(get_turf(src),'sound/magic/demon_consume.ogg', 100, 1)
- if(issilicon(prey)) //no advantage to sacrificing borgs...
- visible_message("Serrated tendrils eagerly pull [prey] apart, but find nothing of interest.")
- prey.gib()
+ meat_counter++
+ visible_message(span_warning("Serrated tendrils eagerly pull [H] to [src], tearing the body apart as its blood seeps over the eggs."))
+ playsound(get_turf(src),'sound/magic/demon_consume.ogg', 100, TRUE)
+ var/deliverykey = H.fingerprintslast //key of whoever brought the body
+ var/mob/living/deliverymob = get_mob_by_key(deliverykey) //mob of said key
+ //there is a 40% chance that the Lava Lizard unlocks their respawn with each sacrifice
+ if(deliverymob && (deliverymob.mind?.has_antag_datum(/datum/antagonist/ashwalker)) && (deliverykey in ashies.players_spawned) && (prob(40)))
+ to_chat(deliverymob, span_warning("The Necropolis is pleased with your sacrifice. You feel confident your existence after death is secure."))
+ ashies.players_spawned -= deliverykey
+ H.gib()
obj_integrity = min(obj_integrity + max_integrity*0.05,max_integrity)//restores 5% hp of tendril
- continue
- visible_message("Serrated tendrils eagerly pull [prey] to [src], tearing the body apart as its blood seeps over the eggs.")
+ for(var/mob/living/L in view(src, 5))
+ if(L.mind?.has_antag_datum(/datum/antagonist/ashwalker))
+ SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "headspear", /datum/mood_event/sacrifice_good)
+ else
+ SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "headspear", /datum/mood_event/sacrifice_bad)
- if(ismegafauna(prey))
- meat_counter += 20
- else
- meat_counter++
- prey.gib()
- obj_integrity = min(obj_integrity + max_integrity*0.05,max_integrity)//restores 5% hp of tendril
+/obj/structure/lavaland/ash_walker/proc/remake_walker(datum/mind/oldmind, oldname)
+ var/mob/living/carbon/human/M = new /mob/living/carbon/human(get_step(loc, pick(GLOB.alldirs)))
+ M.set_species(/datum/species/lizard/ashwalker)
+ M.real_name = oldname
+ M.underwear = "Nude"
+ M.undershirt = "Nude"
+ M.socks = "Nude"
+ M.update_body()
+ M.remove_language(/datum/language/common)
+ oldmind.transfer_to(M)
+ M.mind.grab_ghost()
+ to_chat(M, "You have been pulled back from beyond the grave, with a new body and renewed purpose. Glory to the Necropolis!")
+ playsound(get_turf(M),'sound/magic/exit_blood.ogg', 100, TRUE)
/obj/structure/lavaland/ash_walker/proc/spawn_mob()
- if(meat_counter < ASH_WALKER_SPAWN_THRESHOLD)
- return
- new spawned_obj(get_step(loc, pick(GLOB.alldirs)), ashies, linked_objective)
- visible_message("One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!")
- meat_counter -= ASH_WALKER_SPAWN_THRESHOLD
+ if(meat_counter >= ASH_WALKER_SPAWN_THRESHOLD)
+ new /obj/effect/mob_spawn/human/ash_walker(get_step(loc, pick(GLOB.alldirs)), ashies)
+ visible_message("One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!")
+ meat_counter -= ASH_WALKER_SPAWN_THRESHOLD
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index d9d25ba3c0..0ea6e60a61 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -27,6 +27,7 @@
/datum/language/dwarf,
/datum/language/signlanguage,
/datum/language/neokanji,
+ /datum/language/sylvan,
/datum/language/machine, //Skyrat change - adds machine language
/datum/language/modular_sand/calcic, //Skyrat change - plasmaman language
/datum/language/modular_sand/dunmeri, //Skyrat change - dunmer language
diff --git a/html/changelog.html b/html/changelog.html
index cd8f7ca168..e09db92eca 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,93 @@
-->
+
04 February 2022
+
SakuraOran updated:
+
+ - Ashwalkers can now heal, even from death, by being incapacitated (asleep/dead) near the tendril
+ - Added the ability for antags to have the "protect object" objective, which the ashwalkers now have to protect the tendril. This is determined by if the object is broken or not, and can be set to any object or structure that can reasonably be destroyed
+ - Ashwalkers get one life, and have a 40% chance to earn an additional life when they sacrifice to the tendril.
+ - fixed mobs not dropping guaranteed_butcher_results when gibbed
+
+
+
03 February 2022
+
BlueWildrose updated:
+
+ - Sylvan should actually be speakable for those who have taken that language as roundstart now, and for plantpeople who naturally start with it.
+ - The langauge Neo-kanji's shortcut was overlapping with the slime language, and has been relocated from k to j.
+ - The langauge Dwarvish's shortcut was potentially overlapping with drones, and has been relocated from D to w.
+ - The language Rachnidian's shortcut was getting in the way of the Ratvarian language, so it's been moved from r to c.
+
+
Crowbar764 updated:
+
+ - antag consent HUD added to admin HUD
+ - new 'collection tool' to teleport crew to the slaver shuttle, removing the need to drag them through space
+ - supply shop changes
+ - other misc slaver changes
+ - Another admin grief tool
+
+
Uso15 updated:
+
+ - Dullahans now talk through their Heads and _not_ their necks
+
+
+
02 February 2022
+
SandPoot updated:
+
+ - The Oilskin Duster is now visible.
+
+
SpiWat updated:
+
+
+
01 February 2022
+
BongaTheProto updated:
+
+ - Makes tails able to wag again
+
+
Crowbar764 updated:
+
+ - More buyable gear for slavers
+ - Patches a few problems
+ - improves slaver hideout
+ - improves slaver shuttle
+
+
+
31 January 2022
+
BongaTheProto updated:
+
+ - Hilbert's hotel atmos system shouldn't runtime anymore
+
+
SandPoot updated:
+
+ - Admins have a special shiny button to end the round ic.
+ - No longer calling CHECK_TICKs for no reason.
+ - If reveal everything is false, ghosts can no longer speak to the living when the round ends.
+ - Added an outline color theme for liteweb. (used when you don't pick a color)
+ - You can once again see your previews for picking target bodyparts on your hud.
+ - Stuff on your other ear is no longer fire-proof.
+ - Your items no longer go invisble if you cycle through hud modes or reconnect into the game.
+
+
SandPoot and The Last Hosea2 updated:
+
+ - Added new clothing items including hats, some shoes and a duster! They're available on the loadout and vendors.
+ - Deletes file duplicates that were in the wrong place.
+
+
+
30 January 2022
+
BongaTheProto updated:
+
+ - added urethral penetration interactions
+
+
radar651 updated:
+
+ - Adds in Weapon Permits, they even fit to your jumpsuit.
+ - Heads of Staff, Minus the Captain and HOS, spawn with a weapon permit. The Bartender also spawns with one
+ - Captain, HOS and HOP spawn with a case of 20 weapon permits for distribution.
+ - added in permit, compermit and barpermit
+
+
29 January 2022
Arturlang updated:
@@ -733,85 +820,6 @@
- Ports kink gear from skyrat
- Ports the hypno goggles. This is NOT an alternative to brainwashing surgery or the interrogation chamber.
-
-
03 December 2021
-
BongaTheProto updated:
-
- - kinky clothes
- - Mesmetron
- - some items I forgor
- - stripper poles (idk where to put them yet)
- - fixed the icons null forgot to add
-
-
NullFag updated:
-
- - lavaland stuff idk
- - random shitty urinals
- - footwraps
- - jackboots/toeless
- - jackboots/tall
- - workboots/toeless
- - tunic
- - a couple latex suits
- - sexynursesuit
- - lumberjack suit
-
-
TripleShades updated:
-
- - (Pubby) Holopad to surgery viewing area
-
-
-
02 December 2021
-
DeltaFire15 updated:
-
- - Synthetics gained quasi-immunity to most chemicals, excluding some core medical chems and a few specific disruptive ones.
- - Health analyzer, ChemMaster and chemical analyzer interactions with the chemical processing flag system.
- - System Cleaner should now always update health as opposed to before.
- - system cleaner is now twice as effective.
-
-
-
01 December 2021
-
BongaTheProto updated:
-
- - lipsticks in loadout
- - nail polish
- - deer tail
- - you can now select a partner's genital to cum into
-
-
DeltaFire15 updated:
-
- - Pellets now care about block woundwise
- - Pellet wound-bonus no longer stacks for the final calculation
- - Embeds no longer bypass full blocking.
- - Shields now work properly against unarmed / mob attacks.
-
-
-
28 November 2021
-
SandPoot updated:
-
- - Legless sprite for it
-
-
TripleShades updated:
-
- - (Meta) Adds meters to the refill/scrubber station outside Engineering
- - (Meta) Adds a small light fixture to southeast solar access
- - (Meta) Places an intercom to southeast solar access
- - (Meta) Gives a cautery to Robotics
- - (Meta) Camera to Incinerator
- - (Meta) Linen bin to dorms
- - (Box) Camera to Incinerator
- - (Box) Painting mounts to Library
- - (Pubby) Painting mounts to Library
- - (Meta) Removes the example tanks from the Atmospherics gas chambers tweak: (Box) Moves the Bar camera from out behind the soda dispenser tweak: (Box) Gives dorm room 6 a double bed to start tweak: (Pubby) Moves linen bin in washroom to a table tweak: (Delta) Moves the plant in Medbay's Storage to not be in front of a vendor tweak: (Delta) Moves the gas miners and labels inside the Atmoshperics gas chambers to the centers
- - (Box) Made the upper Execution Chamber airlock unable to be used by the AI
- - (Box) Moves prison cell 4 and 6's shutter button to the wall
-
-
keronshb updated:
-
- - FestiveMap
- - Specific Truck and Ambulance vector cars
- - Radials for those cars
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index a54ae1b19e..bba2e95ebc 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -31600,3 +31600,74 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Added Holocollars, spiked collars, handmade collars, and casino collars,
also in kinkmates and other vendors!
- imageadd: New avian character customization sprites for birbs (yay)
+2022-01-30:
+ BongaTheProto:
+ - rscadd: added urethral penetration interactions
+ radar651:
+ - rscadd: Adds in Weapon Permits, they even fit to your jumpsuit.
+ - rscadd: Heads of Staff, Minus the Captain and HOS, spawn with a weapon permit.
+ The Bartender also spawns with one
+ - rscadd: Captain, HOS and HOP spawn with a case of 20 weapon permits for distribution.
+ - imageadd: added in permit, compermit and barpermit
+2022-01-31:
+ BongaTheProto:
+ - bugfix: Hilbert's hotel atmos system shouldn't runtime anymore
+ SandPoot:
+ - rscadd: Admins have a special shiny button to end the round ic.
+ - bugfix: No longer calling CHECK_TICKs for no reason.
+ - config: If reveal everything is false, ghosts can no longer speak to the living
+ when the round ends.
+ - rscadd: Added an outline color theme for liteweb. (used when you don't pick a
+ color)
+ - bugfix: You can once again see your previews for picking target bodyparts on your
+ hud.
+ - bugfix: Stuff on your other ear is no longer fire-proof.
+ - bugfix: Your items no longer go invisble if you cycle through hud modes or reconnect
+ into the game.
+ SandPoot and The Last Hosea2:
+ - rscadd: Added new clothing items including hats, some shoes and a duster! They're
+ available on the loadout and vendors.
+ - rscdel: Deletes file duplicates that were in the wrong place.
+2022-02-01:
+ BongaTheProto:
+ - bugfix: Makes tails able to wag again
+ Crowbar764:
+ - rscadd: More buyable gear for slavers
+ - bugfix: Patches a few problems
+ - tweak: improves slaver hideout
+ - tweak: improves slaver shuttle
+2022-02-02:
+ SandPoot:
+ - bugfix: The Oilskin Duster is now visible.
+ SpiWat:
+ - spellcheck: tweenty --> twenty
+2022-02-03:
+ BlueWildrose:
+ - bugfix: Sylvan should actually be speakable for those who have taken that language
+ as roundstart now, and for plantpeople who naturally start with it.
+ - bugfix: The langauge Neo-kanji's shortcut was overlapping with the slime language,
+ and has been relocated from k to j.
+ - bugfix: The langauge Dwarvish's shortcut was potentially overlapping with drones,
+ and has been relocated from D to w.
+ - bugfix: The language Rachnidian's shortcut was getting in the way of the Ratvarian
+ language, so it's been moved from r to c.
+ Crowbar764:
+ - rscadd: antag consent HUD added to admin HUD
+ - rscadd: new 'collection tool' to teleport crew to the slaver shuttle, removing
+ the need to drag them through space
+ - rscadd: supply shop changes
+ - tweak: other misc slaver changes
+ - rscadd: Another admin grief tool
+ Uso15:
+ - bugfix: Dullahans now talk through their Heads and _not_ their necks
+2022-02-04:
+ SakuraOran:
+ - rscadd: Ashwalkers can now heal, even from death, by being incapacitated (asleep/dead)
+ near the tendril
+ - rscadd: Added the ability for antags to have the "protect object" objective, which
+ the ashwalkers now have to protect the tendril. This is determined by if the
+ object is broken or not, and can be set to any object or structure that can
+ reasonably be destroyed
+ - balance: Ashwalkers get one life, and have a 40% chance to earn an additional
+ life when they sacrifice to the tendril.
+ - bugfix: fixed mobs not dropping guaranteed_butcher_results when gibbed
diff --git a/html/changelogs/AutoChangeLog-pr-155.yml b/html/changelogs/AutoChangeLog-pr-155.yml
deleted file mode 100644
index 8d9ec4326d..0000000000
--- a/html/changelogs/AutoChangeLog-pr-155.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: radar651
-delete-after: true
-changes:
- - rscadd: Adds in Weapon Permits, they even fit to your jumpsuit.
- - rscadd: Heads of Staff, Minus the Captain and HOS, spawn with a weapon permit.
- The Bartender also spawns with one
- - rscadd: Captain, HOS and HOP spawn with a case of 20 weapon permits for distribution.
- - imageadd: added in permit, compermit and barpermit
diff --git a/html/changelogs/AutoChangeLog-pr-159.yml b/html/changelogs/AutoChangeLog-pr-159.yml
deleted file mode 100644
index a83f75f2cb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-159.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: BongaTheProto
-delete-after: true
-changes:
- - rscadd: added urethral penetration interactions
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
index d04b4b4c84..43018f4b8c 100644
Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 9f9488e48d..f2c7b398cf 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -572,3 +572,10 @@
path = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/spacehoodie
ckeywhitelist = list("bidlink2")
+
+/datum/gear/donator/pokerchips
+ name = "pokerchip set"
+ slot = SLOT_IN_BACKPACK
+ path = /obj/item/storage/box/pockerchips
+ ckeywhitelist = list("greed2323")
+
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index ae06672098..cb1b9728af 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -627,3 +627,49 @@
icon = 'icons/obj/custom.dmi'
mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi'
mutantrace_variation = NONE
+
+/obj/item/coin/red
+ name = "red pokerchip"
+ desc = "A red pokerchip."
+ icon_state = "c_red"
+ item_state = "c_red"
+ icon = 'icons/obj/custom.dmi'
+
+/obj/item/coin/blue
+ name = "blue pokerchip"
+ desc = "A blue pokerchip."
+ icon_state = "c_nlue"
+ item_state = "c_blue"
+ icon = 'icons/obj/custom.dmi'
+
+/obj/item/coin/green
+ name = "green pokerchip"
+ desc = "A green pokerchip."
+ icon_state = "c_green"
+ item_state = "c_green"
+ icon = 'icons/obj/custom.dmi'
+
+/obj/item/coin/black
+ name = "black pokerchip"
+ desc = "A black pokerchip."
+ icon_state = "c_black"
+ item_state = "c_black"
+ icon = 'icons/obj/custom.dmi'
+
+/obj/item/storage/box/pockerchips
+ name = "tray of pocker chips"
+ desc = "A tray of green, red, blue, and black pocker chips."
+ icon_state = "c_holder"
+ icon = 'icons/obj/custom.dmi'
+ illustration=null
+
+/obj/item/storage/box/pokerchips/PopulateContents()
+ for(var/i in 1 to 5)
+ new /obj/item/coin/red(src)
+ for(var/i in 1 to 10)
+ new /obj/item/coin/blue(src)
+ for(var/i in 1 to 15)
+ new /obj/item/coin/black(src)
+ for(var/i in 1 to 20)
+ new /obj/item/coin/green(src)
+
diff --git a/modular_citadel/interface/skin.dmf b/modular_citadel/interface/skin.dmf
deleted file mode 100644
index 84296cbb67..0000000000
--- a/modular_citadel/interface/skin.dmf
+++ /dev/null
@@ -1,319 +0,0 @@
-macro "default"
-
-
-menu "menu"
- elem
- name = "&File"
- command = ""
- saved-params = "is-checked"
- elem
- name = "&Quick screenshot\tF2"
- command = ".screenshot auto"
- category = "&File"
- saved-params = "is-checked"
- elem
- name = "&Save screenshot as...\tShift+F2"
- command = ".screenshot"
- category = "&File"
- saved-params = "is-checked"
- elem
- name = ""
- command = ""
- category = "&File"
- saved-params = "is-checked"
- elem "reconnectbutton"
- name = "&Reconnect"
- command = ".reconnect"
- category = "&File"
- saved-params = "is-checked"
- elem
- name = "&Quit\tAlt-F4"
- command = ".quit"
- category = "&File"
- saved-params = "is-checked"
- elem
- name = "&Help"
- command = ""
- saved-params = "is-checked"
- elem
- name = "&Admin Help\tF1"
- command = "adminhelp"
- category = "&Help"
- saved-params = "is-checked"
- elem
- name = "&Hotkeys"
- command = "hotkeys-help"
- category = "&Help"
- saved-params = "is-checked"
-
-
-window "mainwindow"
- elem "mainwindow"
- type = MAIN
- pos = 0,0
- size = 640x440
- anchor1 = none
- anchor2 = none
- background-color = #242424
- is-default = true
- saved-params = "pos;size;is-minimized;is-maximized"
- icon = 'icons\\ss13_64.png'
- macro = "default"
- menu = "menu"
- elem "split"
- type = CHILD
- pos = 0,0
- size = 637x440
- anchor1 = 0,0
- anchor2 = 100,100
- background-color = #272727
- saved-params = "splitter"
- left = "mapwindow"
- right = "infowindow"
- is-vert = true
- splitter = 75
- elem "asset_cache_browser"
- type = BROWSER
- pos = 0,0
- size = 200x200
- anchor1 = none
- anchor2 = none
- background-color = #272727
- is-visible = false
- saved-params = ""
- elem "tooltip"
- type = BROWSER
- pos = 0,0
- size = 999x999
- anchor1 = none
- anchor2 = none
- background-color = #272727
- is-visible = false
- saved-params = ""
-
-window "mapwindow"
- elem "mapwindow"
- type = MAIN
- pos = 418,0
- size = 1024x1024
- anchor1 = none
- anchor2 = none
- background-color = none
- saved-params = "pos;size;is-minimized;is-maximized"
- statusbar = false
- is-pane = true
- outer-size = 684x617
- inner-size = 662x561
- elem "map"
- type = MAP
- pos = 0,0
- size = 1024x1024
- anchor1 = 0,0
- anchor2 = 100,100
- font-family = "Arial"
- font-size = 7
- is-default = true
- saved-params = "icon-size"
- zoom-mode = distort
- style = ".center { text-align: center; }\n.maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; }\n.command_headset { font-weight: bold;\tfont-size: 8px; } .small { font-size: 6px; }\n.big { font-size: 8px; }\n.reallybig { font-size: 8px; }\n.extremelybig { font-size: 8px; }\n.greentext { color: #00ff00; font-size: 7px; }\n.redtext { color: #ff0000; font-size: 7px; }\n.clown { color: #ff69bf; font-size: 7px; font-weight: bold; }\n.his_grace { color: #15d512; }\n.hypnophrase { color: #0d0d0d; font-weight: bold; }\n.yell { font-weight: bold; }\n.italics { font-size: 6px; }"
-
-window "infowindow"
- elem "infowindow"
- type = MAIN
- pos = 0,0
- size = 640x480
- anchor1 = none
- anchor2 = none
- background-color = #242424
- saved-params = "pos;size;is-minimized;is-maximized"
- is-pane = true
- elem "info"
- type = CHILD
- pos = 0,30
- size = 640x445
- anchor1 = 0,0
- anchor2 = 100,100
- background-color = #272727
- saved-params = "splitter"
- left = "statwindow"
- right = "outputwindow"
- is-vert = false
- elem "changelog"
- type = BUTTON
- pos = 16,5
- size = 104x20
- anchor1 = 3,0
- anchor2 = 19,0
- text-color = #e0e0e0
- background-color = #40628a
- saved-params = "is-checked"
- text = "Changelog"
- command = "changelog"
- elem "rules"
- type = BUTTON
- pos = 120,5
- size = 100x20
- anchor1 = 19,0
- anchor2 = 34,0
- text-color = #e0e0e0
- background-color = #40628a
- saved-params = "is-checked"
- text = "Rules"
- command = "rules"
- elem "wiki"
- type = BUTTON
- pos = 220,5
- size = 100x20
- anchor1 = 34,0
- anchor2 = 50,0
- text-color = #e0e0e0
- background-color = #40628a
- saved-params = "is-checked"
- text = "Wiki"
- command = "wiki"
- elem "discord"
- type = BUTTON
- pos = 320,5
- size = 100x20
- anchor1 = 50,0
- anchor2 = 66,0
- text-color = #e0e0e0
- background-color = #40628a
- saved-params = "is-checked"
- text = "Discord"
- command = "discord"
- elem "github"
- type = BUTTON
- pos = 420,5
- size = 100x20
- anchor1 = 66,0
- anchor2 = 81,0
- text-color = #e0e0e0
- background-color = #40628a
- saved-params = "is-checked"
- text = "GitHub"
- command = "github"
- elem "report-issue"
- type = BUTTON
- pos = 520,5
- size = 100x20
- anchor1 = 81,0
- anchor2 = 97,0
- font-size = 8
- text-color = #e0e0e0
- background-color = #a92c2c
- saved-params = "is-checked"
- text = "Report Issue"
- command = "report-issue"
-
-window "outputwindow"
- elem "outputwindow"
- type = MAIN
- pos = 0,0
- size = 640x480
- anchor1 = none
- anchor2 = none
- background-color = #272727
- saved-params = "pos;size;is-minimized;is-maximized"
- titlebar = false
- statusbar = false
- can-close = false
- can-minimize = false
- can-resize = false
- is-pane = true
- elem "input"
- type = INPUT
- pos = 2,460
- size = 595x20
- anchor1 = 0,100
- anchor2 = 100,100
- background-color = #d3b5b5
- is-default = true
- border = sunken
- saved-params = "command"
- elem "say"
- type = BUTTON
- pos = 600,460
- size = 37x20
- anchor1 = 100,100
- anchor2 = none
- text-color = #e0e0e0
- background-color = #272727
- saved-params = "is-checked"
- text = "Chat"
- command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\""
- is-flat = true
- button-type = pushbox
- elem "browseroutput"
- type = BROWSER
- pos = 0,0
- size = 640x456
- anchor1 = 0,0
- anchor2 = 100,100
- background-color = #272727
- is-visible = false
- is-disabled = true
- saved-params = ""
- auto-format = false
- elem "output"
- type = OUTPUT
- pos = 0,0
- size = 640x456
- anchor1 = 0,0
- anchor2 = 100,100
- text-color = #e0e0e0
- background-color = #272727
- is-default = true
- saved-params = ""
-
-window "statwindow"
- elem "statwindow"
- type = MAIN
- pos = 281,0
- size = 640x480
- anchor1 = none
- anchor2 = none
- background-color = #242424
- saved-params = "pos;size;is-minimized;is-maximized"
- is-pane = true
- elem "stat"
- type = INFO
- pos = 0,0
- size = 640x480
- anchor1 = 0,0
- anchor2 = 100,100
- text-color = #e0e0e0
- background-color = #272727
- is-default = true
- saved-params = ""
- tab-text-color = #e0e0e0
- tab-background-color = #242424
- prefix-color = #e0e0e0
- suffix-color = #e0e0e0
-
-window "preferences_window"
- elem "preferences_window"
- type = MAIN
- pos = 372,0
- size = 1280x1000
- anchor1 = none
- anchor2 = none
- is-visible = false
- saved-params = "pos;size;is-minimized;is-maximized"
- statusbar = false
- elem "preferences_browser"
- type = BROWSER
- pos = 0,0
- size = 960x1000
- anchor1 = 0,0
- anchor2 = 75,100
- saved-params = ""
- elem "character_preview_map"
- type = MAP
- pos = 960,0
- size = 320x1000
- anchor1 = 75,0
- anchor2 = 100,100
- right-click = true
- saved-params = "zoom;letterbox;zoom-mode"
-
diff --git a/modular_sand/code/modules/admin/verbs/randomverbs.dm b/modular_sand/code/modules/admin/verbs/randomverbs.dm
new file mode 100644
index 0000000000..5bb62c4415
--- /dev/null
+++ b/modular_sand/code/modules/admin/verbs/randomverbs.dm
@@ -0,0 +1,20 @@
+/client/proc/admin_end_shift()
+ set category = "Admin.Events"
+ set name = "End shift"
+ set desc = "Calls the shuttle as if a roundend vote passed."
+
+ if(EMERGENCY_AT_LEAST_DOCKED)
+ return
+
+ if(!check_rights(R_ADMIN))
+ return
+
+ var/confirm = alert(src, "End the shift?", "Confirm", "Yes", "No")
+ if(confirm != "Yes")
+ return
+
+ SSshuttle.autoEnd()
+ SSblackbox.record_feedback("tally", "admin_verb", 1, "End Shift") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ log_admin("[key_name(usr)] ended the shift.")
+ message_admins("[key_name_admin(usr)] ended the shift.")
+ return
diff --git a/modular_sand/code/modules/client/loadout/_security.dm b/modular_sand/code/modules/client/loadout/_security.dm
new file mode 100644
index 0000000000..be2d6399aa
--- /dev/null
+++ b/modular_sand/code/modules/client/loadout/_security.dm
@@ -0,0 +1,48 @@
+/datum/gear/head/brodie
+ name = "Brodie"
+ subcategory = LOADOUT_SUBCATEGORY_HEAD_JOBS
+ description = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet."
+ path = /obj/item/clothing/head/helmet/brodie
+ restricted_roles = list("Security Officer", "Warden", "Head of Security")
+
+/datum/gear/head/brodie/medic
+ name = "Medical Brodie"
+ description = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has a cross indicating the wearer is a doctor."
+ path = /obj/item/clothing/head/helmet/brodie/medic
+
+/datum/gear/head/brodie/irish
+ name = "Irish Brodie"
+ description = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has a cross indicating the wearer is an Irishman."
+ path = /obj/item/clothing/head/helmet/brodie/irish
+
+/datum/gear/head/brodie/nettan
+ name = "Netted Brodie"
+ description = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has netting over it."
+ path = /obj/item/clothing/head/helmet/brodie/nettan
+
+/datum/gear/head/brodie/nettanf
+ name = "Brodie with a net and leaves"
+ description = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has netting and leaves over it."
+ path = /obj/item/clothing/head/helmet/brodie/nettanf
+
+/datum/gear/head/brodie/netgreen
+ name = "Green netted Brodie"
+ description = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has green netting over it."
+ path = /obj/item/clothing/head/helmet/brodie/netgreen
+
+/datum/gear/head/brodie/netgreenf
+ name = "Green netted Brodie with leaves"
+ description = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has green netting and leaves over it."
+ path = /obj/item/clothing/head/helmet/brodie/netgreenf
+
+/datum/gear/shoes/puttee
+ name = "Puttee Boots"
+ description = "A World War 1 era set of wool british puttees wrapped over the leg and boots."
+ path = /obj/item/clothing/shoes/jackboots/puttee
+ restricted_roles = list("Security Officer", "Warden", "Head of Security")
diff --git a/modular_sand/code/modules/client/loadout/head.dm b/modular_sand/code/modules/client/loadout/head.dm
new file mode 100644
index 0000000000..7ab2dda314
--- /dev/null
+++ b/modular_sand/code/modules/client/loadout/head.dm
@@ -0,0 +1,14 @@
+/datum/gear/head/slouch
+ name = "Slouch hat"
+ description = "An Australian Military slouch hat with one side turned up... Smells faintly of Kangaroos."
+ path = /obj/item/clothing/head/slouch_hat
+
+/datum/gear/head/lawdog
+ name = "Law dog"
+ description = "Hat of the old west law bringers like bass reeves and wyatt erp."
+ path = /obj/item/clothing/head/lawdog
+
+/datum/gear/head/gunfighter
+ name = "Gun fighter"
+ description = "One hell of a bastard wears this hat upon their head... with its hat band made out of bullet casings folks can tell you mean business."
+ path = /obj/item/clothing/head/gunfighter
diff --git a/modular_sand/code/modules/client/loadout/suit.dm b/modular_sand/code/modules/client/loadout/suit.dm
new file mode 100644
index 0000000000..be93382e3f
--- /dev/null
+++ b/modular_sand/code/modules/client/loadout/suit.dm
@@ -0,0 +1,5 @@
+/datum/gear/suit/duster
+ name = "Oilskin duster"
+ subcategory = LOADOUT_SUBCATEGORY_SUIT_COATS
+ description = "A Long Duster coat with the iconic shoulder cape, Commonly used for rainy days and dusty dry days by cowboys."
+ path = /obj/item/clothing/suit/jacket/duster
diff --git a/modular_sand/code/modules/clothing/head/helmet.dm b/modular_sand/code/modules/clothing/head/helmet.dm
new file mode 100644
index 0000000000..a6c7230bfe
--- /dev/null
+++ b/modular_sand/code/modules/clothing/head/helmet.dm
@@ -0,0 +1,51 @@
+/obj/item/clothing/head/helmet/brodie
+ name = "Brodie"
+ desc = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet."
+ icon = 'modular_sand/icons/obj/clothing/hats.dmi'
+ icon_state = "brodie"
+ item_state = "brodie"
+ mob_overlay_icon = 'modular_sand/icons/mob/clothing/head.dmi'
+ mutantrace_variation = STYLE_NO_ANTHRO_ICON
+ flags_cover = null // Doesn't cover eyes.
+
+/obj/item/clothing/head/helmet/brodie/medic
+ name = "Medical Brodie"
+ desc = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has a cross indicating the wearer is a doctor."
+ icon_state = "brodie_medic"
+ item_state = "brodie_medic"
+
+/obj/item/clothing/head/helmet/brodie/irish
+ name = "Irish Brodie"
+ desc = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has a cross indicating the wearer is an Irishman."
+ icon_state = "brodie_irish"
+ item_state = "brodie_irish"
+
+/obj/item/clothing/head/helmet/brodie/nettan
+ name = "Netted Brodie"
+ desc = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has netting over it."
+ icon_state = "brodie_nettan"
+ item_state = "brodie_nettan"
+
+/obj/item/clothing/head/helmet/brodie/nettanf
+ name = "Brodie with a net and leaves"
+ desc = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has netting and leaves over it."
+ icon_state = "brodie_nettanf"
+ item_state = "brodie_nettanf"
+
+/obj/item/clothing/head/helmet/brodie/netgreen
+ name = "Green netted Brodie"
+ desc = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has green netting over it."
+ icon_state = "brodie_netgreen"
+ item_state = "brodie_netgreen"
+
+/obj/item/clothing/head/helmet/brodie/netgreenf
+ name = "Green netted Brodie with leaves"
+ desc = "The Brodie helmet is a steel combat helmet also known as the battle bowler. A World War 1 and 2 era British and commonwealth helmet\n\
+ This one has green netting and leaves over it."
+ icon_state = "brodie_netgreenf"
+ item_state = "brodie_netgreenf"
diff --git a/modular_sand/code/modules/clothing/head/misc.dm b/modular_sand/code/modules/clothing/head/misc.dm
index 8d93981414..4b011f3e53 100644
--- a/modular_sand/code/modules/clothing/head/misc.dm
+++ b/modular_sand/code/modules/clothing/head/misc.dm
@@ -1,51 +1,26 @@
-/obj/item/clothing/head/goatpelt
- name = "goat pelt hat"
- desc = "Fuzzy and Warm!"
+/obj/item/clothing/head/slouch_hat
+ name = "Slouch hat"
+ desc = "An Australian Military slouch hat with one side turned up... Smells faintly of Kangaroos."
icon = 'modular_sand/icons/obj/clothing/hats.dmi'
- icon_state = "goatpelt"
+ icon_state = "slouch"
+ item_state = "slouch"
mob_overlay_icon = 'modular_sand/icons/mob/clothing/head.dmi'
mutantrace_variation = STYLE_NO_ANTHRO_ICON
- item_state = "goatpelt"
-/obj/item/clothing/head/goatpelt/king
- name = "king goat pelt hat"
- desc = "Fuzzy, Warm and Robust!"
- icon_state = "goatpelt"
- item_state = "goatpelt"
- color = "#ffd700"
- body_parts_covered = HEAD
- armor = list("melee" = 60, "bullet" = 55, "laser" = 55, "energy" = 45, "bomb" = 100, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100)
- dog_fashion = null
- resistance_flags = FIRE_PROOF
-
-/obj/item/clothing/head/goatpelt/king/equipped(mob/living/carbon/human/user, slot)
- ..()
- if (slot == ITEM_SLOT_HEAD)
- user.faction |= "goat"
-
-/obj/item/clothing/head/goatpelt/king/dropped(mob/living/carbon/human/user)
- if (user.head == src)
- user.faction -= "goat"
- ..()
-
-/obj/item/clothing/head/goatpope
- name = "goat pope hat"
- desc = "And on the seventh day King Goat said there will be cabbage!"
- mob_overlay_icon = 'modular_sand/icons/mob/large-worn-icons/64x64/head.dmi'
- mutantrace_variation = STYLE_NO_ANTHRO_ICON
+/obj/item/clothing/head/lawdog
+ name = "Law dog"
+ desc = "Hat of the old west law bringers like bass reeves and wyatt erp."
icon = 'modular_sand/icons/obj/clothing/hats.dmi'
- icon_state = "goatpope"
- item_state = "goatpope"
- worn_x_dimension = 64
- worn_y_dimension = 64
- resistance_flags = FLAMMABLE
+ icon_state = "lawdog"
+ item_state = "lawdog"
+ mob_overlay_icon = 'modular_sand/icons/mob/clothing/head.dmi'
+ mutantrace_variation = STYLE_NO_ANTHRO_ICON
-/obj/item/clothing/head/goatpope/equipped(mob/living/carbon/human/user, slot)
- ..()
- if (slot == ITEM_SLOT_HEAD)
- user.faction |= "goat"
-
-/obj/item/clothing/head/goatpope/dropped(mob/living/carbon/human/user, slot)
- if (user.head == src)
- user.faction -= "goat"
- ..()
+/obj/item/clothing/head/gunfighter
+ name = "Gun fighter"
+ desc = "One hell of a bastard wears this hat upon their head... with its hat band made out of bullet casings folks can tell you mean business."
+ icon = 'modular_sand/icons/obj/clothing/hats.dmi'
+ icon_state = "gunfighter"
+ item_state = "gunfighter"
+ mob_overlay_icon = 'modular_sand/icons/mob/clothing/head.dmi'
+ mutantrace_variation = STYLE_NO_ANTHRO_ICON
diff --git a/modular_sand/code/modules/clothing/head/misc_special.dm b/modular_sand/code/modules/clothing/head/misc_special.dm
new file mode 100644
index 0000000000..8d93981414
--- /dev/null
+++ b/modular_sand/code/modules/clothing/head/misc_special.dm
@@ -0,0 +1,51 @@
+/obj/item/clothing/head/goatpelt
+ name = "goat pelt hat"
+ desc = "Fuzzy and Warm!"
+ icon = 'modular_sand/icons/obj/clothing/hats.dmi'
+ icon_state = "goatpelt"
+ mob_overlay_icon = 'modular_sand/icons/mob/clothing/head.dmi'
+ mutantrace_variation = STYLE_NO_ANTHRO_ICON
+ item_state = "goatpelt"
+
+/obj/item/clothing/head/goatpelt/king
+ name = "king goat pelt hat"
+ desc = "Fuzzy, Warm and Robust!"
+ icon_state = "goatpelt"
+ item_state = "goatpelt"
+ color = "#ffd700"
+ body_parts_covered = HEAD
+ armor = list("melee" = 60, "bullet" = 55, "laser" = 55, "energy" = 45, "bomb" = 100, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100)
+ dog_fashion = null
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/head/goatpelt/king/equipped(mob/living/carbon/human/user, slot)
+ ..()
+ if (slot == ITEM_SLOT_HEAD)
+ user.faction |= "goat"
+
+/obj/item/clothing/head/goatpelt/king/dropped(mob/living/carbon/human/user)
+ if (user.head == src)
+ user.faction -= "goat"
+ ..()
+
+/obj/item/clothing/head/goatpope
+ name = "goat pope hat"
+ desc = "And on the seventh day King Goat said there will be cabbage!"
+ mob_overlay_icon = 'modular_sand/icons/mob/large-worn-icons/64x64/head.dmi'
+ mutantrace_variation = STYLE_NO_ANTHRO_ICON
+ icon = 'modular_sand/icons/obj/clothing/hats.dmi'
+ icon_state = "goatpope"
+ item_state = "goatpope"
+ worn_x_dimension = 64
+ worn_y_dimension = 64
+ resistance_flags = FLAMMABLE
+
+/obj/item/clothing/head/goatpope/equipped(mob/living/carbon/human/user, slot)
+ ..()
+ if (slot == ITEM_SLOT_HEAD)
+ user.faction |= "goat"
+
+/obj/item/clothing/head/goatpope/dropped(mob/living/carbon/human/user, slot)
+ if (user.head == src)
+ user.faction -= "goat"
+ ..()
diff --git a/modular_sand/code/modules/clothing/masks/miscellaneous.dm b/modular_sand/code/modules/clothing/masks/miscellaneous.dm
index b1665df07e..01ba667e7f 100644
--- a/modular_sand/code/modules/clothing/masks/miscellaneous.dm
+++ b/modular_sand/code/modules/clothing/masks/miscellaneous.dm
@@ -1,7 +1,7 @@
/obj/item/clothing/mask/sand //keep an eye on this boy, i want a it to be a hoodie for a cloak now.
name = "Sand mask"
desc = "The halo appears to be floating."
- icon = 'modular_sand/icons/obj/clothing/mask.dmi'
+ icon = 'modular_sand/icons/obj/clothing/masks.dmi'
icon_state = "sand"
item_state = "sand"
mob_overlay_icon = 'modular_sand/icons/mob/clothing/mask.dmi'
diff --git a/modular_sand/code/modules/clothing/shoes/miscellaneous.dm b/modular_sand/code/modules/clothing/shoes/miscellaneous.dm
new file mode 100644
index 0000000000..1c790e9e78
--- /dev/null
+++ b/modular_sand/code/modules/clothing/shoes/miscellaneous.dm
@@ -0,0 +1,8 @@
+/obj/item/clothing/shoes/jackboots/puttee
+ name = "Putte Boots"
+ desc = "A World War 1 era set of wool british puttees wrapped over the leg and boots."
+ icon = 'modular_sand/icons/obj/clothing/shoes.dmi'
+ icon_state = "puttee"
+ item_state = "puttee"
+ mob_overlay_icon = 'modular_sand/icons/mob/clothing/feet.dmi'
+ anthro_mob_worn_overlay = 'modular_sand/icons/mob/clothing/feet_digi.dmi'
diff --git a/modular_sand/code/modules/clothing/suits/miscellaneous.dm b/modular_sand/code/modules/clothing/suits/miscellaneous.dm
new file mode 100644
index 0000000000..db1b8303bb
--- /dev/null
+++ b/modular_sand/code/modules/clothing/suits/miscellaneous.dm
@@ -0,0 +1,9 @@
+/obj/item/clothing/suit/jacket/duster
+ name = "Oilskin duster"
+ desc = "A Long Duster coat with the iconic shoulder cape, Commonly used for rainy days and dusty dry days by cowboys."
+ icon = 'modular_sand/icons/obj/clothing/suits.dmi'
+ icon_state = "duster"
+ item_state = "duster"
+ mob_overlay_icon = 'modular_sand/icons/mob/clothing/suit.dmi'
+ body_parts_covered = CHEST|GROIN|ARMS|LEGS
+ cold_protection = CHEST|GROIN|ARMS|LEGS
diff --git a/modular_sand/code/modules/vending/clothesmate.dm b/modular_sand/code/modules/vending/clothesmate.dm
index 8339635ffc..c4d522cb57 100644
--- a/modular_sand/code/modules/vending/clothesmate.dm
+++ b/modular_sand/code/modules/vending/clothesmate.dm
@@ -1,5 +1,10 @@
/obj/machinery/vending/clothing/Initialize()
- products[/obj/item/clothing/head/wig] = 5
+ products += list(/obj/item/clothing/head/wig = 5,
+ /obj/item/clothing/suit/jacket/duster = 5,
+ /obj/item/clothing/head/slouch_hat = 5,
+ /obj/item/clothing/head/lawdog = 5,
+ /obj/item/clothing/head/gunfighter = 5
+ )
for(var/P in typesof(/datum/gear/underwear))
var/datum/gear/G = P
products[initial(G.path)] = 5
diff --git a/modular_sand/code/modules/vending/wardrobes.dm b/modular_sand/code/modules/vending/wardrobes.dm
new file mode 100644
index 0000000000..3b5f3e20ba
--- /dev/null
+++ b/modular_sand/code/modules/vending/wardrobes.dm
@@ -0,0 +1,5 @@
+/obj/machinery/vending/wardrobe/sec_wardrobe/Initialize(mapload)
+ products[/obj/item/clothing/shoes/jackboots/puttee] = 5
+ for(var/item in subtypesof(/obj/item/clothing/head/helmet/brodie))
+ products[item] = 5
+ . = ..()
diff --git a/modular_sand/icons/mob/clothing/feet.dmi b/modular_sand/icons/mob/clothing/feet.dmi
new file mode 100644
index 0000000000..79cb59931a
Binary files /dev/null and b/modular_sand/icons/mob/clothing/feet.dmi differ
diff --git a/modular_sand/icons/mob/clothing/feet_digi.dmi b/modular_sand/icons/mob/clothing/feet_digi.dmi
new file mode 100644
index 0000000000..5513d0f6ec
Binary files /dev/null and b/modular_sand/icons/mob/clothing/feet_digi.dmi differ
diff --git a/modular_sand/icons/mob/clothing/head.dmi b/modular_sand/icons/mob/clothing/head.dmi
index 5e7539eae8..bb0472ca29 100644
Binary files a/modular_sand/icons/mob/clothing/head.dmi and b/modular_sand/icons/mob/clothing/head.dmi differ
diff --git a/modular_sand/icons/mob/clothing/suit.dmi b/modular_sand/icons/mob/clothing/suit.dmi
index b250f0c247..d67f0be909 100644
Binary files a/modular_sand/icons/mob/clothing/suit.dmi and b/modular_sand/icons/mob/clothing/suit.dmi differ
diff --git a/modular_sand/icons/obj/clothing/hats.dmi b/modular_sand/icons/obj/clothing/hats.dmi
index 1a5b17aaf2..e393feeb57 100644
Binary files a/modular_sand/icons/obj/clothing/hats.dmi and b/modular_sand/icons/obj/clothing/hats.dmi differ
diff --git a/modular_sand/icons/obj/clothing/head_muzzled.dmi b/modular_sand/icons/obj/clothing/head_muzzled.dmi
deleted file mode 100644
index 07c078c353..0000000000
Binary files a/modular_sand/icons/obj/clothing/head_muzzled.dmi and /dev/null differ
diff --git a/modular_sand/icons/obj/clothing/mask.dmi b/modular_sand/icons/obj/clothing/mask.dmi
deleted file mode 100644
index 391e5674a5..0000000000
Binary files a/modular_sand/icons/obj/clothing/mask.dmi and /dev/null differ
diff --git a/modular_sand/icons/obj/clothing/masks.dmi b/modular_sand/icons/obj/clothing/masks.dmi
index 5473d67f40..da9c36c105 100644
Binary files a/modular_sand/icons/obj/clothing/masks.dmi and b/modular_sand/icons/obj/clothing/masks.dmi differ
diff --git a/modular_sand/icons/obj/clothing/shoes.dmi b/modular_sand/icons/obj/clothing/shoes.dmi
new file mode 100644
index 0000000000..5d1cb780b7
Binary files /dev/null and b/modular_sand/icons/obj/clothing/shoes.dmi differ
diff --git a/modular_sand/icons/obj/clothing/suits.dmi b/modular_sand/icons/obj/clothing/suits.dmi
index c6fe6f59e9..31c58f7724 100644
Binary files a/modular_sand/icons/obj/clothing/suits.dmi and b/modular_sand/icons/obj/clothing/suits.dmi differ
diff --git a/modular_splurt/_maps/RandomRuins/LavaRuins/lavaland_surface_abandoned_shelter.dmm b/modular_splurt/_maps/RandomRuins/LavaRuins/lavaland_surface_abandoned_shelter.dmm
index 7cb0ee0e7a..fb338e45d5 100644
--- a/modular_splurt/_maps/RandomRuins/LavaRuins/lavaland_surface_abandoned_shelter.dmm
+++ b/modular_splurt/_maps/RandomRuins/LavaRuins/lavaland_surface_abandoned_shelter.dmm
@@ -169,9 +169,7 @@
/turf/open/floor/plasteel,
/area/lavaland/surface/outdoors)
"wF" = (
-/obj/item/stack/sheet/mineral/uranium{
- amount = 2
- },
+/obj/item/circuitboard/machine/mining_equipment_vendor/golem,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"yv" = (
@@ -211,7 +209,7 @@
/area/lavaland/surface/outdoors)
"CV" = (
/obj/machinery/door/airlock/external/glass,
-/turf/template_noop,
+/turf/open/floor/plasteel,
/area/lavaland/surface/outdoors)
"CX" = (
/obj/effect/mob_spawn/human/wandering_hermit,
@@ -243,6 +241,11 @@
/obj/structure/cable,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
+"HK" = (
+/obj/structure/frame/machine,
+/obj/item/circuitboard/machine/autolathe,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
"II" = (
/obj/structure/cable{
icon_state = "1-4"
@@ -362,9 +365,7 @@
/turf/open/floor/plasteel,
/area/lavaland/surface/outdoors)
"VT" = (
-/obj/item/stack/sheet/mineral/gold{
- amount = 5
- },
+/obj/item/card/id/mining,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"We" = (
@@ -656,7 +657,7 @@ bv
Yt
Pm
rR
-ha
+VT
pE
Pm
Br
@@ -693,7 +694,7 @@ ig
rp
GU
Br
-gd
+HK
gd
ha
ha
@@ -723,7 +724,7 @@ QQ
QQ
QQ
ch
-ha
+wF
ZP
Nq
ch
@@ -778,7 +779,7 @@ QQ
ha
ha
Cj
-VT
+ha
Dr
Qn
Qn
@@ -796,7 +797,7 @@ ha
Qn
Pm
ha
-wF
+ha
Dr
Qn
Qn
diff --git a/modular_splurt/code/game/gamemodes/objectives.dm b/modular_splurt/code/game/gamemodes/objectives.dm
index eafaa5d24c..b1ba57aed4 100644
--- a/modular_splurt/code/game/gamemodes/objectives.dm
+++ b/modular_splurt/code/game/gamemodes/objectives.dm
@@ -1,21 +1,3 @@
-/datum/objective/protect_object
- name = "protect object"
- var/obj/protect_target
-
-/datum/objective/protect_object/proc/set_target(obj/O)
- protect_target = O
- update_explanation_text()
-
-/datum/objective/protect_object/update_explanation_text()
- . = ..()
- if(protect_target)
- explanation_text = "Protect \the [protect_target] at all costs."
- else
- explanation_text = "Free objective."
-
-/datum/objective/protect_object/check_completion()
- return !QDELETED(protect_target)
-
/datum/objective/rescue_prisoner
name = "rescue prisoner"
@@ -33,4 +15,3 @@
/datum/objective/slaver
name = "slave trading"
explanation_text = "Earn 200,000 credits through slave trading."
-
diff --git a/modular_splurt/code/game/object/structures/ghost_role_spawners.dm b/modular_splurt/code/game/object/structures/ghost_role_spawners.dm
index c26bb7ba19..e4239a6158 100644
--- a/modular_splurt/code/game/object/structures/ghost_role_spawners.dm
+++ b/modular_splurt/code/game/object/structures/ghost_role_spawners.dm
@@ -1,60 +1,11 @@
/obj/effect/mob_spawn/human/ash_walker
- name = "ash walker egg"
- desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within."
- mob_name = "an ash walker"
- job_description = "Ashwalker"
- icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
- icon_state = "large_egg"
- mob_species = /datum/species/lizard/ashwalker
- roundstart = FALSE
- death = FALSE
- anchored = FALSE
- move_resist = MOVE_FORCE_NORMAL
- density = FALSE
- short_desc = "You are an ash walker. Your tribe worships the Necropolis."
- flavour_text = "The wastes are sacred ground, its monsters a blessed bounty. You would never willingly leave your homeland behind. \
- You have seen lights in the distance... they foreshadow the arrival of outsiders to your domain. \
- Ensure your nest remains protected at all costs."
- assignedrole = "Ash Walker"
- var/datum/linked_objective
- var/datum/team/ashwalkers/team
- var/obj/structure/ash_walker_eggshell/eggshell
var/gender_bias
-/obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn)
- new_spawn.fully_replace_character_name(null,random_unique_lizard_name(gender))
- to_chat(new_spawn, "Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind.")
-
- new_spawn.mind.add_antag_datum(/datum/antagonist/ashwalker, team)
-
- if(ishuman(new_spawn))
- var/mob/living/carbon/human/H = new_spawn
- H.underwear = "Nude"
- H.undershirt = "Nude"
- H.socks = "Nude"
- H.update_body()
- ADD_TRAIT(H, TRAIT_PRIMITIVE, ROUNDSTART_TRAIT)
- H.remove_language(/datum/language/common)
- team.players_spawned += (new_spawn.key)
- eggshell.egg = null
- QDEL_NULL(eggshell)
-
/obj/effect/mob_spawn/human/ash_walker/equip(mob/living/carbon/human/H)
if(!isnull(gender_bias) && prob(90))
H.gender = gender_bias
return ..()
-/obj/effect/mob_spawn/human/ash_walker/Initialize(mapload, datum/team/ashwalkers/ashteam, datum/ashobjective)
- . = ..()
- var/area/A = get_area(src)
- team = ashteam
- linked_objective = ashobjective
- eggshell = new /obj/structure/ash_walker_eggshell(get_turf(loc))
- eggshell.egg = src
- src.forceMove(eggshell)
- if(A)
- notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER)
-
/obj/effect/mob_spawn/human/ash_walker/western
job_description = "Western Ashwalker"
short_desc = "You are a Farlander. Your tribe worships the home tendril."
@@ -74,49 +25,6 @@
mob_species = /datum/species/lizard/ashwalker/eastern
gender_bias = MALE
-/datum/outfit/ashwalker
- name ="Ashwalker"
- head = /obj/item/clothing/head/helmet/gladiator
- uniform = /obj/item/clothing/under/costume/gladiator/ash_walker
-
-//Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers.
-/obj/structure/ash_walker_eggshell
- name = "ash walker egg"
- desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within."
- icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
- icon_state = "large_egg"
- resistance_flags = LAVA_PROOF | FIRE_PROOF | FREEZE_PROOF
- max_integrity = 80
- var/obj/effect/mob_spawn/human/ash_walker/egg
-
-/obj/structure/ash_walker_eggshell/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) //lifted from xeno eggs
- switch(damage_type)
- if(BRUTE)
- if(damage_amount)
- playsound(loc, 'sound/effects/attackblob.ogg', 100, TRUE)
- else
- playsound(src, 'sound/weapons/tap.ogg', 50, TRUE)
- if(BURN)
- if(damage_amount)
- playsound(loc, 'sound/items/welder.ogg', 100, TRUE)
-
-/obj/structure/ash_walker_eggshell/attack_ghost(mob/user) //Pass on ghost clicks to the mob spawner
- if(egg)
- egg.attack_ghost(user)
- . = ..()
-
-/obj/structure/ash_walker_eggshell/Destroy()
- if(!egg)
- return ..()
- var/mob/living/carbon/human/yolk = new /mob/living/carbon/human/(get_turf(src))
- yolk.fully_replace_character_name(null,random_unique_lizard_name(gender))
- yolk.set_species(/datum/species/lizard/ashwalker)
- yolk.underwear = "Nude"
- yolk.update_body()
- yolk.gib()
- QDEL_NULL(egg)
- return ..()
-
//Portable dangerous-environment sleepers: Spawns in exposed to ash storms shelter.
//Characters in this role could have been conscious for a long time, surviving on the planet. They may also know Draconic language by contacting with ashwalkers.
/obj/effect/mob_spawn/human/wandering_hermit
diff --git a/modular_splurt/code/modules/admin/playtimes.dm b/modular_splurt/code/modules/admin/playtimes.dm
index 4bafb91aa4..126631699c 100644
--- a/modular_splurt/code/modules/admin/playtimes.dm
+++ b/modular_splurt/code/modules/admin/playtimes.dm
@@ -4,10 +4,13 @@
var/next_chem_grief_warning = 0
var/next_canister_grief_warning = 0
var/next_ied_grief_warning = 0
+ var/next_circuit_grief_warning = 0
var/touched_transfer_valve = FALSE
var/used_chem_dispenser = FALSE
var/touched_canister = FALSE
var/crafted_ied = FALSE
+ var/touched_circuit = FALSE
+ var/uses_vpn = FALSE
/client/proc/cmd_player_playtimes()
set category = "Admin"
@@ -89,6 +92,18 @@
flag["tooltip"] = "This player crafted an IED or Molotov."
flags += list(flag)
+ if (C.touched_circuit)
+ var/list/flag = list()
+ flag["icon"] = "code-branch"
+ flag["tooltip"] = "This player touched a circuit printer."
+ flags += list(flag)
+
+ if(C.uses_vpn)
+ var/list/flag = list()
+ flag["icon"] = "wifi"
+ flag["tooltip"] = "This player is [round(C.ip_intel*100, 0.01)]% likely to be using a Proxy/VPN"
+ flags += list(flag)
+
return flags
/datum/player_playtime/ui_act(action, params)
diff --git a/modular_splurt/code/modules/antagonists/ashwalker.dm b/modular_splurt/code/modules/antagonists/ashwalker.dm
deleted file mode 100644
index deed8f4ae7..0000000000
--- a/modular_splurt/code/modules/antagonists/ashwalker.dm
+++ /dev/null
@@ -1,22 +0,0 @@
-/datum/team/ashwalkers
- name = "Ashwalkers"
- show_roundend_report = FALSE
- var/list/players_spawned = list()
-
-/datum/antagonist/ashwalker
- name = "Ash Walker"
- job_rank = ROLE_LAVALAND
- show_in_antagpanel = FALSE
- show_to_ghosts = TRUE
- antagpanel_category = "Ash Walkers"
- var/datum/team/ashwalkers/ashie_team
-
-/datum/antagonist/ashwalker/create_team(datum/team/team)
- if(team)
- ashie_team = team
- objectives |= ashie_team.objectives
- else
- ashie_team = new
-
-/datum/antagonist/ashwalker/get_team()
- return ashie_team
diff --git a/modular_splurt/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/modular_splurt/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
new file mode 100644
index 0000000000..9ba3db985e
--- /dev/null
+++ b/modular_splurt/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm
@@ -0,0 +1,13 @@
+/obj/machinery/atmospherics/components/unary/outlet_injector/hilbertshotel
+
+/obj/machinery/atmospherics/components/unary/outlet_injector/hilbertshotel/Initialize()
+ . = ..()
+ addtimer(CALLBACK(src, .proc/turn_on), 3 SECONDS)
+
+/obj/machinery/atmospherics/components/unary/outlet_injector/hilbertshotel/proc/turn_on()
+ on = TRUE
+ update_appearance()
+
+/obj/machinery/atmospherics/components/unary/outlet_injector/hilbertshotel/layer3
+ piping_layer = 3
+ icon_state = "inje_map-3"
diff --git a/modular_splurt/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/modular_splurt/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
new file mode 100644
index 0000000000..54eb593572
--- /dev/null
+++ b/modular_splurt/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -0,0 +1,9 @@
+/obj/machinery/atmospherics/components/unary/vent_pump/hilbertshotel
+
+/obj/machinery/atmospherics/components/unary/vent_pump/hilbertshotel/Initialize()
+ . = ..()
+ addtimer(CALLBACK(src, .proc/turn_on), 3 SECONDS)
+
+/obj/machinery/atmospherics/components/unary/vent_pump/hilbertshotel/proc/turn_on()
+ on = TRUE
+ update_appearance()
diff --git a/modular_splurt/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/modular_splurt/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
new file mode 100644
index 0000000000..4c97c0c149
--- /dev/null
+++ b/modular_splurt/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -0,0 +1,13 @@
+/obj/machinery/atmospherics/components/unary/vent_scrubber/hilbertshotel
+
+/obj/machinery/atmospherics/components/unary/vent_scrubber/hilbertshotel/Initialize()
+ . = ..()
+ addtimer(CALLBACK(src, .proc/turn_on), 3 SECONDS)
+
+/obj/machinery/atmospherics/components/unary/vent_scrubber/hilbertshotel/proc/turn_on()
+ on = TRUE
+ update_appearance()
+
+/obj/machinery/atmospherics/components/unary/vent_scrubber/hilbertshotel/layer3
+ piping_layer = 3
+ icon_state = "scrub_map-3"
diff --git a/modular_splurt/code/modules/client/client_procs.dm b/modular_splurt/code/modules/client/client_procs.dm
new file mode 100644
index 0000000000..d62111d09d
--- /dev/null
+++ b/modular_splurt/code/modules/client/client_procs.dm
@@ -0,0 +1,4 @@
+/client/check_ip_intel()
+ . = ..()
+ if(ip_intel != initial(ip_intel) && ip_intel >= CONFIG_GET(number/ipintel_rating_bad))
+ uses_vpn = TRUE
diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm
index e3ae397d11..c902e51224 100644
--- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm
+++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/tails.dm
@@ -79,7 +79,7 @@
icon = 'modular_splurt/icons/mob/mam_tails.dmi'
matrixed_sections = MATRIX_RED
-/datum/sprite_accessory/tails_animated/mam_tails_animated
+/datum/sprite_accessory/tails_animated/mam_tails_animated/shorthawk
name = "Hawk - Short"
icon_state = "shorthawk"
icon = 'modular_splurt/icons/mob/mam_tails.dmi'
diff --git a/modular_splurt/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/modular_splurt/code/modules/mob/living/carbon/human/species_types/dullahan.dm
new file mode 100644
index 0000000000..94689e4b6c
--- /dev/null
+++ b/modular_splurt/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -0,0 +1,2 @@
+/obj/item/organ/tongue/dullahan
+ initial_accents = list(/datum/accent/dullahan)
diff --git a/modular_splurt/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/modular_splurt/code/modules/ruins/objects_and_mobs/ash_walker_den.dm
index 78d988185b..a5fac88e7a 100644
--- a/modular_splurt/code/modules/ruins/objects_and_mobs/ash_walker_den.dm
+++ b/modular_splurt/code/modules/ruins/objects_and_mobs/ash_walker_den.dm
@@ -1,18 +1,3 @@
-/obj/structure/lavaland/ash_walker/proc/remake_walker(oldname, oldgender, datum/mind/oldmind)
- var/mob/living/carbon/human/M = new /mob/living/carbon/human(get_step(loc, pick(GLOB.alldirs)))
- M.gender = oldgender
- M.set_species(species)
- M.real_name = oldname
- M.underwear = "Nude"
- M.undershirt = "Nude"
- M.socks = "Nude"
- M.update_body()
- M.remove_language(/datum/language/common)
- oldmind.transfer_to(M)
- M.mind.grab_ghost()
- to_chat(M, "You have been pulled back from beyond the grave, with a new body and renewed purpose. Glory to the Tendril!")
- playsound(get_turf(M),'sound/magic/exit_blood.ogg', 100, TRUE)
-
/obj/structure/lavaland/ash_walker/western
spawned_obj = /obj/effect/mob_spawn/human/ash_walker/western
species = /datum/species/lizard/ashwalker/western
diff --git a/tgstation.dme b/tgstation.dme
index bd78d66664..4fac5f7a4a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1580,6 +1580,7 @@
#include "code\modules\antagonists\abductor\machinery\dispenser.dm"
#include "code\modules\antagonists\abductor\machinery\experiment.dm"
#include "code\modules\antagonists\abductor\machinery\pad.dm"
+#include "code\modules\antagonists\ashwalker\ashwalker.dm"
#include "code\modules\antagonists\blob\blob.dm"
#include "code\modules\antagonists\blob\blob\blob_report.dm"
#include "code\modules\antagonists\blob\blob\overmind.dm"
@@ -2371,7 +2372,6 @@
#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm"
#include "code\modules\integrated_electronics\passive\passive.dm"
#include "code\modules\integrated_electronics\passive\power.dm"
-#include "code\modules\integrated_electronics\subtypes\access.dm"
#include "code\modules\integrated_electronics\subtypes\arithmetic.dm"
#include "code\modules\integrated_electronics\subtypes\atmospherics.dm"
#include "code\modules\integrated_electronics\subtypes\converters.dm"
@@ -3971,6 +3971,7 @@
#include "modular_sand\code\game\turfs\simulated\floor\titanium_floor.dm"
#include "modular_sand\code\modules\admin\chat_commands.dm"
#include "modular_sand\code\modules\admin\verbs\fix_air.dm"
+#include "modular_sand\code\modules\admin\verbs\randomverbs.dm"
#include "modular_sand\code\modules\arousal\arousal.dm"
#include "modular_sand\code\modules\arousal\creampie.dm"
#include "modular_sand\code\modules\arousal\genitals.dm"
@@ -3994,25 +3995,32 @@
#include "modular_sand\code\modules\client\asset_cache.dm"
#include "modular_sand\code\modules\client\preferences.dm"
#include "modular_sand\code\modules\client\preferences_savefile.dm"
+#include "modular_sand\code\modules\client\loadout\_security.dm"
#include "modular_sand\code\modules\client\loadout\accessories.dm"
#include "modular_sand\code\modules\client\loadout\backpack.dm"
#include "modular_sand\code\modules\client\loadout\boxers.dm"
#include "modular_sand\code\modules\client\loadout\hands.dm"
+#include "modular_sand\code\modules\client\loadout\head.dm"
#include "modular_sand\code\modules\client\loadout\shirts.dm"
#include "modular_sand\code\modules\client\loadout\socks.dm"
+#include "modular_sand\code\modules\client\loadout\suit.dm"
#include "modular_sand\code\modules\client\loadout\uniform.dm"
#include "modular_sand\code\modules\client\loadout\wrists.dm"
#include "modular_sand\code\modules\clothing\refactor.dm"
#include "modular_sand\code\modules\clothing\gloves\_gloves.dm"
#include "modular_sand\code\modules\clothing\gloves\accessories.dm"
+#include "modular_sand\code\modules\clothing\head\helmet.dm"
#include "modular_sand\code\modules\clothing\head\misc.dm"
+#include "modular_sand\code\modules\clothing\head\misc_special.dm"
#include "modular_sand\code\modules\clothing\masks\hailer.dm"
#include "modular_sand\code\modules\clothing\masks\miscellaneous.dm"
#include "modular_sand\code\modules\clothing\neck\_neck.dm"
#include "modular_sand\code\modules\clothing\outfits\standard.dm"
+#include "modular_sand\code\modules\clothing\shoes\miscellaneous.dm"
#include "modular_sand\code\modules\clothing\spacesuits\chronosuit.dm"
#include "modular_sand\code\modules\clothing\spacesuits\hardsuit.dm"
#include "modular_sand\code\modules\clothing\suits\armor.dm"
+#include "modular_sand\code\modules\clothing\suits\miscellaneous.dm"
#include "modular_sand\code\modules\clothing\under\costumes.dm"
#include "modular_sand\code\modules\clothing\under\miscellaneous.dm"
#include "modular_sand\code\modules\clothing\under\uniform.dm"
@@ -4166,6 +4174,7 @@
#include "modular_sand\code\modules\vending\autodrobe.dm"
#include "modular_sand\code\modules\vending\clothesmate.dm"
#include "modular_sand\code\modules\vending\kinkmate.dm"
+#include "modular_sand\code\modules\vending\wardrobes.dm"
#include "modular_splurt\code\__HELPERS\_cit_helpers.dm"
#include "modular_splurt\code\__HELPERS\cmp.dm"
#include "modular_splurt\code\__HELPERS\icons.dm"
@@ -4249,7 +4258,6 @@
#include "modular_splurt\code\modules\admin\verbs\discordbunker.dm"
#include "modular_splurt\code\modules\admin\verbs\one_click_antag.dm"
#include "modular_splurt\code\modules\admin\verbs\randomverbs.dm"
-#include "modular_splurt\code\modules\antagonists\ashwalker.dm"
#include "modular_splurt\code\modules\antagonists\slaver\slaver.dm"
#include "modular_splurt\code\modules\antagonists\slaver\equipment\orderable_gear.dm"
#include "modular_splurt\code\modules\antagonists\slaver\equipment\slaver_items.dm"
@@ -4257,7 +4265,11 @@
#include "modular_splurt\code\modules\arousal\genitals_sprite_accessories.dm"
#include "modular_splurt\code\modules\arousal\organs\breasts.dm"
#include "modular_splurt\code\modules\arousal\organs\testicles.dm"
+#include "modular_splurt\code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm"
+#include "modular_splurt\code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm"
+#include "modular_splurt\code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm"
#include "modular_splurt\code\modules\cargo\packs\armory.dm"
+#include "modular_splurt\code\modules\client\client_procs.dm"
#include "modular_splurt\code\modules\client\preferences.dm"
#include "modular_splurt\code\modules\client\preferences_savefile.dm"
#include "modular_splurt\code\modules\client\loadout\backpack.dm"