+
+ [totalmaps > 1 ? "
Layer [i]
" : ""]
-
+ [totalmaps <= 1 ? "
" : ""]
"}
datas += json_encode(M.color_area_names);
+ buttonfield += "
Layer [i] "
+
+ if(totalmaps > 1)
+ info += "
"
+
+ //This is a hacky workaround; the status display is extremely buggy when multiple z-levels are present. We couldn't figure out how to fix this after 7 hours of banging our head against the wall
+ //We're coder
+ var/mousemove_bit = {"
+ canvas.onmousemove = function(e){
+ var rect = canvas.getBoundingClientRect();
+ var x = Math.floor(e.offsetX * img.width / rect.width);
+ var y = Math.floor(e.offsetY * img.height / rect.height);
+
+ var color_idx = x * 4 + (y * 4 * imagedata.width);
+ var color = "#" + hexify(imagedata.data\[color_idx]) + hexify(imagedata.data\[color_idx+1]) + hexify(imagedata.data\[color_idx+2]);
+
+ label.textContent = data\[color];
+ canvas.title = data\[color];
+ }
+ canvas.onmouseout = function(e){
+ label.textContent = " ";
+ canvas.title = "";
+ }
+ "}
info = info.Join()
//this is bad. Too bad!
@@ -133,6 +181,14 @@
}
return num;
}
+ function switchmap(mapid) {
+ var targetblock = document.getElementById(mapid);
+ for(var i = 0; i < [length(minimaps)]; i++) {
+ var currentblock = document.getElementById("layer-" + (i + 1));
+ currentblock.style.display = 'none';
+ }
+ targetblock.style.display = '';
+ }
window.onload = function() {
if(!window.HTMLCanvasElement) {
var label = document.getElementById("label-1");
@@ -150,6 +206,7 @@
var canvas = document.createElement("canvas");
canvas.width = img.width * 2;
canvas.height = img.height * 2;
+ canvas.id = "canvas-" + (i+1);
var ctx = canvas.getContext('2d');
ctx.msImageSmoothingEnabled = false;
@@ -158,31 +215,23 @@
ctx = document.createElement("canvas").getContext('2d');
ctx.canvas.width = img.width;
ctx.canvas.height = img.height;
+ ctx.id = "ctx-" + (i+1);
ctx.drawImage(document.getElementById("map-" + (i+1) + "-meta"), 0, 0);
var imagedata = ctx.getImageData(0, 0, img.width, img.height);
- canvas.onmousemove = function(e){
- var rect = canvas.getBoundingClientRect();
- var x = Math.floor(e.offsetX * img.width / rect.width);
- var y = Math.floor(e.offsetY * img.height / rect.height);
-
- var color_idx = x * 4 + (y * 4 * imagedata.width);
- var color = "#" + hexify(imagedata.data\[color_idx]) + hexify(imagedata.data\[color_idx+1]) + hexify(imagedata.data\[color_idx+2]);
- var label = document.getElementById("label-" + (i+1)); //label-String(n)
-
- label.textContent = data\[color];
- canvas.title = data\[color];
- }
- canvas.onmouseout = function(e){
- canvas.title = "";
- }
+ var label = document.getElementById("label-" + (i+1)); //label-String(n);
+ [totalmaps <= 1 ? mousemove_bit : ""]
}
}
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index e207a4e324..48d9b5a14d 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -367,6 +367,8 @@
if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes")
ready = PLAYER_NOT_READY
src << browse(null, "window=playersetup") //closes the player setup window
+ if(!(client?.prefs.toggles & TG_PLAYER_PANEL))
+ new_player_panel()
return FALSE
var/mob/dead/observer/observer = new()
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index a9233938ab..378313311e 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -24,6 +24,9 @@
var/rando_race = pick(GLOB.roundstart_races)
pref_species = new rando_race()
features = random_features(pref_species?.id, gender)
+ bark_id = pick(GLOB.bark_random_list)
+ bark_pitch = BARK_PITCH_RAND(gender)
+ bark_variance = BARK_VARIANCE_RAND
age = rand(AGE_MIN,AGE_MAX)
/datum/preferences/proc/update_preview_icon(current_tab)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 53a4b0e997..2dcb8ef98f 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -121,7 +121,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
remove_verb(src, /mob/dead/observer/verb/boo)
remove_verb(src, /mob/dead/observer/verb/possess)
- animate(src, pixel_y = 2, time = 10, loop = -1)
+ animate(src, pixel_z = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
+ animate(pixel_z = -4, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
add_to_dead_mob_list()
@@ -539,8 +540,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/stop_orbit(datum/component/orbiter/orbits)
. = ..()
//restart our floating animation after orbit is done.
- pixel_y = 0
- animate(src, pixel_y = 2, time = 10, loop = -1)
+ pixel_z = 0
+ animate(src, pixel_z = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
+ animate(pixel_z = -4, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
set category = "Ghost"
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index 9563959ebc..ff4a7d2bba 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -51,7 +51,7 @@
// update_icons() //Handled in update_transform(), leaving this here as a reminder
update_transform()
-/mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that.
+/mob/living/carbon/alien/humanoid/update_transform(do_animate) //The old method of updating lying/standing was update_icons(). Aliens still expect that.
if(lying > 0)
lying = 90 //Anything else looks silly
..()
diff --git a/code/modules/mob/living/carbon/alien/larva/update_icons.dm b/code/modules/mob/living/carbon/alien/larva/update_icons.dm
index e6e7e657e8..85416261c7 100644
--- a/code/modules/mob/living/carbon/alien/larva/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/larva/update_icons.dm
@@ -21,7 +21,7 @@
else
icon_state = "larva[state]"
-/mob/living/carbon/alien/larva/update_transform() //All this is handled in update_icons()
+/mob/living/carbon/alien/larva/update_transform(do_animate) //All this is handled in update_icons()
..()
return update_icons()
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 8af2b7742c..e323f97d73 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -292,6 +292,14 @@
if(ishuman(src))
S = dna.species
+ //SPLURT EDIT - Headpat traits
+ if(M.has_quirk(/datum/quirk/dominant_aura) && H.has_quirk(/datum/quirk/well_trained))
+ if(H.has_quirk(/datum/quirk/headpat_hater))
+ H.remove_quirk(/datum/quirk/headpat_hater)
+ if(!H.has_quirk(/datum/quirk/headpat_slut))
+ H.add_quirk(/datum/quirk/headpat_slut)
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "dom_trained", /datum/mood_event/dominant/good_boy)
+
if(HAS_TRAIT(H, TRAIT_DISTANT)) //No mood buff since you're not really liking it.
M.visible_message("
[M] gives [H] a pat on the head to make [p_them()] feel better! They seem annoyed...", \
"
You give [H] a pat on the head to make [p_them()] feel better! They seem annoyed as they're now glaring towards you...")
@@ -315,12 +323,13 @@
"
You give [src] a pat on the head to make [p_them()] feel better! They seem to like it way too much..", target = src,
target_message = "
[M] gives you a pat on the head to make you feel better!")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "lewd_headpat", /datum/mood_event/lewd_headpat)
- H.add_lust(5) //Headpats are hot af
+ H.handle_post_sex(5, null, null) //Headpats are hot af
else
M.visible_message("
[M] gives [src] a pat on the head to make [p_them()] feel better!", \
"
You give [src] a pat on the head to make [p_them()] feel better!", target = src,
target_message = "
[M] gives you a pat on the head to make you feel better!")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat)
+ //SPLURT EDIT END
if(!(client?.prefs.cit_toggles & NO_AUTO_WAG) && friendly_check)
if(S?.can_wag_tail(src) && !dna.species.is_wagging_tail())
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 9f85b94d03..2ef3aa36a6 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -157,11 +157,11 @@
. += ""
. += "
[t_He] [t_is] currently in [gender == MALE ? "rut" : "heat"]."
- SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
-
- if(length(.) > 1)
+ if(LAZYLEN(.) > 1)
.[1] += "
"
+ SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
+
/mob/living/carbon/examine_more(mob/user)
if(!all_scars)
return ..()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 5a9a2ebf62..edb5de8188 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -516,10 +516,10 @@
else if(isobserver(user) && traitstring)
. += "
Traits: [traitstring]"
- SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) //This also handles flavor texts now
+ if(LAZYLEN(.) > 2) //Want this to appear after species text
+ .[2] += "
"
- if(length(.) > 1)
- .[1] += "
"
+ SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) //This also handles flavor texts now
/mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects!
var/list/dat = list()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index e79a887dad..3f5b8819be 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -597,18 +597,18 @@
var/no_damage
if(status == "OK" || status == "no damage")
no_damage = TRUE
- to_send += "\t
Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].\n"
+ to_send += "
Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].\n"
for(var/thing in LB.wounds)
var/datum/wound/W = thing
var/msg
switch(W.severity)
if(WOUND_SEVERITY_TRIVIAL)
- msg = "\t
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]."
+ msg = "
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]."
if(WOUND_SEVERITY_MODERATE)
- msg = "\t
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!"
+ msg = "
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!"
if(WOUND_SEVERITY_SEVERE)
- msg = "\t
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!"
+ msg = "
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!"
if(WOUND_SEVERITY_CRITICAL)
msg = "\t
Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!!"
to_send += "\n[msg]"
diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm
index c8b8dbbc9d..8fd7b45b65 100644
--- a/code/modules/mob/living/carbon/monkey/punpun.dm
+++ b/code/modules/mob/living/carbon/monkey/punpun.dm
@@ -46,6 +46,7 @@
..()
/mob/living/carbon/monkey/punpun/proc/Read_Memory()
+ var/saved_color
if(fexists("data/npc_saves/Punpun.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Punpun.sav")
S["ancestor_name"] >> ancestor_name
@@ -62,6 +63,9 @@
ancestor_chain = json["ancestor_chain"]
relic_hat = json["relic_hat"]
relic_mask = json["relic_hat"]
+ saved_color = json["color"]
+ if(!isnull(saved_color))
+ add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY)
/mob/living/carbon/monkey/punpun/proc/Write_Memory(dead, gibbed)
var/json_file = file("data/npc_saves/Punpun.json")
@@ -71,10 +75,12 @@
file_data["ancestor_chain"] = null
file_data["relic_hat"] = null
file_data["relic_mask"] = null
+ file_data["color"] = null
else
file_data["ancestor_name"] = ancestor_name ? ancestor_name : name
file_data["ancestor_chain"] = dead ? ancestor_chain + 1 : ancestor_chain
file_data["relic_hat"] = head ? head.type : null
file_data["relic_mask"] = wear_mask ? wear_mask.type : null
+ file_data["color"] = color ? json_encode(color) : null
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 6efa32b48b..e9150f202d 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -81,6 +81,7 @@
//Called when we bump onto a mob
/mob/living/proc/MobBump(mob/M)
+ SEND_SIGNAL(src, COMSIG_LIVING_MOB_BUMP, M)
//Even if we don't push/swap places, we "touched" them, so spread fire
spreadFire(M)
@@ -88,6 +89,7 @@
return TRUE
var/they_can_move = TRUE
+
if(isliving(M))
var/mob/living/L = M
they_can_move = CHECK_MOBILITY(L, MOBILITY_MOVE)
@@ -105,16 +107,16 @@
//Should stop you pushing a restrained person out of the way
if(L.pulledby && L.pulledby != src && L.restrained())
if(!(world.time % 5))
- to_chat(src, "
[L] is restrained, you cannot push past.")
- return 1
+ to_chat(src, span_warning("[L] is restrained, you cannot push past."))
+ return TRUE
if(L.pulling)
if(ismob(L.pulling))
var/mob/P = L.pulling
if(P.restrained())
if(!(world.time % 5))
- to_chat(src, "
[L] is restraining [P], you cannot push past.")
- return 1
+ to_chat(src, span_warning("[L] is restraining [P], you cannot push past."))
+ return TRUE
//CIT CHANGES START HERE - makes it so resting stops you from moving through standing folks or over prone bodies without a short delay
if(!CHECK_MOBILITY(src, MOBILITY_STAND))
@@ -142,7 +144,7 @@
//END OF CIT CHANGES
if(moving_diagonally)//no mob swap during diagonal moves.
- return 1
+ return TRUE
//handle micro bumping on help intent
if(a_intent == INTENT_HELP)
@@ -156,7 +158,8 @@
if(!too_strong)
mob_swap = TRUE
else
- if(M.pulledby == src && a_intent == INTENT_GRAB)
+ //You can swap with the person you are dragging on grab intent, and restrained people in most cases
+ if(M.pulledby == src && !too_strong)
mob_swap = TRUE
//restrained people act if they were on 'help' intent to prevent a person being pulled from being separated from their puller
else if((M.restrained() || M.a_intent == INTENT_HELP) && (restrained() || a_intent == INTENT_HELP))
@@ -164,8 +167,8 @@
if(mob_swap)
//switch our position with M
if(loc && !loc.Adjacent(M.loc))
- return 1
- now_pushing = 1
+ return TRUE
+ now_pushing = TRUE
var/oldloc = loc
var/oldMloc = M.loc
@@ -185,29 +188,33 @@
if(!M_passmob)
M.pass_flags &= ~PASSMOB
- now_pushing = 0
+ now_pushing = FALSE
if(!move_failed)
- return 1
+ return TRUE
//okay, so we didn't switch. but should we push?
//not if he's not CANPUSH of course
if(!(M.status_flags & CANPUSH))
- return 1
+ return TRUE
if(handle_micro_bump_other(M))
return TRUE
if(isliving(M))
var/mob/living/L = M
if(HAS_TRAIT(L, TRAIT_PUSHIMMUNE))
- return 1
- //If they're a human, and they're not in help intent, block pushing
- if(ishuman(M) && (M.a_intent != INTENT_HELP))
- return TRUE
+ return TRUE
+ if(M.a_intent != INTENT_HELP)
+ //If they're a human, and they're not in help intent, block pushing
+ if(ishuman(M))
+ return TRUE
+ //if they are a cyborg, and they're alive and not in help intent, block pushing
+ if(iscyborg(M) && M.stat != DEAD)
+ return TRUE
//anti-riot equipment is also anti-push
for(var/obj/item/I in M.held_items)
if(!istype(M, /obj/item/clothing))
if(prob(I.block_chance*2))
- return 1
+ return TRUE
/mob/living/get_photo_description(obj/item/camera/camera)
var/list/mob_details = list()
@@ -238,21 +245,40 @@
if(!client && (mob_size < MOB_SIZE_SMALL))
return
now_pushing = TRUE
- var/t = get_dir(src, AM)
+ SEND_SIGNAL(src, COMSIG_LIVING_PUSHING_MOVABLE, AM)
+ var/dir_to_target = get_dir(src, AM)
+
+ // If there's no dir_to_target then the player is on the same turf as the atom they're trying to push.
+ // This can happen when a player is stood on the same turf as a directional window. All attempts to push
+ // the window will fail as get_dir will return 0 and the player will be unable to move the window when
+ // it should be pushable.
+ // In this scenario, we will use the facing direction of the /mob/living attempting to push the atom as
+ // a fallback.
+ if(!dir_to_target)
+ dir_to_target = dir
+
var/push_anchored = FALSE
if((AM.move_resist * MOVE_FORCE_CRUSH_RATIO) <= force)
- if(move_crush(AM, move_force, t))
+ if(move_crush(AM, move_force, dir_to_target))
push_anchored = TRUE
- if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally
- if(force_push(AM, move_force, t, push_anchored))
+ if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally
+ if(force_push(AM, move_force, dir_to_target, push_anchored))
push_anchored = TRUE
+ if(ismob(AM))
+ var/mob/mob_to_push = AM
+ var/atom/movable/mob_buckle = mob_to_push.buckled
+ // If we can't pull them because of what they're buckled to, make sure we can push the thing they're buckled to instead.
+ // If neither are true, we're not pushing anymore.
+ if(mob_buckle && (mob_buckle.buckle_prevents_pull || (force < (mob_buckle.move_resist * MOVE_FORCE_PUSH_RATIO))))
+ now_pushing = FALSE
+ return
if((AM.anchored && !push_anchored) || (force < (AM.move_resist * MOVE_FORCE_PUSH_RATIO)))
now_pushing = FALSE
return
- if (istype(AM, /obj/structure/window))
+ if(istype(AM, /obj/structure/window))
var/obj/structure/window/W = AM
if(W.fulltile)
- for(var/obj/structure/window/win in get_step(W,t))
+ for(var/obj/structure/window/win in get_step(W, dir_to_target))
now_pushing = FALSE
return
if(pulling == AM)
@@ -260,8 +286,9 @@
var/current_dir
if(isliving(AM))
current_dir = AM.dir
- if(step(AM, t) && Process_Spacemove(t))
- step(src, t)
+ if(AM.Move(get_step(AM.loc, dir_to_target), dir_to_target, glide_size))
+ AM.add_fingerprint(src)
+ Move(get_step(loc, dir_to_target), dir_to_target)
if(current_dir)
AM.setDir(current_dir)
now_pushing = FALSE
@@ -361,29 +388,33 @@
offset = GRAB_PIXEL_SHIFT_NECK
if(GRAB_KILL)
offset = GRAB_PIXEL_SHIFT_NECK
- M.setDir(get_dir(M, src))
- switch(M.dir)
- if(NORTH)
- animate(M, pixel_x = 0, pixel_y = offset, 3)
- if(SOUTH)
- animate(M, pixel_x = 0, pixel_y = -offset, 3)
- if(EAST)
- if(M.lying == 270) //update the dragged dude's direction if we've turned
- M.lying = 90
- M.update_transform() //force a transformation update, otherwise it'll take a few ticks for update_mobility() to do so
- M.lying_prev = M.lying
- animate(M, pixel_x = offset, pixel_y = 0, 3)
- if(WEST)
- if(M.lying == 90)
- M.lying = 270
- M.update_transform()
- M.lying_prev = M.lying
- animate(M, pixel_x = -offset, pixel_y = 0, 3)
+ var/target_dir = get_dir(M, src)
+ M.setDir(target_dir)
+ var/target_x
+ var/target_y
+ if(target_dir & NORTH)
+ target_y += offset
+ if(target_dir & SOUTH)
+ target_y -= offset
+ if(target_dir & EAST)
+ target_x += offset
+ if(target_dir & WEST)
+ target_x -= offset
+ if(target_x || target_y)
+ if(0 < target_x && M.lying == 270)
+ M.lying = 90
+ M.update_transform(FALSE) //force a transformation update, otherwise it'll take a few ticks for update_mobility() to do so
+ M.lying_prev = M.lying
+ if(0 > target_x && M.lying == 90)
+ M.lying = 270
+ M.update_transform(FALSE)
+ M.lying_prev = M.lying
+ animate(M, pixel_x = target_x, pixel_y = target_y, time = 3, flags = ANIMATION_PARALLEL)
/mob/living/proc/reset_pull_offsets(mob/living/M, override)
if(!override && M.buckled)
return
- animate(M, pixel_x = 0, pixel_y = 0, 1)
+ animate(M, pixel_x = 0, pixel_y = 0, time = 3, flags = ANIMATION_PARALLEL)
//mob verbs are a lot faster than object verbs
//for more info on why this is not atom/pull, see examinate() in mob.dm
@@ -901,12 +932,11 @@
if(anchored || (buckled && buckled.anchored))
fixed = 1
if(on && !(movement_type & FLOATING) && !fixed)
- animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
- sleep(10)
- animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1)
+ animate(src, pixel_z = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
+ animate(pixel_z = -4, time = 10, loop = -1, flags = ANIMATION_RELATIVE)
setMovetype(movement_type | FLOATING)
else if(((!on || fixed) && (movement_type & FLOATING)))
- animate(src, pixel_y = get_standard_pixel_y_offset(lying), time = 10)
+ animate(src, pixel_z = get_standard_pixel_y_offset(lying), time = 10)
setMovetype(movement_type & ~FLOATING)
// The src mob is trying to strip an item from someone
@@ -1005,7 +1035,7 @@
var/pixel_y_diff = rand(-amplitude/3, amplitude/3)
var/final_pixel_x = get_standard_pixel_x_offset(lying)
var/final_pixel_y = get_standard_pixel_y_offset(lying)
- animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6)
+ animate(src, pixel_x = pixel_x_diff, pixel_y = pixel_y_diff , time = 2, loop = 6, flags = ANIMATION_PARALLEL | ANIMATION_RELATIVE)
animate(pixel_x = final_pixel_x , pixel_y = final_pixel_y , time = 2)
floating_need_update = TRUE
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 49a60c0411..735f271133 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -249,7 +249,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source)
SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) //parent calls can't overwrite the current proc args.
- if(!client)
+ if(!client && !audiovisual_redirect)
return
var/deaf_message
var/deaf_type
@@ -308,8 +308,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
AM.Hear(rendered, src, message_language, message, null, spans, message_mode, source)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message)
- if(client && !eavesdrop_range && say_test(message) == "2") // Yell hook
- process_yelling(listening, rendered, src, message_language, message, spans, message_mode, source)
+ var/is_yell = (say_test(message) == "2")
+ if(client && !eavesdrop_range && is_yell) // Yell hook
+ listening |= process_yelling(listening, rendered, src, message_language, message, spans, message_mode, source)
//speech bubble
var/list/speech_bubble_recipients = list()
@@ -320,6 +321,22 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_recipients, 30)
+ //Listening gets trimmed here if a vocal bark's present. If anyone ever makes this proc return listening, make sure to instead initialize a copy of listening in here to avoid wonkiness
+ if(vocal_bark || vocal_bark_id)
+ for(var/mob/M in listening)
+ if(!M.client)
+ continue
+ if(!(M.client.prefs.toggles & SOUND_BARK))
+ listening -= M
+ var/barks = min(round((LAZYLEN(message) / vocal_speed)) + 1, BARK_MAX_BARKS)
+ var/total_delay
+ for(var/i in 1 to barks)
+ if(total_delay > BARK_MAX_TIME)
+ break
+ addtimer(CALLBACK(src, /atom/movable/proc/bark, listening, (message_range * (is_yell ? 4 : 1)), (vocal_volume * (is_yell ? 1.5 : 1)), BARK_DO_VARY(vocal_pitch, vocal_pitch_range)), total_delay)
+ total_delay += rand(DS2TICKS((vocal_speed / BARK_SPEED_BASELINE) * (is_yell ? 0.5 : 1)), DS2TICKS(vocal_speed / BARK_SPEED_BASELINE) + DS2TICKS((vocal_speed / BARK_SPEED_BASELINE) * (is_yell ? 0.5 : 1))) TICKS
+
+
/atom/movable/proc/process_yelling(list/already_heard, rendered, atom/movable/speaker, datum/language/message_language, message, list/spans, message_mode, obj/source)
if(last_yell > (world.time - 10))
to_chat(src, "
Your voice doesn't project as far as you try to yell in such quick succession.") // yeah no, no spamming an expensive floodfill.
@@ -344,6 +361,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/atom/movable/AM = _AM
AM.Hear(rendered, speaker, message_language, message, null, spans, message_mode, source)
+ return overhearing
+
/mob/proc/binarycheck()
return FALSE
diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm
index 2a68668889..cb32b5c893 100644
--- a/code/modules/mob/living/silicon/ai/examine.dm
+++ b/code/modules/mob/living/silicon/ai/examine.dm
@@ -18,7 +18,7 @@
else if (!shunted && !client)
. += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem..."
if(length(.) > 1)
- .[1] += "\n
"
+ .[1] += "
"
. += ""
diff --git a/code/modules/mob/living/silicon/examine.dm b/code/modules/mob/living/silicon/examine.dm
index 7de281de5f..0840ea1191 100644
--- a/code/modules/mob/living/silicon/examine.dm
+++ b/code/modules/mob/living/silicon/examine.dm
@@ -1,5 +1,4 @@
/mob/living/silicon/examine(mob/user) //Displays a silicon's laws to ghosts
- . = ..()
if(laws && isobserver(user))
. += "
[src] has the following laws:"
for(var/law in laws.get_law_list(include_zeroth = TRUE))
diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm
index f8c3dd37e9..2aa9194dc8 100644
--- a/code/modules/mob/living/silicon/robot/examine.dm
+++ b/code/modules/mob/living/silicon/robot/examine.dm
@@ -49,10 +49,13 @@
if(DEAD)
. += "
It looks like its system is corrupted and requires a reset."
+ if(LAZYLEN(.) > 1)
+ .[2] = "
[.[2]]"
+
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .)
if(length(.) > 1)
- .[1] += "\n
"
+ .[1] += "
"
. += ""
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 13f1bea1e4..3b89413271 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -49,6 +49,9 @@
typing_indicator_state = /obj/effect/overlay/typing_indicator/machine
+ vocal_bark_id = "synth"
+ vocal_pitch_range = 0.1
+
/mob/living/silicon/Initialize(mapload)
. = ..()
GLOB.silicon_mobs += src
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 0d04d4b562..a7bd8ca921 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -35,6 +35,9 @@
collar_type = "cat"
var/held_icon = "cat2"
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "mutedc4"
+ vocal_pitch = 1.4
+ vocal_pitch_range = 0.4
/mob/living/simple_animal/pet/cat/Initialize(mapload)
. = ..()
@@ -136,6 +139,7 @@
..()
/mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory()
+ var/saved_color
if(fexists("data/npc_saves/Runtime.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
S["family"] >> family
@@ -146,14 +150,21 @@
return
var/list/json = json_decode(file2text(json_file))
family = json["family"]
+ saved_color = json["color"]
if(isnull(family))
family = list()
+ if(!isnull(saved_color))
+ add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY)
/mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead)
var/json_file = file("data/npc_saves/Runtime.json")
var/list/file_data = list()
family = list()
if(!dead)
+ if(color)
+ file_data["color"] = json_encode(color)
+ else
+ file_data["color"] = null
for(var/mob/living/simple_animal/pet/cat/kitten/C in children)
if(istype(C,type) || C.stat || !C.z || !C.butcher_results) //That last one is a work around for hologram cats
continue
@@ -161,6 +172,8 @@
family[C.type] += 1
else
family[C.type] = 1
+ else
+ file_data["color"] = null
file_data["family"] = family
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index bce46fe10d..fb8c937ea8 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -20,6 +20,9 @@
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "bullet"
+ vocal_speed = 6
+
/mob/living/simple_animal/pet/dog/ComponentInitialize()
. = ..()
AddElement(/datum/element/wuv, "yaps happily!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "growls!", EMOTE_AUDIBLE)
@@ -436,6 +439,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
/mob/living/simple_animal/pet/dog/corgi/Ian/proc/Read_Memory()
set waitfor = FALSE
+ var/saved_color
if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Ian.sav")
S["age"] >> age
@@ -450,12 +454,15 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
age = json["age"]
record_age = json["record_age"]
saved_head = json["saved_head"]
+ saved_color = json["color"]
if(isnull(age))
age = 0
if(isnull(record_age))
record_age = 1
if(saved_head)
place_on_head(new saved_head)
+ if(!isnull(saved_color))
+ add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY)
/mob/living/simple_animal/pet/dog/corgi/Ian/proc/Write_Memory(dead)
var/json_file = file("data/npc_saves/Ian.json")
@@ -470,10 +477,15 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
file_data["saved_head"] = inventory_head.type
else
file_data["saved_head"] = null
+ if(color)
+ file_data["color"] = json_encode(color)
+ else
+ file_data["color"] = null
else
file_data["age"] = 0
file_data["record_age"] = record_age
file_data["saved_head"] = null
+ file_data["color"] = null
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
@@ -630,6 +642,8 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
mob_size = MOB_SIZE_SMALL
collar_type = "puppy"
+ vocal_pitch = 1.6
+
//puppies cannot wear anything.
/mob/living/simple_animal/pet/dog/corgi/puppy/Topic(href, href_list)
if(href_list["remove_inv"] || href_list["add_inv"])
@@ -651,6 +665,8 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
maxbodytemp = T0C + 40
held_icon = "void_puppy"
+ vocal_pitch = 0.6
+
/mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0)
return 1 //Void puppies can navigate space.
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 0ec687c3e3..ca827c29e5 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -36,6 +36,7 @@
var/datum/reagent/milk_reagent = /datum/reagent/consumable/milk
footstep_type = FOOTSTEP_MOB_SHOE
+ vocal_bark_id = "banjoc3"
/mob/living/simple_animal/hostile/retaliate/goat/Initialize(mapload, /datum/reagent/milk_reagent)
udder = new (null, milk_reagent)
@@ -144,6 +145,8 @@
blood_volume = BLOOD_VOLUME_NORMAL
footstep_type = FOOTSTEP_MOB_SHOE
+ vocal_bark_id = "mutedc2"
+ vocal_pitch = 1.2
/mob/living/simple_animal/cow/Initialize(mapload)
udder = new(null, milk_reagent)
@@ -248,6 +251,8 @@
gold_core_spawnable = FRIENDLY_SPAWN
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "squeak"
+ vocal_pitch = 1.4
/mob/living/simple_animal/chick/Initialize(mapload)
. = ..()
@@ -310,6 +315,9 @@
var/static/chicken_count = 0
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "synthgrunt"
+ vocal_pitch = 1.4
+ vocal_pitch_range = 0.4
/mob/living/simple_animal/chicken/Initialize(mapload)
. = ..()
@@ -404,6 +412,8 @@
var/static/kiwi_count = 0
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "squeak"
+ vocal_pitch = 1.4
/mob/living/simple_animal/kiwi/Destroy()
--kiwi_count
@@ -482,6 +492,8 @@
gold_core_spawnable = FRIENDLY_SPAWN
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "squeak"
+ vocal_pitch = 1.4
/mob/living/simple_animal/babyKiwi/Initialize(mapload)
. = ..()
@@ -558,3 +570,4 @@
maxHealth = 75
blood_volume = BLOOD_VOLUME_NORMAL
footstep_type = FOOTSTEP_MOB_SHOE
+ vocal_bark_id = "mutedc4"
diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm
index 4e4fd7ccfc..475b50d44a 100644
--- a/code/modules/mob/living/simple_animal/friendly/fox.dm
+++ b/code/modules/mob/living/simple_animal/friendly/fox.dm
@@ -23,6 +23,11 @@
gold_core_spawnable = FRIENDLY_SPAWN
footstep_type = FOOTSTEP_MOB_CLAW
+ vocal_bark_id = "bullet"
+ vocal_speed = 2
+ vocal_pitch = 1.6
+ vocal_pitch_range = 0.4
+
/mob/living/simple_animal/pet/fox/ComponentInitialize()
. = ..()
AddElement(/datum/element/mob_holder, "fox")
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index d49eb1251d..f67c5dcb97 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -29,6 +29,8 @@
gold_core_spawnable = FRIENDLY_SPAWN
var/chew_probability = 1
faction = list("rat")
+ vocal_bark_id = "squeak"
+ vocal_pitch = 1.4
/mob/living/simple_animal/mouse/Initialize(mapload)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/friendly/plushie.dm b/code/modules/mob/living/simple_animal/friendly/plushie.dm
index ff95e8fe86..4821695f45 100644
--- a/code/modules/mob/living/simple_animal/friendly/plushie.dm
+++ b/code/modules/mob/living/simple_animal/friendly/plushie.dm
@@ -29,6 +29,8 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
pressure_resistance = 200
+ vocal_bark_id = "squeak"
+ vocal_pitch_range = 0.4
/mob/living/simple_animal/pet/plushie/ComponentInitialize()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 1f12195ad6..c05aba8227 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -910,11 +910,13 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
speak += pick("...[longest_survival].", "The things I've seen!", "I have lived many lives!", "What are you before me?")
desc += " Old as sin, and just as loud. Claimed to be [rounds_survived]."
speak_chance = 20 //His hubris has made him more annoying/easier to justify killing
- add_atom_colour("#EEEE22", FIXED_COLOUR_PRIORITY)
+ if(!color)
+ add_atom_colour("#EEEE22", FIXED_COLOUR_PRIORITY)
else if(rounds_survived == longest_deathstreak)
speak += pick("What are you waiting for!", "Violence breeds violence!", "Blood! Blood!", "Strike me down if you dare!")
desc += " The squawks of [-rounds_survived] dead parrots ring out in your ears..."
- add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY)
+ if(!color)
+ add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY)
else if(rounds_survived > 0)
speak += pick("...again?", "No, It was over!", "Let me out!", "It never ends!")
desc += " Over [rounds_survived] shifts without a \"terrible\" \"accident\"!"
@@ -947,6 +949,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
..(gibbed)
/mob/living/simple_animal/parrot/Poly/proc/Read_Memory()
+ var/saved_color
if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Poly.sav")
S["phrases"] >> speech_buffer
@@ -963,8 +966,11 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
rounds_survived = json["roundssurvived"]
longest_survival = json["longestsurvival"]
longest_deathstreak = json["longestdeathstreak"]
+ saved_color = json["color"]
if(!islist(speech_buffer))
speech_buffer = list()
+ if(!isnull(saved_color))
+ add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY)
/mob/living/simple_animal/parrot/Poly/proc/Write_Memory(dead)
var/json_file = file("data/npc_saves/Poly.json")
@@ -978,6 +984,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
file_data["longestdeathstreak"] = rounds_survived - 1
else
file_data["longestdeathstreak"] = longest_deathstreak
+ file_data["color"] = null
else
file_data["roundssurvived"] = rounds_survived + 1
if(rounds_survived + 1 > longest_survival)
@@ -985,6 +992,10 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list(
else
file_data["longestsurvival"] = longest_survival
file_data["longestdeathstreak"] = longest_deathstreak
+ if(color)
+ file_data["color"] = json_encode(color)
+ else
+ file_data["color"] = null
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 5b487f503e..1671c4bca9 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -482,7 +482,7 @@
update_action_buttons_icon()
return mobility_flags
-/mob/living/simple_animal/update_transform()
+/mob/living/simple_animal/update_transform(do_animate)
var/matrix/ntransform = matrix(transform) //aka transform.Copy()
var/changed = 0
diff --git a/code/modules/mob/living/update_icons.dm b/code/modules/mob/living/update_icons.dm
index d3264c93a2..4ad861bf2b 100644
--- a/code/modules/mob/living/update_icons.dm
+++ b/code/modules/mob/living/update_icons.dm
@@ -1,5 +1,5 @@
//IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can.
-/mob/living/update_transform()
+/mob/living/update_transform(do_animate = TRUE)
var/matrix/ntransform = matrix(transform) //aka transform.Copy()
var/final_pixel_y = pixel_y
var/changed = 0
@@ -25,5 +25,9 @@
resize = RESIZE_DEFAULT_SIZE
if(changed)
- animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, easing = EASE_IN|EASE_OUT)
+ if(do_animate)
+ animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, easing = EASE_IN|EASE_OUT, flags = ANIMATION_PARALLEL)
+ else
+ transform = ntransform
+ pixel_y = final_pixel_y
floating_need_update = TRUE
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index f22c87913f..cfc2a6822a 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -141,7 +141,7 @@
return
hearers -= ignored_mobs
- if(target_message && target && istype(target) && target.client)
+ if(target_message && target && istype(target) && (target.client || target.audiovisual_redirect))
hearers -= target
if(omni)
target.show_message(target_message)
@@ -158,7 +158,7 @@
if(self_message)
hearers -= src
for(var/mob/M in hearers)
- if(!M.client)
+ if(!M.client && !M.audiovisual_redirect)
continue
if(omni)
M.show_message(message)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index a3bcdb0e55..f59ed15c88 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -229,17 +229,23 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
return copytext_char(sanitize(.),1,MAX_MESSAGE_LEN)
/proc/shake_camera(mob/M, duration, strength=1)
- if(!M || !M.client || duration < 1)
+ set waitfor = FALSE
+ if(!M || !M.client || duration <= 0)
return
var/client/C = M.client
+ if (C.prefs.screenshake==0)
+ return
var/oldx = C.pixel_x
var/oldy = C.pixel_y
- var/max = strength*world.icon_size
- var/min = -(strength*world.icon_size)
+ var/clientscreenshake = (C.prefs.screenshake * 0.01)
+ var/max = (strength*clientscreenshake) * world.icon_size
+ var/min = -((strength*clientscreenshake) * world.icon_size)
+ var/roundedduration = -round(-duration) // round() with only one arg will always round down. so uh. this is Something all right
- for(var/i in 0 to duration-1)
+ for(var/i in 0 to roundedduration-1)
+ duration--
if (i == 0)
- animate(C, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
+ animate(C, pixel_x=(rand(min,max)*duration), pixel_y=(rand(min,max)*duration), time=1)
else
animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
animate(pixel_x=oldx, pixel_y=oldy, time=1)
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index fad48b4854..27fb30a459 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -5,6 +5,7 @@
desc = "A solar panel. Generates electricity when in contact with sunlight."
icon = 'goon/icons/obj/power.dmi'
icon_state = "sp_base"
+ minimap_override_color = "#02026a"
density = TRUE
use_power = NO_POWER_USE
idle_power_usage = 0
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 836ed3b804..3f2f4d3e65 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -3,6 +3,7 @@
name = "projectile gun"
icon_state = "pistol"
w_class = WEIGHT_CLASS_NORMAL
+ recoil = 0.25
var/spawnwithmagazine = TRUE
var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
var/obj/item/ammo_box/magazine/magazine
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index afb30631e0..fe42fc2d99 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -5,6 +5,7 @@
mag_type = /obj/item/ammo_box/magazine/internal/cylinder
fire_sound = "sound/weapons/revolvershot.ogg"
casing_ejector = FALSE
+ recoil = 0.5
/obj/item/gun/ballistic/revolver/Initialize(mapload)
. = ..()
@@ -285,6 +286,7 @@
item_state = "shotgun"
w_class = WEIGHT_CLASS_BULKY
weapon_weight = WEAPON_MEDIUM
+ recoil = 1
force = 10
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BACK
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index c6fd27b103..25e4b6b12a 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -5,6 +5,7 @@
item_state = "shotgun"
fire_sound = "sound/weapons/gunshotshotgunshot.ogg"
w_class = WEIGHT_CLASS_BULKY
+ recoil = 1
force = 10
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BACK
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index dd759f9e3c..03dfc46713 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -16,6 +16,7 @@
name = "energy gun"
desc = "A basic energy-based gun."
icon = 'icons/obj/guns/energy.dmi'
+ recoil = 0.1
var/obj/item/stock_parts/cell/cell //What type of power cell this uses
var/cell_type = /obj/item/stock_parts/cell
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 3f41ac859f..9b10a843e8 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -8,6 +8,7 @@
item_flags = NONE
obj_flags = UNIQUE_RENAME
weapon_weight = WEAPON_LIGHT
+ recoil = 0.5
can_flashlight = 1
flight_x_offset = 15
flight_y_offset = 9
diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm
index 07066023b3..8de7633a79 100644
--- a/code/modules/projectiles/guns/misc/syringe_gun.dm
+++ b/code/modules/projectiles/guns/misc/syringe_gun.dm
@@ -4,6 +4,7 @@
icon_state = "syringegun"
item_state = "syringegun"
w_class = WEIGHT_CLASS_NORMAL
+ recoil = 0.1
throw_speed = 3
throw_range = 7
force = 4
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 3554fc7052..d91a336db0 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -1045,13 +1045,13 @@
glass_desc = "Delicious flavored strawberry syrup mixed with milk."
value = REAGENT_VALUE_VERY_COMMON
-/datum/reagent/consumable/tea/pinkmilk/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/pinkmilk/on_mob_life(mob/living/carbon/M)
if(prob(15))
to_chat(M, "
[pick("You cant help to smile.","You feel nostalgia all of sudden.","You remember to relax.")]")
..()
. = 1
-/datum/reagent/consumable/pinktea //Tiny Tim song
+/datum/reagent/consumable/tea/pink //Tiny Tim song
name = "Strawberry Tea"
description = "A timeless classic!"
color = "#f76aeb"//rgb(247, 106, 235)
@@ -1061,7 +1061,7 @@
glass_name = "mug of strawberry tea"
glass_desc = "Delicious traditional tea flavored with strawberries."
-/datum/reagent/consumable/tea/pinktea/on_mob_life(mob/living/carbon/M)
+/datum/reagent/consumable/tea/pink/on_mob_life(mob/living/carbon/M)
if(prob(10))
to_chat(M, "
[pick("Diamond skies where white deer fly.","Sipping strawberry tea.","Silver raindrops drift through timeless, Neverending June.","Crystal ... pearls free, with love!","Beaming love into me.")]")
..()
diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm
index d542694236..dc07a5a184 100644
--- a/code/modules/research/techweb/_techweb.dm
+++ b/code/modules/research/techweb/_techweb.dm
@@ -17,7 +17,7 @@
var/list/obj/machinery/computer/rdconsole/consoles_accessing = list()
var/id = "generic"
var/list/research_logs = list() //IC logs.
- var/largest_bomb_value = 0
+ var/largest_values = list()
var/organization = "Third-Party" //Organization name, used for display.
var/list/next_income = list() //To be applied on the next passive techweb income
var/list/last_bitcoins = list() //Current per-second production, used for display only.
diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
index 17b91fa23d..27df6a14f0 100644
--- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm
+++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm
@@ -47,7 +47,20 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
promptAndCheckIn(user)
/obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user)
- var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num
+ //SPLURT EDIT - max infinidorms rooms
+ var/max_rooms = CONFIG_GET(number/max_infinidorms)
+ var/chosenRoomNumber
+ if(max_rooms == 0)
+ playsound(src, 'sound/machines/terminal_error.ogg', 15, 1)
+ to_chat(user, span_warning("We're currently not offering service, please come back another day!"))
+ return
+
+ chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num
+ if(max_rooms > 0 && mob_dorms[user]?.len >= max_rooms && !activeRooms["[chosenRoomNumber]"] && !storedRooms["[chosenRoomNumber]"])
+ to_chat(user, span_warning("Your free trial of Hilbert's Hotel has ended! Please select one of the rooms you've already visited."))
+ chosenRoomNumber = input(user, "Select one of your previous rooms", "Room number") as null|anything in mob_dorms[user]
+
+ //SPLURT EDIT END
if(!chosenRoomNumber || !user.CanReach(src))
return
if(chosenRoomNumber > SHORT_REAL_LIMIT)
diff --git a/code/modules/vehicles/mecha/combat/five_stars.dm b/code/modules/vehicles/mecha/combat/five_stars.dm
index 6a73c3adde..def8e94cc8 100644
--- a/code/modules/vehicles/mecha/combat/five_stars.dm
+++ b/code/modules/vehicles/mecha/combat/five_stars.dm
@@ -4,7 +4,6 @@
icon = 'icons/mecha/mecha_96x96.dmi'
icon_state = "five_stars"
armor = list(MELEE = 100, BULLET = 50, LASER = 35, ENERGY = 35, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
- step_in = 4
dir_in = 1 //Facing North.
max_integrity = 800
pixel_x = -32
diff --git a/config/entries/general.txt b/config/entries/general.txt
index dfadfddca9..4a0369313b 100644
--- a/config/entries/general.txt
+++ b/config/entries/general.txt
@@ -480,7 +480,7 @@ BOX_RANDOM_ENGINE Box TEG,3
BOX_RANDOM_ENGINE Box Empty,0
BOX_RANDOM_ENGINE Box Antimatter,1
BOX_RANDOM_ENGINE Box P.A.C.M.A.N,1
-BOX_RANDOM_ENGINE Box RBMK,1
+BOX_RANDOM_ENGINE Box RBMK,0
## Whether the suicide verb is allowed.
diff --git a/config/splurt/general.txt b/config/splurt/general.txt
index 3f8f3b0516..9ba4dc93b5 100644
--- a/config/splurt/general.txt
+++ b/config/splurt/general.txt
@@ -3,3 +3,11 @@
## The discord verification system makes use of https://github.com/optimumtact/orangescogs ##
## Needs a working database with the station's current schema ##
#NEED_DISCORD_TO_JOIN
+
+# Enable global barks
+# Uncomment this to allow player's speech barks #
+ENABLE_GLOBAL_BARKS
+
+# Max number of infinidorms each mob can use
+# -1 for infinite, 0 to deactivate infinidorms as a whole
+MAX_INFINIDORMS 5
diff --git a/html/changelogs/archive/2022-06.yml b/html/changelogs/archive/2022-06.yml
index 5a7c089847..46ed65f4bf 100644
--- a/html/changelogs/archive/2022-06.yml
+++ b/html/changelogs/archive/2022-06.yml
@@ -117,7 +117,172 @@
- rscadd: New cane for Plague Doctor
- rscadd: More accurate mask
- rscadd: Plague Doctor kit to Cargo Orders
+ BongaTheProto:
+ - tweak: Makes the new player panel a toggle so you can choose between the old one
+ and TG's current. Option in Game Preferences
+2022-06-06:
SandPoot:
- refactor: Completely replaces the new player panel *not the admin one* with TG's.
timothyteakettle:
- rscadd: adds paper skin and glass bones quirks
+2022-06-07:
+ Bhijn & Myr:
+ - rscadd: During pride month, station nukes are significantly more efficient at
+ revealing genders.
+ - rscadd: Station pets now retain their color between shifts!
+ - bugfix: Admin vote deobfuscation now properly displays votes as 0 if they were
+ simply never voted for.
+ - bugfix: Audiovisual redirection now works exactly as it used to. In laymen's terms,
+ this means folks in VR sleepers are aware of the world around them again!
+ - bugfix: The shake animation, jiggle animation, squish animation, jitter animation,
+ and float animation, have all been fixed.
+ - bugfix: This also means that storage animations are fully working again. It's
+ been a few years!
+ - bugfix: The pull animation no longer interrupts ongoing animations.
+ - tweak: The pull animation now supports diagonal directions (currently only applies
+ to the initial grab! pull code is spaghetti)
+ - bugfix: All screenshake sources now fully support the screenshake pref
+ - code_imp: cit_screenshake.dm has been fully merged into the base files.
+ - bugfix: You can no longer remotely apply fingerprints to storage objects by clicking
+ and dragging it around. Additionally, storage objects now rustle again when
+ clicking and dragging (only took like,, a year to fix)
+ - bugfix: The pickup animation now properly slides into your spaceman again, instead
+ of just kinda disappearing.
+ - tweak: When pulling a resting mob, they'll now skip the laying animation entirely,
+ fixing a visual oddity where they shrink and grow to flip.
+ - tweak: Alerts are now a little snappier and bouncier, as they've been swapped
+ from sine easing, to back easing.
+ - tweak: Radial menus now use sine easing, rather than linear easing. This just
+ looks a little prettier.
+ - tweak: Runechat now properly respects an object's X offset. Previously, it relied
+ on a hardcoded check for dogborgs.
+ - tweak: The float animation now uses pixel_z instead of pixel_y, fixing issues
+ where the Y offset gets wiped due to the float animation. This also makes floating
+ fully compatible with ctrl+WASD."
+ BongaTheProto:
+ - rscadd: New panting emote
+ - rscadd: Adds a recipe for the cum donut
+ - rscadd: Adds a panting emote
+ - rscadd: Adds Dominant Aura and Well-trained quirks
+ - rscadd: Snack alt title for assistants
+ - soundadd: Adds sounds for the kiss them deeply interaction
+ - soundadd: Adds moaning sounds for verb moans
+ - tweak: Changes bane syndrome's value to -2
+ - tweak: Makes xenocommon a selectable language
+ - tweak: Fucking people's throats gives an actually harmful amount of oxyloss again
+ - tweak: If you have the voracious trait, the fat moodlet will become a positive
+ one.
+ - tweak: headpat slut will now give you an modified wuv element and possibly make
+ you cum
+ - bugfix: Fixes the notify verb so it actually removes you from the list if you
+ want it to
+ - bugfix: makes the cheesed moodlet actually check if you're a felinid
+ - bugfix: Gives Bane Syndrome its effects back
+ - bugfix: You can now actually dispense tea from the Soda Dispenser, rejoice!
+ - rscdel: deletes the double railing declaration in the code
+ - code_imp: changes some things to use the cooldown system
+ - code_imp: puts signal handlers in a couple procs where they needed to be
+ - code_imp: Adds a signal for when mobs use emotes
+ SandPoot:
+ - refactor: Does some extremely minor touches on pulling/pushing code.
+ timothyteakettle:
+ - rscadd: updates existing poly maid outfit with tg sprite but polychromatic
+ - rscadd: adds polychromic maid apron, gloves, collar, headband
+ - rscadd: adds support for polychromic accessories
+2022-06-08:
+ SandPoot:
+ - tweak: The "MobInteraction" is now written on typescript.
+2022-06-09:
+ Anonymous:
+ - rscadd: Players, who somehow ended up controlling a simple mob, now can change
+ their genital set just like robots and pAIs.
+ - rscdel: My sanity.
+2022-06-10:
+ AshTheDerg:
+ - rscadd: Holgraphic Security Badges (Backpack loadout option for Security Department,
+ including Detectives)
+ - rscadd: Modular PC vendor
+ - rscadd: Rifle sling, craftable via biogenerator
+ - rscadd: Debug Omnitool (Admin-only, sorry)
+ - tweak: Enforcer Voidsuit now has armor equivalent to Security Winter Jackets
+ - tweak: Gave Detectives badges, too!
+2022-06-11:
+ Bhijn & Myr:
+ - rscadd: The station minimap now features higher detail! Instead of just windows
+ and grilles being outlined, all dense+anchored structures and machinery are
+ shown on the minimap.
+ - rscadd: The station minimap now supports obfuscating entire areas, via the minimap_show_walls
+ var.
+ - rscadd: 'The station minimap now supports defining two area colors, allowing for
+ a checkerboard pattern! tweak: Hallways and maint have been given white and
+ gray colors, respectively, for ease of readability. tweak: Ruins are now obfuscated
+ on the minimap, and have been given a subtle, yet distinct, color pattern!'
+ - bugfix: The station minimap no longer errors when you mouse over it
+ - rscadd: 'The station minimap now supports multiz! (However, due to bugginess,
+ multiz minimaps won''t display area tooltips.) tweak: The station minimap now
+ features pixel-perfect scaling.'
+ - code_imp: The station minimap can now support managing data for up to 16,581,374
+ areas without any conflicts at all! Before, BYOND's psuedorandom RNG meant that
+ it was somewhat common for areas to collide with each others' data.
+ - rscadd: Talking is now accompanied with fully-customizable sounds! You can modify
+ your character's speech under the speech tab in chargen, and you can toggle
+ these sounds via the "Hear/Silence Vocal Barks" verb under the preferences tab!
+ This also fully supports genetics.
+ - bugfix: Admittedly an unatomized change, but Cit's DNA blocks can now properly
+ be updated through genetics. Before, these required a complete genetics reset
+ to apply.
+ - rscadd: 'The chat now supports blockquotes! tweak: Examining, medical scanners,
+ self-checking, and mood checkups, have all been converted to make use of blockquotes.'
+ Bhijn & Myr (+ UI work and cleanup by Sandpoot!):
+ - rscadd: Colormates now have HSV coloration!
+ - tweak: Colormates have had their "please use white clothing" message removed,
+ as that recommendation's now mostly pointless
+ - tweak: The default mode for colormates is now HSV coloration
+ - tweak: The temp messages in colormates have been tweaked slightly to be more user-friendly,
+ as they're user-facing.
+ - tweak: The description for constants in the colormate matrix mode has been fixed;
+ the constant variables have nothing to do with contrast, they simply add color
+ - tweak: Matrix mode has been made a lot more usable; it's now clamped between -10
+ and 10, and features a step of 0.01, making it much easier to simply click and
+ drag to adjust the values, rather than having to punch them in manually
+ Putnam3145:
+ - balance: QCD matter is now worth 10x as much and makes 2 research pointer per
+ mole
+ SandPoot:
+ - rscadd: Added a search box to all vending machine uis.
+ - qol: Vending machines have candystripes for better clarity.
+ - bugfix: Fixed items that use strip_mod and strip_silence (stripping people faster
+ or without giving them a message)
+ keronshb:
+ - bugfix: Families fixed from crashing
+2022-06-12:
+ Anonymous:
+ - tweak: 'wip: Trencher''s coats are now able to hold detective-tier items, however
+ cargo costs for them are increased.'
+ AshTheDerg:
+ - rscadd: Sylveon Bow "horns"
+ - rscadd: Sylveon Ribbon "wings"
+ BongaTheProto:
+ - tweak: Now size normalizers will continuously normalize you and absorb the effect
+ of size changing mechanics in-game. Giving you all of the changes back when
+ you take off the clothing
+ - bugfix: Now you can actually give your character numbers in their names and species
+ - bugfix: Gives the syntech ring and band an actual ring path so they can be attached
+ to gloves (doesn't work if you use them this way tho)
+ - bugfix: Definitely fixes the bug where spawning with more than one size normalizer
+ locks you on size one _in case it still exists_
+ - bugfix: "Fixes a bug with nanites, probably \xBF"
+ - code_imp: Makes the size normalizer code less snowflakey and now relies on a component
+2022-06-13:
+ Bhijn & Myr:
+ - bugfix: Jukebox audio is now audible within closets, crates, etc!
+2022-06-15:
+ AshTheDerg:
+ - rscadd: Added Syndicate Asteroid Listening Post + Ghost Role
+ - rscadd: Added Radio Station Ship
+2022-06-16:
+ BongaTheProto:
+ - imageadd: New ear sprites
+ - tweak: Now subs will actually blush when examining doms
+ - server: Limits the amount of infinidorms each person can create for the sake of
+ helping the TD
diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi
index 03849efa5a..f801c483f1 100644
Binary files a/icons/mob/clothing/accessories.dmi and b/icons/mob/clothing/accessories.dmi differ
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index ca8a7312fa..9bd206e04e 100644
Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ
diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi
index 20b8576277..2b317737d7 100644
Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ
diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi
index 04d9b20a75..ce25963360 100644
Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ
diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi
index 79cb2bff77..f633f030c3 100644
Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index d4cd4b4f2f..17073805c9 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi
index 8540b2f392..c9491af6b2 100644
Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index c16b416cd8..de7dd234b1 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/modular_citadel/code/game/objects/cit_screenshake.dm b/modular_citadel/code/game/objects/cit_screenshake.dm
deleted file mode 100644
index 222de37f82..0000000000
--- a/modular_citadel/code/game/objects/cit_screenshake.dm
+++ /dev/null
@@ -1,51 +0,0 @@
-//we vlambeer now
-
-/obj/proc/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit
- set waitfor = FALSE
- if(!M || !M.client || duration <= 0)
- return
- var/client/C = M.client
- if (C.prefs.screenshake==0)
- return
- var/oldx = C.pixel_x
- var/oldy = C.pixel_y
- var/clientscreenshake = (C.prefs.screenshake * 0.01)
- var/max = (strength*clientscreenshake) * world.icon_size
- var/min = -((strength*clientscreenshake) * world.icon_size)
-
- for(var/i in 0 to duration-1)
- if (i == 0)
- animate(C, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
- else
- animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1)
- animate(pixel_x=oldx, pixel_y=oldy, time=1)
-
-/obj/item/gun/energy
- recoil = 0.1
-
-/obj/item/gun/energy/kinetic_accelerator
- recoil = 0.5
-
-/obj/item/gun/ballistic
- recoil = 0.25
-
-/obj/item/gun/ballistic/shotgun
- recoil = 1
-
-/obj/item/gun/ballistic/revolver
- recoil = 0.5
-
-/obj/item/gun/ballistic/revolver/doublebarrel
- recoil = 1
-
-/obj/item/gun/syringe
- recoil = 0.1
-
-/obj/item/pneumatic_cannon/fire_items(turf/target, mob/user)
- . = ..()
- shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75))
-
-/obj/item/attack_obj(obj/O, mob/living/user)
- . = ..()
- if(force >= 20)
- shake_camera(user, ((force - 15) * 0.01 + 1), ((force - 15) * 0.01))
diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm
index 3824993009..0573a1a22a 100644
--- a/modular_citadel/code/modules/client/loadout/backpack.dm
+++ b/modular_citadel/code/modules/client/loadout/backpack.dm
@@ -175,3 +175,9 @@
/datum/gear/backpack/necklace//this is here because loadout doesn't support proper accessories
name = "A renameable necklace"
path = /obj/item/clothing/accessory/necklace
+
+/datum/gear/backpack/polymaidapron //this is ALSO here because loadout doesn't support proper accessories
+ name = "Polychromic maid apron"
+ path = /obj/item/clothing/accessory/maidapron/polychromic
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_initial_colors = list("#333333", "#FFFFFF")
diff --git a/modular_citadel/code/modules/client/loadout/gloves.dm b/modular_citadel/code/modules/client/loadout/gloves.dm
index 0b87ec65e6..766c6a7cac 100644
--- a/modular_citadel/code/modules/client/loadout/gloves.dm
+++ b/modular_citadel/code/modules/client/loadout/gloves.dm
@@ -13,3 +13,9 @@
/datum/gear/gloves/midnight
name = "Midnight gloves"
path = /obj/item/clothing/gloves/evening/black
+
+/datum/gear/gloves/maidpoly // WHAT DO YOU EVEN CALL THEM
+ name = "Polychromic maid gloves"
+ path = /obj/item/clothing/gloves/polymaid
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_initial_colors = list("#333333", "#FFFFFF")
diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm
index f2a7ead5be..d0563d2986 100644
--- a/modular_citadel/code/modules/client/loadout/head.dm
+++ b/modular_citadel/code/modules/client/loadout/head.dm
@@ -58,6 +58,12 @@
name = "Maid headband"
path= /obj/item/clothing/head/maid
+/datum/gear/head/maidband/poly
+ name = "Polychromic maid headband"
+ path= /obj/item/clothing/head/maid/polychromic
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_initial_colors = list("#333333", "#FFFFFF")
+
/datum/gear/head/flakhelm
name = "Flak Helmet"
path = /obj/item/clothing/head/flakhelm
diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm
index dc7735de2b..64d1fcdc1f 100644
--- a/modular_citadel/code/modules/client/loadout/neck.dm
+++ b/modular_citadel/code/modules/client/loadout/neck.dm
@@ -106,3 +106,9 @@
path = /obj/item/clothing/neck/cloak/cancloak/polychromic
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
loadout_initial_colors = list("#585858", "#373737", "#BEBEBE")
+
+/datum/gear/neck/maid
+ name = "Polychromatic Maid Collar"
+ path = /obj/item/clothing/neck/maid
+ loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
+ loadout_initial_colors = list("#333333", "#FFFFFF")
diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm
index 4404d70bcd..c0c7846112 100644
--- a/modular_citadel/code/modules/client/loadout/uniform.dm
+++ b/modular_citadel/code/modules/client/loadout/uniform.dm
@@ -52,7 +52,7 @@
name = "Polychromic maid costume"
path = /obj/item/clothing/under/rank/civilian/janitor/maid/polychromic
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
- loadout_initial_colors = list("#FFFFFF", "#000000")
+ loadout_initial_colors = list("#333333", "#FFFFFF")
/datum/gear/uniform/mailmanuniform
name = "Mailman's jumpsuit"
diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm
index e66cce7f28..8591f2f8a8 100644
--- a/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm
+++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm
@@ -131,8 +131,8 @@
"slams in and out of \the
[partner]'s mouth, [u_His] balls slapping off [t_His] face.")]"
if(rand(3))
partner.emote("chokes on \the [user]")
- if(prob(1) && istype(partner))
- partner.adjustOxyLoss(5)
+ /*if(prob(1) && istype(partner)) //Handled on modular_splurt
+ partner.adjustOxyLoss(5)*/
if(partner.a_intent == INTENT_HARM)
// adjustBruteLoss(5)
retaliation_message = pick(
diff --git a/modular_sand/code/modules/client/preferences_savefile.dm b/modular_sand/code/modules/client/preferences_savefile.dm
index ef6a14917a..1a604182c3 100644
--- a/modular_sand/code/modules/client/preferences_savefile.dm
+++ b/modular_sand/code/modules/client/preferences_savefile.dm
@@ -6,3 +6,14 @@
else
var/tmp = language
language = list(tmp)
+
+/datum/preferences/update_preferences(current_version, savefile/S)
+ // Citadel added a new bitfield to toggles, we need to push our prefs forward starting from the last bit
+ if(current_version < 55)
+ if(CHECK_BITFIELD(toggles, VERB_CONSENT))
+ DISABLE_BITFIELD(toggles, VERB_CONSENT)
+ ENABLE_BITFIELD(toggles, LEWD_VERB_SOUNDS)
+ if(CHECK_BITFIELD(toggles, SOUND_BARK))
+ DISABLE_BITFIELD(toggles, SOUND_BARK)
+ ENABLE_BITFIELD(toggles, VERB_CONSENT)
+ . = ..()
diff --git a/modular_sand/code/modules/clothing/gloves/_gloves.dm b/modular_sand/code/modules/clothing/gloves/_gloves.dm
index b1984e9770..65f7de4825 100644
--- a/modular_sand/code/modules/clothing/gloves/_gloves.dm
+++ b/modular_sand/code/modules/clothing/gloves/_gloves.dm
@@ -1,16 +1,14 @@
/obj/item/clothing/gloves
var/dummy_thick = FALSE // is able to hold accessories on its item
- // Sandstorm edit - Removed the old attached accessory system. We use a list of accessories instead.
- var/list/obj/item/clothing/accessory/ring/attached_accessories = list()
var/max_accessories = 1
- // Sandstorm edit END
- var/mutable_appearance/accessory_overlay
+ var/list/obj/item/clothing/accessory/ring/attached_accessories = list()
+ var/list/mutable_appearance/accessory_overlays = list()
/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands)
- if(accessory_overlay)
- . += accessory_overlay
+ if(length(accessory_overlays))
+ . += accessory_overlays
/obj/item/clothing/gloves/attackby(obj/item/I, mob/user, params)
if(!attach_accessory(I, user))
@@ -20,7 +18,7 @@
. = ..()
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
- if(length(attached_accessories)) // Sandstorm edit
+ if(length(attached_accessories))
remove_accessory(user)
/obj/item/clothing/gloves/equipped(mob/user, slot)
@@ -70,14 +68,16 @@
if((flags_inv & HIDEACCESSORY) || (A.flags_inv & HIDEACCESSORY))
return TRUE
- // Sandstorm edit
- accessory_overlay = mutable_appearance(I.mob_overlay_icon, I.item_state)
- for(var/obj/item/clothing/accessory/ring/attached_accessory in attached_accessories)
- var/mutable_appearance/Y = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.icon_state, ABOVE_HUD_LAYER)
- Y.alpha = attached_accessory.alpha
- Y.color = attached_accessory.color
- accessory_overlay.add_overlay(Y)
- // Sandstorm edit END
+ accessory_overlays = list(mutable_appearance('icons/mob/clothing/accessories.dmi', "blank"))
+ for(var/obj/item/clothing/accessory/attached_accessory in attached_accessories)
+ var/datum/element/polychromic/polychromic = LAZYACCESS(attached_accessory.comp_lookup, "item_worn_overlays")
+ if(!polychromic)
+ var/mutable_appearance/accessory_overlay = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.item_state || attached_accessory.icon_state, ABOVE_HUD_LAYER)
+ accessory_overlay.alpha = attached_accessory.alpha
+ accessory_overlay.color = attached_accessory.color
+ accessory_overlays += accessory_overlay
+ else
+ polychromic.apply_worn_overlays(attached_accessory, FALSE, attached_accessory.mob_overlay_icon, attached_accessory.item_state || attached_accessory.icon_state, NONE, accessory_overlays)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
@@ -91,10 +91,8 @@
if(!can_use(user))
return
- // Sandstorm edit
if(length(attached_accessories))
var/obj/item/clothing/accessory/ring/A = attached_accessories[length(attached_accessories)]
- // Sandstorm edit END
A.detach(src, user)
if(user.put_in_hands(A))
to_chat(user, "
You detach [A] from [src].")
diff --git a/modular_sand/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/modular_sand/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 5b80e1b91c..c0b7ce2ca5 100644
--- a/modular_sand/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/modular_sand/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -145,7 +145,7 @@
/datum/reagent/consumable/pinkmilk
hydration = 4
-/datum/reagent/consumable/pinktea
+/datum/reagent/consumable/tea/pink
hydration = 4
/datum/reagent/consumable/monkey_energy
diff --git a/modular_splurt/README.md b/modular_splurt/README.md
index 1249b0be0f..c0c251cf64 100644
--- a/modular_splurt/README.md
+++ b/modular_splurt/README.md
@@ -1,5 +1,5 @@
# About modularizing defines
-Since #define clauses can't be properly modularized and need to be loaded first than the rest of the code for it to catch them, the modular_splurt/code/_DEFINES/ folder has been deleted and all of its contents have been moved to code/__DEFINES/splurtcode/
+Since #define clauses can't be properly modularized and need to be loaded first than the rest of the code for it to catch them, the modular_splurt/code/_DEFINES/ folder has been deleted and all of its contents have been moved to code\\__SPLURTCODE\\DEFINES
Please use this folder the same way you'd use the _DEFINES folder once found inside this directory
diff --git a/modular_splurt/_maps/RandomRuins/SpaceRuins/radiostation.dmm b/modular_splurt/_maps/RandomRuins/SpaceRuins/radiostation.dmm
new file mode 100644
index 0000000000..8da26c8a5c
--- /dev/null
+++ b/modular_splurt/_maps/RandomRuins/SpaceRuins/radiostation.dmm
@@ -0,0 +1,1813 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aq" = (
+/obj/structure/closet/cabinet,
+/turf/open/floor/carpet,
+/area/ruin/space/radiostation/cabin)
+"ar" = (
+/obj/machinery/door/airlock/glass{
+ name = "Break Room"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"aH" = (
+/turf/closed/wall,
+/area/ruin/space/radiostation/break_room)
+"aL" = (
+/obj/structure/table,
+/obj/item/storage/box/donkpockets,
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#cee5d2"
+ },
+/obj/item/reagent_containers/glass/beaker/waterbottle,
+/obj/item/reagent_containers/glass/beaker/waterbottle,
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"bg" = (
+/obj/machinery/teleport/hub/syndicate,
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"bz" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/engineering,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"bK" = (
+/obj/machinery/door/airlock/glass{
+ name = "Control Room"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"bS" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"bU" = (
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"bV" = (
+/obj/structure/disposalpipe/trunk,
+/obj/machinery/disposal/bin,
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation/janitor)
+"ca" = (
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"cd" = (
+/obj/machinery/power/apc/auto_name/north{
+ name = "Engines"
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"dc" = (
+/obj/structure/closet,
+/obj/item/mop,
+/obj/item/reagent_containers/glass/bucket,
+/obj/item/lightreplacer,
+/obj/item/storage/bag/trash,
+/obj/item/soap,
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation/janitor)
+"dd" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"dE" = (
+/obj/machinery/vending/cola,
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"dQ" = (
+/obj/machinery/door/airlock{
+ name = "Cabin"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/carpet,
+/area/ruin/space/radiostation/cabin)
+"ep" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"fm" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"gD" = (
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation/janitor)
+"gQ" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"hr" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"hA" = (
+/obj/structure/disposalpipe/segment,
+/turf/closed/wall,
+/area/ruin/space/radiostation/break_room)
+"hO" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"hP" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"ie" = (
+/obj/structure/disposalpipe/segment,
+/turf/closed/wall,
+/area/ruin/space/radiostation/janitor)
+"ip" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/power/solar/fake,
+/turf/open/floor/plasteel/solarpanel,
+/area/ruin/space/radiostation/solars)
+"is" = (
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation/janitor)
+"iB" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"iQ" = (
+/obj/structure/sink{
+ pixel_y = -8
+ },
+/turf/closed/wall,
+/area/ruin/space/radiostation/janitor)
+"ja" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/item/beacon,
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"jO" = (
+/obj/structure/fans/tiny,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/external/glass,
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"ma" = (
+/obj/machinery/power/apc/auto_name/north{
+ name = "Break Room";
+ areastring = "/area/ruin/space/radiostation/break_room"
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"mb" = (
+/turf/open/floor/carpet,
+/area/ruin/space/radiostation/cabin)
+"mC" = (
+/obj/machinery/power/apc/auto_name/north{
+ name = "SMES Room";
+ areastring = "/area/ruin/space/radiostation/engineering"
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"mD" = (
+/obj/machinery/power/apc/auto_name/north{
+ name = "Control Room";
+ areastring = "/area/ruin/space/radiostation/control_room"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"nu" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"nE" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"nG" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"nN" = (
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"nQ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"oo" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"oT" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/carpet,
+/area/ruin/space/radiostation/cabin)
+"oZ" = (
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#cee5d2"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"pd" = (
+/obj/machinery/vending/kink,
+/turf/open/floor/carpet,
+/area/ruin/space/radiostation/cabin)
+"pn" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/power/solar/fake,
+/turf/open/floor/plasteel/solarpanel,
+/area/ruin/space/radiostation/solars)
+"py" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/mechanical,
+/obj/item/multitool,
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"pz" = (
+/obj/machinery/light{
+ light_color = "#cee5d2"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"qj" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"ss" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"sR" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"tx" = (
+/turf/closed/wall,
+/area/ruin/space/radiostation/cabin)
+"tH" = (
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#cee5d2"
+ },
+/turf/open/floor/carpet,
+/area/ruin/space/radiostation/cabin)
+"tL" = (
+/obj/structure/cable,
+/obj/machinery/power/solar/fake,
+/turf/open/floor/plasteel/solarpanel,
+/area/ruin/space/radiostation/solars)
+"uF" = (
+/obj/structure/grille,
+/obj/effect/spawner/structure/window/reinforced/indestructable,
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/break_room)
+"uY" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"vl" = (
+/obj/machinery/vending/sustenance,
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"vx" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"vN" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"wh" = (
+/obj/structure/sink/kitchen{
+ dir = 4;
+ pixel_x = 19
+ },
+/turf/closed/wall,
+/area/ruin/space/radiostation/break_room)
+"wp" = (
+/obj/machinery/light{
+ light_color = "#cee5d2"
+ },
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"ws" = (
+/turf/closed/wall,
+/area/ruin/space/radiostation/engineering)
+"wI" = (
+/obj/machinery/light{
+ dir = 8;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"xc" = (
+/obj/machinery/power/terminal,
+/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"xk" = (
+/obj/structure/chair,
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"xR" = (
+/obj/structure/table,
+/obj/item/storage/firstaid,
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"xS" = (
+/obj/machinery/door/airlock,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation/janitor)
+"yu" = (
+/obj/machinery/light_switch,
+/turf/closed/wall,
+/area/ruin/space/radiostation)
+"yE" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/solar/fake,
+/turf/open/floor/plasteel/solarpanel,
+/area/ruin/space/radiostation/solars)
+"yM" = (
+/obj/machinery/power/smes/magical,
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"yX" = (
+/obj/structure/janitorialcart,
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation/janitor)
+"zA" = (
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"zR" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"An" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/machinery/disposal/bin,
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"As" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation/janitor)
+"AV" = (
+/obj/structure/table/wood,
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"BH" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"Cu" = (
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"Dd" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"Dy" = (
+/obj/structure/chair/comfy/brown{
+ dir = 1
+ },
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"DE" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"EI" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"ET" = (
+/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/power/solar/fake,
+/turf/open/floor/plasteel/solarpanel,
+/area/ruin/space/radiostation/solars)
+"Ft" = (
+/obj/machinery/vending/cigarette,
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"FB" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/carpet,
+/area/ruin/space/radiostation/cabin)
+"FF" = (
+/obj/structure/disposalpipe/trunk,
+/obj/structure/disposaloutlet{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/space/nearstation)
+"Gr" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"Hb" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"Hc" = (
+/obj/machinery/power/apc/auto_name/south{
+ name = "Cabin";
+ areastring = "/area/ruin/space/radiostation/cabin"
+ },
+/obj/structure/cable,
+/turf/open/floor/carpet,
+/area/ruin/space/radiostation/cabin)
+"HD" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"Is" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/light{
+ light_color = "#cee5d2"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"IG" = (
+/obj/structure/grille,
+/obj/effect/spawner/structure/window/reinforced/indestructable,
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/control_room)
+"IJ" = (
+/obj/structure/dresser,
+/turf/open/floor/carpet,
+/area/ruin/space/radiostation/cabin)
+"IK" = (
+/turf/template_noop,
+/area/template_noop)
+"IO" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/engineering{
+ name = "Engines"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"IW" = (
+/obj/machinery/light/small{
+ dir = 4;
+ light_color = "#d8b1b1"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"Ke" = (
+/obj/machinery/light_switch,
+/turf/closed/wall,
+/area/ruin/space/radiostation/control_room)
+"Kj" = (
+/obj/structure/table,
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"KD" = (
+/obj/machinery/power/apc/auto_name/north{
+ name = "Custodial Closet";
+ areastring = "/area/ruin/space/radiostation/janitor"
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation/janitor)
+"KP" = (
+/turf/closed/wall,
+/area/ruin/space/radiostation/engines)
+"KX" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"KY" = (
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating,
+/area/space/nearstation)
+"LA" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"MG" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/telecomms/relay/preset{
+ name = "NT Radio Relay"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"Ob" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"OH" = (
+/obj/structure/fans/tiny,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/airlock/external/glass,
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"OK" = (
+/obj/structure/lattice,
+/turf/template_noop,
+/area/space/nearstation)
+"Pp" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"PG" = (
+/obj/structure/bed/double{
+ dir = 1
+ },
+/obj/item/bedsheet/blue/double{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/ruin/space/radiostation/cabin)
+"PO" = (
+/obj/machinery/vending/coffee,
+/turf/open/floor/carpet/blue,
+/area/ruin/space/radiostation/control_room)
+"PQ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light{
+ dir = 4;
+ light_color = "#e8eaff"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"Qb" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"QM" = (
+/obj/item/radio/intercom{
+ pixel_y = 8;
+ name = "Radio Broadcaster"
+ },
+/turf/closed/wall,
+/area/ruin/space/radiostation/control_room)
+"Rm" = (
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"Rw" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"RP" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"RZ" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/structure/disposaloutlet,
+/turf/open/floor/plating,
+/area/space/nearstation)
+"Sv" = (
+/obj/machinery/shuttle/engine,
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"Tv" = (
+/obj/structure/table,
+/obj/machinery/microwave,
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"TG" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"Uh" = (
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"Uk" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"UB" = (
+/obj/structure/window/plasma/reinforced/spawner/north,
+/obj/structure/shuttle/engine/heater,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engines)
+"UM" = (
+/obj/machinery/vending/snack,
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"UT" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/structure/cable,
+/obj/machinery/power/solar/fake,
+/turf/open/floor/plasteel/solarpanel,
+/area/ruin/space/radiostation/solars)
+"Va" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"Vc" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"Vk" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"VV" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/machinery/power/solar/fake,
+/turf/open/floor/plasteel/solarpanel,
+/area/ruin/space/radiostation/solars)
+"Wf" = (
+/obj/machinery/light{
+ light_color = "#cee5d2"
+ },
+/turf/open/floor/plasteel/cafeteria,
+/area/ruin/space/radiostation/break_room)
+"WF" = (
+/obj/machinery/computer/teleporter,
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"Xt" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/ruin/space/radiostation/engineering)
+"XD" = (
+/turf/closed/wall,
+/area/ruin/space/radiostation/janitor)
+"XQ" = (
+/turf/closed/wall,
+/area/ruin/space/radiostation)
+"XW" = (
+/obj/machinery/power/apc/auto_name/north{
+ name = "Hallway";
+ areastring = "/area/ruin/space/radiostation"
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"Yj" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+"YH" = (
+/obj/machinery/teleport/station,
+/turf/open/floor/plasteel,
+/area/ruin/space/radiostation)
+"YK" = (
+/turf/closed/wall,
+/area/ruin/space/radiostation/control_room)
+"Za" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/space/basic,
+/area/ruin/space/radiostation/solars)
+
+(1,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(2,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+tx
+tx
+tx
+tx
+XD
+XD
+XD
+XD
+XD
+OK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(3,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+tx
+IJ
+PG
+mb
+XD
+dc
+gD
+bV
+ie
+KY
+KY
+RZ
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(4,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+tx
+tH
+FB
+Hc
+iQ
+is
+is
+is
+XD
+OK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(5,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+Rm
+Rm
+Rm
+Rm
+Rm
+Rm
+Rm
+tx
+aq
+oT
+pd
+XD
+KD
+As
+yX
+XD
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(6,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+Rm
+ip
+hO
+UT
+hO
+tL
+Rm
+tx
+tx
+dQ
+tx
+XD
+XD
+xS
+XD
+XD
+XQ
+XQ
+XQ
+KP
+KP
+KP
+KP
+KP
+IK
+"}
+(7,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+Rm
+ip
+hr
+UT
+hr
+tL
+Rm
+XQ
+nN
+uY
+EI
+EI
+EI
+Gr
+wI
+nN
+nN
+nN
+nN
+KP
+zA
+Uh
+UB
+Sv
+IK
+"}
+(8,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+Rm
+ip
+hr
+UT
+hr
+tL
+Rm
+XQ
+oZ
+Dd
+nN
+nN
+nN
+nN
+nN
+nN
+nN
+nN
+nN
+KP
+zA
+sR
+UB
+Sv
+IK
+"}
+(9,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+Rm
+Rm
+Ob
+hP
+nu
+Rm
+Rm
+XQ
+nN
+Dd
+YK
+YK
+IG
+IG
+IG
+YK
+YK
+nN
+pz
+KP
+zA
+sR
+UB
+Sv
+IK
+"}
+(10,1,1) = {"
+IK
+Rm
+Rm
+Rm
+Rm
+Rm
+ws
+ws
+ws
+OH
+ws
+ws
+ws
+XQ
+nN
+Dd
+YK
+Ft
+bU
+bU
+bU
+xR
+YK
+nN
+nN
+KP
+fm
+sR
+UB
+Sv
+IK
+"}
+(11,1,1) = {"
+IK
+Rm
+pn
+pn
+pn
+Rm
+ws
+ca
+Xt
+Rw
+ca
+ca
+ws
+UM
+nN
+Dd
+Ke
+bU
+bU
+bU
+bU
+wp
+YK
+nN
+nN
+KP
+cd
+sR
+UB
+Sv
+IK
+"}
+(12,1,1) = {"
+IK
+Rm
+Uk
+Za
+Za
+Vc
+ws
+vx
+iB
+nE
+ca
+ca
+ws
+nN
+nN
+Dd
+YK
+vN
+xk
+AV
+AV
+bU
+YK
+WF
+nN
+KP
+Pp
+sR
+UB
+Sv
+IK
+"}
+(13,1,1) = {"
+IK
+Rm
+yE
+yE
+yE
+Uk
+jO
+xc
+yM
+iB
+MG
+iB
+bz
+EI
+ja
+ep
+bK
+dd
+xk
+AV
+Dy
+bU
+QM
+YH
+ss
+IO
+zR
+BH
+UB
+Sv
+IK
+"}
+(14,1,1) = {"
+IK
+Rm
+qj
+KX
+KX
+nu
+ws
+Qb
+iB
+oo
+Rw
+ca
+ws
+nN
+nN
+Dd
+YK
+bS
+xk
+AV
+AV
+bU
+YK
+bg
+Dd
+KP
+zA
+Hb
+UB
+Sv
+IK
+"}
+(15,1,1) = {"
+IK
+Rm
+VV
+VV
+VV
+Rm
+ws
+mC
+iB
+Va
+IW
+py
+ws
+dE
+nN
+Dd
+YK
+mD
+bU
+bU
+bU
+wp
+YK
+nN
+Dd
+KP
+zA
+Hb
+UB
+Sv
+IK
+"}
+(16,1,1) = {"
+IK
+Rm
+Rm
+Rm
+Rm
+Rm
+ws
+ws
+ws
+OH
+ws
+ws
+ws
+XQ
+XW
+nG
+YK
+PO
+bU
+bU
+bU
+bU
+YK
+nN
+Dd
+KP
+fm
+Hb
+UB
+Sv
+IK
+"}
+(17,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+Rm
+Rm
+Yj
+Vk
+Vc
+Rm
+Rm
+yu
+nN
+Dd
+YK
+YK
+IG
+IG
+IG
+YK
+YK
+nN
+Is
+KP
+zA
+Hb
+UB
+Sv
+IK
+"}
+(18,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+Rm
+ip
+gQ
+ET
+gQ
+tL
+Rm
+XQ
+oZ
+Dd
+nN
+nN
+nN
+nN
+nN
+nN
+nN
+nN
+Dd
+KP
+zA
+Hb
+UB
+Sv
+IK
+"}
+(19,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+Rm
+ip
+gQ
+ET
+gQ
+tL
+Rm
+XQ
+nN
+TG
+EI
+EI
+PQ
+RP
+EI
+EI
+EI
+EI
+Gr
+KP
+zA
+DE
+UB
+Sv
+IK
+"}
+(20,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+Rm
+ip
+Vk
+ET
+Vk
+tL
+Rm
+XQ
+XQ
+XQ
+aH
+aH
+aH
+ar
+wh
+aH
+aH
+XQ
+XQ
+KP
+KP
+KP
+KP
+KP
+IK
+"}
+(21,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+Rm
+Rm
+Rm
+Rm
+Rm
+Rm
+Rm
+IK
+IK
+IK
+aH
+ma
+nQ
+HD
+Cu
+Cu
+aH
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(22,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+aH
+vl
+Cu
+Cu
+Cu
+Cu
+aH
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(23,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+aH
+aL
+Cu
+Cu
+Cu
+Wf
+aH
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(24,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+OK
+aH
+Tv
+Cu
+LA
+LA
+LA
+aH
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(25,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+FF
+KY
+KY
+hA
+An
+Cu
+Kj
+Kj
+Kj
+aH
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(26,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+OK
+aH
+aH
+uF
+uF
+uF
+aH
+aH
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
+(27,1,1) = {"
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+IK
+"}
diff --git a/modular_splurt/_maps/RandomRuins/SpaceRuins/syndielistenspace.dmm b/modular_splurt/_maps/RandomRuins/SpaceRuins/syndielistenspace.dmm
new file mode 100644
index 0000000000..ed9b30357a
--- /dev/null
+++ b/modular_splurt/_maps/RandomRuins/SpaceRuins/syndielistenspace.dmm
@@ -0,0 +1,1608 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ab" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 25
+ },
+/obj/structure/table,
+/obj/item/paper_bin,
+/obj/item/paper/fluff/ruins/listeningstation/reports/november,
+/obj/item/pen,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"ae" = (
+/turf/template_noop,
+/area/template_noop)
+"ag" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 11
+ },
+/obj/structure/toilet{
+ pixel_y = 18
+ },
+/obj/structure/mirror{
+ pixel_x = 28
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/showroomfloor,
+/area/ruin/space/syndielistenspace)
+"ax" = (
+/obj/machinery/atmospherics/components/unary/outlet_injector/on{
+ dir = 8;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plating/airless,
+/area/ruin/space/syndielistenspace)
+"bk" = (
+/obj/structure/rack{
+ dir = 8;
+ layer = 2.9
+ },
+/obj/item/mining_scanner,
+/obj/item/pickaxe,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/mop/advanced,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"bn" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/power/terminal{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "0-2";
+ pixel_y = 1
+ },
+/obj/structure/reagent_dispensers/fueltank,
+/obj/item/clothing/head/welding,
+/obj/item/weldingtool/largetank,
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"bX" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"ff" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/machinery/door/airlock/medical/glass{
+ name = "Medbay"
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/space/syndielistenspace)
+"fm" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/secure_closet/medical1{
+ req_access = null;
+ req_access_txt = "150"
+ },
+/turf/open/floor/plasteel/white,
+/area/ruin/space/syndielistenspace)
+"fs" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"fW" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/meter,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"gu" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"gN" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/machinery/firealarm{
+ dir = 2;
+ pixel_y = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 1;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"hg" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel/white/side{
+ dir = 5
+ },
+/area/ruin/space/syndielistenspace)
+"hs" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 2;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"ia" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel/white/side,
+/area/ruin/space/syndielistenspace)
+"ii" = (
+/obj/machinery/computer/message_monitor{
+ dir = 2
+ },
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/paper/monitorkey,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"kd" = (
+/obj/structure/table,
+/obj/item/storage/firstaid/regular,
+/obj/item/clothing/neck/stethoscope,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/white/side{
+ dir = 10
+ },
+/area/ruin/space/syndielistenspace)
+"kE" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_y = -29
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"kO" = (
+/obj/machinery/washing_machine{
+ pixel_x = 4
+ },
+/obj/structure/window{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"lp" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"lW" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/closet/crate/bin,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"mh" = (
+/obj/docking_port/stationary{
+ dir = 4;
+ dwidth = 6;
+ height = 7;
+ id = "caravansyndicate3_listeningpost";
+ name = "Syndicate Listening Post";
+ width = 15
+ },
+/obj/docking_port/stationary{
+ dir = 4;
+ dwidth = 4;
+ height = 5;
+ id = "caravansyndicate1_listeningpost";
+ name = "Syndicate Listening Post";
+ width = 9
+ },
+/turf/template_noop,
+/area/template_noop)
+"mU" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"mZ" = (
+/obj/structure/closet/crate/freezer,
+/obj/item/reagent_containers/blood/OMinus{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/reagent_containers/blood/OMinus,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel/white/side{
+ dir = 9
+ },
+/area/ruin/space/syndielistenspace)
+"pa" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/mob_spawn/human/space/syndicate/comms{
+ dir = 8
+ },
+/turf/open/floor/plasteel/grimy,
+/area/ruin/space/syndielistenspace)
+"pV" = (
+/obj/machinery/light/small,
+/obj/structure/sign/warning/vacuum{
+ pixel_y = 32
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"qp" = (
+/obj/machinery/atmospherics/components/unary/tank/air{
+ dir = 1
+ },
+/obj/effect/turf_decal/bot,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"qH" = (
+/obj/structure/table/wood,
+/obj/item/ammo_box/magazine/m10mm,
+/obj/item/paper/fluff/ruins/listeningstation/briefing,
+/turf/open/floor/plasteel/grimy,
+/area/ruin/space/syndielistenspace)
+"rr" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/closed/wall/r_wall,
+/area/ruin/space/syndielistenspace)
+"rJ" = (
+/obj/machinery/vending/cola/random{
+ extended_inventory = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/white/corner{
+ dir = 8
+ },
+/area/ruin/space/syndielistenspace)
+"te" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/machinery/door/airlock/external{
+ id_tag = "syndie_listeningpost_external";
+ req_access_txt = "150"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"tg" = (
+/obj/structure/table,
+/obj/machinery/light/small{
+ brightness = 3;
+ dir = 8
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_x = -2;
+ pixel_y = 6
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_y = 3
+ },
+/obj/item/storage/box/donkpockets{
+ pixel_x = 2
+ },
+/obj/item/reagent_containers/food/snacks/chocolatebar,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/sign/poster/contraband/random{
+ pixel_x = -32
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"ty" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"ui" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/tank_dispenser/oxygen{
+ oxygentanks = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/syndielistenspace)
+"ve" = (
+/obj/structure/sign/departments/medbay/alt,
+/turf/closed/wall,
+/area/ruin/space/syndielistenspace)
+"vj" = (
+/obj/effect/turf_decal/stripes/red/corner{
+ dir = 1
+ },
+/obj/machinery/door/airlock{
+ name = "Cabin"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"vH" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/machinery/door/airlock{
+ name = "Personal Quarters"
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"vJ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/power/apc/syndicate{
+ dir = 4;
+ name = "Syndicate Listening Post APC";
+ pixel_x = 24;
+ areastring = "/area/ruin/space/syndielistenspace"
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"vP" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"wW" = (
+/obj/machinery/door/airlock{
+ name = "Toilet"
+ },
+/turf/open/floor/plasteel/showroomfloor,
+/area/ruin/space/syndielistenspace)
+"xh" = (
+/obj/structure/rack{
+ dir = 8
+ },
+/obj/item/multitool,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"xw" = (
+/obj/structure/chair/stool,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"yi" = (
+/obj/machinery/syndicatebomb/self_destruct{
+ anchored = 1
+ },
+/obj/structure/sign/warning/securearea{
+ desc = "A warning sign which reads 'DANGER: SELF DESTRUCT DEVICE'.";
+ name = "DANGER: SELF DESTRUCT DEVICE";
+ pixel_x = 32
+ },
+/obj/machinery/door/window/brigdoor{
+ dir = 8;
+ req_access_txt = "150"
+ },
+/turf/open/floor/circuit/red,
+/area/ruin/space/syndielistenspace)
+"yy" = (
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high/plus,
+/obj/item/stack/cable_coil{
+ pixel_x = 3;
+ pixel_y = -7
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/airalarm/syndicate{
+ dir = 4;
+ pixel_x = -24
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"yA" = (
+/obj/structure/table,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -26
+ },
+/obj/machinery/microwave,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"yC" = (
+/obj/structure/table/reinforced,
+/obj/machinery/firealarm{
+ dir = 2;
+ pixel_y = 24
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/computer/libraryconsole/bookmanagement,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"yD" = (
+/turf/closed/mineral/random,
+/area/awaymission)
+"yS" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel/white/corner,
+/area/ruin/space/syndielistenspace)
+"zl" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"Bm" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/machinery/door/airlock/hatch{
+ name = "Telecommunications";
+ req_access_txt = "150"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"Bo" = (
+/obj/machinery/airalarm/syndicate{
+ pixel_y = 24
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/baseturf_helper/asteroid/airless,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"BG" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 11
+ },
+/obj/machinery/iv_drip,
+/obj/machinery/light/small,
+/obj/machinery/airalarm/syndicate{
+ dir = 1;
+ pixel_y = -24
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white/side{
+ dir = 6
+ },
+/area/ruin/space/syndielistenspace)
+"CT" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"Ds" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/power/smes/magical,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"DI" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel/grimy,
+/area/ruin/space/syndielistenspace)
+"DW" = (
+/obj/structure/rack{
+ dir = 8
+ },
+/obj/item/clothing/mask/gas{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/item/clothing/mask/gas,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/syndielistenspace)
+"EZ" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/machinery/door/airlock/hatch{
+ name = "E.V.A. Equipment";
+ req_access_txt = "150"
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"GN" = (
+/turf/closed/wall/r_wall,
+/area/ruin/space/syndielistenspace)
+"Hl" = (
+/obj/effect/turf_decal/stripes/red/corner,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/machinery/airalarm/syndicate{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"HF" = (
+/obj/structure/curtain,
+/obj/machinery/shower{
+ pixel_y = 14
+ },
+/obj/machinery/light/small,
+/obj/item/soap,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/showroomfloor,
+/area/ruin/space/syndielistenspace)
+"HX" = (
+/obj/structure/filingcabinet,
+/obj/item/paper/fluff/ruins/listeningstation/reports/april,
+/obj/item/paper/fluff/ruins/listeningstation/reports/may,
+/obj/item/paper/fluff/ruins/listeningstation/reports/june,
+/obj/item/paper/fluff/ruins/listeningstation/reports/july,
+/obj/item/paper/fluff/ruins/listeningstation/reports/august,
+/obj/item/paper/fluff/ruins/listeningstation/reports/september,
+/obj/item/paper/fluff/ruins/listeningstation/reports/october,
+/obj/item/paper/fluff/ruins/listeningstation/receipt,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/paper/fluff/ruins/listeningstation/odd_report,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"JD" = (
+/obj/effect/turf_decal/bot,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/machinery/power/port_gen/pacman,
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"JN" = (
+/obj/machinery/light/small,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/emcloset/anchored,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"JU" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"Kf" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"Kg" = (
+/turf/closed/wall,
+/area/ruin/space/syndielistenspace)
+"Kn" = (
+/obj/structure/closet{
+ icon_door = "black";
+ name = "wardrobe"
+ },
+/obj/item/clothing/under/color/black{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/clothing/under/color/black{
+ pixel_x = 1;
+ pixel_y = -1
+ },
+/obj/item/clothing/head/soft/black{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/clothing/head/soft/black{
+ pixel_x = 1;
+ pixel_y = -1
+ },
+/obj/item/clothing/gloves/fingerless,
+/obj/item/clothing/shoes/sneakers/black{
+ pixel_x = -3;
+ pixel_y = 3
+ },
+/obj/item/clothing/shoes/sneakers/black{
+ pixel_x = 1;
+ pixel_y = -1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/item/storage/photo_album,
+/obj/machinery/light/small,
+/turf/open/floor/plasteel/grimy,
+/area/ruin/space/syndielistenspace)
+"LZ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -27;
+ pixel_y = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/computer/arcade/tetris{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"Mk" = (
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/caution/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"NF" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/syndicate,
+/obj/item/flashlight{
+ pixel_y = -12
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"Oa" = (
+/obj/structure/chair/office/dark{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"Ow" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"Pk" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"Pr" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/machinery/button/door{
+ id = "syndie_listeningpost_external";
+ name = "External Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 24;
+ req_access_txt = "150";
+ specialfunctions = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"Qp" = (
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ id_tag = "syndie_listeningpost_external";
+ req_access_txt = "150"
+ },
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"RF" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4;
+ piping_layer = 3;
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"Sy" = (
+/obj/structure/table,
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_x = -30
+ },
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_x = -4;
+ pixel_y = 14
+ },
+/obj/item/reagent_containers/food/drinks/beer{
+ pixel_x = 3;
+ pixel_y = 11
+ },
+/obj/item/storage/fancy/cigarettes/cigpack_syndicate{
+ pixel_x = -3
+ },
+/obj/item/lighter{
+ pixel_x = 7;
+ pixel_y = -3
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"SC" = (
+/obj/structure/bookcase/random,
+/turf/open/floor/plasteel/grimy,
+/area/ruin/space/syndielistenspace)
+"Tc" = (
+/obj/item/bombcore/badmin{
+ anchored = 1;
+ invisibility = 100
+ },
+/turf/closed/wall,
+/area/ruin/space/syndielistenspace)
+"VK" = (
+/obj/machinery/telecomms/relay/preset/ruskie{
+ use_power = 0
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"VP" = (
+/obj/machinery/computer/camera_advanced{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/newscaster{
+ pixel_y = 32
+ },
+/obj/item/radio/intercom{
+ freerange = 1;
+ name = "Syndicate Radio Intercom";
+ pixel_x = -30
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"VX" = (
+/obj/machinery/vending/snack/random{
+ extended_inventory = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/sign/poster/contraband/random{
+ pixel_x = 32
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/turf/open/floor/plasteel,
+/area/ruin/space/syndielistenspace)
+"YD" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/structure/closet/crate,
+/obj/item/stack/sheet/metal/twenty,
+/obj/item/stack/sheet/glass{
+ amount = 10
+ },
+/obj/item/stack/rods/ten,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/storage/box/lights/bulbs,
+/obj/item/stock_parts/cell/high/plus,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/item/stack/sheet/mineral/plasma{
+ amount = 20
+ },
+/obj/item/wrench,
+/turf/open/floor/plating,
+/area/ruin/space/syndielistenspace)
+"YY" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+"ZG" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/computer/med_data/syndie{
+ dir = 4;
+ req_one_access = null
+ },
+/turf/open/floor/plasteel/dark,
+/area/ruin/space/syndielistenspace)
+
+(1,1,1) = {"
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+"}
+(2,1,1) = {"
+ae
+ae
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+ae
+yD
+yD
+yD
+yD
+yD
+ae
+ae
+ae
+"}
+(3,1,1) = {"
+ae
+ae
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+ae
+ae
+"}
+(4,1,1) = {"
+ae
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+ae
+"}
+(5,1,1) = {"
+ae
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+ae
+"}
+(6,1,1) = {"
+ae
+yD
+yD
+yD
+yD
+Kg
+Kg
+Kg
+Kg
+Kg
+Kg
+Kg
+Kg
+yD
+yD
+yD
+yD
+yD
+yD
+ae
+"}
+(7,1,1) = {"
+yD
+yD
+yD
+yD
+yD
+Kg
+HF
+Kg
+LZ
+yA
+Sy
+tg
+Kg
+Kg
+Kg
+yD
+yD
+yD
+yD
+ae
+"}
+(8,1,1) = {"
+yD
+yD
+yD
+yD
+yD
+Kg
+ag
+wW
+Ow
+ty
+xw
+lW
+Kg
+SC
+Kg
+Kg
+yD
+yD
+yD
+ae
+"}
+(9,1,1) = {"
+yD
+yD
+yD
+yD
+Kg
+Kg
+Kg
+Kg
+kO
+Pk
+Hl
+Mk
+vj
+DI
+Kn
+Kg
+yD
+yD
+yD
+ae
+"}
+(10,1,1) = {"
+yD
+yD
+yD
+Kg
+Kg
+VP
+ZG
+Kg
+Kg
+vH
+Kg
+yi
+Kg
+pa
+qH
+Kg
+yD
+yD
+yD
+ae
+"}
+(11,1,1) = {"
+yD
+yD
+yD
+Kg
+ii
+Oa
+JU
+HX
+Kg
+gu
+Kg
+Kg
+Kg
+Kg
+Kg
+Kg
+Kg
+yD
+yD
+ae
+"}
+(12,1,1) = {"
+yD
+yD
+yD
+Kg
+yC
+zl
+mU
+bX
+Bm
+hs
+JN
+Kg
+Ds
+bn
+YD
+JD
+Kg
+yD
+yD
+ae
+"}
+(13,1,1) = {"
+yD
+yD
+yD
+Kg
+Kg
+VK
+ab
+xh
+Kg
+Bo
+fs
+vP
+CT
+vJ
+fW
+qp
+Kg
+yD
+yD
+ae
+"}
+(14,1,1) = {"
+yD
+yD
+yD
+yD
+Kg
+Kg
+Kg
+Kg
+Tc
+RF
+kE
+Kg
+Kg
+Kg
+Kg
+Kg
+Kg
+yD
+yD
+ae
+"}
+(15,1,1) = {"
+yD
+yD
+yD
+Kg
+Kg
+NF
+yy
+bk
+Kg
+gN
+yS
+ve
+mZ
+kd
+Kg
+yD
+yD
+yD
+yD
+ae
+"}
+(16,1,1) = {"
+yD
+yD
+yD
+Kg
+DW
+YY
+Pr
+lp
+EZ
+Kf
+ia
+ff
+hg
+BG
+Kg
+yD
+yD
+yD
+yD
+ae
+"}
+(17,1,1) = {"
+ae
+yD
+yD
+Kg
+Kg
+Qp
+Kg
+ui
+Kg
+VX
+rJ
+Kg
+fm
+Kg
+Kg
+yD
+yD
+yD
+yD
+ae
+"}
+(18,1,1) = {"
+ae
+yD
+yD
+yD
+GN
+pV
+GN
+rr
+GN
+Kg
+Kg
+Kg
+Kg
+Kg
+yD
+yD
+yD
+yD
+yD
+ae
+"}
+(19,1,1) = {"
+ae
+yD
+yD
+yD
+GN
+te
+GN
+ax
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+yD
+ae
+ae
+"}
+(20,1,1) = {"
+ae
+ae
+ae
+ae
+ae
+mh
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+yD
+yD
+ae
+ae
+ae
+"}
diff --git a/modular_splurt/code/_onclick/hud/new_player.dm b/modular_splurt/code/_onclick/hud/new_player.dm
index 8e2e92f77f..eb61ef3e29 100644
--- a/modular_splurt/code/_onclick/hud/new_player.dm
+++ b/modular_splurt/code/_onclick/hud/new_player.dm
@@ -1,3 +1,8 @@
+/datum/hud/new_player/populate_buttons(mob/dead/new_player/owner)
+ if(!(owner.client?.prefs.toggles & TG_PLAYER_PANEL))
+ return
+ . = ..()
+
/atom/movable/screen/lobby/button/Click(location, control, params)
if(owner != REF(usr)) //No idea what this even means but
return ..()
@@ -10,4 +15,7 @@
to_chat(usr, span_warning("You must link your discord account to your ckey in order to join the game. Join our
discord and use the
[CONFIG_GET(string/discordbotcommandprefix)][CONFIG_GET(string/verification_command)] command [CONFIG_GET(string/verification_channel) ? "as indicated in #[CONFIG_GET(string/verification_channel)] " : ""]. It won't take you more than two minutes :)
Ahelp or ask staff in the discord if this is an error."))
return
+ if(!(usr.client?.prefs.toggles & TG_PLAYER_PANEL))
+ return
+
. = ..()
diff --git a/modular_splurt/code/controllers/configuration/entries/splurt_general.dm b/modular_splurt/code/controllers/configuration/entries/splurt_general.dm
index 7e34c3a007..c4e26c6d0a 100644
--- a/modular_splurt/code/controllers/configuration/entries/splurt_general.dm
+++ b/modular_splurt/code/controllers/configuration/entries/splurt_general.dm
@@ -1 +1,6 @@
/datum/config_entry/flag/need_discord_to_join
+
+/datum/config_entry/flag/enable_global_barks
+
+/datum/config_entry/number/max_infinidorms
+ config_entry_value = 5
diff --git a/modular_splurt/code/controllers/subsystem/ticker.dm b/modular_splurt/code/controllers/subsystem/ticker.dm
new file mode 100644
index 0000000000..a2fd4a9be9
--- /dev/null
+++ b/modular_splurt/code/controllers/subsystem/ticker.dm
@@ -0,0 +1,6 @@
+//Everyone who wanted to be an observer gets made one now
+/datum/controller/subsystem/ticker/proc/create_observers()
+ for(var/mob/dead/new_player/player in GLOB.player_list)
+ if(player.ready == PLAYER_READY_TO_OBSERVE && player.mind && !(player.client?.prefs.toggles & TG_PLAYER_PANEL))
+ //Break chain since this has a sleep input in it
+ addtimer(CALLBACK(player, /mob/dead/new_player.proc/make_me_an_observer), 1)
diff --git a/modular_splurt/code/datums/components/nanites.dm b/modular_splurt/code/datums/components/nanites.dm
new file mode 100644
index 0000000000..f7eb5d3653
--- /dev/null
+++ b/modular_splurt/code/datums/components/nanites.dm
@@ -0,0 +1,2 @@
+/datum/component/nanites
+ max_nanites = 500
diff --git a/modular_splurt/code/datums/components/size_normalized.dm b/modular_splurt/code/datums/components/size_normalized.dm
new file mode 100644
index 0000000000..d8a38a292d
--- /dev/null
+++ b/modular_splurt/code/datums/components/size_normalized.dm
@@ -0,0 +1,49 @@
+/datum/component/size_normalized
+ dupe_mode = COMPONENT_DUPE_UNIQUE
+ var/obj/item/clothing/attached_wear
+ var/normal_resize = RESIZE_NORMAL
+ var/natural_size //The value of the wearer's body_size var in prefs. Unused for now.
+ var/recorded_size //the user's height prior to equipping
+
+//Set up the linked clothing
+/datum/component/size_normalized/Initialize(obj/item/clothing/wear)
+ . = ..()
+ if(!isliving(parent))
+ return COMPONENT_INCOMPATIBLE
+ attached_wear = wear
+
+//Normalize the mob on add in case it's necessary
+/datum/component/size_normalized/RegisterWithParent()
+ . = ..()
+ var/mob/living/wearer = parent
+ recorded_size = get_size(wearer)
+ if(recorded_size != normal_resize)
+ playsound(wearer, 'sound/effects/magic.ogg', 50, 1)
+ wearer.flash_lighting_fx(3, 3, LIGHT_COLOR_PURPLE)
+ wearer.visible_message("
A flash of purple light engulfs \the [wearer], before [wearer.p_they()] jump[wearer.p_s()] to a more average size!","
You feel warm for a moment, before everything scales to your size...")
+ wearer.update_size(normal_resize)
+ RegisterSignal(wearer, COMSIG_MOB_RESIZED, .proc/normalize_size)
+
+//Denormalize the mob when the component is destroyed (if needed)
+/datum/component/size_normalized/UnregisterFromParent()
+ . = ..()
+ var/mob/living/wearer = parent
+ UnregisterSignal(wearer, COMSIG_MOB_RESIZED)
+ if(recorded_size == normal_resize)
+ return
+ playsound(wearer,'sound/weapons/emitter2.ogg', 50, 1)
+ wearer.flash_lighting_fx(3, 3, LIGHT_COLOR_YELLOW)
+ wearer.visible_message("
Golden light engulfs \the [wearer], and [wearer.p_they()] shoot[wearer.p_s()] back to [wearer.p_their()] default height!","
Energy rushes through your body, and you return to normal.")
+ wearer.update_size(recorded_size)
+
+//Make sure the size stays normalized while worn and add the change to the recorded size
+/datum/component/size_normalized/proc/normalize_size(mob/living/source, new_size, cur_size)
+ SIGNAL_HANDLER
+
+ . = TRUE
+ if(get_size(source) == normal_resize)
+ return FALSE
+
+ recorded_size += new_size - cur_size
+
+ source.update_size(normal_resize)
diff --git a/modular_splurt/code/datums/elements/smalltalk.dm b/modular_splurt/code/datums/elements/smalltalk.dm
index cc236e7036..9ffa626757 100644
--- a/modular_splurt/code/datums/elements/smalltalk.dm
+++ b/modular_splurt/code/datums/elements/smalltalk.dm
@@ -14,4 +14,6 @@
UnregisterSignal(source, COMSIG_MOB_SAY)
/datum/element/smalltalk/proc/handle_speech(datum/source, list/speech_args)
+ SIGNAL_HANDLER
+
speech_args[SPEECH_SPANS] |= SPAN_SMALL
diff --git a/modular_splurt/code/datums/elements/wuv.dm b/modular_splurt/code/datums/elements/wuv.dm
new file mode 100644
index 0000000000..de94b61992
--- /dev/null
+++ b/modular_splurt/code/datums/elements/wuv.dm
@@ -0,0 +1,13 @@
+/datum/element/wuv/headpat/pet_the_dog(mob/target, mob/user) //For instances where only the headpat applies
+ if(QDELETED(target) || QDELETED(user) || target.stat != CONSCIOUS)
+ return
+ if(!(check_zone(user.zone_selected) == BODY_ZONE_HEAD) || user == target)
+ return
+ new /obj/effect/temp_visual/heart(target.loc)
+ if(pet_emote)
+ target.emote("me", pet_type, pet_emote)
+ if(pet_moodlet && !(target.flags_1 & HOLOGRAM_1)) //prevents unlimited happiness petting park exploit.
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, target, pet_moodlet, target)
+
+/datum/element/wuv/headpat/kick_the_dog(mob/target, mob/user)
+ return //No kicking the dog >:(( (until I find an use for this that is)
diff --git a/modular_splurt/code/datums/interactions/lewd/_lewd.dm b/modular_splurt/code/datums/interactions/lewd/_lewd.dm
index 7f5ecffe14..85fabb32bf 100644
--- a/modular_splurt/code/datums/interactions/lewd/_lewd.dm
+++ b/modular_splurt/code/datums/interactions/lewd/_lewd.dm
@@ -1,6 +1,21 @@
/mob/living
var/has_belly = FALSE
+/mob/living/moan()
+ var/moaned = lastmoan
+ var/miming = mind ? mind?.miming : FALSE
+ . = ..()
+ if((moaned == lastmoan) || is_muzzled() || miming || !prob(50))
+ return
+ var/list/moans
+ if(isalien(src))
+ moans = list('sound/voice/hiss6.ogg')
+ else if(gender == FEMALE)
+ moans = list('modular_splurt/sound/voice/moan_f1.ogg', 'modular_splurt/sound/voice/moan_f2.ogg', 'modular_splurt/sound/voice/moan_f3.ogg', 'modular_splurt/sound/voice/moan_f4.ogg', 'modular_splurt/sound/voice/moan_f5.ogg', 'modular_splurt/sound/voice/moan_f6.ogg', 'modular_splurt/sound/voice/moan_f7.ogg')
+ else
+ moans = list('modular_splurt/sound/voice/moan_m1.ogg', 'modular_splurt/sound/voice/moan_m2.ogg', 'modular_splurt/sound/voice/moan_m3.ogg')
+ playlewdinteractionsound(src, pick(moans), 50, 1, 4, 1.2, ignored_mobs = get_unconsenting())
+
/mob/living/proc/get_refraction_dif() //Got snapped in upstream, may delete later when I figure something out
var/dif = (refractory_period - world.time)
if(dif < 0)
diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
index b284be8e1f..c11b335955 100644
--- a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
+++ b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm
@@ -96,6 +96,11 @@
/datum/interaction/lewd/throatfuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target)
. = ..()
+ if(istype(target, /mob/living) && user.is_fucking(target, CUM_TARGET_THROAT))
+ var/stat_before = target.stat
+ target.adjustOxyLoss(3)
+ if(target.stat == UNCONSCIOUS && stat_before != UNCONSCIOUS)
+ target.visible_message(message = "
\The [target] passes out on \The [src]'s cock.", ignored_mobs = user.get_unconsenting())
if(!isclownjob(user))
return
@@ -358,6 +363,15 @@
playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1)
+/datum/interaction/lewd/kiss/display_interaction(mob/living/user, mob/living/partner)
+ . = ..()
+ playlewdinteractionsound(partner, pick(
+ 'modular_splurt/sound/interactions/kiss/kiss1.ogg',
+ 'modular_splurt/sound/interactions/kiss/kiss2.ogg',
+ 'modular_splurt/sound/interactions/kiss/kiss3.ogg',
+ 'modular_splurt/sound/interactions/kiss/kiss4.ogg',
+ 'modular_splurt/sound/interactions/kiss/kiss5.ogg'), 50, 1, -1, ignored_mobs = user.get_unconsenting())
+
//Own stuff
/datum/interaction/lewd/oral/selfsuck
description = "Suck yourself off."
diff --git a/modular_splurt/code/datums/mood_events/dominant_events.dm b/modular_splurt/code/datums/mood_events/dominant_events.dm
new file mode 100644
index 0000000000..f8e41e6b42
--- /dev/null
+++ b/modular_splurt/code/datums/mood_events/dominant_events.dm
@@ -0,0 +1,20 @@
+/datum/mood_event/dominant/need
+ description = span_warning("I need to be someone's good THING...\n")
+ mood_change = -2
+ timeout = 3 MINUTES
+
+/datum/mood_event/dominant/good_boy
+ description = span_nicegreen("I feel like a good THING!\n")
+ mood_change = 2
+ timeout = 3 MINUTES
+
+/datum/mood_event/dominant/add_effects(param)
+ . = ..()
+ var/mob/living/carbon/human/actual_owner = owner_mob()
+ var/good_x = "pet"
+ switch(actual_owner.gender)
+ if(MALE)
+ good_x = "boy"
+ if(FEMALE)
+ good_x = "girl"
+ description = replacetextEx(description, "THING", good_x)
diff --git a/modular_splurt/code/datums/mood_events/generic_negative_events.dm b/modular_splurt/code/datums/mood_events/generic_negative_events.dm
index 2e036154fe..c66f79e83d 100644
--- a/modular_splurt/code/datums/mood_events/generic_negative_events.dm
+++ b/modular_splurt/code/datums/mood_events/generic_negative_events.dm
@@ -7,11 +7,11 @@
/datum/mood_event/creampie/cheesed/add_effects(param)
. = ..()
- if(!ishuman(owner))
- return .
- var/mob/living/carbon/human/H = owner
+ var/mob/living/carbon/human/actual_owner = owner_mob()
- if(iscatperson(H))
+ if(!ishuman(actual_owner))
+ return .
+ if(iscatperson(actual_owner))
description = span_warning("CHEESE!!! WAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!")
mood_change = -5
timeout = 5 MINUTES
diff --git a/modular_splurt/code/datums/mood_events/mood_event.dm b/modular_splurt/code/datums/mood_events/mood_event.dm
new file mode 100644
index 0000000000..961f0dc311
--- /dev/null
+++ b/modular_splurt/code/datums/mood_events/mood_event.dm
@@ -0,0 +1,8 @@
+/datum/mood_event/proc/owner_mob()
+ var/mob/living/carbon/human/actual_owner
+ var/datum/component/mood/wrong_declaration = owner
+ if(istype(wrong_declaration))
+ actual_owner = wrong_declaration.parent
+ else
+ actual_owner = owner
+ return actual_owner
diff --git a/modular_splurt/code/datums/mood_events/needs_events.dm b/modular_splurt/code/datums/mood_events/needs_events.dm
new file mode 100644
index 0000000000..da5a575ebb
--- /dev/null
+++ b/modular_splurt/code/datums/mood_events/needs_events.dm
@@ -0,0 +1,7 @@
+/datum/mood_event/fat/add_effects(param)
+ . = ..()
+ var/mob/living/carbon/human/actual_owner = owner_mob()
+ if(!HAS_TRAIT(actual_owner, TRAIT_VORACIOUS))
+ return
+ description = span_nicegreen("MORE FOOD!!! MORE FOOD!!! MORE FOOD!!!")
+ mood_change = 8
diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm
index ba1fa91706..b89de22c36 100644
--- a/modular_splurt/code/datums/traits/good.dm
+++ b/modular_splurt/code/datums/traits/good.dm
@@ -33,3 +33,76 @@
quirk_holder.weather_immunities -= "ash"
*/
+/datum/quirk/dominant_aura
+ name = "Dominant Aura"
+ desc = "Your personality is assertive enough to appear as powerful to other people, so much in fact that the weaker kind can't help but throw themselves at your feet on command."
+ value = 2
+ gain_text = "You feel like making someone your pet"
+ lose_text = "You feel less assertive than befpre"
+
+/datum/quirk/dominant_aura/add()
+ . = ..()
+ RegisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE, .proc/on_examine_holder)
+ RegisterSignal(quirk_holder, COMSIG_MOB_EMOTE, .proc/handle_snap)
+
+/datum/quirk/dominant_aura/remove()
+ . = ..()
+ UnregisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE)
+ UnregisterSignal(quirk_holder, COMSIG_MOB_EMOTE)
+
+/datum/quirk/dominant_aura/proc/on_examine_holder(atom/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/sub = user
+ if(!sub.has_quirk(/datum/quirk/well_trained) || (sub == quirk_holder))
+ return
+
+ examine_list += span_lewd("\nYou can't look at [quirk_holder.p_them()] for more than three seconds before flustering away.")
+ if(!TIMER_COOLDOWN_CHECK(user, COOLDOWN_DOMINANT_EXAMINE))
+ to_chat(quirk_holder, span_notice("\The [user] tries to look at you but immediately looks away with a red face..."))
+ TIMER_COOLDOWN_START(user, COOLDOWN_DOMINANT_EXAMINE, 5 SECONDS)
+ sub.dir = turn(get_dir(sub, quirk_holder), pick(-90, 90))
+ sub.emote("blush")
+
+/datum/quirk/dominant_aura/proc/handle_snap(datum/source, list/emote_args)
+ SIGNAL_HANDLER
+
+ . = FALSE
+ var/datum/emote/E
+ E = E.emote_list[lowertext(emote_args[EMOTE_ACT])]
+ if(TIMER_COOLDOWN_CHECK(quirk_holder, COOLDOWN_DOMINANT_SNAP) || !findtext(E?.key, "snap"))
+ return
+ for(var/mob/living/carbon/human/sub in hearers(DOMINANT_DETECT_RANGE, quirk_holder))
+ if(!sub.has_quirk(/datum/quirk/well_trained) || (sub == quirk_holder))
+ continue
+ var/good_x = "pet"
+ switch(sub.gender)
+ if(MALE)
+ good_x = "boy"
+ if(FEMALE)
+ good_x = "girl"
+ switch(E?.key)
+ if("snap")
+ sub.dir = get_dir(sub, quirk_holder)
+ sub.emote(pick("blush", "pant"))
+ sub.visible_message(span_notice("\The [sub] turns shyly towards \the [quirk_holder]."),
+ span_lewd("You stare into \the [quirk_holder] submissively."))
+ if("snap2")
+ sub.dir = get_dir(sub, quirk_holder)
+ sub.KnockToFloor()
+ sub.emote(pick("blush", "pant"))
+ sub.visible_message(span_lewd("\The [sub] submissively throws [sub.p_them()]self on the floor."),
+ span_lewd("You throw yourself on the floor like a dog on [quirk_holder]'s command."))
+ if("snap3")
+ sub.KnockToFloor()
+ step(sub, get_dir(sub, quirk_holder))
+ sub.emote(pick("blush", "pant"))
+ sub.do_jitter_animation(30) //You're being moved anyways
+ sub.visible_message(span_lewd("\The [sub] crawls closer to \the [quirk_holder] in all fours, following [quirk_holder.p_their()] command"),
+ span_lewd("You get on your fours and crawl towards \the [quirk_holder] like a good, submissive [good_x]."))
+ . = TRUE
+
+ if(.)
+ TIMER_COOLDOWN_START(quirk_holder, COOLDOWN_DOMINANT_SNAP, DOMINANT_SNAP_COOLDOWN)
diff --git a/modular_splurt/code/datums/traits/negative.dm b/modular_splurt/code/datums/traits/negative.dm
index 0aa149375b..45dafa4261 100644
--- a/modular_splurt/code/datums/traits/negative.dm
+++ b/modular_splurt/code/datums/traits/negative.dm
@@ -57,3 +57,113 @@
var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood)
if(mood)
mood.mood_modifier -= 0.5
+
+/datum/quirk/masked_mook
+ name = "Bane Syndrome"
+ desc = "For some reason you don't feel well without wearing some kind of gas mask."
+ gain_text = "You start feeling unwell without any gas mask on."
+ lose_text = "You no longer have a need to wear some gas mask."
+ value = -2
+ mood_quirk = TRUE
+ medical_record_text = "Patient feels more secure when wearing a gas mask."
+ processing_quirk = TRUE
+ var/mood_category = "masked_mook"
+
+/datum/quirk/masked_mook/on_process()
+ var/mob/living/carbon/human/H = quirk_holder
+ var/obj/item/clothing/mask/gas/gasmask = H.get_item_by_slot(ITEM_SLOT_MASK)
+ if(istype(gasmask))
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/masked_mook)
+ else
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/masked_mook_incomplete)
+
+/datum/quirk/masked_mook/on_spawn()
+ . = ..()
+ var/mob/living/carbon/human/H = quirk_holder
+ var/obj/item/clothing/mask/gas/gasmask = new(get_turf(quirk_holder))
+ H.equip_to_slot(gasmask, ITEM_SLOT_MASK)
+ H.regenerate_icons()
+
+/datum/quirk/well_trained
+ name = "Well-trained"
+ desc = "You absolutely love being dominated. The thought of someone with a stronger character than yours is enough to make you act up."
+ value = -2
+ gain_text = "You feel like being someone's pet"
+ lose_text = "You no longer feel like being a pet..."
+ processing_quirk = TRUE
+ var/mood_category = "dom_trained"
+ var/notice_delay = 0
+ var/mob/living/carbon/human/last_dom
+
+/datum/quirk/well_trained/add()
+ . = ..()
+ RegisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE, .proc/on_examine_holder)
+
+/datum/quirk/well_trained/remove()
+ . = ..()
+ UnregisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE)
+
+/datum/quirk/well_trained/proc/on_examine_holder(atom/source, mob/living/user, list/examine_list)
+ SIGNAL_HANDLER
+
+ if(!istype(user))
+ return
+ if(!user.has_quirk(/datum/quirk/dominant_aura))
+ return
+ examine_list += span_lewd("You can sense submissiveness irradiating from [quirk_holder.p_them()]")
+
+/datum/quirk/well_trained/on_process()
+ . = ..()
+ if(!quirk_holder)
+ return
+
+ var/good_x = "pet"
+ switch(quirk_holder.gender)
+ if(MALE)
+ good_x = "boy"
+ if(FEMALE)
+ good_x = "girl"
+
+ //Check for possible doms with the dominant_aura quirk, and for the closest one if there is
+ . = FALSE
+ var/list/mob/living/carbon/human/doms = range(DOMINANT_DETECT_RANGE, quirk_holder)
+ var/closest_distance
+ for(var/mob/living/carbon/human/dom in doms)
+ if(dom != quirk_holder && dom.has_quirk(/datum/quirk/dominant_aura))
+ if(!closest_distance || get_dist(quirk_holder, dom) <= closest_distance)
+ . = dom
+ closest_distance = get_dist(quirk_holder, dom)
+
+ //Return if no dom is found
+ if(!.)
+ last_dom = null
+ return
+
+ //Handle the mood
+ var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood)
+ if(istype(mood.mood_events[mood_category], /datum/mood_event/dominant/good_boy))
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dominant/good_boy)
+ else
+ SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dominant/need)
+
+ //Don't do anything if a previous dom was found
+ if(last_dom)
+ notice_delay = world.time + 15 SECONDS
+ return
+
+ last_dom = .
+
+ if(notice_delay > world.time)
+ return
+
+ //Let them know they're near
+ var/list/notices = list(
+ "You feel someone's presence making you more submissive.",
+ "The thought of being commanded floods you with lust.",
+ "You really want to be called a good [good_x].",
+ "Someone's presence is making you all flustered.",
+ "You start getting excited and sweating."
+ )
+
+ to_chat(quirk_holder, span_lewd(pick(notices)))
+ notice_delay = world.time + 15 SECONDS
diff --git a/modular_splurt/code/datums/traits/neutral.dm b/modular_splurt/code/datums/traits/neutral.dm
index d816747e71..827432936b 100644
--- a/modular_splurt/code/datums/traits/neutral.dm
+++ b/modular_splurt/code/datums/traits/neutral.dm
@@ -49,6 +49,14 @@
value = 0
medical_record_text = "Patient seems overly affectionate."
+/datum/quirk/headpat_slut/add()
+ . = ..()
+ quirk_holder.AddElement(/datum/element/wuv/headpat, null, null, /datum/mood_event/pet_animal)
+
+/datum/quirk/headpat_slut/remove()
+ . = ..()
+ quirk_holder.RemoveElement(/datum/element/wuv/headpat)
+
/datum/quirk/in_heat
name = "In Heat"
desc = "Your system burns with the desire to be bred. Satisfying your lust will make you happy, but ignoring it may cause you to become sad and needy."
@@ -284,29 +292,3 @@
. = ..()
var/obj/item/implant/genital_fluid/put_in = new
put_in.implant(quirk_holder, null, TRUE, TRUE)
-
-/datum/quirk/masked_mook
- name = "Bane Syndrome"
- desc = "For some reason you don't feel well without wearing some kind of gas mask."
- gain_text = "You start feeling unwell without any gas mask on."
- lose_text = "You no longer have a need to wear some gas mask."
- value = 0
- mood_quirk = TRUE
- medical_record_text = "Patient feels more secure when wearing a gas mask."
-
-/datum/quirk/masked_mook/on_process()
- var/mob/living/carbon/human/H = quirk_holder
- var/obj/item/clothing/mask/gas/gasmask = H.get_item_by_slot(ITEM_SLOT_MASK)
- if(istype(gasmask))
- SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "masked_mook_incomplete")
- SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "masked_mook", /datum/mood_event/masked_mook)
- else
- SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "masked_mook")
- SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "masked_mook_incomplete", /datum/mood_event/masked_mook_incomplete)
-
-/datum/quirk/masked_mook/on_spawn()
- . = ..()
- var/mob/living/carbon/human/H = quirk_holder
- var/obj/item/clothing/mask/gas/gasmask = new(get_turf(quirk_holder))
- H.equip_to_slot(gasmask, ITEM_SLOT_MASK)
- H.regenerate_icons()
diff --git a/modular_splurt/code/game/area/areas/ruins/space.dm b/modular_splurt/code/game/area/areas/ruins/space.dm
new file mode 100644
index 0000000000..1af32b50d8
--- /dev/null
+++ b/modular_splurt/code/game/area/areas/ruins/space.dm
@@ -0,0 +1,93 @@
+/area/ruin/space/radiostation
+ name = "Nanotrasen Radio Station"
+ icon_state = "DJ"
+ has_gravity = STANDARD_GRAVITY
+
+/area/ruin/space/radiostation/solars
+ name = "NT Radio Solars"
+ icon_state = "yellow"
+
+/area/ruin/space/radiostation/engineering
+ name = "NT Radio Engineering"
+ icon_state = "engine"
+ has_gravity = STANDARD_GRAVITY
+
+/area/ruin/space/radiostation/engines
+ name = "NT Radio Engines"
+ icon_state = "engine"
+ has_gravity = STANDARD_GRAVITY
+
+/area/ruin/space/radiostation/janitor
+ name = "NT Radio Custodial Closet"
+ icon_state = "janitor"
+ has_gravity = STANDARD_GRAVITY
+
+/area/ruin/space/radiostation/break_room
+ name = "NT Radio Break Room"
+ icon_state = "cafeteria"
+ has_gravity = STANDARD_GRAVITY
+
+/area/ruin/space/radiostation/control_room
+ name = "NT Radio Control Room"
+ icon_state = "DJ"
+ has_gravity = STANDARD_GRAVITY
+
+/area/ruin/space/radiostation/cabin
+ name = "NT Radio Cabin"
+ icon_state = "dorms"
+ has_gravity = STANDARD_GRAVITY
+
+/datum/map_template/ruin/space/radiostation
+ prefix = "modular_splurt/_maps/RandomRuins/SpaceRuins/"
+ id = "radiostation"
+ suffix = "radiostation.dmm"
+ name = "NT Radio Station"
+ description = "A mobile NT Radio Station ship."
+
+
+/area/ruin/space/syndielistenspace
+ name = "Syndicate Listening Post"
+ icon_state = "yellow"
+ has_gravity = STANDARD_GRAVITY
+
+/datum/map_template/ruin/space/syndielistenspace
+ prefix = "modular_splurt/_maps/RandomRuins/SpaceRuins/"
+ id = "syndielistenspace"
+ suffix = "syndielistenspace.dmm"
+ name = "Syndicate Listening Outpost"
+ description = "A syndicate listening outpost cleverly disguised as an asteroid"
+
+
+/obj/effect/mob_spawn/human/space/syndicate/special(mob/living/new_spawn)
+ new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND)
+
+/obj/effect/mob_spawn/human/space/syndicate/comms
+ name = "Syndicate Comms Agent"
+ roundstart = FALSE
+ death = FALSE
+ icon = 'icons/obj/machines/sleeper.dmi'
+ icon_state = "sleeper_s"
+ outfit = /datum/outfit/syndicate_comms_space
+ assignedrole = "Space Syndicate Comms Agent"
+ job_description = "Space Syndicate Comms Agent"
+ short_desc = "You are a syndicate comms agent, employed to listen in on Nanotrasen Comms Chatter."
+ flavour_text = "Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!"
+ important_info = "DO NOT abandon the base."
+ canloadappearance = TRUE
+
+/datum/outfit/syndicate_comms_space
+ name = "Space Syndicate Comms Agent"
+ uniform = /obj/item/clothing/under/syndicate
+ suit = /obj/item/clothing/suit/armor/vest
+ mask = /obj/item/clothing/mask/chameleon
+ shoes = /obj/item/clothing/shoes/combat
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
+ ears = /obj/item/radio/headset/syndicate/alt
+ back = /obj/item/storage/backpack
+ l_pocket = /obj/item/melee/transforming/energy/sword/saber
+ r_pocket = /obj/item/gun/ballistic/automatic/pistol
+ id = /obj/item/card/id/syndicate/anyone
+ implants = list(/obj/item/implant/weapons_auth)
+
+/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
+ H.faction |= ROLE_SYNDICATE
diff --git a/modular_splurt/code/game/object/items/miscellaneous.dm b/modular_splurt/code/game/object/items/miscellaneous.dm
index c44910d01b..72a24aa100 100644
--- a/modular_splurt/code/game/object/items/miscellaneous.dm
+++ b/modular_splurt/code/game/object/items/miscellaneous.dm
@@ -185,3 +185,8 @@
user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \
"You show \the [src.name].")
add_fingerprint(user)
+
+/obj/item/clothing/accessory/badge/holo
+ name = "Security Holo Badge"
+ desc = "A more futuristic hard-light badge"
+ icon_state = "security_badge_holo"
diff --git a/modular_splurt/code/game/object/structures/railings.dm b/modular_splurt/code/game/object/structures/railings.dm
deleted file mode 100644
index ca1e6e2c9e..0000000000
--- a/modular_splurt/code/game/object/structures/railings.dm
+++ /dev/null
@@ -1,198 +0,0 @@
-//ported from virgo
-
-/obj/structure/railing
- name = "railing"
- desc = "A railing to stop people from falling"
-
- icon = 'modular_splurt/icons/obj/railings.dmi'
- var/icon_modifier = "grey_"
- icon_state = "grey_railing0"
-
- density = FALSE
- layer = 4
- anchored = TRUE
- flags_1 = ON_BORDER_1
- max_integrity = 250
- var/heat_resistance = 800
- var/health = 70
- var/maxhealth = 70
-
-
- resistance_flags = ACID_PROOF
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
- CanAtmosPass = ATMOS_PASS_PROC
- var/real_explosion_block //ignore this, just use explosion_block
- var/breaksound = "shatter"
- var/hitsound = 'sound/effects/Glasshit.ogg'
- rad_insulation = RAD_VERY_LIGHT_INSULATION
- rad_flags = RAD_PROTECT_CONTENTS
- var/check = 0
- var/static/list/freepass = typecacheof(list(
- /obj/singularity,
- /obj/effect/projectile,
- /obj/effect/portal,
- /obj/effect/abstract,
- /obj/effect/hotspot,
- /obj/effect/landmark,
- /obj/effect/temp_visual,
- /obj/effect/light_emitter/tendril,
- /obj/effect/collapse,
- /obj/effect/particle_effect/ion_trails,
- /obj/effect/dummy/phased_mob,
- /obj/effect/immovablerod,
- /obj/effect/crystalline_reentry
- )) //Gotta make sure certain things can phase through it otherwise the railings also block them.
-
-/obj/structure/railing/CanPass(atom/movable/mover, turf/target)
- if(istype(mover) && (mover.pass_flags & PASSGLASS) || is_type_in_typecache(mover, freepass))
- return 1
- if(get_dir(loc, target) == dir)
- return 0
- return 1
-
-/obj/structure/railing/CheckExit(atom/movable/O, turf/target)
- if(istype(O) && (O.pass_flags & PASSGLASS) || is_type_in_typecache(O, freepass))
- return 1
- if(get_dir(O.loc, target) == dir)
- return 0
- return 1
-
-/obj/structure/railing/Initialize()
- . = ..()
- if(src.anchored)
- update_icon(0)
-
-/obj/structure/railing/proc/NeighborsCheck(var/UpdateNeighbors = 1)
- check = 0
- //if (!anchored) return
- var/Rturn = turn(src.dir, -90)
- var/Lturn = turn(src.dir, 90)
-
- for(var/obj/structure/railing/R in src.loc)
- if ((R.dir == Lturn) && R.anchored)
- check |= 32
- if (UpdateNeighbors)
- R.update_icon(0)
- if ((R.dir == Rturn) && R.anchored)
- check |= 2
- if (UpdateNeighbors)
- R.update_icon(0)
-
- for (var/obj/structure/railing/R in get_step(src, Lturn))
- if ((R.dir == src.dir) && R.anchored)
- check |= 16
- if (UpdateNeighbors)
- R.update_icon(0)
- for (var/obj/structure/railing/R in get_step(src, Rturn))
- if ((R.dir == src.dir) && R.anchored)
- check |= 1
- if (UpdateNeighbors)
- R.update_icon(0)
-
- for (var/obj/structure/railing/R in get_step(src, (Lturn + src.dir)))
- if ((R.dir == Rturn) && R.anchored)
- check |= 64
- if (UpdateNeighbors)
- R.update_icon(0)
- for (var/obj/structure/railing/R in get_step(src, (Rturn + src.dir)))
- if ((R.dir == Lturn) && R.anchored)
- check |= 4
- if (UpdateNeighbors)
- R.update_icon(0)
-
-/obj/structure/railing/update_icon(var/UpdateNeighgors = 1)
- NeighborsCheck(UpdateNeighgors)
- overlays.Cut()
- if (!check || !anchored)//|| !anchored
- icon_state = "[icon_modifier]railing0"
- else
- icon_state = "[icon_modifier]railing1"
- if (check & 32)
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]corneroverlay")
- if ((check & 16) || !(check & 32) || (check & 64))
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_l")
- if (!(check & 2) || (check & 1) || (check & 4))
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_r")
- if(check & 4)
- switch (src.dir)
- if (NORTH)
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = 32)
- if (SOUTH)
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = -32)
- if (EAST)
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = -32)
- if (WEST)
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = 32)
-
-/obj/structure/railing/examine(mob/user)
- . = ..()
- if(health < maxhealth)
- switch(health / maxhealth)
- if(0.0 to 0.5)
- . += "It looks severely damaged!"
- if(0.25 to 0.5)
- . += "It looks damaged!"
- if(0.5 to 1.0)
- . += "It has a few scrapes and dents."
-
-/obj/structure/railing/take_damage(amount)
- health -= amount
- if(health <= 0)
- visible_message("\The [src] breaks down!")
- playsound(src, 'sound/effects/grillehit.ogg', 50, 1)
- new /obj/item/stack/rods(get_turf(src))
- qdel(src)
-
-/obj/structure/railing/MouseDrop_T(mob/living/M, mob/living/user)
- if(!istype(user))
- return
- if(!isliving(user))
- return
-
- usr.visible_message("[user] starts climbing onto \the [src]!")
-
- if(!do_after(user, 15, target = src))
- return
-
- if(get_turf(user) == get_turf(src))
- usr.dir = get_dir(usr.loc, get_step(src, src.dir))//turn and face railing
- usr.forceMove(get_step(src, src.dir))
- else
- usr.dir = get_dir(usr.loc, loc)//turn and face railing
- usr.forceMove(get_turf(src))
-
- usr.visible_message("[user] climbed over \the [src]!")
- usr.do_twist(targetangle = 45, timer = 8)
-
-/obj/structure/railing/handrail
- name = "handrail"
- desc = "A waist high handrail, perhaps you could climb over it."
-
- icon = 'modular_splurt/icons/obj/railings.dmi'
- icon_modifier = "hand_"
- icon_state = "hand_railing0"
- max_integrity = 100
-
-/obj/structure/railing/handrail/update_icon(var/UpdateNeighgors = 1)
- NeighborsCheck(UpdateNeighgors)
- overlays.Cut()
- if (!check || !anchored)//|| !anchored
- icon_state = "[icon_modifier]railing0"
- else
- icon_state = "[icon_modifier]railing1"
- if (check & 32)
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]corneroverlay")
- if ((check & 16) || !(check & 32) || (check & 64))
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_l")
- if (!(check & 2) || (check & 1) || (check & 4))
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_r")
- if(check & 4)
- switch (src.dir)
- if (NORTH)
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = 32)
- if (SOUTH)
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = -32)
- if (EAST)
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = -32)
- if (WEST)
- overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = 32)
diff --git a/modular_splurt/code/game/say.dm b/modular_splurt/code/game/say.dm
new file mode 100644
index 0000000000..c6659e4d58
--- /dev/null
+++ b/modular_splurt/code/game/say.dm
@@ -0,0 +1,4 @@
+/atom/movable/bark(list/hearers, distance, volume, pitch)
+ if(!CONFIG_GET(flag/enable_global_barks))
+ return
+ . = ..()
diff --git a/modular_splurt/code/modules/cargo/packs/misc.dm b/modular_splurt/code/modules/cargo/packs/misc.dm
index 49f7d788c0..3211d7e085 100644
--- a/modular_splurt/code/modules/cargo/packs/misc.dm
+++ b/modular_splurt/code/modules/cargo/packs/misc.dm
@@ -388,7 +388,7 @@
/datum/supply_pack/misc/goner
name = "Trencher Outfits"
desc = "Contains five trench uniforms, coats, gas masks, jackboots, four helmets and one officer cap. Corporate-made."
- cost = 1850 // Debatable, probably
+ cost = 2050 // Debatable, probably
contraband = TRUE
contains = list(
/obj/item/clothing/mask/gas/goner,
@@ -422,7 +422,7 @@
/datum/supply_pack/misc/goner_red
name = "Red Trencher Outfits"
desc = "Contains an import of five trench uniforms, coats, gas masks, jackboots, four helmets and one officer cap. Made by pesky Reds."
- cost = 1750
+ cost = 2000
contraband = TRUE
contains = list(
/obj/item/clothing/mask/gas/goner,
@@ -456,7 +456,7 @@
/datum/supply_pack/misc/goner_green
name = "Green Trencher Outfits"
desc = "Contains an import of five trench uniforms, coats, gas masks, jackboots, four helmets and one officer cap. Made by stupid Greens."
- cost = 1700
+ cost = 1950
contraband = TRUE
contains = list(
/obj/item/clothing/mask/gas/goner,
@@ -490,7 +490,7 @@
/datum/supply_pack/misc/goner_blue
name = "Blue Trencher Outfits"
desc = "Contains an import of five trench uniforms, coats, gas masks, jackboots, four helmets and one officer cap. Made by dirty Blues."
- cost = 1750
+ cost = 2000
contraband = TRUE
contains = list(
/obj/item/clothing/mask/gas/goner,
@@ -524,7 +524,7 @@
/datum/supply_pack/misc/goner_yellow
name = "Yellow Trencher Outfits"
desc = "Contains an import of five trench uniforms, coats, gas masks, jackboots, four helmets and one officer cap. Made by cursed Yellows."
- cost = 1750
+ cost = 2000
contraband = TRUE
contains = list(
/obj/item/clothing/mask/gas/goner,
@@ -554,7 +554,7 @@
/obj/item/clothing/shoes/jackboots
)
crate_name = "yellow trencher outfit crate"
-
+
/datum/supply_pack/medical/plaguedoc
name = "Plague Doctor Supply Crate"
desc = "Survive any Pandemic in style with this authentic Plague Doctor outfit, bag, and cane!"
diff --git a/modular_splurt/code/modules/cargo/packs/vending.dm b/modular_splurt/code/modules/cargo/packs/vending.dm
index 8426d5441d..d53f162f47 100644
--- a/modular_splurt/code/modules/cargo/packs/vending.dm
+++ b/modular_splurt/code/modules/cargo/packs/vending.dm
@@ -1,2 +1,9 @@
/datum/supply_pack/vending/barkbox
contraband = FALSE //i'm not responsible for citcode
+
+/datum/supply_pack/vending/modularpc
+ name = "Deluxe Silicate Solutions Supply Crate"
+ desc = "Contains a Deluxe Silicate Solutions restock unit!"
+ cost = 1500
+ contains = list(/obj/item/vending_refill/modularpc)
+ crate_name = "deluxe silicate solutions supply crate"
diff --git a/modular_splurt/code/modules/client/loadout/backpack.dm b/modular_splurt/code/modules/client/loadout/backpack.dm
index d73b7537fb..8dcdac25a6 100644
--- a/modular_splurt/code/modules/client/loadout/backpack.dm
+++ b/modular_splurt/code/modules/client/loadout/backpack.dm
@@ -87,3 +87,13 @@
/datum/gear/backpack/nailpolish_purple
name = "Purple Nail Polish"
path = /obj/item/nailpolish/purple
+
+/datum/gear/backback/secbadge
+ name = "Security Badge"
+ path = /obj/item/clothing/accessory/badge
+ restricted_roles = list("Security Officer", "Warden", "Detective", "Head of Security")
+
+/datum/gear/backpack/holobadge
+ name = "Security Holo Badge"
+ path = /obj/item/clothing/accessory/badge/holo
+ restricted_roles = list("Security Officer", "Warden", "Detective", "Head of Security")
diff --git a/modular_splurt/code/modules/client/loadout/gloves.dm b/modular_splurt/code/modules/client/loadout/gloves.dm
index 891ece11d3..59fdf600c7 100644
--- a/modular_splurt/code/modules/client/loadout/gloves.dm
+++ b/modular_splurt/code/modules/client/loadout/gloves.dm
@@ -10,8 +10,8 @@
/datum/gear/gloves/syntech/ring
name = "Normalizer Ring"
- path = /obj/item/clothing/gloves/ring/syntech
+ path = /obj/item/clothing/accessory/ring/syntech
/datum/gear/gloves/syntech/band
name = "Normalizer Band"
- path = /obj/item/clothing/gloves/ring/syntech/band
+ path = /obj/item/clothing/accessory/ring/syntech/band
diff --git a/modular_splurt/code/modules/clothing/sizeaccessories.dm b/modular_splurt/code/modules/clothing/sizeaccessories.dm
index 66ebe8766b..4f4e5ca423 100644
--- a/modular_splurt/code/modules/clothing/sizeaccessories.dm
+++ b/modular_splurt/code/modules/clothing/sizeaccessories.dm
@@ -1,43 +1,6 @@
-//Clothing vars and procs
-/obj/item/clothing
- var/normalize_size = RESIZE_NORMAL //This number is used as the "normal" height people will be given when wearing one of these accessories
- var/natural_size = null //The value of the wearer's body_size var in prefs. Unused for now.
- var/recorded_size = null //the user's height prior to equipping
-
-//For applying a normalization
-/obj/item/clothing/proc/normalize_mob_size(mob/living/carbon/human/H)
- if(H.normalized) //First we make a check to see if they're already normalized, from wearing another article of SynTech jewelry
- to_chat(H, "This accessory buzzes, being overwritten by another.")
- playsound(H, 'sound/machines/buzz-sigh.ogg', 50, 1)
- return
- recorded_size = get_size(H) //If not, grab their current size
- playsound(H, 'sound/effects/magic.ogg', 50, 1)
- flash_lighting_fx(3, 3, LIGHT_COLOR_PURPLE)
- H.visible_message("A flash of purple light engulfs [H], before they change to normal!","You feel warm for a moment, before everything scales to your size...")
- H.update_size(normalize_size) //Then apply the size
- H.normalized = TRUE //And set normalization
-
-//For removing a normalization, and reverting back to normal
-/obj/item/clothing/proc/denormalize_mob_size(mob/living/carbon/human/H)
- if(H.normalized) //sanity check
- playsound(H,'sound/weapons/emitter2.ogg', 50, 1)
- flash_lighting_fx(3, 3, LIGHT_COLOR_YELLOW)
- H.visible_message("Golden light engulfs [H], and they shoot back to their default height!","Energy rushes through your body, and you return to normal.")
- H.update_size(recorded_size)
- H.normalized = FALSE
-
-
-//For storing normalization on mobs
-/mob/living
- var/normalized = FALSE
- //normalized is a check for instances where more than one accessory of jewelry is worn. For all intensive purposes, only the first worn accessory stores the user's size.
- //Anything else is just extra.
-
-//Clothing below. Code could be compressed more, but until I make jewelry slots, this will do. -Dahl
-
//GLOVE SLOT ITEMS...
//SynTech ring
-/obj/item/clothing/gloves/ring/syntech
+/obj/item/clothing/accessory/ring/syntech
name = "normalizer ring"
desc = "An expensive, shimmering SynTech ring gilded with golden NanoTrasen markings. It will 'normalize' the size of the user to a specified height approved for work-conditions, as long as it is equipped. The artificial violet gem inside twinkles ominously."
icon = 'modular_splurt/icons/obj/clothing/sizeaccessories.dmi'
@@ -50,25 +13,25 @@
//These are already defined under the parent ring, but I wanna leave em here for reference purposes
//For glove slots
-/obj/item/clothing/gloves/ring/syntech/equipped(mob/living/user, slot)
- if(ishuman(user))
- var/mob/living/carbon/human/human_target = user
- if(slot == ITEM_SLOT_GLOVES)
+/obj/item/clothing/accessory/ring/syntech/equipped(mob/living/user, slot)
+ if(slot != ITEM_SLOT_GLOVES)
+ return ..()
- if(get_size(human_target) != normalize_size)
- normalize_mob_size(human_target)
+ if(user.GetComponent(/datum/component/size_normalized))
+ to_chat(user, "\The [src] buzzes, being overwritten by another accessory.")
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
+ else
+ user.AddComponent(/datum/component/size_normalized, wear=src)
. = ..()
-/obj/item/clothing/gloves/ring/syntech/dropped(mob/living/user, slot)
- if(ishuman(user))
- var/mob/living/carbon/human/human_target = user
-
- if(human_target.normalized)
- denormalize_mob_size(human_target)
+/obj/item/clothing/accessory/ring/syntech/dropped(mob/living/user, slot)
+ var/datum/component/size_normalized/comp = user.GetComponent(/datum/component/size_normalized)
+ if(comp?.attached_wear == src)
+ qdel(comp)
. = ..()
//SynTech Wristband
-/obj/item/clothing/gloves/ring/syntech/band
+/obj/item/clothing/accessory/ring/syntech/band //I mean, you realistically *can* put a band over your gloves
name = "normalizer wristband"
desc = "An expensive technological wristband cast in SynTech purples with shimmering NanoTrasen golds. It will 'normalize' the size of the user to a specified height for approved work-conditions, as long as it is equipped. There is a small screen buzzing with information."
icon = 'modular_splurt/icons/obj/clothing/sizeaccessories.dmi'
@@ -89,20 +52,20 @@
//For neck items
/obj/item/clothing/neck/syntech/equipped(mob/living/user, slot)
- if(ishuman(user))
- var/mob/living/carbon/human/human_target = user
- if(slot == ITEM_SLOT_NECK)
+ if(slot != ITEM_SLOT_NECK)
+ return ..()
- if(get_size(human_target) != normalize_size)
- normalize_mob_size(human_target)
+ if(user.GetComponent(/datum/component/size_normalized))
+ to_chat(user, "\The [src] buzzes, being overwritten by another accessory.")
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
+ else
+ user.AddComponent(/datum/component/size_normalized, wear=src)
. = ..()
/obj/item/clothing/neck/syntech/dropped(mob/living/user, slot)
- if(ishuman(user))
- var/mob/living/carbon/human/human_target = user
-
- if(human_target.normalized)
- denormalize_mob_size(human_target)
+ var/datum/component/size_normalized/comp = user.GetComponent(/datum/component/size_normalized)
+ if(comp?.attached_wear == src)
+ qdel(comp)
. = ..()
//Syntech Choker
diff --git a/modular_splurt/code/modules/clothing/suits/miscellaneous.dm b/modular_splurt/code/modules/clothing/suits/miscellaneous.dm
index 67014218e4..2e608aec41 100644
--- a/modular_splurt/code/modules/clothing/suits/miscellaneous.dm
+++ b/modular_splurt/code/modules/clothing/suits/miscellaneous.dm
@@ -93,9 +93,14 @@
/obj/item/clothing/suit/hooded/corpus/s //sec
name = "Enforcer Voidsuit"
- desc = "Delux issue grofit voidsuit. Let the middle class know You're in charge."
+ desc = "Deluxe issue armored voidsuit. Let the middle class bask in your grofit!"
icon_state = "corpuss"
+ armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10)
hoodtype = /obj/item/clothing/head/hooded/corpus/s //Enjoy this nice red outfit Nanotrasen! There is NO NEED for a pink one! xoxo -VivI Fanteriso
+
+/obj/item/clothing/suit/hooded/corpus/s/Initialize(mapload)
+ . = ..()
+ allowed = GLOB.security_wintercoat_allowed
/obj/item/clothing/suit/hooded/corpus/c //command
name = "Commander Voidsuit"
@@ -132,6 +137,10 @@
heat_protection = CHEST|GROIN|LEGS|ARMS
armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 5, BIO = 5, RAD = 5, FIRE = 5, ACID = 45) // Det's armor value + 5 BOMB&BIO&RAD&FIRE
+/obj/item/clothing/suit/goner/Initialize(mapload)
+ . = ..()
+ allowed = GLOB.detective_vest_allowed // I am probably gonna get fire-line'd for this... But suggestion is a suggestion. Can always revert the changes, right?
+
/obj/item/clothing/suit/goner/fake
name = "trencher coat replica"
desc = "A 90% replica of No Man's Land-type coat."
diff --git a/modular_splurt/code/modules/clothing/suits/vest.dm b/modular_splurt/code/modules/clothing/suits/vest.dm
index 6c22975d38..a4451f5664 100644
--- a/modular_splurt/code/modules/clothing/suits/vest.dm
+++ b/modular_splurt/code/modules/clothing/suits/vest.dm
@@ -84,3 +84,21 @@
item_state = "peacekeeper_trench_hos"
icon = 'modular_splurt/icons/obj/clothing/suits.dmi'
mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi'
+
+/obj/item/clothing/suit/sling
+ name = "rifle sling"
+ desc = "A sling with universal clips for holding various longarms, or even internals tanks."
+ icon = 'icons/obj/clothing/belts.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/belt.dmi'
+ icon_state = "bandolier"
+ item_state = "bandolier"
+ mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
+ allowed = list(/obj/item/tank/internals, /obj/item/gun/ballistic/shotgun/varmintrifle, /obj/item/gun/ballistic/shotgun/huntingrifle, /obj/item/gun/ballistic/shotgun/hunting, /obj/item/gun/ballistic/shotgun/doublebarrel, /obj/item/gun/ballistic/revolver/doublebarrel/sawn, /obj/item/gun/ballistic/shotgun/leveraction, /obj/item/gun/ballistic/shotgun/brush, /obj/item/gun/ballistic/shotgun/brush2, /obj/item/gun/energy/e_gun)
+
+/datum/design/s_holster
+ name = "Rifle Sling"
+ id = "r_sling"
+ build_type = BIOGENERATOR
+ materials = list(/datum/material/biomass = 600)
+ build_path = /obj/item/clothing/suit/sling
+ category = list("initial","Organic Materials")
diff --git a/modular_splurt/code/modules/discord/toggle_notify.dm b/modular_splurt/code/modules/discord/toggle_notify.dm
index cc08974060..ddfd3dc8db 100644
--- a/modular_splurt/code/modules/discord/toggle_notify.dm
+++ b/modular_splurt/code/modules/discord/toggle_notify.dm
@@ -23,11 +23,11 @@
return
else // Linked
- for(var/member in SSdiscord.notify_members) // If they are in the list, take them out
- if(member == "[stored_id]")
- SSdiscord.notify_members -= "<@[stored_id]>" // The list uses strings because BYOND cannot handle a 17 digit integer
- to_chat(src, span_notice("You will no longer be notified when the server restarts"))
- return // This is necassary so it doesnt get added again, as it relies on the for loop being unsuccessful to tell us if they are in the list or not
+ var/mention_index = SSdiscord.notify_members.Find("<@[stored_id]>")
+ if(mention_index) // If they are in the list, take them out
+ SSdiscord.notify_members -= SSdiscord.notify_members[mention_index] // The list uses strings because BYOND cannot handle a 17 digit integer
+ to_chat(src, span_notice("You will no longer be notified when the server restarts"))
+ return // This is necassary so it doesnt get added again, as it relies on the for loop being unsuccessful to tell us if they are in the list or not
// If we got here, they arent in the list. Chuck 'em in!
to_chat(src, span_notice("You will now be notified when the server restarts"))
diff --git a/modular_splurt/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm b/modular_splurt/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm
new file mode 100644
index 0000000000..3bf6f19d95
--- /dev/null
+++ b/modular_splurt/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm
@@ -0,0 +1,7 @@
+/datum/crafting_recipe/food/donut/cum
+ name = "\"cream\" donut"
+ reqs = list(
+ /datum/reagent/consumable/semen = 10,
+ /obj/item/reagent_containers/food/snacks/donut/plain = 1
+ )
+ result = /obj/item/reagent_containers/food/snacks/donut/semen
diff --git a/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm b/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm
index 37d905e0ae..6cf1d15bee 100644
--- a/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm
+++ b/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm
@@ -79,7 +79,8 @@
"Tourist",
"Clerk",
"Blacksmith",
- "Bard"
+ "Bard",
+ "Snack"
)
LAZYADD(alt_titles, extra_titles)
diff --git a/modular_splurt/code/modules/jobs/job_types/security_officer.dm b/modular_splurt/code/modules/jobs/job_types/security_officer.dm
index 48466a9b6c..785856d86b 100644
--- a/modular_splurt/code/modules/jobs/job_types/security_officer.dm
+++ b/modular_splurt/code/modules/jobs/job_types/security_officer.dm
@@ -1,6 +1,6 @@
/datum/outfit/job/security/New()
. = ..()
- backpack_contents += list(/obj/item/choice_beacon/copgun=1, /obj/item/device/hailer, /obj/item/clothing/accessory/badge)
+ backpack_contents += list(/obj/item/choice_beacon/copgun=1, /obj/item/device/hailer)
/datum/outfit/job/detective/New()
. = ..()
@@ -8,8 +8,8 @@
/datum/outfit/job/warden/New()
. = ..()
- backpack_contents += list(/obj/item/device/hailer, /obj/item/clothing/accessory/badge)
+ backpack_contents += list(/obj/item/device/hailer)
/datum/outfit/job/hos/New()
. = ..()
- backpack_contents += list(/obj/item/device/hailer, /obj/item/clothing/accessory/badge)
+ backpack_contents += list(/obj/item/device/hailer)
diff --git a/modular_splurt/code/modules/language/xenocommon.dm b/modular_splurt/code/modules/language/xenocommon.dm
new file mode 100644
index 0000000000..c0cf0d69c6
--- /dev/null
+++ b/modular_splurt/code/modules/language/xenocommon.dm
@@ -0,0 +1,2 @@
+/datum/language/xenocommon
+ restricted = FALSE //sand, you sometimes know no fun fr
diff --git a/modular_splurt/code/modules/mob/dead/new_player/login.dm b/modular_splurt/code/modules/mob/dead/new_player/login.dm
new file mode 100644
index 0000000000..13876801b3
--- /dev/null
+++ b/modular_splurt/code/modules/mob/dead/new_player/login.dm
@@ -0,0 +1,4 @@
+/mob/dead/new_player/Login()
+ . = ..()
+ if(!(client?.prefs.toggles & TG_PLAYER_PANEL))
+ new_player_panel()
diff --git a/modular_splurt/code/modules/mob/dead/new_player/new_player.dm b/modular_splurt/code/modules/mob/dead/new_player/new_player.dm
new file mode 100644
index 0000000000..5ef70df5ea
--- /dev/null
+++ b/modular_splurt/code/modules/mob/dead/new_player/new_player.dm
@@ -0,0 +1,160 @@
+/mob/dead/new_player/proc/new_player_panel()
+ if(client?.prefs.toggles & TG_PLAYER_PANEL)
+ return
+ var/output = "Welcome, [client ? client.prefs.real_name : "Unknown User"]
"
+ output += "Setup Character
"
+
+ if(SSticker.current_state <= GAME_STATE_PREGAME)
+ switch(ready)
+ if(PLAYER_NOT_READY)
+ output += "\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | Not Ready | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]
"
+ if(PLAYER_READY_TO_PLAY)
+ output += "\[ Ready | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]
"
+ if(PLAYER_READY_TO_OBSERVE)
+ output += "\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | Observe \]
"
+ else
+ output += "View the Crew Manifest
"
+ output += "Join Game!
"
+ output += "[LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)]
"
+
+ if(!IsGuestKey(src.key))
+ output += playerpolls()
+
+ output += ""
+
+ //src << browse(output,"window=playersetup;size=210x240;can_close=0")
+ var/datum/browser/popup = new(src, "playersetup", "New Player Options
", 250, 265)
+ popup.set_window_options("can_close=0")
+ popup.set_content(output)
+ popup.open(FALSE)
+
+/mob/dead/new_player/proc/playerpolls()
+ var/output = "" //hey tg why is this a list?
+ if (SSdbcore.Connect())
+ var/isadmin = FALSE
+ if(client?.holder)
+ isadmin = TRUE
+ var/datum/db_query/query_get_new_polls = SSdbcore.NewQuery({"
+ SELECT id FROM [format_table_name("poll_question")]
+ WHERE (adminonly = 0 OR :isadmin = 1)
+ AND Now() BETWEEN starttime AND endtime
+ AND deleted = 0
+ AND id NOT IN (
+ SELECT pollid FROM [format_table_name("poll_vote")]
+ WHERE ckey = :ckey
+ AND deleted = 0
+ )
+ AND id NOT IN (
+ SELECT pollid FROM [format_table_name("poll_textreply")]
+ WHERE ckey = :ckey
+ AND deleted = 0
+ )
+ "}, list("isadmin" = isadmin, "ckey" = ckey))
+ var/rs = REF(src)
+ if(!query_get_new_polls.Execute())
+ qdel(query_get_new_polls)
+ return
+ if(query_get_new_polls.NextRow())
+ output += "Show Player Polls (NEW!)
"
+ else
+ output += "Show Player Polls
"
+ qdel(query_get_new_polls)
+ if(QDELETED(src))
+ return
+ return output
+
+/mob/dead/new_player/Topic(href, list/href_list)
+ if(src != usr)
+ return ..()
+
+ if(!client)
+ return ..()
+
+ //don't let people get to this unless they are specifically not verified
+ if(href_list["Month"] && (CONFIG_GET(flag/age_verification) && !check_rights_for(client, R_ADMIN) && !(client.ckey in GLOB.bunker_passthrough)))
+ return ..()
+
+ if(!age_verify())
+ return ..()
+
+ //Handle discord verification
+ var/vibe_check = SSdiscord?.check_login(src)
+ if(isnull(vibe_check))
+ to_chat(usr, span_notice("The server is still starting up. Please wait... "))
+ return
+ if(href_list["ready"])
+ var/tready = text2num(href_list["ready"])
+ if(tready != PLAYER_NOT_READY && !vibe_check)
+ ready = PLAYER_NOT_READY
+ to_chat(src, span_warning("You must link your discord account to your ckey in order to join the game. Join our discord and use the [CONFIG_GET(string/discordbotcommandprefix)][CONFIG_GET(string/verification_command)] command [CONFIG_GET(string/verification_channel) ? "as indicated in #[CONFIG_GET(string/verification_channel)] " : ""]. It won't take you more than two minutes :)
Ahelp or ask staff in the discord if this is an error."))
+ return
+ if(href_list["late_join"] || href_list["SelectedJob"] || href_list["JoinAsGhostRole"])
+ if(!vibe_check)
+ to_chat(src, span_warning("You must link your discord account to your ckey in order to join the game. Join our discord and use the [CONFIG_GET(string/discordbotcommandprefix)][CONFIG_GET(string/verification_command)] command [CONFIG_GET(string/verification_channel) ? "as indicated in #[CONFIG_GET(string/verification_channel)] " : ""]. It won't take you more than two minutes :)
Ahelp or ask staff in the discord if this is an error."))
+ return
+
+ if(client?.prefs.toggles & TG_PLAYER_PANEL)
+ return ..()
+
+ //Determines Relevant Population Cap
+ var/relevant_cap
+ var/hpc = CONFIG_GET(number/hard_popcap)
+ var/epc = CONFIG_GET(number/extreme_popcap)
+ if(hpc && epc)
+ relevant_cap = min(hpc, epc)
+ else
+ relevant_cap = max(hpc, epc)
+
+ if(href_list["show_preferences"])
+ client.prefs.ShowChoices(src)
+ return 1
+
+ if(href_list["ready"])
+ var/tready = text2num(href_list["ready"])
+ //Avoid updating ready if we're after PREGAME (they should use latejoin instead)
+ //This is likely not an actual issue but I don't have time to prove that this
+ //no longer is required
+ if(SSticker.current_state <= GAME_STATE_PREGAME)
+ ready = tready
+ //if it's post initialisation and they're trying to observe we do the needful
+ if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE)
+ ready = tready
+ make_me_an_observer()
+ return
+
+ if(href_list["refresh"])
+ src << browse(null, "window=playersetup") //closes the player setup window
+ new_player_panel()
+
+ if(href_list["late_join"])
+ if(!SSticker || !SSticker.IsRoundInProgress())
+ return ..()
+
+ if(href_list["late_join"] == "override")
+ LateChoices()
+ return
+
+ if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(usr.key) in GLOB.admin_datums)))
+ to_chat(usr, span_danger("[CONFIG_GET(string/hard_popcap_message)]"))
+
+ var/queue_position = SSticker.queued_players.Find(usr)
+ if(queue_position == 1)
+ to_chat(usr, span_notice("You are next in line to join the game. You will be notified when a slot opens up."))
+ else if(queue_position)
+ to_chat(usr, span_notice("There are [queue_position-1] players in front of you in the queue to join the game."))
+ else
+ SSticker.queued_players += usr
+ to_chat(usr, span_notice("You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len]."))
+ return
+
+ if(href_list["manifest"])
+ ViewManifest()
+
+ else if(!href_list["late_join"])
+ new_player_panel()
+
+ if(href_list["showpoll"])
+ handle_player_polling()
+ return
+
+ . = ..()
diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm
index 4b8f76e265..5e5fb17c33 100644
--- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm
+++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm
@@ -1,5 +1,3 @@
-//Hyperstation Ears
-
/datum/sprite_accessory/ears/human/gret
name = "Gret"
icon_state = "gret"
@@ -78,3 +76,8 @@
name = "Shadekin"
icon_state = "shadekin"
color_src = MUTCOLORS
+
+/datum/sprite_accessory/ears/mam_ears/eros/cat_normal
+ name = "Cat, normal"
+ icon_state = "catnormal"
+ matrixed_sections = MATRIX_RED_GREEN
diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm
index c468f60e69..b797a3ab08 100644
--- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm
+++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm
@@ -2,6 +2,14 @@
name = "Demon"
icon = 'modular_splurt/icons/mob/mutant_bodyparts.dmi'
icon_state = "demon"
+
+/datum/sprite_accessory/horns/sylveon
+ name = "Sylveon Bow"
+ icon = 'modular_splurt/icons/mob/mutant_bodyparts.dmi'
+ icon_state = "sylveon_bow"
+ color_src = MATRIXED
+ matrixed_sections = MATRIX_ALL
+ relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
//ripped from skyrat
/datum/sprite_accessory/horns/broken
diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/wings.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/wings.dm
index 672582d515..2bde7f9a4b 100644
--- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/wings.dm
+++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/wings.dm
@@ -100,3 +100,11 @@
icon_state = "delirious"
icon = 'modular_splurt/icons/mob/wings.dmi'
upgrade_to = SPECIES_WINGS_MOTH
+
+/datum/sprite_accessory/deco_wings/sylveon
+ name = "Sylveon Ribbons"
+ icon_state = "sylveon_bow"
+ icon = 'modular_splurt/icons/mob/wings.dmi'
+ color_src = MATRIXED
+ matrixed_sections = MATRIX_ALL
+ relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
diff --git a/modular_splurt/code/modules/mob/emote.dm b/modular_splurt/code/modules/mob/emote.dm
new file mode 100644
index 0000000000..a8caa144f9
--- /dev/null
+++ b/modular_splurt/code/modules/mob/emote.dm
@@ -0,0 +1,3 @@
+/mob/emote(act, m_type, message, intentional)
+ . = ..()
+ SEND_SIGNAL(src, COMSIG_MOB_EMOTE, args)
diff --git a/modular_splurt/code/modules/mob/living/simple_animal/simple_animal.dm b/modular_splurt/code/modules/mob/living/simple_animal/simple_animal.dm
new file mode 100644
index 0000000000..acb57b6c00
--- /dev/null
+++ b/modular_splurt/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -0,0 +1,23 @@
+/mob/living/simple_animal/verb/toggle_gender()
+ set name = "Set Gender"
+ set desc = "Allows you to set your gender."
+ set category = "IC"
+
+ var/choice = tgui_alert(usr, "Select Gender.", "Gender", list("Both", "Male", "Female", "None"))
+ switch(choice)
+ if("Both")
+ has_penis = TRUE
+ has_balls = TRUE
+ has_vagina = TRUE
+ if("Male")
+ has_penis = TRUE
+ has_balls = TRUE
+ has_vagina = FALSE
+ if("Female")
+ has_penis = FALSE
+ has_balls = FALSE
+ has_vagina = TRUE
+ if("None")
+ has_penis = FALSE
+ has_balls = FALSE
+ has_vagina = FALSE
diff --git a/modular_splurt/code/modules/mob/splurt_emotes.dm b/modular_splurt/code/modules/mob/splurt_emotes.dm
index f7c4bbfe2b..f75a0cecca 100644
--- a/modular_splurt/code/modules/mob/splurt_emotes.dm
+++ b/modular_splurt/code/modules/mob/splurt_emotes.dm
@@ -1,3 +1,4 @@
+//Main code edits
/datum/emote/living/audio_emote/laugh/run_emote(mob/user, params)
. = ..()
if(. && iscarbon(user))
@@ -27,11 +28,8 @@
message = "farts out shitcode."
emote_type = EMOTE_AUDIBLE
-/mob/living
- var/fart_cooldown = 0
-
/datum/emote/living/fart/run_emote(mob/living/user, params, type_override, intentional)
- if(user.fart_cooldown)
+ if(TIMER_COOLDOWN_CHECK(user, COOLDOWN_EMOTE_FART))
to_chat(user, "You try your hardest, but no shart comes out.")
return
var/list/fart_emotes = list( //cope goonies
@@ -82,17 +80,8 @@
. = ..()
if(.)
playsound(user, pick(GLOB.brap_noises), 50, 1, -1)
- var/delay = 3 SECONDS
- user.fart_cooldown = TRUE
- addtimer(CALLBACK(GLOBAL_PROC, .proc/_fart_renew_msg, user), delay)
+ TIMER_COOLDOWN_START(user, COOLDOWN_EMOTE_FART, 3 SECONDS)
-/proc/_fart_renew_msg(mob/living/user)
- if(QDELETED(user))
- return
- //to_chat(user, "Your ass feels full, again.") //full o shit you mean
- user.fart_cooldown = 0
-
-// Hyperstation Emotes
/datum/emote/living/cackle
key = "cackle"
key_third_person = "cackles"
@@ -541,3 +530,18 @@
return
user.nextsoundemote = world.time + 10
playsound(user, pick('modular_splurt/sound/voice/aauugghh1.ogg', 'modular_splurt/sound/voice/aauugghh2.ogg'), 40, 1, -1)
+
+/datum/emote/living/pant
+ key = "pant"
+ key_third_person = "pants"
+ message = "pants!"
+
+/datum/emote/living/pant/run_emote(mob/user, params, type_override, intentional)
+ var/list/pants = list(
+ "pants!",
+ "pants like a dog.",
+ "lets out soft pants.",
+ "pulls [user.p_their()] tongue out, panting."
+ )
+ message = pick(pants)
+ . = ..()
diff --git a/modular_splurt/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/modular_splurt/code/modules/ruins/spaceruin_code/hilbertshotel.dm
index ada721b558..0cb2f7b023 100644
--- a/modular_splurt/code/modules/ruins/spaceruin_code/hilbertshotel.dm
+++ b/modular_splurt/code/modules/ruins/spaceruin_code/hilbertshotel.dm
@@ -1,5 +1,11 @@
/obj/item/hilbertshotel
w_class = WEIGHT_CLASS_GIGANTIC
+ var/list/list/mob_dorms = list()
+
+/obj/item/hilbertshotel/sendToNewRoom(roomNumber, mob/user)
+ . = ..()
+ if(!mob_dorms[user]?.Find(roomNumber))
+ LAZYADD(mob_dorms[user], roomNumber)
// Better SPLURT version of hilbert's
/datum/map_template/hilbertshotel
diff --git a/modular_splurt/code/modules/vending/kinkmate.dm b/modular_splurt/code/modules/vending/kinkmate.dm
index 59a1ccffff..6d67f336d1 100644
--- a/modular_splurt/code/modules/vending/kinkmate.dm
+++ b/modular_splurt/code/modules/vending/kinkmate.dm
@@ -15,7 +15,12 @@
/obj/item/clothing/neck/petcollar/holo = 5,
/obj/item/clothing/neck/petcollar/casino = 5,
/obj/item/clothing/gloves/latexsleeves = 3,
- /obj/item/genital_equipment/sounding = 4
+ /obj/item/genital_equipment/sounding = 4,
+ /obj/item/clothing/accessory/ring/syntech = 4,
+ /obj/item/clothing/accessory/ring/syntech/band = 4,
+ /obj/item/clothing/neck/syntech = 4,
+ /obj/item/clothing/neck/syntech/choker = 4,
+ /obj/item/clothing/neck/syntech/collar = 4
)
var/list/extra_contraband = list(
//Lewd-Clothes
diff --git a/modular_splurt/code/modules/vending/modularpc.dm b/modular_splurt/code/modules/vending/modularpc.dm
new file mode 100644
index 0000000000..16af43d7c7
--- /dev/null
+++ b/modular_splurt/code/modules/vending/modularpc.dm
@@ -0,0 +1,35 @@
+/obj/machinery/vending/modularpc
+ name = "\improper Deluxe Silicate Solutions"
+ desc = "Your dream PC, just a few credits away!."
+ icon_state = "modularpc"
+ icon_deny = "modularpc-deny"
+ light_mask = "modular-light-mask"
+ products = list(/obj/item/computer_hardware/hard_drive/micro = 5,
+ /obj/item/computer_hardware/hard_drive/small = 5,
+ /obj/item/computer_hardware/hard_drive = 5,
+ /obj/item/computer_hardware/processor_unit/small = 4,
+ /obj/item/computer_hardware/processor_unit = 4,
+ /obj/item/computer_hardware/network_card = 4,
+ /obj/item/computer_hardware/network_card/wired = 4,
+ /obj/item/computer_hardware/battery = 5,
+ /obj/item/stock_parts/cell/computer/micro = 5,
+ /obj/item/stock_parts/cell/computer = 5,
+ /obj/item/computer_hardware/printer/mini = 3,
+ /obj/item/computer_hardware/card_slot = 5,
+ /obj/item/computer_hardware/radio_card = 4)
+ premium = list(/obj/item/computer_hardware/recharger/apc_recharger = 3,
+ /obj/item/computer_hardware/hard_drive/advanced = 3,
+ /obj/item/computer_hardware/network_card/advanced = 3,
+ /obj/item/computer_hardware/ai_slot = 2,
+ /obj/item/stock_parts/cell/computer/advanced = 3,
+ /obj/item/computer_hardware/processor_unit/photonic/small = 3,
+ /obj/item/computer_hardware/processor_unit/photonic = 2,
+ /obj/item/computer_hardware/printer = 2)
+ refill_canister = /obj/item/vending_refill/modularpc
+ default_price = PRICE_CHEAP
+ extra_price = PRICE_ABOVE_NORMAL
+ payment_department = ACCOUNT_SCI
+
+/obj/item/vending_refill/modularpc
+ machine_name = "Deluxe Silicate Solutions"
+ icon_state = "refill_parts"
diff --git a/modular_splurt/icons/mob/mam_ears.dmi b/modular_splurt/icons/mob/mam_ears.dmi
index 93a8fb5480..8aec29bf29 100644
Binary files a/modular_splurt/icons/mob/mam_ears.dmi and b/modular_splurt/icons/mob/mam_ears.dmi differ
diff --git a/modular_splurt/icons/mob/mutant_bodyparts.dmi b/modular_splurt/icons/mob/mutant_bodyparts.dmi
index c73dea93e3..f1cbf6eb03 100644
Binary files a/modular_splurt/icons/mob/mutant_bodyparts.dmi and b/modular_splurt/icons/mob/mutant_bodyparts.dmi differ
diff --git a/modular_splurt/icons/mob/wings.dmi b/modular_splurt/icons/mob/wings.dmi
index e81553e462..2aa8cf7c41 100644
Binary files a/modular_splurt/icons/mob/wings.dmi and b/modular_splurt/icons/mob/wings.dmi differ
diff --git a/modular_splurt/icons/obj/badge.dmi b/modular_splurt/icons/obj/badge.dmi
index 9e1dcb855d..c71de9bc54 100644
Binary files a/modular_splurt/icons/obj/badge.dmi and b/modular_splurt/icons/obj/badge.dmi differ
diff --git a/modular_splurt/sound/interactions/kiss/kiss1.ogg b/modular_splurt/sound/interactions/kiss/kiss1.ogg
new file mode 100644
index 0000000000..f4bd734338
Binary files /dev/null and b/modular_splurt/sound/interactions/kiss/kiss1.ogg differ
diff --git a/modular_splurt/sound/interactions/kiss/kiss2.ogg b/modular_splurt/sound/interactions/kiss/kiss2.ogg
new file mode 100644
index 0000000000..18f12d6f04
Binary files /dev/null and b/modular_splurt/sound/interactions/kiss/kiss2.ogg differ
diff --git a/modular_splurt/sound/interactions/kiss/kiss3.ogg b/modular_splurt/sound/interactions/kiss/kiss3.ogg
new file mode 100644
index 0000000000..0f89617f00
Binary files /dev/null and b/modular_splurt/sound/interactions/kiss/kiss3.ogg differ
diff --git a/modular_splurt/sound/interactions/kiss/kiss4.ogg b/modular_splurt/sound/interactions/kiss/kiss4.ogg
new file mode 100644
index 0000000000..a7c47dd8af
Binary files /dev/null and b/modular_splurt/sound/interactions/kiss/kiss4.ogg differ
diff --git a/modular_splurt/sound/interactions/kiss/kiss5.ogg b/modular_splurt/sound/interactions/kiss/kiss5.ogg
new file mode 100644
index 0000000000..31a48c4d62
Binary files /dev/null and b/modular_splurt/sound/interactions/kiss/kiss5.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 95fe96d7ac..1a33cd1bca 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -154,6 +154,8 @@
#include "code\__DEFINES\dcs\helpers.dm"
#include "code\__DEFINES\dcs\signals.dm"
#include "code\__DEFINES\dcs\signals\signals_subsystem.dm"
+#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm"
+#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm"
#include "code\__DEFINES\mapping\maploader.dm"
#include "code\__DEFINES\material\worth.dm"
#include "code\__DEFINES\mobs\innate_abilities.dm"
@@ -245,11 +247,14 @@
#include "code\__SPLURTCODE\DEFINES\atmospherics.dm"
#include "code\__SPLURTCODE\DEFINES\cit_defines.dm"
#include "code\__SPLURTCODE\DEFINES\click.dm"
+#include "code\__SPLURTCODE\DEFINES\cooldowns.dm"
#include "code\__SPLURTCODE\DEFINES\genital_defines.dm"
#include "code\__SPLURTCODE\DEFINES\hud.dm"
#include "code\__SPLURTCODE\DEFINES\is_helpers.dm"
#include "code\__SPLURTCODE\DEFINES\lewd.dm"
+#include "code\__SPLURTCODE\DEFINES\login.dm"
#include "code\__SPLURTCODE\DEFINES\mobs.dm"
+#include "code\__SPLURTCODE\DEFINES\quirks.dm"
#include "code\__SPLURTCODE\DEFINES\radiation.dm"
#include "code\__SPLURTCODE\DEFINES\say.dm"
#include "code\__SPLURTCODE\DEFINES\signals.dm"
@@ -259,6 +264,7 @@
#include "code\__SPLURTCODE\DEFINES\subsystems.dm"
#include "code\__SPLURTCODE\DEFINES\traits.dm"
#include "code\__SPLURTCODE\DEFINES\arousal\genitals.dm"
+#include "code\__SPLURTCODE\DEFINES\dcs\signals.dm"
#include "code\__SPLURTCODE\DEFINES\zeros\species.dm"
#include "code\__SPLURTCODE\DEFINES\zeros\traits.dm"
#include "code\_globalvars\admin.dm"
@@ -479,6 +485,7 @@
#include "code\datums\action.dm"
#include "code\datums\ai_laws.dm"
#include "code\datums\armor.dm"
+#include "code\datums\bark.dm"
#include "code\datums\beam.dm"
#include "code\datums\beepsky_fashion.dm"
#include "code\datums\browser.dm"
@@ -3731,6 +3738,7 @@
#include "code\modules\vehicles\mecha\mecha_wreckage.dm"
#include "code\modules\vehicles\mecha\combat\combat.dm"
#include "code\modules\vehicles\mecha\combat\durand.dm"
+#include "code\modules\vehicles\mecha\combat\five_stars.dm"
#include "code\modules\vehicles\mecha\combat\gygax.dm"
#include "code\modules\vehicles\mecha\combat\honker.dm"
#include "code\modules\vehicles\mecha\combat\marauder.dm"
@@ -3801,7 +3809,6 @@
#include "interface\skin.dmf"
#include "modular_citadel\code\datums\components\souldeath.dm"
#include "modular_citadel\code\datums\status_effects\chems.dm"
-#include "modular_citadel\code\game\objects\cit_screenshake.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm"
#include "modular_citadel\code\modules\admin\holder2.dm"
#include "modular_citadel\code\modules\admin\secrets.dm"
@@ -4224,6 +4231,7 @@
#include "modular_splurt\code\controllers\configuration\entries\splurt_server.dm"
#include "modular_splurt\code\controllers\subsystem\discord.dm"
#include "modular_splurt\code\controllers\subsystem\redbot.dm"
+#include "modular_splurt\code\controllers\subsystem\ticker.dm"
#include "modular_splurt\code\datums\ai_laws.dm"
#include "modular_splurt\code\datums\dna.dm"
#include "modular_splurt\code\datums\mind.dm"
@@ -4231,6 +4239,8 @@
#include "modular_splurt\code\datums\status_effects.dm"
#include "modular_splurt\code\datums\world_topic.dm"
#include "modular_splurt\code\datums\components\chasm.dm"
+#include "modular_splurt\code\datums\components\nanites.dm"
+#include "modular_splurt\code\datums\components\size_normalized.dm"
#include "modular_splurt\code\datums\components\crafting\recipes\recipes_misc.dm"
#include "modular_splurt\code\datums\components\crafting\recipes\recipes_primal.dm"
#include "modular_splurt\code\datums\components\crafting\recipes\recipes_robot.dm"
@@ -4238,14 +4248,18 @@
#include "modular_splurt\code\datums\elements\crawl_under.dm"
#include "modular_splurt\code\datums\elements\smalltalk.dm"
#include "modular_splurt\code\datums\elements\spooky.dm"
+#include "modular_splurt\code\datums\elements\wuv.dm"
#include "modular_splurt\code\datums\interactions\cuddling.dm"
#include "modular_splurt\code\datums\interactions\lewd\_lewd.dm"
#include "modular_splurt\code\datums\interactions\lewd\lewd_datums.dm"
#include "modular_splurt\code\datums\interactions\lewd\lewd_interactions.dm"
#include "modular_splurt\code\datums\looping_sounds\machinery_sounds.dm"
+#include "modular_splurt\code\datums\mood_events\dominant_events.dm"
#include "modular_splurt\code\datums\mood_events\drug_events.dm"
#include "modular_splurt\code\datums\mood_events\generic_negative_events.dm"
#include "modular_splurt\code\datums\mood_events\generic_positive_events.dm"
+#include "modular_splurt\code\datums\mood_events\mood_event.dm"
+#include "modular_splurt\code\datums\mood_events\needs_events.dm"
#include "modular_splurt\code\datums\mutations\telekenisis.dm"
#include "modular_splurt\code\datums\ruins\lavaland.dm"
#include "modular_splurt\code\datums\ruins\station.dm"
@@ -4255,12 +4269,14 @@
#include "modular_splurt\code\datums\traits\neutral.dm"
#include "modular_splurt\code\game\atoms.dm"
#include "modular_splurt\code\game\data_huds.dm"
+#include "modular_splurt\code\game\say.dm"
#include "modular_splurt\code\game\area\areas\centcom.dm"
#include "modular_splurt\code\game\area\areas\layenia.dm"
#include "modular_splurt\code\game\area\areas\maintenance.dm"
#include "modular_splurt\code\game\area\areas\shuttles.dm"
#include "modular_splurt\code\game\area\areas\station_areas.dm"
#include "modular_splurt\code\game\area\areas\ruins\lavaland.dm"
+#include "modular_splurt\code\game\area\areas\ruins\space.dm"
#include "modular_splurt\code\game\gamemodes\objectives.dm"
#include "modular_splurt\code\game\machinery\chem_alert.dm"
#include "modular_splurt\code\game\machinery\cryopod.dm"
@@ -4321,7 +4337,6 @@
#include "modular_splurt\code\game\object\structures\ghost_role_spawners.dm"
#include "modular_splurt\code\game\object\structures\micro_bricks.dm"
#include "modular_splurt\code\game\object\structures\pole.dm"
-#include "modular_splurt\code\game\object\structures\railings.dm"
#include "modular_splurt\code\game\object\structures\signs.dm"
#include "modular_splurt\code\game\object\structures\statues.dm"
#include "modular_splurt\code\game\object\structures\table_frames.dm"
@@ -4477,6 +4492,7 @@
#include "modular_splurt\code\modules\food_and_drinks\food\snacks_pastry.dm"
#include "modular_splurt\code\modules\food_and_drinks\recipes\drink_recipes.dm"
#include "modular_splurt\code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm"
+#include "modular_splurt\code\modules\food_and_drinks\recipes\tablecraft\recipes_donut.dm"
#include "modular_splurt\code\modules\hydroponics\grown\towercap.dm"
#include "modular_splurt\code\modules\jobs\job_types\_job_alt_titles.dm"
#include "modular_splurt\code\modules\jobs\job_types\blueshield.dm"
@@ -4490,14 +4506,18 @@
#include "modular_splurt\code\modules\jobs\job_types\security_officer.dm"
#include "modular_splurt\code\modules\jobs\job_types\service.dm"
#include "modular_splurt\code\modules\keybindings\keybind\movement.dm"
+#include "modular_splurt\code\modules\language\xenocommon.dm"
#include "modular_splurt\code\modules\mapping\mapping_helpers\baseturf.dm"
#include "modular_splurt\code\modules\mining\shelters.dm"
#include "modular_splurt\code\modules\mining\equipment\kinetic_crusher.dm"
#include "modular_splurt\code\modules\mining\equipment\survival_pod.dm"
+#include "modular_splurt\code\modules\mob\emote.dm"
#include "modular_splurt\code\modules\mob\mob.dm"
#include "modular_splurt\code\modules\mob\mob_defines.dm"
#include "modular_splurt\code\modules\mob\splurt_emotes.dm"
#include "modular_splurt\code\modules\mob\dead\dead.dm"
+#include "modular_splurt\code\modules\mob\dead\new_player\login.dm"
+#include "modular_splurt\code\modules\mob\dead\new_player\new_player.dm"
#include "modular_splurt\code\modules\mob\dead\new_player\sprite_accesories\body_markings.dm"
#include "modular_splurt\code\modules\mob\dead\new_player\sprite_accesories\ears.dm"
#include "modular_splurt\code\modules\mob\dead\new_player\sprite_accesories\frills.dm"
@@ -4529,6 +4549,7 @@
#include "modular_splurt\code\modules\mob\living\silicon\robot\dogborg_equipment.dm"
#include "modular_splurt\code\modules\mob\living\silicon\robot\robot.dm"
#include "modular_splurt\code\modules\mob\living\silicon\robot\robot_modules.dm"
+#include "modular_splurt\code\modules\mob\living\simple_animal\simple_animal.dm"
#include "modular_splurt\code\modules\mob\living\simple_animal\bot\medbot.dm"
#include "modular_splurt\code\modules\mob\living\simple_animal\friendly\mouse.dm"
#include "modular_splurt\code\modules\mob\living\simple_animal\gremlin\gremlin.dm"
@@ -4603,6 +4624,7 @@
#include "modular_splurt\code\modules\vending\clothesmate.dm"
#include "modular_splurt\code\modules\vending\engineering.dm"
#include "modular_splurt\code\modules\vending\kinkmate.dm"
+#include "modular_splurt\code\modules\vending\modularpc.dm"
#include "modular_splurt\code\modules\vending\security.dm"
#include "modular_splurt\code\modules\vending\wardrobes.dm"
#include "tools\Redirector\textprocs.dm"
diff --git a/tgui/packages/tgui-panel/styles/components/Chat.scss b/tgui/packages/tgui-panel/styles/components/Chat.scss
index b439ace8c5..a199963fd0 100644
--- a/tgui/packages/tgui-panel/styles/components/Chat.scss
+++ b/tgui/packages/tgui-panel/styles/components/Chat.scss
@@ -98,3 +98,24 @@ $color-bg-section: base.$color-bg-section !default;
pointer-events: none;
}
}
+
+blockquote {
+ background-color: rgba($text-color, 0.05);
+ border-left: 0.15em solid;
+ border-color: $text-color;
+ padding-left: 0.3em;
+ padding-right: 0.3em;
+ margin-bottom: 0.15em;
+ margin-left: 0.3em;
+ margin-right: 0em;
+}
+
+hr {
+ background-color: rgba($text-color, 0.25);
+ height: 0.15em;
+ border-style: none;
+ margin-left: 1em;
+ margin-right: 2em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+}
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
index 049b7464ee..2d31efcae1 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
@@ -447,6 +447,10 @@ em {
font-style: italic;
}
+blockquote.warning {
+ border-color: #c51e1e;
+}
+
.alertwarning {
color: #FF0000;
font-weight: bold;
@@ -486,10 +490,18 @@ em {
color: #9ab0ff;
}
+blockquote.info {
+ border-color: #9ab0ff;
+}
+
.notice {
color: #6685f5;
}
+blockquote.notice {
+ border-color: #6685f5;
+}
+
.tinynotice {
color: #6685f5;
font-size: 85%;
@@ -545,18 +557,34 @@ em {
color: #059223;
}
+blockquote.green {
+ border-color: #059223;
+}
+
.red {
color: #FF0000;
}
+blockquote.red {
+ border-color: #FF0000;
+}
+
.blue {
color: #215cff;
}
+blockquote.blue {
+ border-color: #215cff;
+}
+
.nicegreen {
color: #059223;
}
+blockquote.nicegreen {
+ border-color: #059223;
+}
+
/* hornichems */
.userlove {
color: #ff42a6;
@@ -579,6 +607,10 @@ em {
color: #973e3b;
}
+blockquote.cult {
+ border-color: #973e3b;
+}
+
.cultitalic {
color: #973e3b;
font-style: italic;
@@ -634,6 +666,10 @@ em {
color: #9956d3;
}
+blockquote.purple {
+ border-color: #9956d3;
+}
+
.holoparasite {
color: #88809c;
}
@@ -697,6 +733,10 @@ em {
color: #BE8700;
}
+blockquote.brass {
+ border-color: #BE8700;
+}
+
.heavy_brass {
color: #BE8700;
font-weight: bold;
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
index 54646e7f4a..69db6e9026 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
@@ -484,6 +484,10 @@ h1.alert, h2.alert {
font-style: italic;
}
+blockquote.warning {
+ border-color: #ff0000;
+}
+
.alertwarning {
color: #FF0000;
font-weight: bold;
@@ -522,11 +526,18 @@ h1.alert, h2.alert {
.info {
color: #0000CC;
}
+blockquote.info {
+ border-color: #0000CC;
+}
.notice {
color: #000099;
}
+blockquote.notice {
+ border-color: #000099;
+}
+
.tinynotice {
color: #000099;
font-size: 85%;
@@ -582,18 +593,33 @@ h1.alert, h2.alert {
color: #03ff39;
}
+blockquote.green {
+ border-color: #03ff39;
+}
+
.red {
color: #FF0000;
}
+blockquote.red {
+ border-color: #FF0000;
+}
.blue {
color: #0000FF;
}
+blockquote.blue {
+ border-color: #0000FF;
+}
+
.nicegreen {
color: #14a833;
}
+blockquote.nicegreen {
+ border-color: #14a833;
+}
+
/* hornichems */
.userlove {
color: #FF1493;
@@ -616,6 +642,10 @@ h1.alert, h2.alert {
color: #973e3b;
}
+blockquote.cult {
+ border-color: #973e3b;
+}
+
.cultitalic {
color: #973e3b;
font-style: italic;
@@ -671,6 +701,10 @@ h1.alert, h2.alert {
color: #5e2d79;
}
+blockquote.purple {
+ border-color: #5e2d79;
+}
+
.holoparasite {
color: #35333a;
}
@@ -735,6 +769,10 @@ h1.alert, h2.alert {
color: #BE8700;
}
+blockquote.brass {
+ border-color: #BE8700;
+}
+
.heavy_brass {
color: #BE8700;
font-weight: bold;
diff --git a/tgui/packages/tgui/interfaces/Colormate.js b/tgui/packages/tgui/interfaces/Colormate.js
index f376547102..02810f2943 100644
--- a/tgui/packages/tgui/interfaces/Colormate.js
+++ b/tgui/packages/tgui/interfaces/Colormate.js
@@ -1,115 +1,120 @@
import { useBackend } from '../backend';
-import { Button, Flex, Icon, NoticeBox, NumberInput, Section, Tabs } from '../components';
+import { Button, Icon, NoticeBox, NumberInput, Section, Table, Tabs, Slider } from '../components';
import { Window } from '../layouts';
export const Colormate = (props, context) => {
const { act, data } = useBackend(context);
- const { matrixactive, temp } = data;
+ const { activemode, temp } = data;
const item = data.item || [];
return (
- {temp ? (
- {temp}
- ) : (null)}
- {Object.keys(item).length ? (
- <>
-
-
- Item:
-
-
-
- Preview:
-
-
-
-
+
+ {temp ? (
+ {temp}
+ ) : (null)}
+ {Object.keys(item).length ? (
+ <>
+
+
+
+ Item:
+
+
+
+
+
+ Preview:
+
+
+
+
act('switch_modes', {
- mode: "0",
+ mode: 1,
})} >
- Regular coloring
+ Tint coloring (Simple)
act('switch_modes', {
- mode: "1",
+ mode: 2,
})} >
- Matrixed coloring
+ HSV coloring (Normal)
+
+ act('switch_modes', {
+ mode: 3,
+ })} >
+ Matrix coloring (Advanced)
- {matrixactive ? (
- <>
- Coloring: {item.name}
-
- >
- ) : (
- <>
- Coloring: {item.name}
-
- >
- )}
-
- >
- ) : (
-
+ Coloring: {item.name}
+
+
+
+
+ {activemode === 1 ? (
+
+ ) : activemode === 2 ? (
+
+ ) : (
+
+ )}
+
+
+ >
+ ) : (
No item inserted.
-
- )}
+ )}
+
);
};
-export const ColormateNoMatrix = (props, context) => {
+export const ColormateTint = (props, context) => {
const { act, data } = useBackend(context);
return (
-
-
-
- act('paint')} />
- act('clear')} />
- act('drop')} />
-
-
- act('choose_color')} />
-
-
-
+ act('choose_color')}
+ />
);
};
@@ -117,170 +122,211 @@ export const ColormateMatrix = (props, context) => {
const { act, data } = useBackend(context);
const matrixcolors = data.matrixcolors || [];
return (
-
-
-
- act('matrix_paint')} />
- act('clear')} />
- act('drop')} />
-
-
-
- RR: act('set_matrix_color', {
- color: 1,
- value,
- })} />
-
-
- GR: act('set_matrix_color', {
- color: 4,
- value,
- })} />
-
-
- BR: act('set_matrix_color', {
- color: 7,
- value,
- })} />
-
-
-
-
- RG: act('set_matrix_color', {
- color: 2,
- value,
- })} />
-
-
- GG: act('set_matrix_color', {
- color: 5,
- value,
- })} />
-
-
- BG: act('set_matrix_color', {
- color: 8,
- value,
- })} />
-
-
-
-
- RB: act('set_matrix_color', {
- color: 3,
- value,
- })} />
-
-
- GB: act('set_matrix_color', {
- color: 6,
- value,
- })} />
-
-
- BB: act('set_matrix_color', {
- color: 9,
- value,
- })} />
-
-
-
-
- CR: act('set_matrix_color', {
- color: 10,
- value,
- })} />
-
-
- CG: act('set_matrix_color', {
- color: 11,
- value,
- })} />
-
-
- CB: act('set_matrix_color', {
- color: 12,
- value,
- })} />
-
-
-
- RG means red will become this much green.
- CR means that red will have this much constrast applied to it.
-
-
-
+
+
+
+ RR: act('set_matrix_color', {
+ color: 1,
+ value,
+ })} />
+
+
+ GR: act('set_matrix_color', {
+ color: 4,
+ value,
+ })} />
+
+
+ BR: act('set_matrix_color', {
+ color: 7,
+ value,
+ })} />
+
+
+
+
+ RG: act('set_matrix_color', {
+ color: 2,
+ value,
+ })} />
+
+
+ GG: act('set_matrix_color', {
+ color: 5,
+ value,
+ })} />
+
+
+ BG: act('set_matrix_color', {
+ color: 8,
+ value,
+ })} />
+
+
+
+
+ RB: act('set_matrix_color', {
+ color: 3,
+ value,
+ })} />
+
+
+ GB: act('set_matrix_color', {
+ color: 6,
+ value,
+ })} />
+
+
+ BB: act('set_matrix_color', {
+ color: 9,
+ value,
+ })} />
+
+
+
+
+ CR: act('set_matrix_color', {
+ color: 10,
+ value,
+ })} />
+
+
+ CG: act('set_matrix_color', {
+ color: 11,
+ value,
+ })} />
+
+
+ CB: act('set_matrix_color', {
+ color: 12,
+ value,
+ })} />
+
+
+
+ RG means red will become this much green.
+ CR means this much red will be added.
+
+
+ );
+};
+
+export const ColormateHSV = (props, context) => {
+ const { act, data } = useBackend(context);
+ const { buildhue, buildsat, buildval } = data;
+ return (
+
+
+ Hue:
+
+ act('set_hue', {
+ buildhue: value,
+ })} />
+
+
+
+ Saturation:
+
+ act('set_sat', {
+ buildsat: value,
+ })} />
+
+
+
+ Value:
+
+ act('set_val', {
+ buildval: value,
+ })} />
+
+
+
);
};
diff --git a/tgui/packages/tgui/interfaces/MobInteraction.js b/tgui/packages/tgui/interfaces/MobInteraction.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/MobInteraction.js
rename to tgui/packages/tgui/interfaces/MobInteraction.tsx
index 125217d898..ca7146740b 100644
--- a/tgui/packages/tgui/interfaces/MobInteraction.js
+++ b/tgui/packages/tgui/interfaces/MobInteraction.tsx
@@ -5,8 +5,69 @@ import { useBackend, useLocalState } from '../backend';
import { BlockQuote, Button, Flex, LabeledList, Icon, Input, Section, Table, Tabs, Stack } from '../components';
import { Window } from '../layouts';
+type HeaderInfo = {
+ isTargetSelf: boolean;
+ interactingWith: string;
+ selfAttributes: string[];
+ theirAttributes: string[];
+}
+
+type ContentInfo = {
+ interactions: InteractionData[];
+}
+
+type InteractionData = {
+ key: string;
+ desc: string;
+ type: number;
+}
+
+type GenitalInfo = {
+ genitals: GenitalData[];
+}
+
+type GenitalData = {
+ name: string,
+ key: string,
+ visibility: string,
+ possible_choices: string[],
+}
+
+type CharacterPrefsInfo = {
+ erp_pref: number,
+ noncon_pref: number,
+ vore_pref: number,
+ extreme_pref: number,
+ unholy_pref: number,
+ extreme_harm: boolean,
+}
+
+type ContentPrefsInfo = {
+ verb_consent: number,
+ lewd_verb_sounds: number,
+ arousable: number,
+ genital_examine: number,
+ vore_examine: number,
+ medihound_sleeper: number,
+ eating_noises: number,
+ digestion_noises: number,
+ trash_forcefeed: number,
+ forced_fem: number,
+ forced_masc: number,
+ hypno: number,
+ bimbofication: number,
+ breast_enlargement: number,
+ penis_enlargement: number,
+ butt_enlargement: number,
+ belly_inflation: number,
+ never_hypno: number,
+ no_aphro: number,
+ no_ass_slap: number,
+ no_auto_wag: number,
+}
+
export const MobInteraction = (props, context) => {
- const { act, data } = useBackend(context);
+ const { act, data } = useBackend(context);
const {
isTargetSelf,
interactingWith,
@@ -78,7 +139,7 @@ export const MobInteraction = (props, context) => {
};
const InteractionsTab = (props, context) => {
- const { act, data } = useBackend(context);
+ const { act, data } = useBackend(context);
const [
searchText,
setSearchText,
@@ -103,20 +164,20 @@ const InteractionsTab = (props, context) => {
{
interactions.length ? (
interactions.map((interaction) => (
-
+
act('interact', {
- interaction: interaction['key'],
+ interaction: interaction.key,
})} />
))
) : (
-
+
{
searchText ? (
"No matching results."
@@ -124,7 +185,7 @@ const InteractionsTab = (props, context) => {
"No interactions available."
)
}
-
+
)
}